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 validate.js表单验证的基本用法入门
May 13 Javascript
jquery表单验证框架提供的身份证验证方法(示例代码)
Dec 27 Javascript
js 连续赋值的简单实现
Jun 13 Javascript
两行代码轻松搞定JavaScript日期验证
Aug 03 Javascript
Vue.js实战之利用vue-router实现跳转页面
Apr 01 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
Aug 19 Javascript
基于vue-ssr服务端渲染入门详解
Jan 08 Javascript
jQuery动态添加li标签并添加属性和绑定事件方法
Feb 24 jQuery
vue刷新页面时去闪烁提升用户体验效果的实现方法
Dec 10 Javascript
在Node.js中将SVG图像转换为PNG,JPEG,TIFF,WEBP和HEIF格式的方法
Aug 22 Javascript
js实现简单扫雷
Nov 27 Javascript
echarts饼图各个板块之间的空隙如何实现
Dec 01 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
以文本方式上传二进制文件的PHP程序
2006/10/09 PHP
MySQL的FIND_IN_SET函数使用方法分享
2012/03/27 PHP
php 获取今日、昨日、上周、本月的起始时间戳和结束时间戳的方法
2013/09/28 PHP
ThinkPHP 表单自动验证运用示例
2014/10/13 PHP
PHP实现抓取Google IP并自动修改hosts文件
2015/02/12 PHP
php浏览历史记录的方法
2015/03/10 PHP
PHP实现支持加盐的图片加密解密
2016/09/09 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
PHP 信号管理知识整理汇总
2017/02/19 PHP
PHP实现文字写入图片功能
2019/02/18 PHP
PHP实现单文件、多个单文件、多文件上传函数的封装示例
2019/09/02 PHP
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
jquery mobile事件多次绑定示例代码
2013/09/13 Javascript
Flexigrid在IE下不显示数据的处理的解决方法
2013/10/24 Javascript
利用jquery动画特效和css打造的侧边弹出垂直导航
2014/04/04 Javascript
JavaScript中函数(Function)的apply与call理解
2015/07/08 Javascript
Google Maps基础及实例解析
2016/08/06 Javascript
Bootstrap 树控件使用经验分享(图文解说)
2017/11/06 Javascript
详解用async/await来处理异步
2019/08/28 Javascript
Layui 解决表格异步调用后台分页的问题
2019/10/26 Javascript
JavaScript实现随机点名小程序
2020/10/29 Javascript
pyqt和pyside开发图形化界面
2014/01/22 Python
python使用Queue在多个子进程间交换数据的方法
2015/04/18 Python
python 统计代码行数简单实例
2017/05/04 Python
Python实现ping指定IP的示例
2018/06/04 Python
python中多个装饰器的执行顺序详解
2018/10/08 Python
python错误调试及单元文档测试过程解析
2019/12/19 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
html5图片上传预览示例分享
2014/04/14 HTML / CSS
启动仪式策划方案
2014/06/14 职场文书
世界遗产的导游词
2015/02/13 职场文书
消防演习通知
2015/04/25 职场文书
员工福利申请报告
2015/05/15 职场文书
辛德勒的名单观后感
2015/06/03 职场文书
Python作用域和名称空间的详细介绍
2022/04/13 Python