移动端项目一直使用VUX
来开发,以前使用里面的Search
组件作过一些二次封装的组件,最近发现Search
组件内部的默认插槽,本来是fixed
定位,在手机上打开是好的,可是在浏览器的模拟器打开竟然失效了。css
首先上google查到了,常见的fixed
定位失效的主要缘由vue
fixed 属性会建立新的层叠上下文。当元素祖先的 transform, perspective 或 filter 属性非 none 时,容器由视口改成该祖先。git
见MDN position: fixedgithub
好的,查到了主要问题,接下来咱们来看看,是否是这个缘由致使的chrome
在VUX
的Search
组件中,咱们找到了外层容器.vux-search-fixed
的样式中,有一个backdrop-filter
属性浏览器
.vux-search-fixed {
position: fixed;
left: 0;
top: 0;
z-index: 5;
background: rgba(255, 255, 255, 1);
backdrop-filter: blur(5px);
}
复制代码
OK,咱们尝试着把这个backdrop-filter
属性取消掉,诶,fixed
定位又铺满整个窗口了。布局
咱们再来看下这个backdrop-filter
属性的兼容性 ui
兼容性并非很好,目前须要chrome76以上才生效。google
以前fixed
定位正常显示,是因为以前浏览器没有支持这个backdrop-filter
属性。spa
由此能够肯定就是父元素的这个backdrop-filter
属性,致使fixed
定位的子元素,不在是相对于屏幕视口(viewport),而是相对于带有这个backdrop-filter
属性的父元素定位了。
backdrop-filter
属性,因此能够看到内部fixed
定位的子元素child
会相对于设置了backdrop-filter
属性的父元素parent
定位,而不是屏幕视口(viewport)
parent
元素的backdrop-filter
属性注释,便可看到child
元素会基于viewport定位,铺满整个视口
backdrop-filter
属性,因此fixed
不会失效
把父容器的backdrop-filter
属性去掉就好
毕竟保证布局一致性的优先级确定是高于这种纯属滤镜的美化样式
已经给VUX
提好了issue