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 相关文章推荐
使用jQuery简化Ajax开发 Ajax开发入门
Oct 14 Javascript
Node.js:Windows7下搭建的Node.js服务(来玩玩服务器端的javascript吧,这可不是前端js插件)
Jun 27 Javascript
微信小程序 window_x64环境搭建
Sep 30 Javascript
用jmSlip编写移动端顶部日历选择控件
Oct 24 Javascript
JS日期对象简单操作(获取当前年份、星期、时间)
Oct 26 Javascript
javascript简单进制转换实现方法
Nov 24 Javascript
原生js实现焦点轮播图效果
Jan 12 Javascript
微信小程序 详解页面跳转与返回并回传数据
Feb 13 Javascript
JS对象序列化成json数据和json数据转化为JS对象的代码
Aug 23 Javascript
p5.js入门教程和基本形状绘制
Mar 15 Javascript
TypeScript 引用资源文件后提示找不到的异常处理技巧
Jul 15 Javascript
js实现简单扫雷
Nov 27 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
手冲咖啡应该是现代精品咖啡店的必备选项吗?
2021/03/03 冲泡冲煮
windwos下使用php连接oracle数据库的过程分享
2014/05/26 PHP
PHP 自动加载的简单实现(推荐)
2016/08/12 PHP
php根据用户名和手机号查询是否存在手机号码
2017/02/16 PHP
php获取微信openid方法总结
2019/10/10 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
JavaScript 编写匿名函数的几种方法
2010/02/21 Javascript
基于jQuery替换table中的内容并显示进度条的代码
2011/08/02 Javascript
jQuery之按钮组件的深入解析
2013/06/19 Javascript
javascript与jquery中跳出循环的区别总结
2013/11/04 Javascript
Js操作树节点自动折叠展开的几种方法
2014/05/05 Javascript
jquery text()方法取标签中的文本
2014/07/25 Javascript
jQuery知识点整理
2015/01/30 Javascript
jquery实现网页定位导航
2016/08/23 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
JavaScript实现三级级联特效
2017/11/05 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
在小程序中集成redux/immutable/thunk第三方库的方法
2018/08/12 Javascript
vue-cli中vue本地实现跨域调试接口
2019/01/16 Javascript
Mpvue中使用Vant Weapp组件库的方法步骤
2019/05/16 Javascript
javascript中的数据类型检测方法详解
2019/08/07 Javascript
[02:25]专访DOTA2负责人Erik 国际邀请赛暂不会离开西雅
2014/07/21 DOTA
python应用程序在windows下不出现cmd窗口的办法
2014/05/29 Python
用Python的Django框架编写从Google Adsense中获得报表的应用
2015/04/17 Python
深入解析Python编程中super关键字的用法
2016/06/24 Python
利用Python爬取可用的代理IP
2016/08/18 Python
OpenCV实现人脸识别
2017/04/07 Python
对Python的交互模式和直接运行.py文件的区别详解
2019/06/29 Python
10个python3常用排序算法详细说明与实例(快速排序,冒泡排序,桶排序,基数排序,堆排序,希尔排序,归并排序,计数排序)
2020/03/17 Python
英国工艺品购物网站:Minerva Crafts
2018/01/29 全球购物
伦敦剧院门票:London Theatre Direct
2018/11/21 全球购物
联想英国官网:Lenovo英国
2019/07/17 全球购物
前台领班岗位职责
2013/12/04 职场文书
飘柔洗发水广告词
2014/03/14 职场文书
反对邪教标语
2014/06/30 职场文书
乡镇党员干部群众路线对照检查材料思想汇报
2014/09/28 职场文书