长话短说,在Chrome(81.0.4044.138(上,出于某种原因,滚动捕捉会跳过中间<div class="item2">
。在火狐(76.0.1(上,它工作正常。知道为什么吗?
html {
scroll-snap-type: y mandatory;
}
body {
margin: 0;
padding: 0;
overflow-x: hidden;
overflow-y: scroll;
}
div {
height: 100vh;
scroll-snap-align: center;
}
.item1 {
background-color: blue;
font-size: 5rem;
}
.item2 {
background-color: yellow;
font-size: 5rem;
}
.item3 {
background-color: red;
font-size: 5rem;
}
<body class="container">
<div class="item1">Hello World</div>
<div class="item2">Hello World</div>
<div class="item3">Hello World</div>
</body>
实际上,Chrome浏览器中有一个关于它的错误(其背后的原因直到现在还不清楚,所以没有人知道为什么(。因此,您不能直接将scroll-snap-type
应用于html
(同时将其应用于body
也不起作用(标记。因此,为了使其工作,您应该创建另一个div
并将元素包装在其中,而不是它。
所以试试这个:
body {
margin: 0;
padding: 0;
overflow: hidden;
}
.container {
scroll-snap-type: y mandatory;
overflow-y: scroll;
}
div {
height: 100vh;
scroll-snap-align: center;
}
.item1 {
background-color: blue;
font-size: 5rem;
}
.item2 {
background-color: yellow;
font-size: 5rem;
}
.item3 {
background-color: red;
font-size: 5rem;
}
<body>
<div class="container">
<div class="item1">Hello World</div>
<div class="item2">Hello World</div>
<div class="item3">Hello World</div>
</div>
</body>
注意:CSS 技巧中存在相同的问题。
这是我经过一段时间修补后提出的解决方法。 希望这有帮助!
const scrollContainer = document.querySelector('.container')
// don't forget to add "scroll-behavior: smooth;" to the .container CSS
scrollContainer.onwheel = function(event) {
// use scrollBy using the deltaY just as a direction
// the exact value is not important because of "scroll-snap-type: y mandatory;"
scrollContainer.scrollBy(0, event.deltaY);
// this will stop the original scroll event.
return false;
};
body {
margin: 0;
padding: 0;
overflow: hidden;
}
.container {
scroll-snap-type: y mandatory;
scroll-behavior: smooth;
overflow-y: scroll;
}
div {
height: 100vh;
scroll-snap-align: center;
}
.item1 {
background-color: blue;
font-size: 5rem;
}
.item2 {
background-color: yellow;
font-size: 5rem;
}
.item3 {
background-color: red;
font-size: 5rem;
}
<body>
<div class="container">
<div class="item1">Hello World</div>
<div class="item2">Hello World</div>
<div class="item3">Hello World</div>
</div>
</body>
在子元素上使用滚动-捕捉-停止:always。