vue解决弹出蒙层滑动穿透问题的方法


Posted in Javascript onSeptember 22, 2018

最近开发过程中遇到一些小问题(似乎问题总是那么多),但一直没什么时间去优化与解决。程序员不能被业务绑架,有时间还是花点在代码上?,开始这次的vue尝试吧。

【遇到的问题】

在一个可滑动列表页弹出一个全屏蒙层,蒙层固定,中间一块显示消息框,当用手滑动蒙层空白处时,滑动事件会穿透到底部列表页,导致列表页的滑动。

【要实现的目标】

1. 滑动蒙层空白处不让滑动事件穿透。

2. 当蒙层消息框文字多时,要让文字可上下滑动。

要实现的效果其实如下:

vue解决弹出蒙层滑动穿透问题的方法

【实现思路】

1. vue提供的@touchmove.prevent可以用来阻止滑动,但是这个方法会对其内的子div的滑动事件也禁止掉了,这样会导致中间文字无法滑动。如果没有中间滑动需求,用@touchmove.prevent实现是一个很好的方法。

2. 蒙层设为fixed悬浮在最上,底部列表设置overflow-y: hidden;这样可以列表内容就不可以滑了,但实际过程中没有效果,于是想到继续往列表父div向上追溯,对body和html标签设置相关样式,这样就控制住了底部列表滑动问题。

3. 蒙层空白处点击事件与中间文字点击事件处理,防止事件冒泡带来其他bug。

【相关实现代码】

1. html代码都是比较简单,列表页for循环实现;蒙层用一个变量控制其显示和隐藏。但这里有几个注意点: a. 给上面列表的div动态绑定了noScroll class,它的作用是当消息蒙层显示时切换到相关的css样式; b. 弹出的全屏蒙层,加有点击事件是为了点空白处让蒙层消失,但这里对显示的每行文字还加了@click.stop="messageTitleClick(num)"这个方法,为什么加它呢——是因为蒙层空白处的点击方法对整个蒙层都生效,在文字上加上这个方法可以屏蔽掉蒙层点击方法的影响,即使这个方法里什么也不做它也是有作用的,另外这个方法上加了stop是为了防止它的点击事件穿透到后面的div。代码如下:

<!-- 列表 -->
 <div :class="{noScroll: isShowPopup}">
  <div class="item" v-for="num in 50" @click="itemClick(num)">
  <div style="width:100%">点击item{{num}}</div>
  </div>
 </div>

 <!-- 蒙层 -->
 <div v-if="isShowPopup" class="popup" @click="popUpEmptyClick()">
  <div class="message">
  <p class="message-title" v-for="num in 30" @click.stop="messageTitleClick(num)">
   消息提示 {{num}}
  </p>
  </div>
 </div>

2. 给整个列表动态绑定的css如下

/* 当前蒙层显示时生效 */
.noScroll {
 overflow-y: hidden;
}

3. 给列表整个div动态绑定.noScroll 后,底部列表照样可以滑动,所以考虑继续向上追溯。利用watch监听蒙层是否显示,当显示时,设置body相应样式;但蒙层消失时,body样式恢复。但是在vue里怎么操作body里,虽然vue是数据驱动的,不提倡直接操作Dom。但此刻我也是没什么好办法了,就直接操作Dom了。如下:

watch: {
 isShowPopup(newVal, oldVal) {
  if (newVal == true) {
  let cssStr = "overflow-y: hidden; height: 100%;";
  document.getElementsByTagName('html')[0].style.cssText = cssStr;
  document.body.style.cssText = cssStr;
  } else {
  let cssStr = "overflow-y: auto; height: auto;";
  document.getElementsByTagName('html')[0].style.cssText = cssStr;
  document.body.style.cssText = cssStr;
  }

  // 下面需要这两行代码,兼容不同浏览器
  document.body.scrollTop = this.pageScrollYoffset;
  window.scroll(0, this.pageScrollYoffset);
 }
 }

【补充】

最好去查看完整的demo代码,因为后续代码对真机上一些滑动问题进行了修复补充,包括处理一些滚动条位置等。

