在vue中实现禁止屏幕滚动,禁止屏幕滑动


Posted in Javascript onJuly 22, 2020

今天写了一个Vue弹层组件,用来全屏查看图片的,大概是下面这么一个效果:

在vue中实现禁止屏幕滚动,禁止屏幕滑动

其中背景是透明色的,但是弹出这个组件时手指滑动、鼠标滚轮滑动,底部页面是会动。

作为自己开发的一个常用的组件,这种bug当然是要解决的。

于是学艺不精的我在网上找了蛮久的,看了不少博客,看了不少观点和方法。终于找到了一个最简单、最实在的方法,

代码如下:

<div class="magnify" v-show="isShow" @click.self="hide" @touchmove.prevent @mousewheel.prevent>
...
</div>

首先,这个div就是整个遮罩组件的根组件,核心就是div上的事件绑定。

@touchmove 是触摸移动事件

@mousewheel 是鼠标滚轮事件

而加了prevent事件后缀,相信大家都知道是阻止默认事件。

当组件在屏幕最上方显示时,触摸移动事件和鼠标滚轮都被阻止了,所以页面不会再滚动。

在网上也看到了很多给body添加事件的解决方法:

function bodyScroll(event){ 
 event.preventDefault(); 
} 

document.body.addEventListener('touchmove',bodyScroll,false);

这里就不说了,网上有很多,我也没用上,所以没有验证,如果是传统页面的,可以使用一下这种方法。

好了,菜鸟要继续去学习了。。。

补充知识:VUE2.0 实现移动端在固定区域内的滚动效果

1.开发工具:微信web开发者工具;

2.项目:嵌在APP中的一个活动,活动是H5页面,使用VUE2.0框架。

3.需求,直接上截图:

在vue中实现禁止屏幕滚动,禁止屏幕滑动

item 上拉滚动到底部,遮罩层部分消失;item下拉,遮罩层部分显示。

4.代码:

HTML:

遮罩层部分与滚动区域部分是平级

<template>
 <div id="selectGoods">
 <!--item列表区域-->
 <div class="goods-area" ref="box">
  <div class="goods-list" ref="item" v-for="(item,index) in items" >
  <img class="left-img" :src="item.goodsUrl" alt="">
  <div class="right-text">
   <span class="inviter-goods">{{item.resourceName}}</span> <br>
   <span class="invitee-rules"><span class="person-num">{{item.inviteResourceId}}</span>我是右侧文本第二行</span>
  </div>
  </div>
 </div>
 <!--列表底部遮罩层-->
 <div class="bottom-mask" v-show="bottomMaskShow">
  <img class="mask-img" src="../../../static/inviteFriends/goodsListMask.png" alt="">
  <img class="bottom-triangle" src="../../../static/inviteFriends/xiasanjiao.png" alt="">
 </div>
 </div>
</template>

CSS(重点):

.goods-area{
 height:8.58rem;
 overflow-x: hidden;  /* 解决左右可以滑动的问题 */
 overflow-y: auto;  /* 解决左右可以滑动的问题 */
 overflow-scrolling: touch; /*兼容性 ios5+、android4+ */
}

JS:

this.$refs.是VUE2.0新增的一个对象,不需要使用JS原生的获取DOM节点的方法,直接在元素上绑定ref,如上,<div ref = "box">,然后再JS中直接调用 this.$refs.box 就可以直接获取。另外,感兴趣的小伙伴可以看一下,console.log(this.$refs.item)的结果。

回归本文主题,vue2.0 中的 mounted 方法,是页面加载后调用方法的地方。这还牵扯到另外一个问题就是VUE的钩子函数(后续工作中有了更深入的体会结合自己的实际项目再写一篇)。

页面加载后,监听滚动区域的 scroll 事件,调用 onScroll 方法,根据滚动的尺寸判断是否已经滚动到底部,控制遮罩层的显示和隐藏。

mounted () {
 this.$refs.box.addEventListener('scroll', this.onScroll);
},
onScroll () { //onScroll方法放在methods:{}中
 let nScrollHeight = this.$refs.box.scrollHeight; // 滚动距离总长 内部div的高度
 let nScrollTop = this.$refs.box.scrollTop; // 滚动条(点)当前的位置在内部div的高度 里占多少
 let itemHeight = nScrollHeight / (this.items.length); // 可以理解为每一个item的高度
 let scrollLength = itemHeight * (this.items.length - 4); // 默认显示4个item
 this.bottomMaskShow = true;
 if (nScrollTop > (scrollLength -49)) { // 49 这个差值比较灵活,是根据项目中打印出来的item高度和scrollTop实际滚动(出去)的值对比得出的
 this.bottomMaskShow = false;
 } else
 if(nScrollTop <= (scrollLength -49)){ 
 this.bottomMaskShow = true;
 }
}

