【PC端网页特效】05-侧边栏返回顶部案例和筋斗云案例

返回顶部

在这里插入图片描述

案例需求

在博客:案例:仿淘宝右侧固定侧边栏中已经实现了当滚动到一定位置,显示/隐藏“返回顶部”,这里接着做点击返回顶部即带有动画的回到顶部

案例实现

  1. window.scroll(x,y),滚动窗口至文档的特定位置
  2. 为”返回顶部”绑定事件,如果是a标签,则一定要将href属性值改为JavaScript:;(因为此处非选用锚点跳转)
  3. 通过将之前封装的动画函数animate.js修改实现:

只需要把所有的left相关的值改为跟页面垂直滚动距离相关就可以了
页面滚动了多少,可以通过window.pageYoffset得到

案例JS代码:

		var goBack = document.querySelector('.goBack');
 // 点击【返回顶部】模块,就让窗口滚动回最上方
        goBack.addEventListener('click', function () {
            moveTop(window, 0);
        })

          //页面垂直缓动的动画函数
          function moveTop(obj, target, callback) {
            // 清除多次点击后的定时器,保留最新的那一次
            clearInterval(obj.timer);
 
            //  使用obj.timer,把timer当作obj的属性,如果使用var timer = ,调用一次就会开辟一次内存空间
            obj.timer = setInterval(function () {
                //对步长向上取整,因为除以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();
                    }
                }
                //  只要还没到目标位置,就加上步长,继续走
               window.scroll(0,window.pageYOffset + step)
 
            }, 15);
        }
 

筋斗云案例

在这里插入图片描述

案例需求

  1. 鼠标移动到哪,筋斗云带有动画效果跟随移动;移出则回到原来位置
  2. 鼠标点击到哪云就停在哪

案例实现

在这里插入图片描述

案例代码:

<!DOCTYPE html>
<html lang="zh-cn">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            font-family: "SF Pro SC","SF Pro Text","SF Pro Icons","PingFang SC", Verdana, Arial, '微软雅黑','宋体';
        }
        .header{
            position: relative;
            width: 1226px;
            height: 48px;
            margin: 20px auto;
            background-color: rgb(232,231,227);
        
        }
        .nav{
            overflow: hidden;
            padding-left: 20px;
            /* 剩下44px */
            position: absolute;
            top: 0;
            left: 0;
          
          
           
            

        }
        .nav li{
            color: rgb(126,126,125);
            list-style-type: none;
            float: left;
            height: 48px;
            line-height: 48px;
            font-size: 14px;
            width: 166px;
         
          
           
        }
        .cloud{
            background-image: url(../../images/cloud.png);
            background-size: 100%;
            position: absolute;
            width: 166px;
            height: 66px;
            top: -23px;
            
            
            
   
        }
        /* .cloud img{
            width: 100%;
        } */

    </style>
</head>
<body>
    <div class="header-wrap">
        <div class="header">
            <span class="cloud"></span>
            <ul class="nav">
                <li>首页新闻</li>
                <li>师资力量</li>
                <li>活动策划</li>
                <li>企业文化</li>
                <li>招聘信息</li>
                <li>公司简介</li>
                <li>你是佩奇</li>
            </ul>
        </div>
    </div>

 <script>
    // 获取元素
    var nav = document.querySelector('.nav');
    var cloud = document.querySelector('.cloud');
    var lis = nav.querySelectorAll('li');
    // 给每个li注册事件
    var current = 0;//作为筋斗云的起始位置
    for(var i = 0; i<lis.length; i++){
        lis[i].addEventListener('mouseenter',function(){
            animate(cloud,this.offsetLeft);
        })
        lis[i].addEventListener('mouseleave',function(){
            animate(cloud,current);
        })

        lis[i].addEventListener('click',function(){
        // 鼠标点击,就把当前位置作为目标值
            current = this.offsetLeft;
           
        })
        
    }
    

    // 动画函数
    function animate(obj, target, callback) {
            //核心原理:js是动态语言,可以很方便的给对象加属性
            //还有一个问题就是,加了按钮后,如果不断点击按钮,元素运动得会越来越快,这是因为开启了多个定时器
            //解决方案就是先清除之前的定时器,只开启一个定时器
            clearInterval(obj.timer);
            obj.timer = setInterval(function () {
                //步长写在定时器里面
                //把步长值改为整数,不要出现小数的问题 往上取整
                var step = (target - obj.offsetLeft) / 10;
                step = step > 0 ? Math.ceil(step) : Math.floor(step);
                if (obj.offsetLeft == target) {
                    //停止动画,本质是停止定时器
                    clearInterval(obj.timer);
                    //回调函数写到定时器结束里面
                    if (callback) {
                        //调用函数
                        callback();
                    }
                }
                //通过步长公式
                obj.style.left = obj.offsetLeft + step + 'px';//offsetLeft用来获取位置,style用来赋值,注意加单位px
            }, 30);
        }


 </script>
</body>
</html>


  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值