百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

还用 JavaScript 实现返回顶部?纯 CSS 轻松搞定!

liuian 2025-09-09 04:34 17 浏览

“返回顶部” 功能如今已经并不多见,但该技术可用于很好地学习两个现代 CSS 特性:

  • position: sticky
  • scroll-behavior: Smooth

其理念是为用户提供一个 “跳转链接”,以便快速滚回网站顶部,在博客等偏内容的场景非常常见。

1. 熟悉两个滚动的基础属性

1.1 position:sticky

position:sticky 的元素首先根据文档流进行定位,然后根据 top、right、bottom 和 left 的值相对其最近的滚动祖先元素 (Nearest Scrolling Ancestor) 和包含块元素(最近的块级祖先元素,包括表格)进行偏移,且偏移量不影响其他元素位置。

dt {
  margin: 0;
  padding: 2px 0 0 12px;
  position: -webkit-sticky;
  position: sticky;
  top: -1px;
}

position:sticky 始终会创建一个新的堆叠上下文,而且 sticky 元素会 “sticky” 在其最近的具有 “滚动机制”(overflow 为 hidden、scroll、 auto、overlay)的祖先元素上,即使该祖先元素并非最近的实际滚动祖先元素。

1.2 scroll-behavior: smooth

scroll-behavior: smooth 是一个非常新的 CSS 属性,支持率相对较低。其确切定义要求滚动行为(尤其是在锚点链接时)具有流畅的动画效果,而不是默认的、更不协调的即时跳转。

/* Keyword values */
scroll-behavior: auto;
scroll-behavior: smooth;
/* Global values */
scroll-behavior: inherit;
scroll-behavior: initial;
scroll-behavior: revert;
scroll-behavior: revert-layer;
scroll-behavior: unset;

该属性采用 “渐进式增强” 策略,即对于支持该属性的浏览器来说,其将提供更好的体验,但对于不支持该属性的浏览器也能保持底线。

目前,Chrome>=61、Edge>=79、Safari>=15.4、FireFox>=36、Opera>=48 等都支持该属性,但是 IE 全系列都不支持,caniuse 给出的浏览器整体支持率为 94.06%。

2. 构建返回顶部示例

2.1 创建基础的 HTML

下面是示例的 HTML 内容:

<header id="top">Title</header>
<main>
  <article>
    <!-- long form content here -->
  </article>
  <!-- Back to Top link -->
  <div class="back-to-top-wrapper">
    <a href="#top" class="back-to-top-link" aria-label="Scroll to Top"></a>
  </div>
</main>

代码将链接放在 <article> 之后,但在 <main > 标签内,其并非文章的明确组成部分,且希望其在焦点顺序中位于最后。

同时,还在 <header> 元素中添加了 id="top" ,并将该锚点用作返回顶部链接的 href 值。

2.2 添加 smooth-scrolling

此时为页面添加以下 CSS 样式:

// 如果用户对运动敏感度没有偏好,则可以平滑滚动
@media screen and (prefers-reduced-motion: no-preference) {
  html {
    scroll-behavior: smooth;
  }
}

prefers-reduced-motion 媒体功能用于检测用户是否在其设备上启用了相关设置以最大程度地减少不必要的动效,即希望移除、减少或替换界面中的动画。

此类动画可能会引发前庭运动障碍患者的不适,缩放或平移大型物体等动画可能会引发前庭运动障碍。

2.3 设置 “返回顶部” 链接的样式

接下来为链接添加基本的样式:

.back-to-top-link {
  display: inline-block;
  text-decoration: none;
  font-size: 2rem;
  line-height: 3rem;
  text-align: center;
  width: 3rem;
  height: 3rem;
  border-radius: 50%;
  background-color: #d6e3f0;
  padding: 0.25rem;
}

以上代码设置了一个非常基本的圆形按钮,同时从 HTML 结构可以看出,在链接的外面还添加了一个 back-to-top-wrapper 元素。

这是因为 position:sticky 会从元素在 DOM 中的位置拾取元素,然后根据 top 值将其相对视口定位。但是,由于将链接放在了文档末尾,因此如果没有一些辅助可能永远不会被拾取。

因此,示例使用 back-to-top-wrapper 包装器和 position:absolute 来将链接的位置调整到页面视觉上更高的位置。此时浏览器会使用新位置,即包装器进入视口时的位置来计算何时 “stick” 链接。

