html - CSS视差滚动站点中滚动条创建的间隙
问题描述
我是 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;
}
解决方案
我想出了一些解决方案并将它们放入示例网站:https ://dawaltconley.github.io/parallax-gap-fix/ 。
问题似乎只出现在某些系统滚动条上,当用户插入 USB 鼠标(我如何找到它们)或更改其设置时,这些滚动条会出现在 OSXShow scroll bars
上Always
。与透明触控板不同,此滚动条会更改视差页面元素的内部宽度,但不会更改总大小,其中呈现视差元素的 3D 空间。
更改perspective-origin
和transform-origin
属性以left
重新对齐视差元素而不调整任何大小。这将是理想的解决方案,除了 Safari 计算 3D 空间的方式似乎与大多数现代浏览器不同,并且需要将这些属性设置为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%);
}
100vw
与元素100%
的任何直接子元素之间的区别.parallax
是滚动条的宽度。将负右边距设置为该宽度会将视差元素扩展为与页面相同的宽度,从而消除屏幕边缘的间隙。将此设置为左边距会使元素的拉伸超出必要的程度,但需要将 3D 空间的中心与页面其余部分的中心对齐。
应该可以通过对类应用类似的规则来抵消这种膨胀.parallax__layout
,但 Safari 的不一致使这变得困难,因为非膨胀的元素需要完美对齐以避免布局中的间隙。
顺便说一句,这个解决方案的优点是当有问题的滚动条不存在时它什么都不做。100vw
在这种情况下,和之间没有区别100%
,因此计算的样式与 Kieth Clark 的相同。
推荐阅读
- python - 不重复字符的最长子串的长度
- ios - 如何访问我在不同文件中定义的方法?
- grails - grails 4.0.3 集成测试:如果 setup() 调用另一种方法保存到数据库,则更改不会持久
- python - 如何在模拟器中从下载中选择图像?
- html - Flexbox 不包装内容
- command-prompt - 如何使用命令提示符将解析的数据组织到表中?
- docker - Traefik 与 nip.io
- html - Flex 不会将两个 div 包装在同一行中
- mysql - mysql 容器无法启动 - 无法初始化 DD 存储引擎
- python - 使用 Python 从 CSV 插入或更新 MongoDB 中的文档