HTML开发 完美解决pop弹出蒙版后底层滑动问题

html 弹出蒙版后禁止底层滑动

在对应的最外层(蒙版父视图),添加css

position: relative;

蒙版层使用

position: fixed;

然后点击弹出蒙版和关闭蒙版 调用下面的方法

// 处理弹出/关闭pop的时候,使背景图不滚动
fixedBody: function () {
  var body = document.body
  if (body.style.position != 'fixed') {
    this.bodyScrollTop = window.scrollY
    body.style.position = 'fixed'
    body.style.top = -this.bodyScrollTop + 'px'
  } else {
    body.style.position = ''
    body.style.top = ''
    window.scrollTo(0, this.bodyScrollTop)
  }
}

注意,有时候,代码加了,依旧不生效,原因可能是少了这些代码:

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

具体代码栗子如下:


<!DOCTYPE html>
<html lang="en">

<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta name="viewport"
        content="width=device-width, initial-scale=1.0, maximum-scale=1, minimum-scale=1, user-scalable=0">
    <title>HTML弹出蒙板的测试</title>
    <!-- 引入 Vue,使用到vue,必须先引入vue -->
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.min.js"></script>
    <!-- 引入babel-polyfill es6转es5 -->
    <script src="https://cdn.bootcss.com/babel-polyfill/7.8.3/polyfill.min.js"></script>
    <!-- 内部样式 -->
    <style type="text/css">
        html,
        body {
            width: 100%;
            height: 100%;
            margin: 0;
            padding: 0;
        }

        .app-view-wrapper {
            /* 蒙板父视图需要的属性 */
            position: relative;
            width: 100%;
            height: 100%;
            display: flex;
            align-items: center;
            flex-direction: column;
        }

        .button-wrapper {
            display: flex;
            align-items: center;
            justify-content: center;
            width: 120px;
            margin-top: 30px;
            height:35px;
            border-radius:15px;
            box-shadow:0px 4px 10px 0px rgba(1,55,143,0.3);
            background-color: rgba(241,98,61,1);
            margin-bottom: 30px;
            position: fixed;
        }

        .button-title {
            font-size:14px;
            color: #FFFFFF;
            text-align: center;
            line-height:35px;;
        }

        .pop-view-wrapper {
            /* 蒙板需要的属性 */
            position: fixed;
            overflow: hidden;
            width: 100%; 
            height: 100%;
            background:rgba(52,52,52,0.7);
            display: flex;
            justify-content: center;
            align-content: center;
            z-index: 99;
            left: 0;
            top: 0;
        }

        /* pop背景 */
        .pop-bg-wrapper {
            width:300px;
            display: flex;
            justify-content: center;
            align-items: center;
            flex-direction: column;
        }


        .pop-content-wrapper {
            width: 100%;
            height:20.625rem; 
            background:#FFFFFF;
            border-radius:10px;
            overflow: hidden;
            display: flex;
            align-items: center;
            flex-direction: column;
        }

        .content-text {
            /* height: 10.9375rem; */
            flex: 1;
            margin: 20px;
            font-size:15px;
            font-weight:400;
            color:#333333;
            line-height:25px;
            margin-bottom: 20px;
            overflow-y: auto;
        }

        .title-text {
            margin-top: 20px;
            font-size:18px;
            font-weight:500;
            color:#333333;
            line-height:25px;
            text-align: center;
        }

        .pop-close-img {
            margin-top: 20px;
            width: 40px;
            height: 40px;
        }


    </style>
    <!-- 小屏幕处理 -->
    <script>
        // 设置fontSize
        initFontSize()
        // 变化的时候,修改fontSize
        window.onresize = () => {
            initFontSize()
        }
        function initFontSize() {
            var html = document.getElementsByTagName("html")[0];
            const cw = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;
            // 375 -> fontSize = 16px
            html.style.fontSize = cw / 375 * 16 + 'px';
        }
    </script>
</head>

<body>
    <div id="app" class="app-view-wrapper">
        <!-- 触发pop按钮 -->
        <div class="button-wrapper" @click="openPop">
            <div class="button-title">点我弹出pop</div>
        </div>
        <!-- 这里添加内容,让页面可以滚动 -->
        <p v-for="(content, index) in contentList" :key="index">{{content}}</p>
        <!-- 弹出框 -->
        <div class="pop-view-wrapper" v-if="showPop">
            <div class="pop-bg-wrapper">
                <div class="pop-content-wrapper">
                    <span class="title-text">pop弹出框</span>
                    <div class="content-text">{{popContent}}</div>
                </div>
                <img class="pop-close-img" src="images/close-img.png" alt="" @click="closePop">
            </div>
        </div>
    </div>