/* 在链接出现之前,<main> 页面内的滚动距离 */
$scrollLength: 100vh;
.back-to-top-wrapper {
  // 可以取消以下注释来可视化轨道
  // outline: 1px solid red;
  position: absolute;
  top: $scrollLength;
  right: 0.25rem;
  // 将最终链接延伸至, 页面底部的页脚
  // 设置为 `0` 表示在 `main` 的末尾停止
  bottom: -5em;
  width: 3em;
  pointer-events: none;
  // 防止包装器阻止文章内容被点击
}

此时链接与内容略微重叠,位于初始视口内容下方。接着可以给 <main> 添加样式来避免该问题,同时添加 position:relative:

main {
  // 为 “滚动轨道” 留出空间
  padding: 0 3rem;
  // 确保锚点包装器的 `absolute` 定位父元素为 <main>
  position: relative;
  max-width: 50rem;
  margin: 2rem auto;
}

最后,继续给链接添加定位所需的样式,使其完全正常工作:

.back-to-top-link {
  // 当不支持 `sticky` 时,`fixed` 打底
  position: fixed;
  // preferred positioning, requires prefixing for most support, and not supported on Safari
  // @link https://caniuse.com/#search=position%3A%20sticky
  position: sticky;
  // 恢复点击
  pointer-events: all;
  // 在视口内实现所需定位
  // 当 `sticky` 接管时,相对于视口顶部;或当使用 `fixed` 打底时,始终相对于视口顶部
  top: calc(100vh - 5rem);
}

回退到 fixed 则意味着不支持 sticky 定位的浏览器将始终显示链接。而当支持 sticky 定位时,链接在 $scrollLength 之前不会显示。使用 sticky 定位时,一旦包装器顶部位于视口内,链接就会 “卡住” 并随用户滚动。

下面是完整的 CSS 样式:

$color: #254568;
$main-width: 50rem;
$scrollLength: 100vh;
* {
  box-sizing: border-box;
}
@media (prefers-reduced-motion: no-preference) {
  html {
    scroll-behavior: smooth;
  }
}
main {
  padding: 0 3rem;
  position: relative;
  max-width: $main-width;
  margin: 2rem auto;
  *:last-child {
    margin-bottom: 0;
  }
}
.back-to-top-wrapper {
  position: absolute;
  top: $scrollLength;
  right: 0.25rem;
  bottom: -5em;
  width: 3em;
  pointer-events: none;
}
.back-to-top-link {
  position: fixed;
  position: sticky;
  pointer-events: all;
  top: calc(100vh - 5rem);
  display: inline-block;
  text-decoration: none;
  font-size: 2rem;
  line-height: 3rem;
  text-align: center;
  width: 3rem;
  height: 3rem;
  border-radius: 50%;
  padding: 0.25rem;
  border: 1px solid $color;
  background-color: scale-color($color, $lightness: 85%);
  transition: transform 80ms ease-in;
  &:hover,
  &:focus {
    transform: scale(1.1);
  }
  &:focus {
    outline: none;
    box-shadow: 0 0 0 3px scale-color($color, $lightness: 35%);
  }
}
body {
  font-family: "Baloo 2", sans-serif;
  min-height: 100vh;
  height: 100%;
  display: grid;
  grid-template-rows: auto 1fr auto auto;
  // Remove default browser margin
  margin: 0;
}

header,
footer {
  display: grid;
  place-items: center;
  background-color: $color;
  color: #fff;
}
header {
  background-image: url(https://images.unsplash.com/photo-1513628253939-010e64ac66cd?ixlib=rb-1.2.1&q=80&fm=jpg&crop=entropy&cs=tinysrgb&w=800&fit=max&ixid=eyJhcHBfaWQiOjE0NTg5fQ);
  background-position: center;
  background-size: cover;
  background-repeat: no-repeat;
}
h1 {
  font-size: 4rem;
  text-align: center;
}
p {
  font-size: 1.125rem;
  line-height: 1.5;
}

参考资料

声明:文章参考了 Stephanie Eckles 发表的《Pure CSS Smooth-Scroll "Back to Top"》,同时添加了自己的理解。

https://moderncss.dev/pure-css-smooth-scroll-back-to-top/

https://developer.mozilla.org/en-US/docs/Web/CSS/position

https://developer.mozilla.org/en-US/docs/Web/CSS/@media/prefers-reduced-motion

https://caniuse.com/?search=scroll-behavior%3A smooth

https://www.freecodecamp.org/news/css-only-back-to-top-button/

相关推荐

搭建一个20人的办公网络(适用于20多人的小型办公网络环境)

楼主有5台机上网,则需要一个8口路由器,组网方法如下:设备:1、8口路由器一台,其中8口为LAN(局域网)端口,一个WAN(广域网)端口,价格100--400元2、网线N米,这个你自己会看了:)...

