背景:我目前正在开发一个项目,我的 JS 应用程序嵌入到多个其他(父)JS 应用程序中。某些父应用程序可以通过将 display:block/none 设置为包含我的应用程序的某些元素来显示/隐藏我的应用程序。其他父应用程序暂时从 DOM 中删除我的应用程序并稍后重新附加它。很少有父应用程序使用影子 dom,所以我无权访问父应用程序中的元素。
我需要一种方法来检查我的应用程序是否可见(在 DOM 内并显示;不关心可见性:隐藏且不必在视口内),而不更改父应用程序,所以我查看了getBoundingClientRect。
问题:至少在 chrome 上,如果元素或其祖先具有 display:none 或从 DOM 中删除, getBoundingClientRect返回 (w:0,h:0,l:0,t:0)。我找不到任何关于保证这种行为的文档,我想知道,使用 getBoundingClientRect 检查元素的可见性是否安全(从某种意义上说,这个逻辑不会改变)。
我还需要知道这种行为在所有主要浏览器中是否一致,包括 FF、IE8+ 和 Safari。这在任何地方都有记录吗?
最后,为什么是(0,0,0,0)?我觉得getBoundingClientRect在 (0,0,0,0) 实际上意味着不同的情况下应该返回 null 。有充分的理由吗?
编辑/附加问题:感谢 istos 指出返回 null 可能会破坏一些毫无戒心的代码,例如:
console.log(clientRectObject.height);
// TypeError: Cannot read property 'height' of null
不是抱怨当前的行为,而是作为一个设计问题:返回一些非法的 Rect 值(例如负宽度和高度)代替 null 是否可以成为更有用的选择?