我非常喜欢 Sandwich 网站的设计。 在众多漂亮的特性中,这些带有彩虹下划线的标题会在您滚动时移动。 这不是滚动劫持——它只是一个小的设计特性,利用滚动位置来实现一点运动。

要绘制彩虹本身,我们可以使用带有硬停止的线性渐变,与在 CSS 中绘制条纹的概念相同。 这是一个很大的 CSS 代码块,这很好,但我看到他们选择了一个background-image
。 这是作为 SVG 的,大小为 661 字节(非常小)。 我们可以通过设置background-size
来限制高度并使用background-position
将其放置在底部,使其看起来像下划线。
我们将在内联元素上执行此操作,以便下划线在单词断开处断开
h1 {
span {
background-image: url(spectrum.svg);
background-repeat: repeat-x;
background-size: 100vw 0.2em;
background-position: left bottom 5px;
}
}
要对其进行动画处理,我们移动background-position-x
。 这不是一个特别高效的动画处理方法,但我们实际上并没有对其进行动画处理——它只是根据滚动位置移动。 而不是手动操作background-position-x
,我们将使用自定义属性设置它,然后使用 JavaScript 操作自定义属性。
background-position-x: var(--scrollPos);
在页面滚动时更新该变量非常简单
window.addEventListener("scroll", e => {
let scrollTop = document.body.scrollTop ? document.body.scrollTop : document.documentElement.scrollTop;
let newPos = scrollTop + "px";
document.documentElement.style.setProperty('--scrollPos', newPos);
});
它正在工作!
查看 CodePen 上 Chris Coyier 的
彩虹下划线(@chriscoyier)
在 CodePen 上。
看到我使用document.body
或document.documentElement
时那种有点生硬的行吗? 这是一个愚蠢的跨浏览器问题,其中“滚动元素”在 Safari 中与其他所有浏览器不同。
在执行此操作时,我了解到可以使用document.scrollingElement
来避免那里的痛苦。 我将在代码中添加关于此的注释,但保留原始行以备后用。
scrollingElement 在 Chrome 上运行没有问题,使用此行
let scrollTop = document.scrollingElement.scrollTop;
是的。 在文章的最后我说
太酷了。 谢谢
不错!
不错 :-) LGBT 网站应该默认使用它,哈哈
感谢这篇文章,祝您度过愉快的一天!
这真的很酷,但它确实属于滚动劫持,因为它使用 JS 监听滚动并在那里执行操作。
太可爱了。 感谢分享
SVG 可以减少近一半(降至 372 字节)
但即便如此,产生完全相同结果的 CSS 渐变也只有 136 字节
现场测试
我也认为最好使用 CSS 渐变。
如果我们倾斜彩虹背景并在其上方放置透明条,当我们滚动时,我们会产生彩虹正在移动的视觉错觉。
为了实现这一点,我们可以结合使用背景上的
box-sizing
(border-box
)和background-attachment: fixed;
以及透明的border-bottom
。我认为这应该具有响应性(使用线性渐变 [Ana 的解决方案])… https://codepen.io/maddesigns/pen/XWJvJeR