笔记本电脑各种参数介绍(笔记本电脑各项参数新手普及知识)

1、CPU:这个主要取决于频率和二级缓存,频率越高、二级缓存越大,速度越快,现在的CPU有三级缓存、四级缓存等,都影响相应速度。2、内存:内存的存取速度取决于接口、颗粒数量多少与储存大小,一般来说,内...

汉字上面带拼音输入法下载(字上面带拼音的输入法是哪个)

使用手机上的拼音输入法打成汉字的方法如下:1.打开手机上的拼音输入法,在输入框中输入汉字的拼音,例如“nihao”。2.根据输入法提示的候选词,选择正确的汉字。例如,如果输入“nihao”,输...

xpsp3安装版系统下载(windowsxpsp3安装教程)

xpsp3纯净版在采用微软封装部署技术的基础上,结合作者的实际工作经验,融合了许多实用的功能。它通过一键分区、一键装系统、自动装驱动、一键设定分辨率,一键填IP,一键Ghost备份(恢复)等一系列...

没有备份的手机数据怎么恢复

手机没有备份恢复数据方法如下1、使用数据线将手机与电脑连接好,在“我的电脑”中可以看到手机的盘符。  2、将手机开启USB调试模式。在手机设置中找到开发者选项,然后点击“开启USB调试模式”。  3、...

电脑怎么激活windows11专业版

win11专业版激活方法有多种,以下提供两种常用的激活方式:方法一:使用激活密钥激活。在win11桌面上右键点击“此电脑”,选择“属性”选项。进入属性页面后,点击“更改产品密钥或升级windows”。...

华为手机助手下载官网(华为手机助手app下载专区)

华为手机助手策略调整,已不支持从应用市场下载手机助手,目前华为手机助手是需要在电脑上下载或更新手机助手到最新版本,https://consumer.huawei.com/cn/support/his...

光纤线断了怎么接(宽带光纤线断了怎么接)

宽带光纤线断了可以重接,具体操作方法如下:1、光纤连接的时候要根据束管内,同色相连,同芯相连,按顺序进行连接,由大到小。一般有三种连接方法,分别是熔接、活动连接和机械连接。2、连接的时候要开剥光缆,抛...

深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
  • 深度操作系统安装教程(深度操作系统安装教程图解)
win7旗舰版和专业版区别(win7旗舰版跟专业版)

1、功能区别:Win7旗舰版比专业版多了三个功能,分别是Bitlocker、BitlockerToGo和多语言界面; 2、用途区别:旗舰版的功能是所有版本中最全最强大的,占用的系统资源,...

万能连接钥匙(万能wifi连接钥匙下载)

1、首先打开wifi万能钥匙软件,若手机没有开启WLAN,就根据软件提示打开WLAN开关;2、打开WLAN开关后,会显示附近的WiFi,如果知道密码,可点击相应WiFi后点击‘输入密码’连接;3、若不...

雨林木风音乐叫什么(雨林木风是啥)

雨林木风的创始人是陈年鑫先生。陈年鑫先生于1999年创立了雨林木风公司,其初衷是为满足中国市场对高品质、高性能电脑的需求。在陈年鑫先生的领导下,雨林木风以技术创新、产品质量和客户服务为核心价值,不断推...

aics6序列号永久序列号(aics6破解序列号)

关于AICS6这个版本,虽然是比较久远的版本,但是在功能上也是十分全面和强大的,作为一名平面设计师的话,AICS6的现有的功能已经能够应付几乎所有的设计工作了……到底AICC2019的功能是不是...

win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
  • win7正在启动windows 卡住(win7正在启动windows卡住了 进入安全模式)
手机可以装电脑系统吗(手机可以装电脑系统吗怎么装)

答题公式1:手机可以通过数据线或无线连接的方式给电脑装系统。手机安装系统需要一定的技巧和软件支持,一般需要通过数据线或无线连接的方式与电脑连接,并下载相应的软件和系统文件进行安装。对于大部分手机用户来...