移动端的fixed会有各种各样奇怪的问题,比如说移动端键盘弹起后底部tab被顶到键盘上方,失去焦点后底部tab跳动到原位置,还有在底部tab加input的各种bug,还有被顶起后不回到原位,停留在页面中间等等。
下面我总结一下github和各种前端技术网站的解决方案,主要就是以下几种。
1. 使用iscroll.js(如果原生能解决,能不用第三方插件就不用,而且据说性能不是很好,实在没办法再用),但滚动页面时input会有光标错位的问题,解决方法是在滚动时让input框失去焦点,收起键盘。
2. 把content部分设置为position:absolute,让其中的内容内部滑动,这样就不会影响到头部和底部nav,头部和底部也可以使用position:absolute,至于滑动不顺畅,可以用-webkit-overflow-scrolling : touch,这种办法依然有光标错位的问题,原因是加了-webkit-overflow-scrolling : touch 这条代码,导致滑动速度过快,光标来不及重绘,解决办法同上。
尝试过强制重绘,但无法解决。
3. focus时把nav的定位改成static,让他重回文档流,blur时再移除变回fixed,这种办法视觉体验特别不好,会突然跳出来一个nav,不推荐使用,当然你可以用系统时钟一直监控input框获得焦点和失去焦点的状态,但是严重浪费系统性能,所以放弃这种办法。
4. 头部底部nav还是用absolute,滚动时一直重新计算absolute位置,模拟fixed,这种办法视觉体验比上一种更差,一直抖动,不推荐使用。
5. 技术解决不了的,用业务解决,凡是有input的地方,都弹起一个新视图,淘宝京东都是这么做的,完美避开nav和tab。
6. 不解决,头部底部还是使用fixed,中间视图就跟着body滚动,目前移动端浏览器端对原生fixed的支持也已经很好了,下面贴一张图。
其实使用fixed对于移动端的浏览器亲测没有任何问题,但是对于完全仿原生App(固定到屏幕,并且把头部导航栏去掉),还是会有input的bug,如果要强行使用fixed,我的解决办法是固定到屏幕之后,还是以浏览器打开,不去头部导航栏。