2020-08-05

吸顶效果

一、通过监听scroll事件,实现吸顶功能

吸顶效果的基本的开发思路,利用scroll事件进行监听scrollTop的值,当scrollTop达到一定的值得时候设置吸顶元素的position : fixed;属性

写入事件监听,监听滚动条。

js

mounted () {
   window.addEventListener('scroll', this.handleScroll);
},
destroyed(){
    window.removeEventListener('scroll', this.handleScroll);
},
methods: {
      handleScroll () {  
          this.$nextTick(() => {
              let scrollTop = document.documentElement.scrollTop || document.body.scrollTop;  
              let offsetTop = document.querySelector('#searchBar').offsetTop;
              if (scrollTop > offsetTop) {
                  this.searchBarFixed = true;
              } else {
                  this.searchBarFixed = false;
              }
          })
      }
}

css

.isFixed{
  position:fixed;
  top:0;
  left:0;
  width:100%;
  z-index:999;
}

在对应的标签中加入修改后的样式

<div id="searchBar" :class="searchBarFixed== true?'isFixed':''">

二 使用css 粘性定位 position: sticky; 属性实现

首先给需要吸顶效果的子元素 设置 position: sticky; top:0; 给父元素 添加 position :relative;

position:sticky; 在屏幕范围内 不受 left ,top 影响 ,当到元素接近偏移区域是 会 变成 fixed, 会自动固定在 top ,left 等 实现粘性吸顶!它之所以会出现,也是因为监听scroll事件来实现粘性布局使浏览器进入慢滚动的模式,这与浏览器想要通过硬件加速来提升滚动的体验是相悖的。

position: -webkit-sticky;//safari 里这样写

原生js 实现better-scroll效果,饿了么菜单内容联动,即粘即用

<!DOCTYPE html>
<html>

<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
</head>
<style>
    /*菜单容器样式,设置水平垂直居中,方便点击*/

    .menu {
        position: fixed;
        width: 200px;
        height: 200px;
        top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
    }

    /*菜单样式*/

    [href] {
        display: inline-block;
        width: 40px;
    }

    /*内容的样式*/

    [name] {
        display: block;
        width: 300px;
        height: 400px;
        border-top: 5px solid salmon;
    }

    /*菜单高亮的样式*/

    .active {
        font-size: 32px;
        background-color: chartreuse;
    }
</style>

<body>
    <!--内容容器-->
    <div class="content"></div>
    <!--菜单容器-->
    <div class="menu"></div>
</body>

</html>
<script>
    //初始化选择器,将获取到的element数组转化为数组对象
    function $(selector) {
        return Array.prototype.slice.call(document.querySelectorAll(selector)) //支持css3的选择器
    }

    //创建内容和菜单的DOM
    function createDom(attr) {
        var html = '';
        var temp = attr == 'href' ? '#' : '';
        for (var i = 1; i < 10; i++) {
            html += '<a ' + attr + '="' + (temp + i) + '">' + i + '</a>';
        }
        return html;
    }
    $('.content')[0].innerHTML = createDom('name')
    $('.menu')[0].innerHTML = createDom('href')
    //获取内容的偏移量(相对于浏览器顶部)
    var nameOffsets = $('[name]').map(function (v) {
        return v.offsetTop
    });

    // 
    var timer;
    window.onscroll = function (e) {
        if(timer){
          clearTimeout(timer)
        }  
        timer = setTimeout(function(){
          addLiScroll();
          timer = undefined;
        },200)
    }

    //滚动防抖
    function addLiScroll(){
      //获取当前页面相对于浏览器顶部的偏移量
      var pageOffset = window.pageYOffset;
      var abs = Math.abs; //获取绝对值函数
      //查找离当前浏览器顶部的偏移量最近的菜单锚点.
      var nearHash = nameOffsets.reduce(function (a, b) {
          return abs(a - pageOffset) > abs(b - pageOffset) ? b : a;
      })
      //获取菜单锚点
      var index = nameOffsets.indexOf(nearHash);
      //给菜单锚点添加 .active ,移除其他菜单元素的.active
      $('.active').forEach(function (v) {
          v.className = ''
      })
      $('[href]')[index].className = 'active'
    }
</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值