工作中发现,给一个元素添加 fixed 属性,让它固定在窗口某个位置,直接加 position:fixed 这个属性就能重现这个效果(BUG);
在安卓手机上的效果都比较好,但是 ios 系统的个别浏览器兼容性就不好,如 QQ 浏览器、UC 浏览器、360 浏览器(这几个是 ios 最容易出问题的浏览器);
问题重现:
当用户快速滑动页面的到时候,fixed 的元素就会在窗口跳动或者抖动,非常影响用户体验
解决方案:
大致思路就是,将 fixed 的元素与滚动的元素区分开来,例如:项目中有一个固定在底部的使用了 fixed 的按钮,那么滚动的容器与之成为兄弟元素
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 
 | <div class="container">
 <div class="content">
 <p>...</p>
 
 <p>...</p>
 </div>
 
 <div class="fixBox">
 <button>按钮</button>
 </div>
 </div>
 
 | 
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 
 | .container {width: 100%;
 height: 100%;
 overflow: hidden;
 display: flex;
 }
 .content {
 flex: 1 1 auto;
 overflow: auto;
 overflow-x: visible;
 }
 .fixBox {
 position: absolute;
 bottom: 0;
 height: 45px;
 width: 100%;
 }
 
 | 
在 class 为 container 的内容层中滚动,实际上,滚动条在 content 上,与 fixBox 已经无关,所以就不会影响抖动问题
额外出现的问题
精确定位到问题所在之后,就开始写 HTML 跟 CSS 了,因为考虑到是在移动端的项目,所以二话不说,直接上了 flex 的布局。
结果,测试人员在测试的过程中发现,低版本 webview 不支持 css3 flex 布局,具体请 点这里.
尴了个尬,此处省略无数个 WTF~!
最后,只能使用最原始的绝对定位来实现此效果~
下面附上修改后的样式:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 
 | .container {position: absolute;
 left: 0;
 top: 0;
 right: 0;
 bottom: 0;
 width: 100%;
 height: 100%;
 overflow: hidden;
 }
 .content {
 overflow: auto;
 overflow-x: visible;
 position: absolute;
 top: 0;
 right: 0;
 bottom: 80px;
 left: 0;
 }
 .fixBox {
 position: absolute;
 bottom: 0;
 height: 45px;
 width: 100%;
 }
 
 | 
完结~