使用 scroll-snap-type 在 Chrome 上双滚动网站
Website double-scrolling on Chrome using scroll-snap-type
我希望我的部分占据整个页面,并且一旦用户向上或向下滚动,previous/next 部分就会出现。它在 Firefox 和 Chromium-Edge 上完美运行,但是当我在 Chrome 上测试它时,它总是跳过一个部分(从第 1 部分到第 3 部分,然后从第 3 部分回到第 1 部分)。我该怎么做才能解决这个问题?
这里是 HTML:
<div class="page container">
<div class="section section1">
...
</div>
<div class="section section1">
...
</div>
<div class="section section2">
...
</div>
<div class="section section3">
...
</div>
</div>
这里是 CSS:
.container{
position: relative;
width: 100%;
height: 100vh;
overflow: auto;
/* Scroll Snap */
scroll-snap-type: y mandatory;
}
.section{
position: relative;
width: 100%;
height: 100%;
scroll-snap-align: start;
display: flex;
align-items: center;
justify-content: center;
}
如果有人想自己看的话,这里是网址:Open in Firefox and/or Chrome to see difference
绝对是 Chrome 中的错误。违规者似乎是 background-color
(!) 属性 设置在容器元素上。
由于某些莫名其妙的原因,它的存在会触发过度滚动……但仅限于 wheel
类滚动。键盘一(使用 KeyUp/Down 或 PageUp/Down)工作正常。
这是 SRE;尝试滚动页面,然后按 'Fix Chrome' 按钮,然后再滚动一次 - 看看有什么不同。在Chrome 86(Version 86.0.4240.111 (Official Build) (64-bit)
,准确地说),至少。
body {
margin: 0;
padding: 0;
overflow: hidden;
}
.break-things {
background-color: #f3f3f3;
}
.container {
position: relative;
width: 100%;
height: 100vh;
scroll-snap-type: y mandatory;
overflow-y: scroll;
}
.item {
scroll-snap-align: start;
font-size: 7rem;
height: 77vh;
}
.item1 {
background-color: blue;
}
.item2 {
background-color: yellow;
}
.item3 {
background-color: red;
}
<body>
<header><button type=button>FIX CHROME SCROLL SNAP</button></header>
<div class="container break-things">
<div class="item item1">Hello World</div>
<div class="item item2">Hello World</div>
<div class="item item3">Hello World</div>
</div>
<script>
let isChromeBroken = true;
document.querySelector('button').onclick = (ev) => {
isChromeBroken = !isChromeBroken;
ev.target.textContent = `${isChromeBroken ? 'FIX' : 'BREAK'} CHROME SCROLL SNAP`;
document.querySelector('.container').classList.toggle('break-things');
}
</script>
</body>
我在 Chrome 和 Windows 上的 Opera 中遇到了同样的问题(不是 Mac)。但是如果我让页面的每一块都可以水平滚动,问题就解决了。
正如 在他对这种情况的回答中所写,该错误仅在 wheel
事件上触发。但就我而言,它不依赖于任何背景参数。
目前我只找到了基于此的解决方案:
html {
scroll-snap-type: y mandatory;
}
.page {
position: relative;
scroll-snap-align: start;
height: 100vh;
overflow-x: auto;
}
.page::-webkit-scrollbar {
display: none
}
.page::before {
content: "";
position: absolute;
width: calc(100% + 1px);
height: 1px;
}
<div class="container">
<div class="page">
Page 1
</div>
<div class="page">
Page 2
</div>
<div class="page">
Page 3
</div>
<div class="page">
Page 4
</div>
</div>
下面的代码片段为我解决了这个问题。
var canScroll = true;
var scrollContainer = document.querySelector('html')
scrollContainer.addEventListener('wheel', function(e) {
if (canScroll) {
scrollContainer.scrollBy(0, e.deltaY);
canScroll = false;
setTimeout(() => {
canScroll = true;
}, 800);
}
e.preventDefault();
}, { passive: false });
html {
height: 100%;
scroll-snap-type: y mandatory;
scroll-behavior: smooth;
-ms-scroll-snap-type: mandatory;
}
div#section-1,div#section-2,div#section-3,div#section-4,div#section-5 {
padding: 0;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
font-family: 'LexiaLight';
width: 100%;
}
div#section-1, div#section-2, div#section-3, div#section-4, div#section-5 {
scroll-snap-align: start;
scroll-snap-stop: always;
}
div#section-1 {
background: #264653;
}
div#section-2 {
background: #2a9d8f;
}
div#section-3 {
background: #e9c46a;
}
div#section-4 {
background: #f4a261;
}
div#section-5 {
background: #e76f51;
}
div#section-1, div#section-2, div#section-3, div#section-4, div#section-5{
scroll-snap-align: start;
scroll-snap-stop: always;
}
<div id="section-1"></div>
<div id="section-2"></div>
<div id="section-3"></div>
<div id="section-4"></div>
<div id="section-5"></div>
这几乎让我崩溃:)
我简单地删除了 container
元素上的 background
属性 设置,它是固定的。
我希望我的部分占据整个页面,并且一旦用户向上或向下滚动,previous/next 部分就会出现。它在 Firefox 和 Chromium-Edge 上完美运行,但是当我在 Chrome 上测试它时,它总是跳过一个部分(从第 1 部分到第 3 部分,然后从第 3 部分回到第 1 部分)。我该怎么做才能解决这个问题?
这里是 HTML:
<div class="page container">
<div class="section section1">
...
</div>
<div class="section section1">
...
</div>
<div class="section section2">
...
</div>
<div class="section section3">
...
</div>
</div>
这里是 CSS:
.container{
position: relative;
width: 100%;
height: 100vh;
overflow: auto;
/* Scroll Snap */
scroll-snap-type: y mandatory;
}
.section{
position: relative;
width: 100%;
height: 100%;
scroll-snap-align: start;
display: flex;
align-items: center;
justify-content: center;
}
如果有人想自己看的话,这里是网址:Open in Firefox and/or Chrome to see difference
绝对是 Chrome 中的错误。违规者似乎是 background-color
(!) 属性 设置在容器元素上。
由于某些莫名其妙的原因,它的存在会触发过度滚动……但仅限于 wheel
类滚动。键盘一(使用 KeyUp/Down 或 PageUp/Down)工作正常。
这是 SRE;尝试滚动页面,然后按 'Fix Chrome' 按钮,然后再滚动一次 - 看看有什么不同。在Chrome 86(Version 86.0.4240.111 (Official Build) (64-bit)
,准确地说),至少。
body {
margin: 0;
padding: 0;
overflow: hidden;
}
.break-things {
background-color: #f3f3f3;
}
.container {
position: relative;
width: 100%;
height: 100vh;
scroll-snap-type: y mandatory;
overflow-y: scroll;
}
.item {
scroll-snap-align: start;
font-size: 7rem;
height: 77vh;
}
.item1 {
background-color: blue;
}
.item2 {
background-color: yellow;
}
.item3 {
background-color: red;
}
<body>
<header><button type=button>FIX CHROME SCROLL SNAP</button></header>
<div class="container break-things">
<div class="item item1">Hello World</div>
<div class="item item2">Hello World</div>
<div class="item item3">Hello World</div>
</div>
<script>
let isChromeBroken = true;
document.querySelector('button').onclick = (ev) => {
isChromeBroken = !isChromeBroken;
ev.target.textContent = `${isChromeBroken ? 'FIX' : 'BREAK'} CHROME SCROLL SNAP`;
document.querySelector('.container').classList.toggle('break-things');
}
</script>
</body>
我在 Chrome 和 Windows 上的 Opera 中遇到了同样的问题(不是 Mac)。但是如果我让页面的每一块都可以水平滚动,问题就解决了。
正如 wheel
事件上触发。但就我而言,它不依赖于任何背景参数。
目前我只找到了基于此的解决方案:
html {
scroll-snap-type: y mandatory;
}
.page {
position: relative;
scroll-snap-align: start;
height: 100vh;
overflow-x: auto;
}
.page::-webkit-scrollbar {
display: none
}
.page::before {
content: "";
position: absolute;
width: calc(100% + 1px);
height: 1px;
}
<div class="container">
<div class="page">
Page 1
</div>
<div class="page">
Page 2
</div>
<div class="page">
Page 3
</div>
<div class="page">
Page 4
</div>
</div>
下面的代码片段为我解决了这个问题。
var canScroll = true;
var scrollContainer = document.querySelector('html')
scrollContainer.addEventListener('wheel', function(e) {
if (canScroll) {
scrollContainer.scrollBy(0, e.deltaY);
canScroll = false;
setTimeout(() => {
canScroll = true;
}, 800);
}
e.preventDefault();
}, { passive: false });
html {
height: 100%;
scroll-snap-type: y mandatory;
scroll-behavior: smooth;
-ms-scroll-snap-type: mandatory;
}
div#section-1,div#section-2,div#section-3,div#section-4,div#section-5 {
padding: 0;
height: 100vh;
display: flex;
align-items: center;
justify-content: center;
font-family: 'LexiaLight';
width: 100%;
}
div#section-1, div#section-2, div#section-3, div#section-4, div#section-5 {
scroll-snap-align: start;
scroll-snap-stop: always;
}
div#section-1 {
background: #264653;
}
div#section-2 {
background: #2a9d8f;
}
div#section-3 {
background: #e9c46a;
}
div#section-4 {
background: #f4a261;
}
div#section-5 {
background: #e76f51;
}
div#section-1, div#section-2, div#section-3, div#section-4, div#section-5{
scroll-snap-align: start;
scroll-snap-stop: always;
}
<div id="section-1"></div>
<div id="section-2"></div>
<div id="section-3"></div>
<div id="section-4"></div>
<div id="section-5"></div>
这几乎让我崩溃:)
我简单地删除了 container
元素上的 background
属性 设置,它是固定的。