我的天!居然国内所有react组件库都有这个bug!

前言

首先声明,没有标题党哈!

以下我知道的国内知名react组件库全部都有这个bug,你们现在都能去复现,一个提pr的好机会就让给你们了,哈哈!复现组件库:

本来字节还有一个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,哈哈

mx-design

目前组件不是很多,还在努力迭代中,不知道凭借没有这个bug的小小优点,能不能从你手里取一个star,哈哈

bug原因

affix组件无非都是用了fixed布局,我是如何发现这个bug的呢,我的组件库动画系统用的framer-motion,我本来是想在react-router切换路由的时候整点动画的,动画效果就是给body元素加入例如transform的变化。

然后我再看我的固钉组件怎么失效了。。。后来仔细一想,才发现想起来fixed布局的一个坑就是,大家都以为fixed布局相对的父元素是window窗口,其实是错误的!

真正的规则如下(以下说的包含块就是fixed布局的定位父元素):

  1. 如果 position 属性是 absolutefixed,包含块也可能是由满足以下条件的最近父级元素的内边距区的边缘组成的:

    1. transformperspective 的值不是 none
    2. will-change 的值是 transformperspective
    3. filter 的值不是 nonewill-change 的值是 filter(只在 Firefox 下生效)。
    4. contain 的值是 paint(例如:contain: paint;
    5. backdrop-filter 的值不是 none(例如:backdrop-filter: blur(10px);

本文完毕,求关注,求star!!!对于react组件库感兴趣的小伙伴,欢迎加群一起交流哦!

相关推荐
vortex58 小时前
解决 Kali 中 Firefox 下载语言包和插件速度慢的问题:配置国内镜像加速
前端·firefox·腾讯云
修仙的人8 小时前
Rust + WebAssembly 实战!别再听说,学会使用!
前端·rust
maxine8 小时前
JS Entry和 HTML Entry
前端
用户63310776123668 小时前
Who is a Promise?
前端
威风的虫9 小时前
JavaScript中的axios
开发语言·javascript·ecmascript
比老马还六9 小时前
Blockly元组积木开发
前端
笨笨狗吞噬者9 小时前
【uniapp】小程序体积优化,JSON文件压缩
前端·微信小程序·uni-app
bot5556669 小时前
“企业微信iPad协议”静默 72 小时:一台被遗忘的测试机如何成为私域的逃生梯
javascript·面试
西洼工作室9 小时前
浏览器事件循环与内存管理可视化
前端·javascript·css·css3
xier12345610 小时前
高性能和高灵活度的react表格组件
前端