Vue项目移动端滚动穿透问题的实现


Posted in Javascript onMay 19, 2020

概述

今天在做 Vue 移动端项目的时候遇到了滚动穿透问题,在网上查资料后,选取了我觉得最好的方法,记录下来供以后开发时参考,相信对其他人也有用。

上层无需滚动

如果上层无需滚动的话,直接屏蔽上层的 touchmove 事件即可。示例如下:

<div @touchmove.prevent>
我是里面的内容
</div>

上层需要滚动

如果上层需要滚动的话,那么固定的时候先获取 body 的滑动距离,然后用 fixed 固定,用 top 模拟滚动距离;不固定的时候用获取 top 的值,然后让 body 滚动到之前的地方即可。示例如下:

<template>
 <div @click="handleHambergerClick"></div>
</template>
<script>
export default {
 name: 'BaseHeaderMobile',
 data() {
  return {
   isHeaderVisible: false,
  };
 },
 methods: {
  handleHambergerClick() {
   // hack: 滑动穿透问题
   if (!this.isHeaderVisible) {
    this.lockBody();
   } else {
    this.resetBody();
   }

   this.isHeaderVisible = !this.isHeaderVisible;
  },
  lockBody() {
   const { body } = document;
   const scrollTop = document.body.scrollTop || document.documentElement.scrollTop;
   body.style.position = 'fixed';
   body.style.width = '100%';
   body.style.top = `-${scrollTop}px`;
  },
  resetBody() {
   const { body } = document;
   const { top } = body.style;
   body.style.position = '';
   body.style.width = '';
   body.style.top = '';
   document.body.scrollTop = -parseInt(top, 10);
   document.documentElement.scrollTop = -parseInt(top, 10);
  },
 },
};
</script>

到此这篇关于Vue项目移动端滚动穿透问题的实现的文章就介绍到这了,更多相关Vue 移动端滚动穿透内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
jQuery的显示和隐藏方法与css隐藏的样式对比
Oct 18 Javascript
JavaScript输入邮箱自动提示实例代码
Jan 13 Javascript
js身份证判断方法支持15位和18位
Mar 18 Javascript
angular中使用路由和$location切换视图
Jan 23 Javascript
Position属性之relative用法
Dec 14 Javascript
Bootstrap三种表单布局的使用方法
Jun 21 Javascript
JS仿QQ好友列表展开、收缩功能(第一篇)
Jul 07 Javascript
详解vue项目首页加载速度优化
Oct 18 Javascript
详解webpack4之splitchunksPlugin代码包分拆
Dec 04 Javascript
基于mpvue搭建微信小程序项目框架的教程详解
Apr 10 Javascript
vue-cli3 配置开发与测试环境详解
May 17 Javascript
vue学习笔记之给组件绑定原生事件操作示例
Feb 27 Javascript
vue和小程序项目中使用iconfont的方法
May 19 #Javascript
小程序瀑布流组件实现翻页与图片懒加载
May 19 #Javascript
jQuery 淡入/淡出效果函数用法分析
May 19 #jQuery
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
May 19 #Javascript
微信小程序使用GoEasy实现websocket实时通讯
May 19 #Javascript
jQuery 动画与停止动画效果实例详解
May 19 #jQuery
jQuery 选择方法及$(this)用法实例分析
May 19 #jQuery
You might like
Zend引擎的发展 [15]
2006/10/09 PHP
php根据isbn书号查询amazon网站上的图书信息的示例
2014/02/13 PHP
Yii框架获取当前controlle和action对应id的方法
2014/12/03 PHP
使用新浪微博API的OAuth认证发布微博实例
2015/03/27 PHP
PHP调用全国天气预报数据接口查询天气示例
2019/02/20 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
jquery attr 设定src中含有&amp;(宏)符号问题的解决方法
2011/07/26 Javascript
含有CKEditor的表单如何提交
2014/01/09 Javascript
使用 js+正则表达式为关键词添加链接
2014/11/11 Javascript
jquery实现的树形目录实例
2015/06/26 Javascript
jQuery on()方法示例及jquery on()方法的优点
2015/08/27 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
js删除数组元素、清空数组的简单方法(必看)
2016/07/27 Javascript
BootStrap glyphicon图标无法显示的解决方法
2016/09/06 Javascript
Bootstrap CSS使用方法
2016/12/23 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
详解React中setState回调函数
2018/06/14 Javascript
微信小程序解除10个请求并发限制
2018/12/18 Javascript
JS使用数组实现的队列功能示例
2019/03/04 Javascript
JavaScript面试技巧之数组的一些不low操作
2019/03/22 Javascript
VueJs里利用CryptoJs实现加密及解密的方法示例
2019/04/29 Javascript
微信小程序上传文件到阿里OSS教程
2019/05/20 Javascript
在Vue中使用icon 字体图标的方法
2019/06/14 Javascript
[49:41]NB vs NAVI Supermajor小组赛A组 BO3 第一场 6.2
2018/06/03 DOTA
Python实现计算最小编辑距离
2016/03/17 Python
OpenCV-Python实现轮廓检测实例分析
2018/01/05 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
扩展Django admin的list_filter()可使用范围方法
2019/08/21 Python
keras在构建LSTM模型时对变长序列的处理操作
2020/06/29 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
松下电器美国官方商店:Panasonic美国
2016/10/14 全球购物
介绍下WebSphere的安全性
2013/01/31 面试题
日语专业推荐信
2013/11/12 职场文书
实验心得体会
2014/09/05 职场文书
个人批评与自我批评
2014/10/15 职场文书
2019感恩宣传标语!
2019/07/05 职场文书