在使用第三方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
)