如何防止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() 来阻止,这个事件写在某个页面元素上不会影响该元素的正常滚动。这是个小问题,记录一下,方便下次遇到又忘记了。

目录
相关文章
|
18小时前
|
存储 人工智能 开发工具
为什么要使用 Git 作为代码版本管理工具?
本文由喵喵侠分享,对比了SVN与Git两大版本管理工具。SVN集中式管理适合小团队,但离线操作受限、分支繁琐;Git凭借分布式架构、高性能和强大分支功能成为主流,尤其适合远程协作。尽管学习曲线较陡,但其生态丰富,未来将向AI集成、图形化界面和更智能的协作发展,是开发者必备技能。
19 1
|
18小时前
|
JavaScript 前端开发 索引
JavaScript实战:探究数组循环截取的实现技巧
本文介绍如何用JavaScript实现数组循环截取4个元素的两种方法:for循环和slice。通过模运算处理索引滚动,结合setInterval定时切换,适用于视频列表轮播等场景,并对比了两种方式在代码简洁性、可读性与执行效率上的优劣。
14 1
|
18小时前
|
JavaScript 搜索推荐 测试技术
为什么要使用 Git 作为代码版本管理工具?
本文记录了一次Vue2项目打包卡在最后一步的排查过程。作者发现测试环境打包被阻塞,通过回退配置定位到`code-inspector-plugin`插件及`.env.test`中`NODE_ENV=production`的错误配置,修正后问题解决。
12 1
|
18小时前
|
JavaScript 前端开发 开发者
JavaScript实战:探究数组循环截取的实现技巧
本文介绍如何使用JavaScript实现数组的循环截取功能,适用于视频列表轮播等场景。通过for循环和slice两种方法,每隔固定时间截取4个元素并循环滚动索引,保证无缝衔接。详细讲解实现思路、代码解析及两种方法的优劣对比,帮助开发者提升实际编码能力。
14 1
|
10天前
|
人工智能 前端开发 Unix
从CLI原理出发,如何做好AI Coding
本文探讨CLI类AI编程工具的产品美学与技术原理,分析其遵循Unix哲学的轻量、可组合、可集成特性,解析Single Agent架构与上下文工程的实践,并分享如何通过Prompt优化、任务拆解与团队对齐,高效利用CLI提升编码效率,展望AI时代人机协作的新范式。
150 10
从CLI原理出发,如何做好AI Coding
|
15天前
|
人工智能 程序员 图形学
第一章 AI 编程革命的第一步:让 Cursor 真正“听懂”你要做一款游戏
第一章 AI 编程革命的第一步:让 Cursor 真正“听懂”你要做一款游戏
82 5
第一章 AI 编程革命的第一步:让 Cursor 真正“听懂”你要做一款游戏
|
15天前
|
人工智能 自然语言处理 机器人
AI也会"三思而后答"?揭秘Self-RAG智能检索术
遇到AI胡说八道怎么办?Self-RAG就像给AI装了个"思考开关",让它知道什么时候该查资料、什么时候该独立思考,还能自我评估答案靠不靠谱。6步智能决策机制,让AI回答又准又稳!#人工智能 #RAG技术 #智能检索 #AI应用
112 11
|
15天前
|
存储 编解码 分布式计算
阿里云服务器Arm计算架构解析:主要实例规格、性能特点、适用场景与价格参考
阿里云基于ARM架构的云服务器(倚天实例)依托自研倚天710 CPU与第四代神龙/CIPU架构,Arm计算架构以其低功耗、高效率的特点受到广泛关注。本文将为大家解析阿里云服务器Arm计算架构的技术特点、适用场景以及包年包月与按量付费的详细价格信息与最新活动价格情况,以供选择参考。
113 8
|
11天前
|
弹性计算 固态存储 关系型数据库
国内高性价比云服务器选型指南:阿里云低价机型配置与市场对比
今年,阿里云针对不同用户群体推出多款高性价比云服务器产品,覆盖轻量应用服务器与 ECS 实例,价格区间从 38 元 / 年至 160 元 / 月,适配个人开发、中小企业轻量业务等多种场景,具体核心机型信息如下: