移动端常见安卓、IOS兼容问题

一、禁止IOS缩放

  1.适用安卓、IOS10以下

<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0,user-scalable=no"/>

  viewport——>视口

  width=device-width——>页面宽度等于设备宽度

  initial-scale=1.0——>页面初始缩放比例1:1

  minimun-scale=1.0,maximum-scale=1.0——>页面最小、最大缩放比例

  user-scalable=no——>禁止用户缩放

 

  2.IOS10以上

    <script>
        window.onload = function () {
            // 禁止双指缩放
            // touchstart:触摸开始,多点触控,后面的手指同样会触发
            // touches:位于当前屏幕所有手指列表
            document.addEventListener('touchstart', function (event) {
                if (event.touches.length > 1) {
                    event.preventDefault();
                }
            });
            // 禁止手指双击缩放
            var lastTouchEnd = 0;
            document.addEventListener('touchend', function (event) {
                var now = (new Date()).getTime();
                if (now - lastTouchEnd <= 300) {
                    event.preventDefault();
                }
                lastTouchEnd = now;
            }, false);
            // ios双指手势操作事件
            document.addEventListener('gesturestart', function (event) {
                event.preventDefault();
            });
        }
    </script>

 

二、禁止蒙板下的穿透滚动

  way1(IOS10以上不生效):

        // 蒙板显示时:
        $('body').css({ overflow: 'visible' })
        // 蒙板隐藏时
        $('body').css({ overflow: 'hidden' })

   way2(蒙板内同样不可滚动):

function aboutdefault(e) {
    e.preventDefault();
}
// 蒙板显示时:
document.body.addEventListener('touchmove', aboutdefault, { passive: false });
// 蒙板隐藏时
document.body.removeEventListener('touchmove', aboutdefault, { passive: false });

   way3:

        // 蒙板显示时
        let top = document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset
        $('body').css({ 'position': 'fixed', top: -top + 'px' })
        // 蒙板隐藏时
        let top = -parseInt($('body').css("top"))
        $('body').css({ 'position': 'static' })
        document.body.scrollTop = document.documentElement.scrollTop = top

 

三、移除IOS中input原生样式

    /* 去除系统默认appearance的样式,常用于IOS下移除input标签原生样式 */
     -webkit-appearance: none;

 

四、IOS软键盘收起时让页面弹回

        // focusout失去焦点触发,与blur不同,focusout子元素失去焦点也会触发事件
        // $('.weui-cells_form').on('blur', '.weui-input', function () {
        $('.weui-cells_form').on('focusout', function () {
            let u = navigator.userAgent;    // 只读字符串,声明了浏览器用于 HTTP 请求的用户代理头的值。
            let isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/); // ios终端
            if (isiOS) {
                setTimeout(function () {
                    window.scrollTo(
                        0,
                        $('.weui-cells_form').offset().top  //  弹回的节点的位置
                    )
                }, 100)
            }
        })

  不过个人认为top这个取值并不是很好,只是一个大概,因为它并没有弹回触发软键盘时的位置

  可以尝试聚焦时获取document.documentElement.scrollTop || document.body.scrollTop || window.pageYOffset,失焦时用该值作为滚回的top位置,未测试……

 

五、IOS返回不刷新

      var isPageHide = false;
        window.addEventListener('pageshow', function () {
            if (isPageHide) {
                window.location.reload();
            }
        });
        window.addEventListener('pagehide', function () {
            isPageHide = true;
        }); 

 

六、IOS下巴

  具有下巴的ios,页面内容会下坠,或与下巴重叠

  给固定定位在底部、和页面最外层的body或div,添加样式padding-bottom: env(safe-area-inset-bottom)即可解决

  该样式生效时,会覆盖原来的padding-bottom,需要的话则需要calc计算,示例原padding-bottom为10px时:则可修改为padding-bottom: env(safe-area-inset-bottom + 10px);

 

 

padding-bottom: env(safe-area-inset-bottom);

 

 

七、IOS滚动

  ios的overflow滚动存在卡顿和不能触底的问题,所以ios的滚动很有必要配合-webkit-overflow-scrolling: touch;一起使用

.main {
      height: 100%;
      overflow-y: scroll;
      -webkit-overflow-scrolling: touch;
 }

 

posted @ 2020-04-19 23:19  惊蛰丶  阅读(584)  评论(0编辑  收藏  举报