注意:scrollbar-gutter: stable;
特性在 Safari 浏览器中不受支持。此外,该问题仅在 Chrome 中出现,而在 Firefox 中表现如预期。
在使用 scrollbar-gutter: stable
属性尝试将元素固定到视口位置时,我观察到了一些异常行为。
当页面存在滚动条或启用了 stable
模式的滚动条凹槽时,理论上屏幕的总宽度应考虑滚动条/凹槽的宽度并从中减去,以确保例如 right: 0;
的定位不会位于滚动条之后,而是始于滚动条的起始边缘。
然而,在我的示例代码中,宽度计算似乎忽略了滚动条凹槽,提供的全宽尺寸就像没有滚动条凹槽存在一样。这导致红色的 div 无法正确居中,而黄色的 div 则被放置在了滚动条之后(甚至遮挡了一部分文本)。
在我的代码片段中,当你点击屏幕时,div 的宽度会被输出到控制台。你将看到,最初它显示的是正确的宽度,已考虑了滚动条凹槽。但是,没有任何明显的原因,在第二次点击时,宽度突然改变,得到了不正确的值。这是为什么?又该如何解决呢?
<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false">
<div class="snippet-code">
<pre class="snippet-code-js lang-js"><code>const test = document.querySelector(".container");
document.addEventListener("click", () => console.log(test.clientWidth))</code></pre>
<pre class="snippet-code-css lang-css"><code>html {
scrollbar-gutter: stable;
}
.container {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: skyblue;
}
.test1 {
position: fixed;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 10rem;
height: 10rem;
background: salmon;
}
.test2 {
position: fixed;
right: 0;
top: 0;
height: 50%;
width: 4.5rem;
background: yellow;
}</code></pre>
<pre class="snippet-code-html"><code><div class="container">
<div class="test1"></div>
<div class="test2">Some text example</div>
</div></code></pre>
</div>
</div>