zoukankan      html  css  js  c++  java
  • Web APIs---14. PC端网页特效(4)

    案例1:返回顶部


    在之前函数的基础上添加的第五部分

    <body>
        <div class="slider-bar">
            <span class="goBack">返回顶部</span>
        </div>
        <div class="header w">头部区域</div>
        <div class="banner w">banner区域</div>
        <div class="main w">主体部分</div>
        <script>
            //1. 获取元素
            var sliderbar = document.querySelector('.slider-bar');
            var banner = document.querySelector('.banner');
            //被卷去头部的大小  一定要写在滚动的外面
            var bannerTop = banner.offsetTop; //offsetTop返回元素相对于带有定位的父元素的上方的偏移
    
            //改为固定定位后侧边栏会跳一下,这是由于侧边栏样式中的top: 300px;导致的。解决方案如下:
            var sliderbarTop = sliderbar.offsetTop - bannerTop;
    
            //获取元素
            var main = document.querySelector('.main');
            var goBack = document.querySelector('.goBack');
    
            var mainTop = main.offsetTop;
            console.log(mainTop);
    
    
            //2. 添加页面滚动事件  页面滚动所以必须为document添加
            document.addEventListener('scroll', function() {
                    //window.pageYOffset 页面被卷去的头部
                    // console.log(window.pageYOffset); //检测得到172px的时候比较适合 将侧边栏改为固定定位
                    //3. 当banner滚动到页面顶部时,侧边栏改为固定定位
                    if (window.pageYOffset >= bannerTop) {
                        sliderbar.style.position = 'fixed';
                        //改为固定定位后侧边栏会跳一下,这是由于侧边栏样式中的top: 300px;导致的。解决方案如下:
                        sliderbar.style.top = sliderbarTop + 'px';
                    } else {
                        sliderbar.style.position = 'absolute';
                        sliderbar.style.top = '300px'; //变成绝对定位后再将top值复原为300px
                    }
    
                    //4.当main滚动到页面顶部时,侧边栏出现返回顶部字样
                    if (window.pageYOffset >= mainTop) {
                        goBack.style.display = 'block';
                    } else {
                        goBack.style.display = 'none';
                    }
                })
                //5.当我们点击了返回顶部模块,就让窗口滚动到页面的最上方
            goBack.addEventListener('click', function() {
                //
                window.scroll(0,0);
            })
        </script>
    </body>
    

    上述代码中,点击返回顶部页面是刷的一下就返回了顶部,现在希望返回顶部的过程柔和一点,添加返回顶部动画animate.js


    但是需要对animate.js做一系列修改:

    • 盒子左右走改为页面上下滚动:将obj.offsetLeft修改为window.pageYOffset。
    • 盒子移动的位置改为页面滚动到的位置:将obj.style.left修改为window.scroll(x,y)
    <body>
        <div class="slider-bar">
            <span class="goBack">返回顶部</span>
        </div>
        <div class="header w">头部区域</div>
        <div class="banner w">banner区域</div>
        <div class="main w">主体部分</div>
        <script>
            //1. 获取元素
            var sliderbar = document.querySelector('.slider-bar');
            var banner = document.querySelector('.banner');
            //被卷去头部的大小  一定要写在滚动的外面
            var bannerTop = banner.offsetTop; //offsetTop返回元素相对于带有定位的父元素的上方的偏移
    
            //改为固定定位后侧边栏会跳一下,这是由于侧边栏样式中的top: 300px;导致的。解决方案如下:
            var sliderbarTop = sliderbar.offsetTop - bannerTop;
    
            //获取元素
            var main = document.querySelector('.main');
            var goBack = document.querySelector('.goBack');
    
            var mainTop = main.offsetTop;
            console.log(mainTop);
    
    
            //2. 添加页面滚动事件  页面滚动所以必须为document添加
            document.addEventListener('scroll', function() {
                //window.pageYOffset 页面被卷去的头部
                // console.log(window.pageYOffset); //检测得到172px的时候比较适合 将侧边栏改为固定定位
                //3. 当banner滚动到页面顶部时,侧边栏改为固定定位
                if (window.pageYOffset >= bannerTop) {
                    sliderbar.style.position = 'fixed';
                    //改为固定定位后侧边栏会跳一下,这是由于侧边栏样式中的top: 300px;导致的。解决方案如下:
                    sliderbar.style.top = sliderbarTop + 'px';
                } else {
                    sliderbar.style.position = 'absolute';
                    sliderbar.style.top = '300px'; //变成绝对定位后再将top值复原为300px
                }
    
                //4.当main滚动到页面顶部时,侧边栏出现返回顶部字样
                if (window.pageYOffset >= mainTop) {
                    goBack.style.display = 'block';
                } else {
                    goBack.style.display = 'none';
                }
            })
    
            //5.当我们点击了返回顶部模块,就让窗口滚动到页面的最上方
            goBack.addEventListener('click', function() {
                // window.scroll(0, 0);
                animate(window, 0); //
            })
    
    
            //缓动动画函数
            function animate(obj, target, callback) {
                // console.log(callback);  callback = function() {}  调用的时候 callback()
    
                // 先清除以前的定时器,只保留当前的一个定时器执行
                clearInterval(obj.timer);
                obj.timer = setInterval(function() {
                    // 步长值写到定时器的里面
                    // 把我们步长值改为整数 不要出现小数的问题
                    // var step = Math.ceil((target - obj.offsetLeft) / 10);
                    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 = window.pageYOffset + step + 'px';
                    window.scroll(0, window.pageYOffset + step);
                }, 15);
            }
        </script>
    </body>
    
    //window.pageXOffset,window.pageYOffset     类似于元素的ele.offfsetTOP,ele.offfsetLeft
    //window.scroll(x,y)    类似于元素的ele.style.left,ele.style.top
    

    案例2:筋斗云案例

    • 案例需求
    • 案例分析
    • 结构代码
    <body>
        <div id="c_nav" class="c-nav">
            <span class="cloud"></span>
            <ul>
                <li class="current"><a href="#">首页新闻</a></li>
                <li><a href="#">师资力量</a></li>
                <li><a href="#">活动策划</a></li>
                <li><a href="#">企业文化</a></li>
                <li><a href="#">招聘信息</a></li>
                <li><a href="#">公司简介</a></li>
                <li><a href="#">我是佩奇</a></li>
                <li><a href="#">啥是佩奇</a></li>
            </ul>
        </div>
    </body>
    
    • JS代码
    <script src="animate.js"></script>
    <script>
        window.addEventListener('load', function() {
            //1. 获取元素
            var cloud = document.querySelector('.cloud');
            var c_nav = document.querySelector('.c-nav');
            var lis = c_nav.querySelectorAll('li');
            //2. 给所有的小li绑定事件
            //current作为筋斗云的起始位置
            var current = 0;
            for (var i = 0; i < lis.length; i++) {
                //(1)鼠标经过把 当前小li的位置作为目标值target
                lis[i].addEventListener('mouseenter', function() {
                    animate(cloud, this.offsetLeft);
                });
                //(2)鼠标离开就复原为当前位置
                lis[i].addEventListener('mouseleave', function() {
                    animate(cloud, current);
                });
                //(3)当我们鼠标点击,就把当前的位置作为目标值
                lis[i].addEventListener('click', function() {
                    current = this.offsetLeft;
                });
            }
        })
    </script>
    
  • 相关阅读:
    Qt QSqlquery结果集使用——size()函数无法返回结果集个数
    Bootstrap 响应式珊格布局
    Bootstrap navbar使用
    UML 类图之间关系
    QMessageBox 主要用法
    QT QString 与 int 转化
    Qt 连接数据库失败 QSqlDatabase: QMYSQL driver not loaded
    数据库使用问题 mysqld.sock找不到
    操作系统(二)--操作系统概述
    操作系统(一)--计算机系统概述
  • 原文地址:https://www.cnblogs.com/deer-cen/p/12310668.html
Copyright © 2011-2022 走看看