如何防止Vue页面局部元素滚动时,页面整体滚动?

简介: 本文由喵喵侠分享,针对Vue中列表组件滚动时触发页面整体滚动的问题,分析了`e.stopPropagation()`无法阻止默认行为的原因,并提出使用`e.preventDefault()`来禁止浏览器默认滚动。同时扩展介绍了该方法在阻止表单提交、链接跳转等场景的应用,以及与`return false`的区别,帮助开发者更精准地控制事件行为。

前言

你好,我是喵喵侠。我最近遇到了一个问题,就是Vue页面我引入了一个列表组件,这个列表是可以单独滚动的。当我把鼠标移入,开始滚动操作时候,浏览器最右边的滚动条也会开始滚动。我尝试在@mousewheel.native这个事件,第一行加入e.stopPropagation(),发现还是没有作用,最外层的body还是可以滚动。针对这个问题,我花了点时间研究下,下面是原因分析和解决方法。

原因分析

e.stopPropagation() 只阻止事件在 JavaScript 中的冒泡传播,但它不会阻止浏览器对滚轮事件的默认处理行为。而浏览器的默认行为是,当一个滚动事件发生且子元素滚动到边界时(比如已经滚动到底部或顶部),事件会继续传递给父容器,最终传递到 body,导致页面的整体滚动。

解决方法

为了防止整个页面滚动(即 body 的滚动),你需要使用 e.preventDefault() 来阻止浏览器的默认行为。在 @mousewheel.native 事件处理程序中,添加对 e.preventDefault() 的调用即可。

代码示例如下:

<template>
  <div class="scrollable-element" @mousewheel.native="handleScroll">
    <!-- 子元素内容 -->
  </div>
</template>
<script>
export default {
  methods: {
    handleScroll(e) {
      e.preventDefault();  // 阻止浏览器默认行为(即防止页面滚动)
      // 其他滚动处理逻辑
    }
  }
}
</script>
<style>
.scrollable-element {
  max-height: 300px;
  overflow-y: auto;
}
</style>

扩展知识

preventDefault() 的其他作用

e.preventDefault() 除了可以阻止默认的浏览器滚动事件外,还可以用来阻止某些元素的默认行为。例如:

  • 阻止表单提交:如果你在表单的提交事件中调用 e.preventDefault(),那么表单不会被提交。
  • 阻止链接跳转:点击 <a> 标签时,浏览器会跳转到 href 属性指定的地址。调用 e.preventDefault() 可以阻止这种跳转。
  • 阻止鼠标右键菜单:通常点击鼠标右键会弹出浏览器的上下文菜单。你可以使用 e.preventDefault() 来阻止这种行为。

preventDefault() 与 return false的区别

虽然在某些情况下,return false 也能阻止默认行为,但它还会停止事件传播,也就是事件里面,这一行后面的语句都不执行了。而e.preventDefault() 仅仅阻止默认行为,而不阻止事件传播。

总结

浏览器的滚动事件需要用preventDefault() 来阻止,这个事件写在某个页面元素上不会影响该元素的正常滚动。这是个小问题,记录一下,方便下次遇到又忘记了。

目录
相关文章
|
14天前
|
SQL 存储 关系型数据库
从一条慢SQL说起:交易订单表如何做索引优化
本文首先以淘天电商交易订单表线上一条非典型慢 SQL 的深入剖析为切入点,示范如何系统地分析与排查慢 SQL;接着详尽归纳了索引分类、B+Tree 与 B‑Tree 的结构差异、B+Tree 高度估算方法、EXPLAIN 与 Query Profile 等诊断工具的使用,以及索引下推与排序的执行流程等索引优化理论;最后结合日常实践经验,提出了适用于大规模线上集群的索引变更 SOP,并总结了常见的慢 SQL 成因与相应的解决策略。
201 36
从一条慢SQL说起:交易订单表如何做索引优化
|
安全 大数据 Linux
大数据技术之Clickhouse---入门篇---安装
大数据技术之Clickhouse---入门篇---安装
|
4天前
|
移动开发 前端开发 JavaScript
uni-app实战案例:实现H5页面麦克风权限获取与录音功能
本文介绍如何在uni-app的H5页面中实现麦克风权限获取与录音功能,涵盖音频流转换为Blob、Base64及文件下载的完整方案,助力前端语音交互开发。
115 0
|
4天前
|
自然语言处理 前端开发 Windows
推荐一款很好用的VSCode变量翻译插件
本文介绍VSCode插件“var-translate-en”,可一键将中文翻译为英文并转为小驼峰等命名格式,支持百度、腾讯、阿里等翻译服务。通过简单配置与快捷键设置,提升变量命名效率,解决命名难题。
92 0
|
4天前
|
安全 网络安全 开发工具
解决 Host key verification failed 报错的三种方法(含 SSH 安全建议)
本文由喵喵侠撰写,详解Git提交时常见报错“Host key verification failed”的成因与解决方案。当SSH密钥变更或服务器重装系统时,本地记录的主机密钥会失效,导致连接被拒。文章提供三种解决方法:使用`ssh-keygen -R`删除旧密钥、手动编辑`known_hosts`文件,或临时禁用严格检查(不推荐生产环境)。同时强调安全建议:确认服务器状态、核对密钥指纹、启用`VerifyHostKeyDNS`防范中间人攻击。帮助开发者快速定位问题,保障代码提交顺畅。
100 0
|
1天前
|
自然语言处理 监控 测试技术
互联网大厂“黑话”完全破译指南
互联网大厂黑话太多听不懂?本文整理了一份“保姆级”职场黑话词典,涵盖PRD、A/B测试、WLB、埋点、灰度发布等高频术语,用大白话+生活化类比,帮你快速听懂同事在聊什么。非技术岗也能轻松理解,建议收藏防踩坑。
67 16
|
2天前
|
机器学习/深度学习 人工智能 算法
基于深度学习YOLO12的汽车损伤检测系统
针对汽车损伤检测效率低、主观性强等问题,本研究基于YOLOv12提出自动化检测系统,融合区域注意力与R-ELAN网络,提升小损伤识别精度与多场景适应性,实现快速、精准、标准化评估,推动保险、二手车等产业智能化升级。
|
4天前
|
JavaScript 搜索推荐 测试技术
为什么要使用 Git 作为代码版本管理工具?
本文记录了一次Vue2项目打包卡在最后一步的排查过程。作者发现测试环境打包被阻塞,通过回退配置定位到`code-inspector-plugin`插件及`.env.test`中`NODE_ENV=production`的错误配置,修正后问题解决。
24 1
|
4天前
|
JavaScript 前端开发 开发者
JavaScript实战:探究数组循环截取的实现技巧
本文介绍如何使用JavaScript实现数组的循环截取功能,适用于视频列表轮播等场景。通过for循环和slice两种方法,每隔固定时间截取4个元素并循环滚动索引,保证无缝衔接。详细讲解实现思路、代码解析及两种方法的优劣对比,帮助开发者提升实际编码能力。
32 1
|
4天前
|
存储 人工智能 开发工具
为什么要使用 Git 作为代码版本管理工具?
本文由喵喵侠分享,对比了SVN与Git两大版本管理工具。SVN集中式管理适合小团队,但离线操作受限、分支繁琐;Git凭借分布式架构、高性能和强大分支功能成为主流,尤其适合远程协作。尽管学习曲线较陡,但其生态丰富,未来将向AI集成、图形化界面和更智能的协作发展,是开发者必备技能。
44 1

热门文章

最新文章