元素滚动scroll、动画函数封装

1元素滚动scroll系列

1.1 scroll概述

我们使用scroll系列的相关属性可以动态得到该元素的大小、滚动距离等。
在这里插入图片描述

1.2页面被卷去的头部

如果浏览器的高(或宽)度不足以显示整个页面时,会自动出现滚动条。当滚动条向下滚动时,页面上被隐藏掉的高度,我们就成为页面被卷去的头部,滚动条在滚动时会触发onscroll事件。

1.3 仿淘宝固定右侧侧边栏

<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>
    //获取banner和侧边元素
    let slider_bar = document.querySelector('.slider-bar')
    let banner = document.querySelector('.banner')

    //banner距离窗口顶端数值
    let bannerTop = banner.offsetTop

    //slider_bar距离窗口顶端数值
    let slider_barTop = slider_bar.offsetTop

    //侧边栏固定后距离顶端的数值
    let sliderbarTop = slider_bar.offsetTop - bannerTop

    let main = document.querySelector('.main')

    //主体距离窗口顶端的数值
    let mainTop = main.offsetTop

    let goBack = document.querySelector('.goBack')

    document.addEventListener('scroll', function () {
        //被卷入部分超过banner距离窗口顶端数值
        // window.pageYOffset 页面被卷去的头部
        if (window.pageYOffset >= bannerTop) {
            slider_bar.style.position = 'fixed'
            slider_bar.style.top = sliderbarTop + 'px'
        } else {
            slider_bar.style.position = 'absolute'
            slider_bar.style.top = '300px'
        }
        if(window.pageYOffset >= mainTop){
            goBack.style.display = 'block'
        }else{
            goBack.style.display = 'none'
        }
    })
</script>

2 三大系列总结

在这里插入图片描述

3mouseenter和mouseover的区别

mouseover鼠标经过自身盒子会触发,经过子盒子还会触发。mouseenter只会经过自身盒子触发。

4 动画函数封装

4.1动画实现原理

实现步骤
1、获得盒子当前位置
2、让盒子在当前位置加上1个移动距离
3、利用定时器不断重复这个操作
4、加一个结束定时器的条件
5、注意此元素需要添加定位。才能使用element.style.left

<div></div>

<script>
    let div = document.querySelector('div')

    let time = setInterval(function(){
        if(div.offsetLeft>=500){
            clearInterval(time)
        }
        div.style.left = div.offsetLeft + 1 + 'px'
    },10)
</script>

4.2 动画函数给不同元素记录不同定时器

function animate(obj, target) {
        // 当我们不断的点击按钮,这个元素的速度会越来越快,因为开启了太多的定时器
        // 解决方案就是 让我们元素只有一个定时器执行
        // 先清除以前的定时器,只保留当前的一个定时器执行
        clearInterval(obj.timer);
        obj.timer = setInterval(function() {
            if (obj.offsetLeft >= target) {
                // 停止动画 本质是停止定时器
                clearInterval(obj.timer);
            }
            obj.style.left = obj.offsetLeft + 1 + 'px';

        }, 30);
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

春花.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值