固定页眉、页面内链接和重叠内容,我的天!

Avatar of Chris Coyier
Chris Coyier 发表于

DigitalOcean 为您旅程的每个阶段提供云产品。开始使用 200 美元的免费赠金

让我们看一个基本的页面内链接

<a href="#section-two">Section Two</a>

点击后,浏览器将滚动到具有该 ID 的元素:<a href="#section-two">第二部分</a>。这几乎和浏览器本身一样古老的浏览器功能。

但是,一旦使用 position: fixed;,它就变成了一个问题。浏览器仍然会跳转以使新目标元素进入视野,但该元素可能会被固定位置元素遮挡,这对于 用户体验 来说非常糟糕。

近 10 年前,我称之为 “撞击浏览器窗口”,并介绍了一些可能的解决方案。Nicolas Gallager 记录了五种不同的技术。我什至在 CSS-Tricks 的 v17 版本中使用了固定位置的页眉,而且我不太喜欢其中任何一种技术。我有点放弃了,并在所有 <h3> 元素中添加了顶部填充,这足以容纳页眉。

但是有一种新方法!终于!

Šime Vidas 在 Web Platform News 中记录了这一点。作为 CSS 滚动捕捉 的一部分,有许多 CSS 属性可以一起使用,但事实证明 scroll-paddingscroll-margin 可以在滚动捕捉容器之外使用。

html {
  scroll-padding-top: 70px; /* height of sticky header */
}

当这篇文章首次发表时,它只适用于 Chrome,但随着我在 2021 年 4 月更新这篇文章,它也适用于 Firefox 和 Safari!

Hiroyuki Ikezoe 写信告诉我,<body> 不是使用 scroll-padding 的正确位置,因为 document.scrollingElement 实际上是 <html>。不幸的是,Chrome(v73)的实现方式是它目前只能在 <body> 上工作,但已经提交了一个错误报告,并且可能的结果是它将不再在 <body> 上工作,而只在 <html> 上工作。这与 原生规范的自定义滚动条 情况相同:它们只在 <html> 上工作。