• 返回顶部案例


    1. 带有动画的返回顶部

    2. 此时可以继续使用我们封装的动画函数

    3. 只需要把所有的left 相关的值改为 跟 页面垂直滚动距离相关就可以了

    4. 页面滚动了多少,可以通过 window.pageYOffset 得到

    5. 最后是页面滚动,使用 window.scroll(x,y)

      //1. 获取元素
           var sliderbar = document.querySelector('.slider-bar');
           var banner = document.querySelector('.banner');
           // banner.offestTop 就是被卷去头部的大小 一定要写到滚动的外面
           var bannerTop = banner.offsetTop
               // 当我们侧边栏固定定位之后应该变化的数值
           var sliderbarTop = sliderbar.offsetTop - bannerTop;
           // 获取main 主体元素
           var main = document.querySelector('.main');
           var goBack = document.querySelector('.goBack');
           var mainTop = main.offsetTop;
           // 2. 页面滚动事件 scroll
           document.addEventListener('scroll', function() {
                   // console.log(11);
                   // window.pageYOffset 页面被卷去的头部
                   // console.log(window.pageYOffset);
                   // 3 .当我们页面被卷去的头部大于等于了 172 此时 侧边栏就要改为固定定位
                   if (window.pageYOffset >= bannerTop) {
                       sliderbar.style.position = 'fixed';
                       sliderbar.style.top = sliderbarTop + 'px';
                  } else {
                       sliderbar.style.position = 'absolute';
                       sliderbar.style.top = '300px';
                  }
                   // 4. 当我们页面滚动到main盒子,就显示 goback模块
                   if (window.pageYOffset >= mainTop) {
                       goBack.style.display = 'block';
                  } else {
                       goBack.style.display = 'none';
                  }

              })
               // 3. 当我们点击了返回顶部模块,就让窗口滚动的页面的最上方
           goBack.addEventListener('click', function() {
               // 里面的x和y 不跟单位的 直接写数字即可
               // window.scroll(0, 0);
               // 因为是窗口滚动 所以对象是window
               animate(window, 0);
          });

    修改后的动画函数:

     // 把所有的left 相关的值改为 跟 页面垂直滚动距离相关
           function animate(obj, target, callback) {
               // 清除以前的定时器,只保留一个定时器
               clearInterval(obj.timer);
               obj.timer = setInterval(function () {
                   // 步长值写到定时器里面
                   // 步长需要取整 以免出现小数
                   // var step = Math.cell((target - obj.offsetLeft) / 10);
                   // 页面滚动了多少,可以通过 window.pageYOffset 得到
                   var step = (target - window.pageYOffset) / 10;
                   // 正数就向上取整,负数就向下取整
                   step = step > 0 ? Math.ceil(step) : Math.floor(step);
                   // 移动到指定位置就停止动画
                   if (window.pageYOffset == target) {
                       // 停止动画 本质是停止定时器
                       clearInterval(obj.timer);
                       // if (callback) {
                       //     callback();
                       // };
                       callback && callback();
                  }
                   //把每次加1这个步长值改为一个慢慢变小的值 步长公式: (目标值-现在的位置) / 10
                   // obj.style.left = obj.offsetLeft + step + 'px';
                   // 页面滚动,使用 window.scroll(x,y)
                   window.scroll(0, window.pageYOffset + step);
              }, 15);
          }

     

    星辰ꦿ.大海
  • 相关阅读:
    LeetCode 183. Customers Who Never Order (从不订购的客户)
    LeetCode 182. Duplicate Emails (查找重复的电子邮箱)
    LeetCode 181. Employees Earning More Than Their Managers (超过经理收入的员工)
    LeetCode 176. Second Highest Salary (第二高的薪水)
    CMake Tutorial
    osx c++连接mysql
    为mysql 表重新设置自增的主键id
    更改pandas dataframe 列的顺序
    会场安排问题
    nlpir分词器过期处理
  • 原文地址:https://www.cnblogs.com/xc-dh/p/13760590.html
Copyright © 2020-2023  润新知