实现滚动列表时,每块区域的标签自动吸附在顶部

3 篇文章 0 订阅

目录

前言

原理

如何实现

效果展现


前言

之前比方说做通讯录,要实现页面往下滚动时,始终要在滚动区域的顶部固定显示该区域属于什么字母开头的标签,然后滚动到下一个字母区域,切换显示下一个字母。我都是用js来判断并实现的,特别麻烦。今天刷抖音时看到实现这一个效果的视频,发现只要css就能实现,遂测试并记录下来

原理

以下摘自菜鸟教程:

position: sticky; 基于用户的滚动位置来定位。

粘性定位的元素是依赖于用户的滚动,在 position:relative 与 position:fixed 定位之间切换。

它的行为就像 position:relative; 而当页面滚动超出目标区域时,它的表现就像 position:fixed;,它会固定在目标位置。

元素定位表现为在跨越特定阈值前为相对定位,之后为固定定位。

这个特定阈值指的是 top, right, bottom 或 left 之一,换言之,指定 top, right, bottom 或 left 四个阈值其中之一,才可使粘性定位生效。否则其行为与相对定位相同。

本人理解:

给需要置顶的div设置:position: sticky;top:0;   那么当列表滚动时,它就会实现置顶效果;而当它的父元素即将滚动出祖先元素的范围时,它会取消置顶效果,跟随父元素向上滚动。

当然它的祖先元素就需要设置overflow、overflow-y:auto、scroll,否则无法实现该效果

注意: Internet Explorer, Edge 15 及更早 IE 版本不支持 sticky 定位。 Safari 需要使用 -webkit- prefix (查看以下实例)。

如何实现

HTML:

<div class="main">
      <dl>
        <dt>这是标签A</dt>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
      </dl>
      <dl>
        <dt>这是标签B</dt>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
      </dl>
      <dl>
        <dt>这是标签C</dt>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
      </dl>
      <dl>
        <dt>这是标签D</dt>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
      </dl>
      <dl>
        <dt>这是标签E</dt>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
      </dl>
      <dl>
        <dt>这是标签F</dt>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
        <dd>标签栏粘贴效果</dd>
      </dl>
    </div>

css:

.main{
        position: fixed;
        width: 80%;
        height: 70vh;
        top: 50px;
        left: 50%;
        transform: translate(-50%,0);
        overflow-y: scroll;
      }
      dl{
        border: 1px solid #ccc;
      }
      dt{
        position: sticky;
        top: 0;
        color: white;
        background-color: rgb(53, 50, 50);
      }
      dd,dt{
        padding: 0 10px;
        border-bottom: 1px solid #ccc;
      }

效果展现

开始滚动前:

 滚动后:

 

A标签即将离开区域:

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,可以通过以下HTML和CSS代码实现: ```html <!-- navbar.html --> <div id="navbar"> <ul> <li><a href="#">影院</a></li> <li><a href="#">电影</a></li> <li><a href="#">个人中心</a></li> </ul> </div> <div id="content"> <!-- 此处为页面主体内容 --> </div> ``` ```css /* navbar.css */ #navbar { position: relative; top: 200px; background-color: #f2f2f2; padding: 10px 0; box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); } #navbar ul { margin: 0; padding: 0; list-style: none; display: flex; justify-content: center; } #navbar li { margin: 0 20px; } #navbar a { text-decoration: none; color: #333; font-weight: bold; } #navbar.fixed { position: fixed; top: 0; left: 0; right: 0; } ``` 这段代码创建了一个导航栏,包含三个选项:影院、电影和个人中心。导航栏初始状态距离页面顶部200px,当页面滚动到导航栏顶部,导航栏会自动吸附顶部不会消失。CSS代码中的.fixed类定义了导航栏固定在页面顶部的样式,当页面滚动到导航栏顶部,通过JavaScript代码动态添加.fixed类即可实现导航栏固定的效果。 ```javascript // navbar.js window.addEventListener("scroll", function() { var navbar = document.getElementById("navbar"); var content = document.getElementById("content"); if (window.pageYOffset >= navbar.offsetTop) { navbar.classList.add("fixed"); content.style.paddingTop = navbar.offsetHeight + "px"; } else { navbar.classList.remove("fixed"); content.style.paddingTop = 0; } }); ``` 这段JavaScript代码监听窗口的滚动事件,当滚动距离大于等于导航栏距离页面顶部的距离,通过添加.fixed类实现导航栏固定。同,为了避免页面内容被导航栏遮挡,需要设置页面主体内容的paddingTop值为导航栏的高度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值