【Demo地址】

手动将路由切到 /three 就是此页示例

https://github.com/LiJinShi/wechat_back_vue

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
高性能WEB开发 flush让页面分块,逐步呈现 flush让页面分块,逐步呈现
Jun 19 Javascript
解决json日期格式问题的3种方法
Feb 02 Javascript
js怎么判断flash swf文件是否加载完毕
Aug 14 Javascript
JavaScript数组对象实现增加一个返回随机元素的方法
Jul 27 Javascript
javascript生成img标签的3种实现方法(对象、方法、html)
Dec 25 Javascript
jQuery 操作input中radio的技巧
Jul 18 Javascript
AngularJS 输入验证详解及实例代码
Jul 28 Javascript
JS实现页面跳转参数不丢失的方法
Nov 28 Javascript
AngularJS中使用ngModal模态框实例
May 27 Javascript
webpack4 + react 搭建多页面应用示例
Aug 03 Javascript
使用Angular material主题定义自己的组件库的配色体系
Sep 04 Javascript
vue移动端模态框(可传参)的实现
Nov 20 Javascript
vue如何解决循环引用组件报错的问题
Sep 22 #Javascript
开发一个Parcel-vue脚手架工具(详细步骤)
Sep 22 #Javascript
angular的输入和输出的使用方法
Sep 22 #Javascript
vue构建动态表单的方法示例
Sep 22 #Javascript
小程序实现展开/收起的效果示例
Sep 22 #Javascript
玩转vue的slot内容分发
Sep 22 #Javascript
vue 巧用过渡效果(小结)
Sep 22 #Javascript
You might like
兼容PHP和Java的des加密解密代码分享
2014/06/26 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
php使用 readfile() 函数设置文件大小大小的方法
2017/08/11 PHP
一些mootools的学习资源
2010/02/07 Javascript
JQuery.closest(),parent(),parents()寻找父结点
2012/02/17 Javascript
js实现无需数据库的县级以上联动行政区域下拉控件
2013/08/14 Javascript
JS方法调用括号的问题探讨
2014/01/24 Javascript
使用Jquery获取带特殊符号的ID 标签的方法
2014/04/30 Javascript
jquery验证邮箱格式是否正确实例讲解
2015/11/16 Javascript
浅谈Vuex的状态管理(全家桶)
2017/11/04 Javascript
node.js部署之启动后台运行forever的方法
2018/05/23 Javascript
vue移动端实现红包雨效果
2020/06/23 Javascript
vue axios请求频繁时取消上一次请求的方法
2018/11/10 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
微信小程序使用GoEasy实现websocket实时通讯
2020/05/19 Javascript
详解JS预解析原理
2020/06/16 Javascript
详解python上传文件和字符到PHP服务器
2017/11/24 Python
使用DataFrame删除行和列的实例讲解
2018/04/08 Python
opencv python统计及绘制直方图的方法
2019/01/21 Python
学Python 3的理由和必要性
2019/11/19 Python
关于Python Tkinter Button控件command传参问题的解决方式
2020/03/04 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
2020/12/05 Python
基于Pytorch版yolov5的滑块验证码破解思路详解
2021/02/25 Python
找到不普通的东西:Bonanza
2016/10/20 全球购物
美国滑雪和滑雪板商店:Buckman
2018/03/03 全球购物
一道写SQL的面试题和答案
2013/11/19 面试题
Ajax和javascript的区别
2013/07/20 面试题
教师队伍管理制度
2014/01/14 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
护理工作个人总结
2015/03/03 职场文书
幼儿园教师自荐书
2015/03/06 职场文书
新郎父母婚礼致辞
2015/07/27 职场文书
医学生自荐信范文(2016精选篇)
2016/01/28 职场文书
python数据分析之用sklearn预测糖尿病
2021/04/22 Python
磁贴还没死, 微软Win11可修改注册表找回Win10开始菜单
2021/11/21 数码科技
Win11远程连接不上怎么办?Win11远程桌面用不了的解决方法
2022/08/05 数码科技