热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

纯粹的CSS平滑滚动"回到顶部"(附实例)

纯粹的CSS平滑滚动回到顶部(附实例)-返回顶部链接最近可能不常使用,但有两个现代CSS特性,该技术很好地展示了这一点:position:stickyscroll-beh

"返回顶部 "链接最近可能不常使用,但有两个现代CSS特性,该技术很好地展示了这一点:

  • position: sticky
  • scroll-behavior: smooth

我第一次爱上 "返回顶部 "链接--然后学会了如何用jQuery做这些链接--是在2011年最华丽的网站之一。Web Designer Wall。

这个想法是为用户提供一个 "跳转链接 "来滚动到网站的顶部,这在以前的博客中经常使用。

下面是我们要学习实现的内容:

关于position: sticky

这个较新的位置值在caniuse上有如下描述。

将元素定位为 "固定 "或 "相对",取决于它在视口中的显示方式。结果是,在滚动时,元素在必要时被 "卡住"。

caniuse数据的另一个重要说明是,你将需要提供它的前缀,以获得最佳支持。我们的演示将回落到position: fixed ,这将实现主要目标,只是不那么优雅。

关于scroll-behavior: smooth#

这是一个非常新的属性,而且支持率相对较低。这个确切的定义要求滚动行为,特别是在选择一个锚定链接时,有一个平滑的动画外观,而不是默认的、更刺耳的即时跳转。

使用它可以提供 "渐进式增强",这意味着对于那些浏览器支持它的人来说,这将是一个更好的体验,但对于那些不支持它的浏览器来说,它也可以发挥作用。

令人惊讶的是,Safari在这方面的支持是落后的,但其他主要浏览器都支持。

设置舞台:基本内容HTML

首先,我们需要为基本内容格式设置一些语义标记:

Title

我们把我们的链接放在article 之后,但在main 。它并不是文章的具体组成部分,而且我们还希望它在焦点顺序中处于最后。

我们还将id="top" 添加到 ,并将该锚点作为返回顶部链接的href 值。如果你只想滚动到

的顶部,你可以移动这个id,或者也可以把它附加到靠近页面顶部的一个现有id上。

添加平滑滚动#

我们的目标的第一部分很简单,通过下面的CSS规则就可以实现。

/* Smooth scrolling IF user doesn't have a preference due to motion sensitivities */
@media screen and (prefers-reduced-motion: no-preference) {
  html {
    scroll-behavior: smooth;
  }
}

我发现了一些奇怪的现象,比如当你访问一个在URL中包含#anchor 的页面时,它仍然会执行平滑滚动,这对于你的情况来说可能并不理想。

为 "返回顶部 "链接设计样式

在我们让它发挥作用之前,让我们对链接进行一些基本的样式设计。为了好玩,我使用了一个表情符号,但你也可以换成一个SVG图标,以便对样式进行更多的控制:

.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;
  /* emoji don't behave like regular fonts
     so this helped position it correctly */
  padding: 0.25rem;
}

这给了我们一个非常基本的圆形按钮。在完整的Codepen中,我已经添加了额外的 "漂亮 "样式和:hover:focus ,但这些都不是必要的。

接下来,你可能想知道为什么我们要为这个链接添加一个包装器。原因是我们需要用它来创建一个 "滚动轨道",让链接生活在其中。

position: sticky 的设计方式是,它从元素在DOM中的位置拾取它。然后,它尊重一个 "top "值,将其置于相对于视口的位置。然而,我们把链接放在了文档的最后,所以如果没有一些帮助,它基本上不会被选中。

我们将使用包装器和position: absolute ,以改变链接的位置,使其在页面上的视觉效果更高。值得庆幸的是,浏览器会使用这个视觉上的调整位置--也就是它进入视口的时间--来计算何时 "粘 "住链接。

因此,我们的包装样式看起来像这样:

