1. <script>
    2. //1. 获取元素
    3. var sliderbar = document.querySelector('.slider-bar');
    4. var banner = document.querySelector('.banner');
    5. // banner.offestTop 就是被卷去头部的大小 一定要写到滚动的外面
    6. var bannerTop = banner.offsetTop
    7. // 当我们侧边栏固定定位之后应该变化的数值
    8. var sliderbarTop = sliderbar.offsetTop - bannerTop;
    9. // 获取main 主体元素
    10. var main = document.querySelector('.main');
    11. var goBack = document.querySelector('.goBack');
    12. var mainTop = main.offsetTop;
    13. // 2. 页面滚动事件 scroll
    14. document.addEventListener('scroll', function() {
    15. // console.log(11);
    16. // window.pageYOffset 页面被卷去的头部
    17. // console.log(window.pageYOffset);
    18. // 3 .当我们页面被卷去的头部大于等于了 172 此时 侧边栏就要改为固定定位
    19. if (window.pageYOffset >= bannerTop) {
    20. sliderbar.style.position = 'fixed';
    21. sliderbar.style.top = sliderbarTop + 'px';
    22. } else {
    23. sliderbar.style.position = 'absolute';
    24. sliderbar.style.top = '300px';
    25. }
    26. // 4. 当我们页面滚动到main盒子,就显示 goback模块
    27. if (window.pageYOffset >= mainTop) {
    28. goBack.style.display = 'block';
    29. } else {
    30. goBack.style.display = 'none';
    31. }
    32. })
    33. // 3. 当我们点击了返回顶部模块,就让窗口滚动的页面的最上方
    34. goBack.addEventListener('click', function() {
    35. // 里面的x和y 不跟单位的 直接写数字即可
    36. // window.scroll(0, 0);
    37. // 因为是窗口滚动 所以对象是window
    38. animate(window, 0);
    39. });
    40. // 动画函数
    41. function animate(obj, target, callback) {
    42. // console.log(callback); callback = function() {} 调用的时候 callback()
    43. // 先清除以前的定时器,只保留当前的一个定时器执行
    44. clearInterval(obj.timer);
    45. obj.timer = setInterval(function() {
    46. // 步长值写到定时器的里面
    47. // 把我们步长值改为整数 不要出现小数的问题
    48. // var step = Math.ceil((target - obj.offsetLeft) / 10);
    49. var step = (target - window.pageYOffset) / 10;
    50. step = step > 0 ? Math.ceil(step) : Math.floor(step);
    51. if (window.pageYOffset == target) {
    52. // 停止动画 本质是停止定时器
    53. clearInterval(obj.timer);
    54. // 回调函数写到定时器结束里面
    55. // if (callback) {
    56. // // 调用函数
    57. // callback();
    58. // }
    59. callback && callback();
    60. }
    61. // 把每次加1 这个步长值改为一个慢慢变小的值 步长公式:(目标值 - 现在的位置) / 10
    62. // obj.style.left = window.pageYOffset + step + 'px';
    63. window.scroll(0, window.pageYOffset + step);
    64. }, 15);
    65. }
    66. </script>