父节点使用transform,子节点fixed定位失效

在使用第三方sdk时,偶遇一个小问题,遂记录一下。

问题现象

第三方sdk提供了渲染功能和操作按钮,因为业务场景的原因,需要改变这些按钮的样式和位置。
我啪的一下,很快啊。直接f12,鼠标选中dom节点,查看class名字,使用important直接覆盖样式。但是它不讲武德,大小形状颜色都变了,fixed定位咋没生效呢。

于是又啪的一下,打开了styles查看,发现fixed实际已经生效了。遂开始面向谷歌编程。

问题原因

父节点的样式中如果transform属性不为none,就会修改fixed的上文基准位置,不再以视口为基准。
以下三种可以修改fixed上文基准的样式属性:

  • transform 属性不为 none 的元素
  • perspective 的值不为 none 的元素
  • 在 will-change 中指定了任意 css 属性

解决方案

原先打算获取dom节点,将其挂载到根节点下,但sdk组件内部状态变更,就会重新渲染一份按钮,故此方案不可行。

最终让sdk开发同事使用Portal的方式将提交按钮放置到根节点下,改变了dom层级结构。(vue的话就是Teleport

猜你喜欢

转载自blog.csdn.net/sinat_36521655/article/details/113899728