/* How far of a scroll travel within 
prior to the link appearing */ $scrollLength: 100vh; .back-to-top-wrapper { // uncomment to visualize "track" // outline: 1px solid red; position: absolute; top: $scrollLength; right: 0.25rem; // Optional, extends the final link into the // footer at the bottom of the page // Set to `0` to stop at the end of `main` bottom: -5em; // Required for best support in browsers not supporting `sticky` width: 3em; // Disable interaction with this element pointer-events: none; }

最后一个定义对你来说可能也是新的:pointer-events: none 。这实质上是让点击等交互事件 "穿过 "这个元素,这样它就不会阻塞文档的其他部分。例如,我们不希望这个包装器意外地阻塞内容中的链接。

有了这个,我们现在可以看到链接在初始视口内容的下面有一点重叠。让我们在

,以防止这种重叠,同时添加position: relative ,这对于绝对链接包装器的最佳效果来说是必要的:

main {
  // leave room for the "scroll track"
  padding: 0 3rem;
  // required to make sure the `absolute` positioning of
  // the anchor wrapper is indeed `relative` to this element vs. the body
  position: relative;
  max-width: 50rem;
  margin: 2rem auto;

  // Optional, clears margin if last element is a block item
  *:last-child {
    margin-bottom: 0;
  }
}

剩下的就是重新访问该链接,为定位添加必要的样式,使其完全发挥作用:

.back-to-top-link {
  // `fixed` is fallback when `sticky` not supported
  position: fixed;
  // preferred positioning, requires prefixing for most support, and not supported on Safari
  // @link https://caniuse.com/#search=position%3A%20sticky
  position: sticky;
  // reinstate clicks
  pointer-events: all;
  // achieves desired positioning within the viewport
  // relative to the top of the viewport once `sticky` takes over, or always if `fixed` fallback is used
  top: calc(100vh - 5rem);

  // ... styles written earlier
}

fixed 的回退意味着不支持sticky 定位的浏览器将始终显示该链接。当支持sticky ,就会发生完全理想的效果,即链接不会出现,直到通过$scrollLength 。在sticky ,一旦包装器的顶部进入视口,链接就会被 "卡住",随用户滚动。

请注意,我们还用all 的值恢复了pointer-events ,这样与链接的交互才会真正发挥作用。

已知问题

如果你有简短的内容,在较短的设备视口上,这不会很优雅地失败。你可能会想--就像我一样--使用overflow: hidden 。但不幸的是,这使得position: sticky 完全无法工作☹️ 所以在一个 "真实世界 "的场景中,你可能不得不提供一个选项来切换每篇文章的行为,或者在将文章注入模板之前执行一个计算来确定它是否符合长度要求。

如果你知道或发现这些方法有任何其他的 "问题",请留言。


推荐阅读
  • 本文介绍了绕过WAF的XSS检测机制的方法,包括确定payload结构、测试和混淆。同时提出了一种构建XSS payload的方法,该payload与安全机制使用的正则表达式不匹配。通过清理用户输入、转义输出、使用文档对象模型(DOM)接收器和源、实施适当的跨域资源共享(CORS)策略和其他安全策略,可以有效阻止XSS漏洞。但是,WAF或自定义过滤器仍然被广泛使用来增加安全性。本文的方法可以绕过这种安全机制,构建与正则表达式不匹配的XSS payload。 ... [详细]
  • 使用圣杯布局模式实现网站首页的内容布局
    本文介绍了使用圣杯布局模式实现网站首页的内容布局的方法,包括HTML部分代码和实例。同时还提供了公司新闻、最新产品、关于我们、联系我们等页面的布局示例。商品展示区包括了车里子和农家生态土鸡蛋等产品的价格信息。 ... [详细]
  • 本文由编程笔记#小编为大家整理,主要介绍了css回到顶部按钮相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 使用HTML创建弹出框以便用户输入信息
    在做项目的过程中,我们时常需要进行一些弹框操作,比如在后台管理时需要进行的一些增删改操作,这个时候我们需要使用到弹框,或者在 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 第8章 使用外部和内部链接
    8.1使用web地址LearnAboutafricanelephants. ... [详细]
  • 我用Tkinter制作了一个图形用户界面,有两个主按钮:“开始”和“停止”。请您就如何使用“停止”按钮终止“开始”按钮为以下代码调用的已运行功能提供建议 ... [详细]
  • 基于jquery实现简单的分页控件_jquery
    前台分页控件有很多,这里分享我的分页控件pagination.js1.0版本,该控件基于jquery。先来看一下预览效果: ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • 本文讨论了在Spring 3.1中,数据源未能自动连接到@Configuration类的错误原因,并提供了解决方法。作者发现了错误的原因,并在代码中手动定义了PersistenceAnnotationBeanPostProcessor。作者删除了该定义后,问题得到解决。此外,作者还指出了默认的PersistenceAnnotationBeanPostProcessor的注册方式,并提供了自定义该bean定义的方法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • css自适应字体样式?如果是一排文字,一个background‘red’;就搞定了。是多行的话,只有根据文字行高,用一张背景图横向重复。css样式自适应分辨率高度和宽度尽量使用百分 ... [详细]
  • 使用浏览器的主滚动条 ... [详细]
  • JavaScript实现拖动对话框效果
    原标题:JavaScript实现拖动对话框效果代码实现:<!DOCTYPEhtml><htmllan ... [详细]
  • packagecom.lihong.DDPush.pms;importcom.lihong.DDPush.mybatis.Parser;importorg.junit.Test;impor ... [详细]
author-avatar
诸暨巴黎婚纱
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有