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 相关文章推荐
JS实现QQ图片一闪一闪的效果小例子
Jul 31 Javascript
用jquery中插件dialog实现弹框效果实例代码
Nov 15 Javascript
javascript实现数字验证码的简单实例
Feb 10 Javascript
jquery实现pager控件示例
Apr 09 Javascript
深入理解JQuery中的事件与动画
May 18 Javascript
js实现音乐播放控制条
Sep 09 Javascript
基于js中this和event 的区别(详解)
Oct 24 Javascript
AngularJS中重新加载当前路由页面的方法
Mar 09 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
Jul 13 jQuery
jsonp格式前端发送和后台接受写法的代码详解
Nov 07 Javascript
vue pages 多入口项目 + chainWebpack 全局引用缩写说明
Sep 21 Javascript
js属性对象的hasOwnProperty方法的使用
Feb 05 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 从数据库提取二进制图片的处理代码
2009/09/09 PHP
php文件怎么打开 如何执行php文件
2011/12/21 PHP
微信获取用户地理位置信息的原理与步骤
2015/11/12 PHP
CI映射(加载)数据到view层的方法
2016/03/28 PHP
Yii2中Restful API原理实例分析
2016/07/25 PHP
php文件管理基本功能简单操作
2017/01/16 PHP
php获取目录下所有文件及目录(多种方法)(推荐)
2019/05/14 PHP
Gambit vs ForZe BO3 第一场 2.13
2021/03/10 DOTA
兼容多浏览器的iframe自适应高度(ie8 、谷歌浏览器4.0和 firefox3.5.3)
2009/11/04 Javascript
JQuery下的Live方法和$.browser方法使用代码
2010/06/02 Javascript
JavaScript实现简单的时钟实例代码
2013/11/23 Javascript
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
Javascript前端UI框架Kit使用指南之kitjs的对话框组件
2014/11/28 Javascript
angularJS结合canvas画图例子
2015/02/09 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
利用js查找数组中指定元素并返回该元素的所有索引示例
2017/03/29 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
Angular 数据请求的实现方法
2018/05/07 Javascript
jQuery实现点击图标div循环放大缩小功能
2018/09/30 jQuery
Vue微信公众号网页分享的示例代码
2020/05/28 Javascript
[54:02]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 IG vs VGJ.T
2018/04/03 DOTA
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
对python 匹配字符串开头和结尾的方法详解
2018/10/27 Python
Python3爬虫中关于Ajax分析方法的总结
2020/07/10 Python
基于python实现计算两组数据P值
2020/07/10 Python
python 装饰器的使用示例
2020/10/10 Python
联想台湾官网:Lenovo TW
2018/05/09 全球购物
NULL是什么,它是怎么定义的
2015/05/09 面试题
如何找出EMP表里面SALARY第N高的employee
2013/12/05 面试题
学校食堂采购员岗位职责
2013/12/05 职场文书
电视节目策划方案
2014/05/16 职场文书
三好学生个人先进事迹材料
2014/05/17 职场文书
2015年底工作总结范文
2015/05/15 职场文书
催款律师函范文
2015/05/27 职场文书
openstack中的rpc远程调用的方法
2021/07/09 Python
Python编写车票订购系统 Python实现快递收费系统
2022/08/14 Python