你好,我是喵喵侠。我最近遇到了一个问题,就是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>
e.preventDefault()
除了可以阻止默认的浏览器滚动事件外,还可以用来阻止某些元素的默认行为。例如:
e.preventDefault()
,那么表单不会被提交。<a>
标签时,浏览器会跳转到 href
属性指定的地址。调用 e.preventDefault()
可以阻止这种跳转。e.preventDefault()
来阻止这种行为。虽然在某些情况下,return false
也能阻止默认行为,但它还会停止事件传播,也就是事件里面,这一行后面的语句都不执行了。而e.preventDefault()
仅仅阻止默认行为,而不阻止事件传播。
浏览器的滚动事件需要用preventDefault() 来阻止,这个事件写在某个页面元素上不会影响该元素的正常滚动。这是个小问题,记录一下,方便下次遇到又忘记了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。