前言
首先声明,没有标题党哈!
以下我知道的国内知名react组件库全部都有这个bug,你们现在都能去复现,一个提pr的好机会就让给你们了,哈哈!复现组件库:
- 阿里系:ant design, fusion design,
- 字节系:arco design
- 腾讯:tdesign
本来字节还有一个semi design,结果我发现它没有Affix组件,也就是固钉组件,让他躲过一劫,他有这个组件我也觉得肯定会复现相同的bug。
Affix组件是什么,以及bug复现
Affix组件(固钉组件)能将页面元素钉在可视范围。如下图:

这个button组件,会在距离顶部80px的时候会固定在屏幕上(position: fixed),如下图:

如何复现bug
你在这个button元素任意父元素上,加上以下任意style属性
- will-change: transform;
- will-change: filter;
- will-change: perspective;
- transform 不为none
- perspective不为none
- 非safari浏览器,filter属性不为none
- 非safari浏览器,backdrop-filter属性不为none
- 等等
都可以让这个固定组件失效,就是原本是距离顶部80px固定。
我的组件库没有这个bug,哈哈
目前组件不是很多,还在努力迭代中,不知道凭借没有这个bug的小小优点,能不能从你手里取一个star,哈哈
bug原因
affix组件无非都是用了fixed布局,我是如何发现这个bug的呢,我的组件库动画系统用的framer-motion,我本来是想在react-router切换路由的时候整点动画的,动画效果就是给body元素加入例如transform的变化。
然后我再看我的固钉组件怎么失效了。。。后来仔细一想,才发现想起来fixed布局的一个坑就是,大家都以为fixed布局相对的父元素是window窗口,其实是错误的!
真正的规则如下(以下说的包含块就是fixed布局的定位父元素):
-
如果 position 属性是
absolute
或fixed
,包含块也可能是由满足以下条件的最近父级元素的内边距区的边缘组成的:transform
或perspective
的值不是none
will-change
的值是transform
或perspective
filter
的值不是none
或will-change
的值是filter
(只在 Firefox 下生效)。contain
的值是paint
(例如:contain: paint;
)backdrop-filter
的值不是none
(例如:backdrop-filter: blur(10px);
)
本文完毕,求关注,求star!!!对于react组件库感兴趣的小伙伴,欢迎加群一起交流哦!