其实这个功能没有什么难点,但是自己在这个问题上纠缠了好长时间,在移动端的效果总是不理想,原因在于,在一开始自己就进入了一个误区,认为在微信的开发工具上打印出来的 scrollTop 跟手机上打印出来的是一样的,结果是,完全不一样,手机根据尺寸的大小scrollTop的值也是不一样的。

写在最后:

1.对于移动端的适配问题,灵活,以不变应万变;

2.遇到问题,想想那些点都是“你以为的”,可能就是这些“你以为的”出了问题;

以上这篇在vue中实现禁止屏幕滚动,禁止屏幕滑动就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery获取样式中的背景颜色属性值/颜色值
Dec 17 Javascript
Javascript表格翻页效果的具体实现
Oct 05 Javascript
Node.js安装教程和NPM包管理器使用详解
Aug 16 Javascript
jquery制作多功能轮播图插件
Apr 02 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
Nov 25 Javascript
JS组件Bootstrap Table使用实例分享
May 30 Javascript
jQuery双向列表选择器DIV模拟版
Nov 01 Javascript
vue.js 获取当前自定义属性值
Jun 01 Javascript
JavaScript数据结构与算法之队列原理与用法实例详解
Nov 22 Javascript
JavaScript惰性载入函数实例分析
Mar 27 Javascript
vue iview实现动态新增和删除
Jun 17 Javascript
微信小程序基础教程之echart的使用
Jun 01 Javascript
vue 弹出遮罩层样式实例
Jul 22 #Javascript
vue中解决拖拽改变存在iframe的div大小时卡顿问题
Jul 22 #Javascript
vue中实现拖动调整左右两侧div的宽度的示例代码
Jul 22 #Javascript
在vue中实现禁止回退上一步,路由不存历史记录
Jul 22 #Javascript
vue项目中使用多选框的实例代码
Jul 22 #Javascript
vue中el-input绑定键盘按键(按键修饰符)
Jul 22 #Javascript
解决VUE-Router 同一页面第二次进入不刷新的问题
Jul 22 #Javascript
You might like
极典R601SW收音机
2021/03/02 无线电
PHP防止注入攻击实例分析
2014/11/03 PHP
smarty高级特性之过滤器的使用方法
2015/12/25 PHP
使用laravel的Eloquent模型如何获取数据库的指定列
2019/10/17 PHP
php 实现简单的登录功能示例【基于thinkPHP框架】
2019/12/02 PHP
TP3.2框架分页相关实现方法分析
2020/06/03 PHP
jQuery学习笔记之控制页面实现代码
2012/02/27 Javascript
extjs关于treePanel+chekBox全部选中以及清空选中问题探讨
2013/04/02 Javascript
JS判断移动端访问设备并加载对应CSS样式
2014/06/13 Javascript
JS实现响应鼠标点击动画渐变弹出层效果代码
2016/03/25 Javascript
Bootstrap框架下下拉框select搜索功能
2020/03/26 Javascript
微信小程序  自定义创建详细介绍
2016/10/27 Javascript
JavaScript中英文字符长度统计方法示例【按照中文占2个字符】
2017/01/17 Javascript
angular中使用Socket.io实例代码
2017/06/03 Javascript
JavaScript变量类型以及变量作用域详解
2017/08/14 Javascript
vue项目base64字符串转图片的实现代码
2018/07/13 Javascript
微信小程序有旋转动画效果的音乐组件实例代码
2018/08/22 Javascript
利用python爬取软考试题之ip自动代理
2017/03/28 Python
Python如何快速上手? 快速掌握一门新语言的方法
2017/11/14 Python
python爱心表白 每天都是浪漫七夕!
2018/08/18 Python
Python解析Excle文件中的数据方法
2018/10/23 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
Django打印出在数据库中执行的语句问题
2019/07/25 Python
解决Django连接db遇到的问题
2019/08/29 Python
opencv调整图像亮度对比度的示例代码
2019/09/27 Python
PyCharm2019安装教程及其使用(图文教程)
2019/09/29 Python
Python hashlib加密模块常用方法解析
2019/12/18 Python
用html5绘制折线图的实例代码
2016/03/25 HTML / CSS
ABOUT YOU匈牙利:500个最受欢迎的时尚品牌
2019/07/19 全球购物
介绍一下linux文件系统分配策略
2013/02/25 面试题
金属材料工程毕业生个人的自我评价
2013/11/28 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
餐饮营销方案
2014/02/23 职场文书
个人总结怎么写
2015/02/26 职场文书
女方家长婚礼答谢词
2015/09/29 职场文书
升职感谢领导的话语及升职感谢信
2019/06/24 职场文书