CSS 视差滚动网站中的滚动条造成的间隙

Gap created by scrollbar in CSS parallax scrolling sites

我是 Keith Clark 纯粹的 CSS 视差技术的忠实粉丝,并且已经在我自己的一个网站上使用它并取得了一些成功。然而最近,我注意到背景视差元素 even in his own demo 并没有紧靠屏幕的左侧,而是留下了一个间隙,间隙的大小取决于 3D 中的距离 space它们被渲染。

据我所知,罪魁祸首是滚动条。这个滚动条 应该 在那里(在父视差 div 内),但它在父容器的大小(其中 3d space 被渲染)和容器的视差子项的大小,这为该间隙留出了空间。我在 Chrome、Firefox 和 Safari 的最新版本中看到了它(尽管我可以发誓一年前我没有在那里看到它)。

这可以通过对每个视差组或层应用 width: 100vw 规则来解决。但是,虽然这消除了差距,但它使元素与视图的默认中心不对齐(因此任何没有应用 100vw 规则的元素)。我也想要一个尽可能遵守 'pure CSS' 原则的解决方案。

HTML 取自 Keith Clark 的例子:

<div class="parallax">
  <div class="parallax__group">
    <div class="parallax__layer parallax__layer--base">
      <div>Base Layer</div>
    </div>
    <div class="parallax__layer parallax__layer--back">
      <div>Background Layer</div>
    </div>
  </div>
</div>

CSS:

.parallax { // parent, page-level container
    height: 500px;
    height: 100vh;
    overflow-x: hidden;
    overflow-y: auto;
    -webkit-perspective: 300px;
    perspective: 300px;
    -webkit-perspective-origin-x: 100%;
    perspective-origin-x: 100%;
}

.parallax__group {
    position: relative;
    height: 500px;
    height: 100vh;
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d;
}

.parallax__layer {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    -webkit-transform-origin-x: 100%;
    transform-origin-x: 100%;
}

.parallax__layer--base {
    -webkit-transform: translateZ(0);
    transform: translateZ(0);
    z-index: 4;
}

.parallax__layer--back {
    -webkit-transform: translateZ(-300px) scale(2);
    transform: translateZ(-300px) scale(2);
    z-index: 3;
}

我想出了一些解决方案并将它们放入此处的示例网站中:https://dawaltconley.github.io/parallax-gap-fix/

问题似乎只出现在某些系统滚动条上,当用户插入 USB 鼠标(我是如何找到它们的)或将 Show scroll bars 更改为 [=12= 时,这些滚动条出现在 OSX 上] 在他们的设置中。与透明触控板不同,此滚动条会更改视差页面元素的内部宽度,但不会更改总大小,其中呈现视差元素的 3D space。

perspective-origintransform-origin 属性更改为 left 可重新对齐视差元素而不调整任何大小。这将是理想的解决方案,除了 Safari 似乎计算 3D space 与大多数现代浏览器不同,并且需要将这些属性设置为 center 以正确对齐所有内容。

我找到的适用于所有浏览器的最佳解决方案是将以下规则添加到 .parallax__group 元素:

    .parallax__group {
        margin-left: calc(100% - 100vw);
        margin-right: calc(100% - 100vw);
        padding-left: calc(100vw - 100%);
        padding-right: calc(100vw - 100%);
    }

100vw100% 之间的区别,来自 .parallax 元素的任何直接子元素,是滚动条的宽度。将负右边距设置为该宽度会将视差元素扩展到与页面相同的宽度,从而消除屏幕边缘的间隙。将此设置为左边距会稍微拉伸元素,但需要将 3D 的中心 space 与页面其余部分的中心对齐。

应该可以通过对 .parallax__layout class 应用类似的规则来抵消这种膨胀,但是 Safari 的不一致性使这变得困难,因为非膨胀的元素需要对齐 完美 避免布局中的间隙。

顺便说一下,这个解决方案的优点是当有问题的滚动条不存在时它什么都不做。在那种情况下,100vw100% 之间没有区别,因此计算出的样式与 Kieth Clark 的相同。