不要将工具提示附加到 document.body

Avatar of Chris Coyier
Chris Coyier

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费积分!

以下是 Atif Afzal 关于 使用一个始终位于页面上的 <div> 来添加/删除工具提示,以及它们如何比直接将这些工具提示放入 <body> 中的性能要好得多。虽然没有明确提及,但将它们放在 DOM 中较高位置的原因是为了能够使用绝对定位将它们精确地放置在页面上的所需位置,而无需处理隐藏溢出或相对父级等问题。

令我惊讶的是,仅仅使用一个单独的容器,甚至没有添加 [CSS] contain 属性就修复了性能问题。现在主要的问题是解释它。最初我以为这可能是浏览器内部的一些启发式算法,对 Recalculate Style 进行了优化,但实际上没有黑魔法,我发现了原因。

技巧是避免强制重新计算样式

[…] 工具提示容器在页面中不可见,因此修改它不会使整个页面渲染树失效。如果工具提示容器在页面中可见,那么整个渲染树将失效,但在这种情况下,只有独立的子树失效了。对于只有 3 个节点的小子树来说,Recalculate Style 并不会花费太多时间,因此速度更快。

看起来这里使用了 popper.js,因此您必须巧妙地处理它。我们在 CodePen 上使用 Toast 消息,这是我们目前唯一使用的第三方组件:react-hot-toast。我检查了一下,我们不仅将消息放入了我们自己的 <div> 中,该库本身也这样做,所以我认为我们已经解决了问题。