You signed in with another tab or window.
Reload
to refresh your session.
You signed out in another tab or window.
Reload
to refresh your session.
You switched accounts on another tab or window.
Reload
to refresh your session.
By clicking “Sign up for GitHub”, you agree to our
terms of service
and
privacy statement
. We’ll occasionally send you account related emails.
Already on GitHub?
Sign in
to your account
html、body 的部分样式组合,会导致
getScrollEventTarget
方法获取到错误的滚动容器元素,进而导致
scroll
事件监听失败
考虑
html
、
body
的
height
、
overflow-scroll
可能出现的场景组合,对
scroll
的事件触发,做如下测试
测试机列表
iOS 12.3.1
vivo 手机:VivoBrowser 5.6.3.2 Android 5.1.1、VivoBrowser 5.5.1.1 Android 6.0.01
三星手机: SanmsungBrowser 5.0 Andriod 7.0
乐视手机:EUI Browser 2.9.9199 Android 6.0
锤子手机:Android 7.1.1
监听 scroll 事件
window.addEventListener('scroll', () => {
console.log('window scroll');
});
document.documentElement.addEventListener('scroll', () => {
console.log('html scroll');
});
document.body.addEventListener('scroll', () => {
console.log('body scroll');
});
1. 默认场景
html, body {
height: auto;
overflow: auto;
2. 设置 html 滚动
html {
height: 100%;
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
3. 设置 body 滚动
html, body {
height: 100%;
body {
overflow-y: scroll;
-webkit-overflow-scrolling: touch;
4. 设置 html、body 都滚动 ⚠️⚠️
html, body {
height: 100%;
overflow-y: scroll;
body {
-webkit-overflow-scrolling: touch;
在 场景1
、场景2
、场景3
都只会触发 window 的 scroll 事件,所以通过 getScrollEventTarget
获取到 window 也没什么问题
但在 场景 4
中,只会触发 body 的 scroll 事件,所以通过 getScrollEventTarget
应该返回的是 body,而现在返回的是 window,导致在组件内绑定 scroll 事件无效,进一步导致了 van-list
在滚动时,无法触发 onload 事件
同样的,如果有用户设置了类似 场景4
的样式,还需要验证下是否会导致 van-tabs
、van-popup
、van-index-bar
、van-pull-refresh
组件也会出现类似的问题
场景 1:符合预期
场景 2:也算符合预期。根据 http://w3help.org/zh-cn/causes/SD9013 文章的内容 ,给人感觉滚动条是 window 的,而不是 html 的
场景 3:这个没想明白。感觉它和 场景2
类似,滚动条也像是 window 的。设置以下 css 后,可以发现滚动条确实像是 window 的,而不是 body 的
html {
height: 100vh;
margin: 0 100px;
body {
height: 50vh;
overflow-y: scroll;
场景 4:个人认为这个符合预期,不算是浏览器的 bug ,我比较倾向 getScrollEventTarget
兼容这种场景
感觉这个 overflow-y: scroll
和 对html与body的一些研究与理解 文章里提到的 background
属性类似,即:
当只设置 html { overflow-y: scroll }
或 只设置 body { overflow-y: scroll }
时,滚动条及 scroll 事件都是直接作用到 window
上的。只有同时设置 html, body { overflow-y: scroll }
时,body 才会拥有滚动条和事件
@chenjiahan 貌似这个修改让新版本的 vant 在 1, 4 的情况都拿不到 window 为滚动容器,导致 sticky 没办法吸顶。
https://codesandbox.io/s/competent-cdn-i8xbm?file=/src/App.vue
我觉得应该要把 overflow 的 scroll
和 auto
在 body/html 上面要分开处理,不能够用一个正则来统一确定是否为滚动容器。