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操作Select选择的Text和Value(获取/设置/添加/删除)
Mar 06 Javascript
jquery限定文本框只能输入数字即整数和小数
Nov 29 Javascript
JS判断客服QQ号在线还是离线状态的方法
Jan 13 Javascript
jQuery下拉美化搜索表单效果代码分享
Aug 25 Javascript
第一次动手实现bootstrap table分页效果
Sep 22 Javascript
JavaScript九九乘法口诀表的简单实现
Oct 04 Javascript
js技巧之十几行的代码实现vue.watch代码
Jun 09 Javascript
vue-cli项目修改文件热重载失效的解决方法
Sep 19 Javascript
Three.js中矩阵和向量的使用教程
Mar 19 Javascript
vue父子组件的通信方法(实例详解)
Nov 10 Javascript
Vue前端项目部署IIS的实现
Jan 06 Javascript
微信小程序入门之绘制时钟
Oct 22 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实现通用的信用卡验证类
2015/03/24 PHP
php解析url并得到url中的参数及获取url参数的四种方式
2015/10/26 PHP
PHP文件上传小程序 适合初学者学习!
2019/05/23 PHP
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
js改变embed标签src值的方法
2015/04/10 Javascript
基于jquery实现可定制的web在线富文本编辑器附源码下载
2015/11/17 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
2016/05/15 Javascript
微信小程序 详解Page中data数据操作和函数调用
2017/01/12 Javascript
Javascript创建类和对象详解
2017/05/31 Javascript
详谈commonjs模块与es6模块的区别
2017/10/18 Javascript
vue2.0在没有dev-server.js下的本地数据配置方法
2018/02/23 Javascript
微信小程序CSS3动画下拉菜单效果
2018/11/04 Javascript
微信小程序学习笔记之本地数据缓存功能详解
2019/03/29 Javascript
详解服务端预渲染之Nuxt(介绍篇)
2019/04/07 Javascript
vue 框架下自定义滚动条(easyscroll)实现方法
2019/08/29 Javascript
Python使用MD5加密字符串示例
2014/08/22 Python
Python实现各种排序算法的代码示例总结
2015/12/11 Python
Python自定义函数定义,参数,调用代码解析
2017/12/27 Python
Python反射的用法实例分析
2018/02/11 Python
Pandas DataFrame中的tuple元素遍历的实现
2019/10/23 Python
python中从for循环延申到推导式的具体使用
2019/11/29 Python
PyCharm GUI界面开发和exe文件生成的实现
2020/03/04 Python
Python实现加密接口测试方法步骤详解
2020/06/05 Python
Python建造者模式案例运行原理解析
2020/06/29 Python
迪奥官网:Dior.com
2018/12/04 全球购物
考试没考好检讨书
2014/01/31 职场文书
酒店营销策划方案
2014/02/07 职场文书
十八届三中全会个人学习材料
2014/02/13 职场文书
六个一活动实施方案
2014/03/21 职场文书
演讲稿格式
2014/04/30 职场文书
学校做一个有道德的人活动方案
2014/08/23 职场文书
2014客服代表实习自我鉴定
2014/09/18 职场文书
中秋节感想
2015/08/10 职场文书
2016年“5.12”护士节慰问信
2015/11/30 职场文书
2016毕业实习单位评语大全
2015/12/01 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书