前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >滑动头部固定,要不也了解下?

滑动头部固定,要不也了解下?

作者头像
IMWeb前端团队
发布2019-12-03 17:57:18
5260
发布2019-12-03 17:57:18
举报
文章被收录于专栏:IMWeb前端团队IMWeb前端团队

本文作者:IMWeb 气势的信心 原文出处:IMWeb社区 未经同意,禁止转载

前言

最近公司事情比较少,正好早上有人问我那个滑动粘着头部不动的怎么实现,我想了半天,前几天刚刚写过,那就记录一下咯。于是,女朋友送了我一张图

output_1536301166.gif
output_1536301166.gif

抛思路

其实思路还蛮简单的,监听容器div的滚动时间,及每个需要fixed的高度,滑到这个对应高度了,fixed住就行了。可能有点笼统,我们结合代码说吧。 今天我们从基本的template-script-style模式来贴代码好了 [图片上传失败...(image-444c6e-1536305058022)]

template
代码语言:javascript
复制
<!--滑动的容器-->
<div class="scroll-div">
    <!--一个头部加一个item的容器-->
    <div class="for-class" v-for="item in baseArray">
        <!--需要fixed住的头部,id为获取具体位置使用,可替换成ref
        绑定class实现添加fixed样式作用-->
        <div class="info-line"
             :id="item.idName"
             :class="{fiexd_line:fiexdItem===item.fiexdItem}">
             {{item.name}}
        </div>
     <!--下方的item,这里与本文关系不到,可忽略-->
     <div class="detail-container" 
          :class="{margin_top:fiexdItem===1000}">
          <div class="detail-item"
               v-for="sub_item in item.list"
               @click="setLocation(sub_item)">
               {{sub_item}}
          </div>
    </div>
</div>
style

然后是css部分,这里用了scss的写法,具体是什么,自行百度或谷歌,其中只列出了有关的样式,剩余部分用...省略

代码语言:javascript
复制
.scroll-div {
      width: 100%;
      overflow: auto;
      ...
    }
    .info-line {
     ...
     //这个都不是特别重要
    }
    .fiexd_line {
      position: fixed;
      width: 100%;
      ...
    }
script

重头戏来了,我们一步一步顺清楚。 1.数据初始化 2.事件监听 3.逻辑判断

数据初始化
代码语言:javascript
复制
具体的数据可根据实际情况修改,这里的数据以效果图为准
//添加A-Z数组
let baseAtoZArray = [];//生成A-Z的字母
for (let i = 65; i < 91; i++) {
    baseAtoZArray.push(String.fromCharCode(i));
}
//均分数组并添加相应的数据,每个子数组最多有7个元素
this.baseArray = [...chunk(baseAtoZArray, 7)];
for (let item of this.baseArray) {
    this.baseArray[this.baseArray.indexOf(item)] = {
        name: item.join(''),//显示的文本
        idName: `${item[0]}2${item[item.length - 1]}-line`,//唯一id,es6模版字符串和下方的...运算符了解下
        fiexdItem: this.baseArray.indexOf(item),//fixed标识
        list: this.getRegList(item[0], item[item.length - 1]),//符合该条件的下方内容,与本文关系不大
    };
}
//添加期望工作城市与热门城市
this.baseArray = [
{
    name: '期望工作城市',
    idName: `base-line`,
    fiexdItem: 1000,
    list: [this.location],
},
{
    name: '热门城市',
    idName: `hot-line`,
    fiexdItem: 100,
    list: this.$config.HOT_CITIES,
},...this.baseArray];
事件监听+逻辑判断
代码语言:javascript
复制
//监听滚动事件
//界面加载完成后,将每一层header距离头部的距离记录下来
for (let item of that.baseArray) {
    item.top = $('#' + item.idName).offset().top
}
$('.scroll-div').on('scroll', function () {
    //对每一项数据监测
    for (let item of that.baseArray) {
        if (this.scrollTop  > item.top - 20) {
            //因为在同一高度中,只可能有一个header,所以设置一个,其他header不匹配,然后duang的一下符合条件的就fixed住了
            that.fiexdItem = item.fiexdItem;
        }
    }
});

代码就这么多,主要是数据准备上以及获取上要下点功夫,还有很多需要优化的地方,骚年们加油吧,在这里我就给你们喊:

output_1536301131.gif
output_1536301131.gif

效果图

image
image

后话

最近产出有点多,希望能对大家有所帮助

9150e4e5ly1fmlapax9n4g206o06o74e.gif
9150e4e5ly1fmlapax9n4g206o06o74e.gif

好了,要被老板拖过去搬砖了,下次见,有空点点github嘛。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-09-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 抛思路
    • template
      • style
        • script
          • 数据初始化
          • 事件监听+逻辑判断
      • 效果图
      • 后话
      相关产品与服务
      容器服务
      腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档