当前位置 : 主页 > 手机开发 > 无线 >

关于移动端弹层下的body滚动

来源:互联网 收集:自由互联 发布时间:2021-06-10
关于移动端弹层下的body滚动 这个问题在移动端挺常见的,网上也有一些解决方法,现在笔者来总结一下:css的解决方案都有兼容问题,js是比较稳定的解决方法(虽然比较麻烦) ps: 本文

关于移动端弹层下的body滚动

这个问题在移动端挺常见的,网上也有一些解决方法,现在笔者来总结一下:css的解决方案都有兼容问题,js是比较稳定的解决方法(虽然比较麻烦)

ps: 本文的例子都是用vue写的

关于css的解决方案

1. overflow:hidden;

这是最多人开始想到的解决方法,虽然在pc端可以解决问题,但在移动端是不行的,
但有人说在html,body同时设置overflow:hidden可以,但经测试,效果不啥的。。。
在安卓上勉强还行,但会有一卡一卡的效果,ios上直接不行。用手机查看例子.

// vue
watch:{
    showMark:function(val){
        if(val){
            document.body.style.overflow = 'hidden';
            document.documentElement.style.overflow = 'hidden';
        }else{
            document.body.style.overflow = 'auto';
            document.documentElement.style.overflow = 'auto';
        }
    }
}

2.position:fixed

这个方法比上一个方法好多了,经测试,安卓上运行良好,ios上的微信浏览器也可以
但设置body为fixed定位的同时,滚动的位置为跳回顶部。貌似可以用这个?
嗯,如果你不介意页面弹回顶部的话,但我想在复杂的页面上估计会有小问题,特别在body上用到transform的时候,fixed会有奇怪的bug。用手机查看例子

// vue
watch:{
    showMark:function(val){
        if(val){
            document.body.style.position = 'fixed';
        }else{
            document.body.style.overflow = 'static';
        }
    }
}

3. pointer-events: none;

嗯,别用这个,试过在弹层上使用这个样式,无效,在body上才行,但会把touch事件都去掉。。。
用手机查看例子

关于js的解决方案

当弹层的元素不需要滚动的情况

嗯,这种情况就好办,直接阻止在弹层上touchmove事件。用手机查看例子

// vue下,直接加一个@touchmove.prevent

// 用原生js,则统一给一个class元素添加touchmove事件,并阻止默认行为
// 这里使用了jquery
$('.stop-scroll').on('touchmove',function(e){
    e.preventDefault();
})

当弹层的元素需要滚动的情况

嗯,这种情况就复杂了,需要自己模拟一个滚动的效果,你可以自己找一个合适的插件,或者参考一下笔者的插件touchScroll.js,又或者你自己动手写一个适合项目的插件。用手机查看例子

// touchScroll.js初始化(vue)
mounted(){
    this.touchScroll = new TouchScroll({
        target: this.$refs.content, //模拟滚动的对象
        des:'y',//x,y
        noScrolls: [this.$refs.mark] //不需要滚动的对象列表
    });

},
watch:{
    showPupop(val){
        if(val){
            // 打开弹层获取高度
            this.touchScroll.start();
        }else{
            // 关闭弹窗重置
            this.touchScroll.reset();
        }
    }
}
网友评论