vue添加全屏遮罩,并且消除滚动条

今天做移动端菜单适配,小屏幕时利用媒体查询,将菜单缩成一个icon,点击icon弹出侧边栏菜单

先添加一个遮罩层,然后添加菜单,菜单的zindex高于遮罩层,菜单icon的zindex高于菜单,定位固定在右上角,这样点击icon菜单滑进滑出,icon的位置不需要额外调整。

//菜单icon
.navbar-icon {
   width: 30px;
   display: none;
   position: absolute;
   top: 20px;
   right: 20px;
   z-index: 101;
   cursor: pointer;
 }
  //菜单列表弹层
  .navbar-phone{
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  z-index: 100;
  font-size: 14px;
  background-color: #fff;
  overflow: hidden;
  -webkit-transform: translateX(40%);
  transform: translateX(40%);
}
//半透明遮罩
.shadePage{
  width: 100%;
  background: #ddd;
  position: fixed;
  top: 0;
  right: 0;
  left: 0;
  bottom: 0;
  opacity: 0.7;
  z-index: 99;
}

基本功能做好了,但是发现弹出菜单页后,整个遮罩和菜单内容是可以随下面的页面滚动的,这显然是不符合我们需求的,原本的思路是让这个遮罩层的高度只等于屏幕高度,于是在这个坑上最走越远,查了不少资料,有的是用js动态算出屏幕高度赋值给遮罩的,有说给html,body所有父容器增加height:100%,然后容器height:100%的,但是即使遮罩高度固定,屏幕仍然可以滚动。这时候发现让遮罩充满整个屏幕的思路是错的,于是搜到了遮罩层去除滚动的。

因为项目引用了elementUI,有人说可以直接调用element提供的loading组件,调用了下,loading组件确实可以整个屏幕全屏,无滚动,但是有两个痛点,一个是有一个一直存在的loading动画,一个是遮罩的zindex是根据当前容器里元素最高的zindex动态生成的,本来遮罩的zindex是2000,我想让弹出层盖在遮罩上,设置了zindex:2004,结果页面上遮罩的zindex变成了2005。看来eleme的loading主要是用于页面过渡的,不大适合做通用的遮罩。

还有通过js阻止浏览器默认事件的,但是这样一棒子打死,弹出层若想添加滚动的内容就实现不了了。

这时候找到一篇最完美的解决方案,点击弹出的时候,给body添加overflow:hidden的样式,关闭遮罩的时候重新打开,同时打开的时候记录下当前页面滚动的位置,关闭的时候需要回归当前位置。

全局添加样式:

body.dialog-open {
  position: fixed;
  width: 100%;
}

添加全局方法:

  const ModalHelper = ( (bodyCls) =>{
    let scrollTop;
    return {
      afterOpen: function () {
          scrollTop = document.scrollingElement.scrollTop;
          document.body.classList.add(bodyCls);
          document.body.style.top = -scrollTop + ‘px‘;
      },
      beforeClose: function () {
          document.body.classList.remove(bodyCls);
          // scrollTop lost after set position:fixed, restore it back.
          document.scrollingElement.scrollTop = scrollTop;
      }
    };
  })(‘dialog-open‘); 

然后监听一下控制弹出层显示的变量,调用添加和消除样式:

   watch: {
      phoneMenu:function(val) {
        if (!!val){
          ModalHelper.afterOpen();
        } else {
          ModalHelper.beforeClose();
        }
      }
    }

大功告成

原文地址:https://www.cnblogs.com/yoxixi/p/9402385.html

时间: 2024-10-05 04:40:31

vue添加全屏遮罩,并且消除滚动条的相关文章

可以防止滚动条影响的全屏遮罩效果

可以防止滚动条影响的全屏遮罩效果:遮罩效果当前在很多应用中都有使用,当然也比较简单,无非是在需要的时候出现一个具有透明效果的全屏元素,但是有一种情况需要特别注意一下,那就是页面出现滚动条的时候,这个时候如不进行一下处理,遮罩层效果的表现可能不伦不类.代码如下: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="author" cont

【前端】-全屏遮罩

前端开发中,很多时候一个弹出层的显示都会伴随着一个遮罩层的显示. 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml"> 4 <head> 5 <meta h

全屏遮罩和弹出窗

/*全屏遮罩* 使用方法:* 显示:TC.shadow.show();* 隐藏:TC.shadow.hide();* */ ;(function(){ function addShadow( obj ) { if(typeof obj !== "object"){ return false; } obj.show(); var $shadow = $( '#shadow' ); if ( !$shadow.length ) { $shadow = $( '<section id=

全屏遮罩

前端开发中,很多时候一个弹出层的显示都会伴随着一个遮罩层的显示. 1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" 2 "http://www.w3.org/TR/html4/loose.dtd"> 3 <html xmlns="http://www.w3.org/1999/xhtml"> 4 <head> 5 <meta h

jQuery10种不同动画效果的响应式全屏遮罩层

遮罩层有很多今天介绍这个jQuery10种不同动画效果的响应式全屏遮罩层 效果预览 下载地址 实例代码 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 <div class="container">             <header class="sucaihuo-header"

CSS实现 全屏 遮罩

CSS实现 全屏 遮罩 遮罩 CSS: .divBG { background: gray; position: fixed; left: 0px; top: 0px; width: 100%; height: 100%; display: none; z-index: 20; filter: alpha(opacity=60); opacity: 0.5 !important; } 弹出层 CSS: .PopUp { position: fixed; display: none; z-inde

分享10种风格迥异的全屏遮罩层效果

今天,我们想给大家分享一些全屏遮罩效果的灵感.像任何其它的UI组件一样,网页设计不断有新的趋势和风格出现,我们想尝试的遮罩有一些微妙的,还有奇特的效果.这些遮罩的特别之处在于,他们没有像模态窗口那样固定大小而是占据整个屏幕,因此创建效果时,人们必须考虑到这一点. 在线演示      源码下载 您可能感兴趣的相关文章 网站开发中很有用的 jQuery 效果[附源码] 分享35个让人惊讶的 CSS3 动画效果演示 十分惊艳的8个 HTML5 & JavaScript 特效 Web 开发中很实用的10

iframe框架嵌套技巧(全屏,去双滚动条)

一般情况下我们很少用到iframe(框架),但有些特殊的情况下我们不得不使用iframe,那么或许或遇到嵌套内容不全屏,网页周围有边框,双滚动条等等情况,下面来说一下处理技巧. 全屏与边框处理: <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Colin-iframe Test</

Android6.0 源码修改之 仿IOS添加全屏可拖拽浮窗返回按钮

前言 之前写过屏蔽系统导航栏功能的文章,具体可看Android6.0 源码修改之屏蔽导航栏虚拟按键(Home和RecentAPP)/动态显示和隐藏NavigationBar 在某些特殊定制的版本中要求完全去掉导航栏,那么当用户点进一些系统自带的应用界面如设置.联系人等,就没法退出了,虽然可以在actionBar中添加back按钮,但总不能每一个app都去添加吧.所以灵机一动我们就给系统添加一个全屏可拖拽的浮窗按钮,点击的时候处理返回键的逻辑.它大概长这样(审美可能丑了点,你们可以自由发挥) 图1