</body>
<script>
    new Vue({
        el: '#app',
        data() {
            return {
               showPop: false,
               popContent: '十年前看周星驰大话西游,可以笑的没心没肺,而现在看着看着不知不觉就流泪了,想要救紫霞,就必须要打败牛魔王,想要打败牛魔王,就必须要变成孙悟空,想要变成孙悟空,就必须要忘掉七情六欲,看似简单,难的就是那一转身,正所谓不戴金箍,如何救你,戴了金箍,如何爱你,其实每一个人以前都是那个无忧无虑的至尊宝,只是随着年龄的增长,不得不戴上紧箍咒,拿起金箍棒,成为孙悟空,从而要去承担起所有的责任,再也回不到从前的至尊宝,《大话西游》的结尾有句话,“你看那个人,好奇怪哟,象一条狗”。像条狗的人 是放弃了人间的男女情欢、无欲无念、兢兢业业走在西天取经路上的至尊宝。他如你我这般,收起了脾气火气不再任性淘气,只为梦想奔波。人生百年,谁不曾大闹天宫,谁不曾头上紧箍,谁不曾爱上西楼,谁不曾孤单上路。 曾离我们仅一步之遥的人,一旦错过,之后哪怕化身绝世英雄,身披金衣金甲,脚踏七彩祥云,一跃十万八千里,也未必能追得回来。 三生有幸遇见你,纵使悲凉也是情。 多年以后,才知道,那个转身,有多难…',
               contentList:[
                   '小兄弟可知,为什么自古就有男左女右之说?因为男人的右手杀气太重。',
                   '女大三抱金砖,女大三十送江山,女大三百炼仙丹,女大三千列仙班。',
                   '青龙偃月刀为何沦为水果刀?九齿钉耙梳出的中分为何如此靓丽?传国玉玺缺的一角竟然是砸核桃所致?何人竟能用13500斤的金箍棒擀饺子皮?张飞为何哭诉自己的蛇矛被抢去织毛衣?京外高压线为何频频发出琴声?敬请关注今晚8点走近科学栏目专题《秀儿,是你吗?》',
                   '我要利用核聚变放出的高能粒子流,穿过天文单位级别的距离,精准狙杀数以万计的低等虫族,守卫我所栖息之地的清洁神圣。---简单来说就是晒被子',
                   '尚未佩妥剑,转眼便江湖,但愿尽千帆,归来仍少年 ',
                   '我要这天,再遮不住我眼.我要这地,再埋不了我心.要这众生,都明白我意.要那诸佛,全都烟消云散.',
                   '接受难以接受的事情,或许就是一个人成熟的标志吧',
                   '惊不惊喜?意外不意外?感动不感动?',
                   '失恋我可以,没钱绝对不行。',
                   '话说那赵云白马银枪,力战众将,威武勇猛,在长坂坡上杀了个七进七出,杀得敌人丢兵弃甲,溃不成军。',
                   '但那长坂坡也不是省油的灯,她乃是怡红院的头牌花魁,平缓心神之后当即使出坐缸本领,令赵云节节败退...',
                   '人在北美,刚下航母。家财不多,挥金如土。麻省毕业,长相彦祖。玉树临风,一米八五。白宫任职,通今博古。刚订完婚,欧洲公主。鹤发童颜,仙风道骨。闲来无事,玩玩知乎。熟人太多,匿了。',
                   '北冥有鱼,其名为鲲,鲲之大,一锅炖不下,化而为鸟,其名为鹏,鹏之大,需要两个烧烤架,一个秘制,一个麻辣,来瓶雪花,带你勇闯天涯。'
               ]
            }
        },

        // created函数
        created() {
        },
        // 方法
        methods: {

            openPop () {
                this.showPop = true;
                this.fixedBody();
            },

            closePop () {
                this.showPop = false;
                this.fixedBody();
            },

            fixedBody () {
               let body = document.body;
                if (body.style.position != 'fixed') {
                    this.bodyScrollTop = window.scrollY;
                    body.style.position = 'fixed';
                    body.style.top = -this.bodyScrollTop + 'px';
                } else {
                    body.style.position = '';
                    body.style.top = '';
                    window.scrollTo(0, this.bodyScrollTop);
                } 
            }
        }
    });

    // 处理移动端的点击双击放大
    window.onload = function () {
        // 阻止双击放大
        var lastTouchEnd = 0;
        document.addEventListener('touchstart', function (event) {
            if (event.touches.length > 1) {
                event.preventDefault();
            }
        });
        document.addEventListener('touchend', function (event) {
            var now = (new Date()).getTime();
            if (now - lastTouchEnd <= 300) {
                event.preventDefault();
            }
            lastTouchEnd = now;
        }, false);

        // 阻止双指放大
        document.addEventListener('gesturestart', function (event) {
            event.preventDefault();
        });
    };
</script>

</html>

效果如图:


效果图
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容