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 相关文章推荐
input+select(multiple) 实现下拉框输入值
May 21 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
Apr 05 Javascript
jquery实现实时改变网页字体大小、字体背景色和颜色的方法
Aug 05 Javascript
基于jQuery实现选取月份插件附源码下载
Dec 28 Javascript
javascript的 {} 语句块详解
Feb 27 Javascript
Vue2学习笔记之请求数据交互vue-resource
Feb 23 Javascript
js图片延迟加载(Lazyload)三种实现方式
Mar 01 Javascript
原生js jquery ajax请求以及jsonp的调用方法
Aug 04 jQuery
菊花转动的jquery加载动画效果
Aug 19 jQuery
vue router 跳转后回到顶部的实例
Aug 31 Javascript
JavaScript基于面向对象实现的无缝滚动轮播示例
Jan 17 Javascript
JavaScript实现左右滚动电影画布
Feb 06 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自定义函数实现二维数组排序功能
2016/07/20 PHP
PHP不使用递归的无限级分类简单实例
2016/11/05 PHP
PHPUnit测试私有属性和方法功能示例
2018/06/12 PHP
PHP内部实现打乱字符串顺序函数str_shuffle的方法
2019/02/14 PHP
Jquery 的扩展方法总结
2011/10/01 Javascript
JavaScript jQuery 中定义数组与操作及jquery数组操作
2015/12/18 Javascript
AngularJS仿苹果滑屏删除控件
2016/01/18 Javascript
BootStrap响应式导航条实例介绍
2016/05/06 Javascript
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
vue2.0结合DataTable插件实现表格动态刷新的方法详解
2017/03/17 Javascript
详解vue项目优化之按需加载组件-使用webpack require.ensure
2017/06/13 Javascript
Angular中点击li标签实现更改颜色的核心代码
2017/12/08 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
JavaScript高级函数应用之分时函数实例分析
2018/08/03 Javascript
js动态获取时间的方法分析
2019/08/02 Javascript
[01:25:09]2014 DOTA2国际邀请赛中国区预选赛 5 23 CIS VS DT第二场
2014/05/24 DOTA
Python中利用函数装饰器实现备忘功能
2015/03/30 Python
python实现自动网页截图并裁剪图片
2018/07/30 Python
python批量复制图片到另一个文件夹
2018/09/17 Python
解决python中使用PYQT时中文乱码问题
2019/06/17 Python
如何理解python面向对象编程
2020/06/01 Python
python PyAUtoGUI库实现自动化控制鼠标键盘
2020/09/09 Python
销售行政专员职责
2014/01/03 职场文书
给面试官的感谢信
2014/02/01 职场文书
欢送退休感言
2014/02/08 职场文书
会计系毕业生求职信
2014/05/28 职场文书
学校班子个人对照检查材料思想汇报
2014/09/27 职场文书
银行授权委托书范本
2014/10/04 职场文书
家长学校教学计划
2015/01/19 职场文书
董事会决议范本
2015/07/01 职场文书
研讨会致辞
2015/07/31 职场文书
家长必看:义务教育,不得以面试 评测等名义选拔学生
2019/07/09 职场文书
餐饮行业关注的9大营销策略
2019/08/26 职场文书
创业计划书之外语培训班
2019/11/02 职场文书
浅谈Go语言多态的实现与interface使用
2021/06/16 Golang
uni-app 微信小程序授权登录的实现步骤
2022/02/18 Javascript