我是 Keith Clark 的纯 CSS 视差技术的忠实粉丝,并且在我自己的一个网站上使用它并取得了一些成功。然而,最近我注意到,即使在他自己的演示中,背景视差元素也不会紧靠屏幕左侧,而是留有间隙,其大小取决于它们在 3D 空间中渲染的距离。
据我所知,罪魁祸首是滚动条。这个滚动条应该在那里(在父视差 div 内),但它会在父容器(渲染 3d 空间的地方)的大小和容器的视差子容器的大小之间产生差异,从而为那个差距。我在最新版本的 Chrome、Firefox 和 Safari 中看到了它(尽管我可以发誓我甚至一年前都没有看到它)。
这可以通过width: 100vw
对每个视差组或层应用规则来解决。但是,虽然这消除了差距,但它会使元素与视图的默认中心不对齐(因此对于没有100vw
应用规则的任何元素)。我还想要一个尽可能遵循“纯 CSS”原则的解决方案。
取自 Keith Clark 示例的 HTML:
<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;
}