工作中发现,给一个元素添加 fixed
属性,让它固定在窗口某个位置,直接加 position:fixed
这个属性就能重现这个效果(BUG);
在安卓手机上的效果都比较好,但是 ios 系统的个别浏览器兼容性就不好,如 QQ 浏览器、UC 浏览器、360 浏览器(这几个是 ios 最容易出问题的浏览器);
问题重现:
当用户快速滑动页面的到时候,fixed 的元素就会在窗口跳动或者抖动,非常影响用户体验
解决方案:
大致思路就是,将 fixed 的元素与滚动的元素区分开来,例如:项目中有一个固定在底部的使用了 fixed 的按钮,那么滚动的容器与之成为兄弟元素
1 2 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>
|
1 2 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~!
最后,只能使用最原始的绝对定位来实现此效果~
下面附上修改后的样式:
1 2 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%; }
|
完结~