不使用JavaScript的粘性定位(感谢CSS位置:粘性)

用户滚动到某个点时粘贴元素是现代Web设计中的常见模式。 您会看到它应用于顶部导航,侧边栏,共享链接或广告块; 在用户滚动时在视口中保持可见性。

从历史上看,我们需要JavaScript才能做到这一点。 但是,粘性行为已成为新的标准(CSS position: sticky ),使我们能够使用纯CSS达到效果。 让我们看看它是如何工作的!

粘性位置

stickyposition属性的新值,作为CSS3布局模块Spec的一部分添加。 它的作用类似于relative定位,因为它不会从文档流中删除任何内容。 换句话说,粘性元素不会影响相邻元素的位置,也不会折叠其父元素。

在下面的示例中,我们将#sidebar位置设置为stickytop: 10px 。 最高值是必需的,并指定元素粘贴到视口顶部边缘的距离。

#sidebar {
	position: -webkit-sticky;  // required for Safari
	position: sticky;
	top: 0; // required as well.
}

现在,当我们滚动页面时,当侧边栏到视口顶部的距离达到0 ,侧边栏应该会粘住,从而有效地为我们提供了fixed位置。 换句话说, stickyrelative位置和fixed位置之间的混合体。

套料

此外,CSS position: sticky将在滚动框或溢出元素中起作用。 这次,我们将top设置为15px ,以便在侧边栏固定放置时在侧边栏上方出更多空间(是的, 这是一个单词 )。

侧边栏将始终沿父级的高度保持粘性(即:当父级的底部到达侧边栏的底部时,它将再次“推”出页面)。

很简单,不是吗?

支持

在过去的几年中,浏览器对CSS位置的支持:sticky取得了巨大飞跃。 从图表中您会看到它具有出色的覆盖范围,尽管当CSS Sticky应用于<thead><tr>元素时,许多支持浏览器(例如Chrome和Edge,它们都使用Blink渲染引擎)仍然很<thead>

此外,如前所述,Safari提供了全面的支持,但需要使用-webkit-前缀。

使用Polyfill

为了帮助我们不支持的浏览器(不是有很多时下),我们可以使用stickyfill由奥列格Korsunsky开发。 该polyfill在各种情况下都能很好地工作。 无论指定的元素具有填充,边距,边框,是浮动的还是由诸如em和percent之类的相对单位形成的,polyfill都会准确地模仿CSS sticky位置行为。 使用stickyfill同样直观。

首先,获取stickyfill.js(如果您更熟悉并且更喜欢使用jQuery选择元素,则可以选择使用jQuery)。 在HTML文档中链接这些库。 然后使用指定的元素启动stickyfill,如下所示:

var sidebar = document.getElementById('sidebar');
Stickyfill.add(sidebar);

如果使用的是jQuery,则可以编写以下代码:

$('#sidebar').Stickyfill();

现在,我们的粘性侧边栏应该可以在包括Chrome和Opera在内的浏览器中使用。 polyfill足够聪明,它只能在不支持的浏览器中运行,否则将被完全禁用,不使用浏览器的本机实现。

注意事项

在您尝试并在网站上使用sticky位置之前,还需要注意其他几件事:

  • 首先,父容器的高度应大于粘性元素。
  • 该polyfill有其自身的缺点,因为它不能在溢出的盒子中工作。
  • 在写这篇文章的时候,有一个粘识别当元素被卡住没有特定JavaScript事件处理程序。 此类事件可能很有用,例如,在元素固定后(可能不是单词)添加其他类。 但是,可以使用Intersection Observer API来实现此目的。 阅读这篇文章以了解更多信息。

总结思想

如果您只需要简单的粘滞元素,则CSS粘滞位置是一种出色的工具。 如果您的需求超出此范围(例如,您想在粘性元素上添加一些奇特的效果),那么最好还是选择一个JavaScript解决方案,要么是自写的,要么选择像Waypoints.js这样 具有粘性的库模块

其他参考

学习CSS:完整指南

无论您是刚刚开始使用基础知识还是想探索更高级CSS,我们都已构建了完整的指南来帮助您学习 CSS。

翻译自: https://webdesign.tutsplus.com/tutorials/sticky-positioning-with-nothing-but-css--cms-24042

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
非常感谢您的提问!关于您的问题,以下是一个简单的示例代码: HTML: ```html <div class="navbar"> <a href="#">Home</a> <a href="#">About</a> <a href="#">Services</a> <a href="#">Contact</a> </div> <div class="content"> <p>Content goes here</p> </div> ``` CSS: ```css .navbar { background-color: #333; overflow: hidden; position: fixed; top: 0; width: 100%; } .navbar a { float: left; color: white; text-align: center; padding: 14px 16px; text-decoration: none; } .content { margin-top: 50px; } ``` JS: ```javascript window.onscroll = function() {stickyNavbar()}; var navbar = document.querySelector(".navbar"); var sticky = navbar.offsetTop; function stickyNavbar() { if (window.pageYOffset >= sticky) { navbar.classList.add("sticky"); } else { navbar.classList.remove("sticky"); } } ``` 在这个示例中,我们定义了一个 `navbar` 和一个 `content`,并将 `navbar` 设置为固定位置。然后,我们使用 JavaScript 监听滚动事件,当滚动到一定位置时,将 `navbar` 添加一个 `sticky` 类,这样就可以更改其样式,使其保持粘性。在 CSS 样式中,我们为粘性导航栏设置了背景颜色,并使用 `overflow: hidden` 隐藏溢出部分。当 `navbar` 添加了 `sticky` 类时,我们还可以为其添加样式,比如 `box-shadow` 或者改变其 `z-index` 值,以使其更加突出。 希望这个示例可以帮助您理解如何使用 JavaScript 更改样式以实现粘性导航栏的功能。如果您有任何其他问题,欢迎随时提问!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值