目录
  1. 1. 问题情况
  2. 2. 解决办法
  3. 3. 额外参考

iOS不兼容position:fixed属性

问题情况

在移动端开发过程中如果在头部或底部设置 position:fixed 的元素,可能会在 ios8 以下的系统中出现以下问题,当用户进行输入时系统键盘激活,此类 fixed 元素会出现位置浮动问题。类似如下图所示: position:fixed

解决办法

解决办法大致如下: 确保自己的页面已引入浏览器适应性 meta

1
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=0">
  • CSS + JS: 原理在于这个问题发生在 overflow 属性为 scroll
1
2
3
4
.fixfixed{
   position: absolute;
   ...
}
1
2
3
4
5
6
7
8
9
10
var u = navigator.userAgent, app = navigator.appVersion;
var isIOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); //ios终端

if (isIOS) {
    $(document).on("focus", "input", function () {
        $(yourselector).addClass("fixfixed");
    }).on("focusout", "input", function () {
        $(yourselector).removeClass("fixfixed");
    });
}

或使用 iscroll.js 库。

额外参考

另外 iOS 系统中目前针对 fixed 的元素还会出现闪烁的现象,具体表现为呼出系统键盘,元素在一定时间后才回归原位。

具体的移动端 fixed 兼容性情况原因在阿里的支付宝开发经验中有详细讲过无线Web开发经验谈

  • iOS 系统: 在 iOS5 之后,iOS 才正式开始支持 fixed 的布局,在 iOS5 之前,苹果处于性能上的考虑,并没有实现,因此在使用 fixed 的时候,需要注意你所做的项目对 iOS 的版本最低支持的版本,不过即使 iOS5 之后,开始支持 fixed 属性,在实际使用中,还是有很多小坑在,国外专门有个网页再说 iOS 的 fixed 的问题。提供以下地址,可供参考:iOS-fixed issues。比较安全的做法是,在固定的布局里面,尽可能保持里面的结构简单,不要出现过于复杂的布局,一般 app 的头部和尾部可以使用 fixed 属性。
  • Android 系统 Android 系统在 2.1 之后,就已经开始支持 fixed,不过由于各个厂商对于 fixed 的实现不同,2.1 和2.2 对于 fixed 的支持不是很好,在滚动的时候会出现闪动,消失、位移等各种渲染问题。2.3 之后的版本,fixed 的问题相对少一些,不过在个别厂商的手机上也会出现各种渲染问题。从 4.x 开始,fixed 的表现比较好。因此如果在 Android 上需要 fixed 的效果,需要综合评判其效果。

本文版权归 yangzj1992 所有。来源青春样博客(qcyoung.com),商业转载请联系本人获得授权,非商业转载请注明出处。


本博客采用 Disqus 作为评论解决方案,目前 Disqus 经常被 GFW 封锁,若想参与评论请翻墙访问本站或将 disqus.com 添加至翻墙白名单。你也可以通过导航栏上的社交网站与我联系