CSS 高雅的锚点滚动跳转

米阳 2020-5-16 541 5/16

页面锚点,也叫跳转链接,是实现页面内导航的简单方法。比如,目录可以利用锚点链接,让读者直接跳转到页面中的不同部分。

简易的锚点

要创建一个页面锚点,只需要给一个元素添加一个 id  属性。就这么简单!你可以用各种元素作为页面锚点,但最常见的是使用标题。

<h1 id="my-anchor">页面锚点</h1>

现在,你可以使用 #  加 id  作为 href  来链接到页面锚点。

<a href="#my-anchor">跳转到页面锚点</a>

作为锚点链接的 href  属性,有两个特殊值:#top  或者简单的 #,它们的作用相同,都会跳转到页面的最顶部。不需要为它们创建页面锚点。

让我们看看这些锚点链接的实际效果。

演示  https://codersblock.com/assets/demos/anchor-links/basic

在演示中,你可以看到,点击锚点链接会在页面 URL 中添加一个哈希值(例如:#my-anchor),这个哈希值可以复制并用来直接链接到页面锚点。

现在,让我们看看添加一些 CSS 会带来什么效果。

添加平滑滚动

在之前的演示中,跳转到页面锚点是瞬间完成的,这可能会让人感到有点突兀。幸运的是,我们只需要用 CSS 就可以实现平滑滚动。

html {
  scroll-behavior: smooth;
}

现在,再来试试这些锚点链接。

演示  https://codersblock.com/assets/demos/anchor-links/smooth

添加滚动距离

到目前为止,我们的锚点链接将页面锚点滚动到视窗的最顶部。如果在锚点上面留点空白,是不是会更美观呢?我们可以通过在页面锚点上设置 scroll-margin-top 来实现。

h1 {
  scroll-margin-top: 40px;
}

这样,视窗顶部和页面锚点之间就会留出 40px 的空间。来试试看。

演示  https://codersblock.com/assets/demos/anchor-links/smooth-and-margin

当你的页面有固定头部时,这个技巧非常有用,可以让页面锚点稍微向下偏移,避免被固定头部遮挡。

添加目标页面锚点样式

你可以使用 CSS 的 :target  伪类,为跳转到的页面锚点添加样式。

h1:target {
  color: #71a819; /* 绿色 */
}

在这个演示中,点击 “跳转到页面锚点”  会启用上面的 CSS,使页面锚点文本变成绿色。点击 “跳转回顶部”  会取消 <h1> 的目标状态,所以文本不再是绿色。

演示  https://codersblock.com/assets/demos/anchor-links/smooth-and-margin-and-styling

更炫的锚点样式

我们可以用 :target 做更多事情,不只是改变文字颜色。下面这个演示会高亮显示内容区域,并让“返回顶部”链接动画进入视野。

演示  https://codersblock.com/assets/demos/anchor-links/fancier-styling

以下是一些 HTML 代码,展示了页面的基本结构。

<nav>
  <a href="#kiwis">奇异果</a>
  <a href="#limes">青柠</a>
  <a href="#pears">梨</a>
</nav>

<article>
  <h1 id="kiwis">奇异果</h1>
  <p><!-- 关于奇异果的介绍 --></p>
</article>

<!-- 更多文章元素在这里 -->

<a class="back-to-top" href="#top">返回顶部</a>

文章高亮效果是通过下面的 CSS 实现的。

/* 边框最初是透明的 */
article {
  border: 3px solid transparent;
}

/* 当目标 h1 在文章内部时,边框会变为绿色 */
article:has(h1:target) {
  border-color: #71a819;
}

下面是显示/隐藏“返回顶部”链接的 CSS。

.back-to-top {
  /* 将链接固定在右上角 */
  position: fixed;
  top: 10px;
  right: 10px;

  /* 链接最初淡出并移出视窗的右侧 */
  opacity: 0;
  translate: calc(100% + 10px);

  /* 0.5 秒的过渡时间 */
  transition: all 0.5s;
}

/* 当 body 中存在目标 h1 时,链接淡入并移入视野 */
body:has(h1:target) .back-to-top {
  opacity: 1;
  translate: 0px;
}

嵌套滚动

到目前为止,所有示例都只有一个滚动容器:页面本身。但你可能遇到过嵌套滚动容器的情况,例如,页面中有一个可滚动的 <div> 元素。如果你在一个嵌套滚动容器中放置一个页面锚点,指向它的锚点链接会滚动所有必要的容器,将目标元素滚动到视野内。很酷吧!

下面是一个演示。注意滚动位置可能有点偏差,因为还没有添加 scroll-margin。我们将在下一节解释原因。

演示  https://codersblock.com/assets/demos/anchor-links/nested-scroll-without-padding

滚动边距VS滚动填充

现在让我们解决滚动位置问题。之前我们使用过 scroll-margin-top,但在 Chrome 和 Edge 中,它在这里不起作用。滚动边距不会扩展到嵌套滚动容器之外。

幸运的是,还有另一种方法可以解决这个问题。我们可以使用 scroll-padding 而不是 scroll-margin。它们的效果类似,但区别在于:

  • scroll-margin  应用于页面锚点。
  • scroll-padding  应用于滚动容器。

让我们用一些 scroll-padding 更新演示。

html {
  scroll-padding-top: 130px;
}

.slide-container {
  scroll-padding-inline: 20px;
}

这样,页面顶部就会有一些较大的滚动填充,按钮会一直保持在视野中。它还在可滚动的 <div> 元素上添加了一些内联(左右)滚动填充,因此每个幻灯片在滚动容器中居中。

演示  https://codersblock.com/assets/demos/anchor-links/nested-scroll-with-padding

 

 

- THE END -
Tag:

米阳

8月07日09:49

最后修改:2024年8月7日
0

非特殊说明,本博所有文章均为博主原创。