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应用于login页面的问题及解决
Oct 17 Javascript
Node.js中使用事件发射器模式实现事件绑定详解
Aug 15 Javascript
node.js中的fs.rmdir方法使用说明
Dec 16 Javascript
JavaScript实现网页对象拖放功能的方法
Apr 15 Javascript
jQuery实现的图文高亮滚动切换特效实例
Aug 10 Javascript
JavaScript类型系统之正则表达式
Jan 05 Javascript
Angular 常用指令实例总结整理
Dec 13 Javascript
JavaScript初学者必看“new”
Jun 12 Javascript
Node.js npm命令运行node.js脚本的方法
Oct 10 Javascript
用Angular实现一个扫雷的游戏示例
May 15 Javascript
vue渲染方式render和template的区别
Jun 05 Javascript
vue3引入highlight.js进行代码高亮的方法实例
Apr 08 Vue.js
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 中文处理技巧
2010/04/25 PHP
php学习笔记(三)操作符与控制结构
2011/08/06 PHP
将博客园(cnblogs.com)数据导入到wordpress的代码
2013/01/06 PHP
用Json实现PHP与JavaScript间数据交换的方法详解
2013/06/20 PHP
php去除换行(回车换行)的三种方法
2014/03/26 PHP
浅谈ThinkPHP的URL重写
2014/11/25 PHP
PHP简单实现循环链表功能示例
2017/11/10 PHP
使用laravel和ECharts实现折线图效果的例子
2019/10/09 PHP
了解jQuery技巧来提高你的代码
2010/01/08 Javascript
JQuery Dialog(JS 模态窗口,可拖拽的DIV)
2010/02/07 Javascript
探索Emberjs制作一个简单的Todo应用
2012/11/07 Javascript
HTML上传控件取消选择
2013/03/06 Javascript
禁止拷贝网页内容的js代码
2014/01/22 Javascript
javascript实时获取鼠标坐标值并显示的方法
2015/04/30 Javascript
jQuery实用技巧必备(下)
2015/11/03 Javascript
jQuery代码实现对话框右上角菜单带关闭×
2016/05/03 Javascript
AngularJS教程之环境设置
2016/08/16 Javascript
快速入门Vue
2016/12/19 Javascript
JavaScript仿支付宝6位数字密码输入框
2016/12/29 Javascript
jQuery选择器实例应用
2017/01/05 Javascript
React Router基础使用
2017/01/17 Javascript
jQuery动态生成不规则表格(前后端)
2017/02/21 Javascript
解决Vue使用mint-ui loadmore实现上拉加载与下拉刷新出现一个页面使用多个上拉加载后冲突问题
2017/11/07 Javascript
浅谈vue自定义全局组件并通过全局方法 Vue.use() 使用该组件
2017/12/07 Javascript
详解vuex的简单使用
2018/03/12 Javascript
JavaScript类的继承方法小结【组合继承分析】
2018/07/11 Javascript
Nodejs实现微信分账的示例代码
2021/01/19 NodeJs
举例讲解Python中装饰器的用法
2015/04/27 Python
浅析python中SQLAlchemy排序的一个坑
2017/02/24 Python
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
党建工作经验交流材料
2014/05/25 职场文书
出国留学自荐信模板
2015/03/06 职场文书
酒店厨房管理制度
2015/08/06 职场文书
MySQL不使用order by实现排名的三种思路总结
2021/06/02 MySQL
golang的文件创建及读写操作
2022/04/14 Golang
分享几个实用的CSS代码块
2022/06/10 HTML / CSS