web前端总结-js(10)

学习目标:

1.offset系列
2.动画实现原理
3.简单动画封装函数
4.给不同对象添加不同的定时器
5.缓动动画
6.回调函数
7.引用animate动画函数
8.常见的网页特效案例
9.轮播图制作
10.筋斗云案例

学习内容:

1.offset系列
1)offset得到的是元素的偏移位置,返回不带单位的数值
2)它以带有定位的父亲为准,如果没有父亲或者父亲没有定位,以body为准
3)返回的元素的大小,宽度,高度,是包含padding+border+width的值
4)offsetParent返回的是带有定位的父亲,否则返回body
5)parentNode返回最近一级的父亲,不管有没有定位。

   <script>
        //offset系列
        var father = document.querySelector('.father')
        var son = document.querySelector('.son')
        console.log();
        //可以得到元素的偏移位置,返回不带单位的数值
        console.log(father.offsetTop);
        console.log(father.offsetLeft);
        //它以带有定位的父亲为准,如果没有父亲或者父亲没有定位,以body为准
        console.log(son.offsetLeft);
        //湖片区元素的大小,宽度,高度 是包含padding+border+width
        var w = document.querySelector('.w')
        console.log(w.offsetWidth);
        console.log(w.offsetHeight);
        //返回带有定位的父亲,否则返回body
        console.log(son.offsetParent);
        console.log(song.parentNode);//返回最近一级的父亲,不管有没有定位
    </script>

2.动画实现原理
1)获取当前位置
2)让移动物体在当前位置加一移动距离
3)利用setInterval定时器重复执行步骤,加一个停止判断条件
4)元素需要添加一个定位,才能使用element.style.left属性

 <script>
        //动画原理
        //1.获取当前位置
        //2.让盒子在当前位置加1移动距离
        //3.利用定时器不断重复此操作
        //4.加一个结束操作
        //5.注意元素需要添加定位,才能使用element。style。left
        var div = document.querySelector('div')
        var timer = setInterval(function () {
            if (div.offsetLeft >= 400) {
                //停止动画本质是停止定时骑
                clearInterval(timer)
            }
            div.style.left = div.offsetLeft + 1 + 'px'
        }, 30)
    </script>

3.简单动画封装函数
1)目标对象obj,targer目标位置

<script>
        var span = document.querySelector('span')
        var div = document.querySelector('div')
        //目标对象obj,targer目标位置
        function animate(obj, target) {
            var timer = setInterval(function () {
                if (obj.offsetLeft >= target) {
                    //停止动画本质是停止定时骑
                    clearInterval(timer)
                }
                obj.style.left = obj.offsetLeft + 1 + 'px'
            }, 30)
        }
        animate(div, 300)   
    </script>

4.给不同对象添加不同的定时器
1)目标对象obj,targer目标位置
2)给不同元素指定了不同定时器

<script>
        var span = document.querySelector('span')
        var div = document.querySelector('div')
        //目标对象obj,targer目标位置
        //给不同元素指定了不同的定时器
        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)
        }
        animate(div, 400)
        var btn = document.querySelector('button')
        btn.addEventListener('click', function () {
            animate(span, 200)
        })

    </script>

5.缓动动画
1)缓动动画就是将每次动画移动步长慢慢变小(目标值-当前距离)/10

   <script>
        var span = document.querySelector('span')
        //目标对象obj,targer目标位置
        //给不同元素指定了不同的定时器
        function animate(obj, target) {
            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)
                }
                //每次加一这个步长改为慢慢变小的。(目标值-当前距离)/10
                obj.style.left = obj.offsetLeft + step + 'px'
            }, 15)
        }
        var btn500 = document.querySelector('.btn500')
        var btn800 = document.querySelector('.btn800')
        btn500.addEventListener('click', function () {
            animate(span, 500)
        })
        btn800.addEventListener('click', function () {
            animate(span, 800)
        })

    </script>

6.回调函数
1)回调函数写到定时器结束里面

 <script>
        var span = document.querySelector('span')
        //目标对象obj,targer目标位置
        //给不同元素指定了不同的定时器
        function animate(obj, target, callback) {
            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()
                    }
                }
                //每次加一这个步长改为慢慢变小的。(目标值-当前距离)/10
                obj.style.left = obj.offsetLeft + step + 'px'
            }, 15)
        }
        var btn500 = document.querySelector('.btn500')
        var btn800 = document.querySelector('.btn800')

        btn500.addEventListener('click', function () {
            animate(span, 500)
        })
        btn800.addEventListener('click', function () {
            animate(span, 800, function () {
                span.style.backgroundColor = 'pink'
            })
        })
    </script>

7.引用animate动画函数
1)animate封装为动画函数,包含移动元素,移动距离,回调函数

<script>
        var sliderbar = document.querySelector('.sliderbar')
        var con = document.querySelector('.con')
        //当鼠标经过sliderbar就会让con盒子滑动到左侧
        //当鼠标利尻ssliderbar就会让con盒子滑动到右侧
        sliderbar.addEventListener('mouseenter', function () {
            animate(con, -160, function () {
                sliderbar.children[0].innerHTML = '➡'
            })
        })
        sliderbar.addEventListener('mouseleave', function () {
            animate(con, 0, function () {
                sliderbar.children[0].innerHTML = '⬅'
            })
        })
    </script>

9.轮播图制作

window.addEventListener('load', function () {
    // 1. 获取元素
    var arrow_l = document.querySelector('.arrow-l');
    var arrow_r = document.querySelector('.arrow-r');
    var focus = document.querySelector('.focus');
    var focusWidth = focus.offsetWidth;
    //鼠标经过focus就显示隐藏左右按键
    focus.addEventListener('mouseenter', function () {
        arrow_l.style.display = 'block'
        arrow_r.style.display = 'block'
        clearInterval(timer)
        timer = null
    })
    focus.addEventListener('mouseleave', function () {
        arrow_l.style.display = 'none'
        arrow_r.style.display = 'none'
        timer = setInterval(function () {
            //手动点击事件执行
            arrow_r.click()
        }, 1000)
    })
    var ul = focus.querySelector('ul')
    //  console.log(ul.children.length);
    var ol = focus.querySelector('.circle')
    var focusWidth = focus.offsetWidth
    for (var i = 0; i < ul.children.length; i++) {
        //创建li
        var li = document.createElement('li')
        //设置小圆圈的索引号 自定义属性
        li.setAttribute('index', i)
        //插入
        ol.appendChild(li)
        //生成li时候就利用排他思想,
        li.addEventListener('click', function () {
            //干掉所有人 清除所有current类名

            for (var i = 0; i < ol.children.length; i++) {
                ol.children[i].className = ''
            }
            //留下我自己 当前li设置current
            this.className = 'current'
            //5.点击小圆圈移动图片,移动ul
            //ul的移动距离就是li的索引号乘以图片宽度
            //当我们点击了某个li,拿到li索引号

            var index = this.getAttribute('index')
            animate(ul, -index * focusWidth)
            //当我们点击了li,就把li的索引号给num
            num = index
            circle = index
        })
    }
    // 把ol第一个小li设为类名current
    ol.children[0].className = 'current'
    //7.克隆第一章图片,放到ul最后面
    //6.点击右侧按钮,图片滚动一张
    //cloneNode()true深克隆包含子节点,
    var first = ul.children[0].cloneNode(true)
    ul.appendChild(first)

    var num = 0
    var circle = 0
    var flag = true
    //circle控制小圆圈变化,先清除其他小圆圈类名
    arrow_r.addEventListener('click', function () {
        //如果走到最后复制的一张图片,left快速回0
        if (flag) {
            flag = false
            if (num == ul.children.length - 1) {
                ul.style.left = 0
                num = 0
            }
            num++
            animate(ul, -num * focusWidth, function () {
                flag = true
            })
            circle++
            if (circle == ol.children.length) {
                circle = 0
            }
            circleChange()
        }

    })
    //左侧按钮
    arrow_l.addEventListener('click', function () {
        //如果走到最后复制的一张图片,left快速回0

        if (flag) {
            flag = false
            if (num == 0) {
                num = ul.children.length - 1
                ul.style.left = -num * focusWidth + 'px'
            }
            num--
            animate(ul, -num * focusWidth, function () {
                flag = true
            })
            circle--
            //如果circle<0:说明第一张图片要改为第四个小圆圈
            if (circle < 0) {
                circle = ol.children.length - 1
            }
            circleChange()
        }

    })
    function circleChange() {
        //先清除其他小圆圈的current类名
        for (var i = 0; i < ol.children.length; i++) {
            ol.children[i].className = ''
        }
        //留下当前的小圆圈的current类名
        ol.children[circle].className = 'current'
    }
    //10.自动播放轮播图
    var timer = setInterval(function () {
        //手动点击事件执行
        arrow_r.click()
    }, 1000)
})

10.筋斗云案例

<script>
        window.addEventListener('load', function () {
            var cloud = document.querySelector('.cloud')
            var c_nav = document.querySelector('.c-nav')
            var lis = c_nav.querySelectorAll('li')
            //2.给li绑定事件
            var current = 0
            for (var i = 0; i < lis.length; i++) {
                lis[i].addEventListener('mouseenter', function () {
                    animate(cloud, this.offsetLeft)
                })
                //鼠标离开就复原为0
                lis[i].addEventListener('mouseleave', function () {
                    animate(cloud, current)
                })
                lis[i].addEventListener('click', function () {
                    current = this.offsetLeft
                })
            }
        })
    </script>

学习时间:

提示:这里可以添加计划学习的时间
例如:
1、 周一至周五晚上 7 点—晚上9点
2、 周六上午 9 点-上午 11 点
3、 周日下午 3 点-下午 6 点


学习产出:

提示:这里统计学习计划的总量
例如:
1、 技术笔记 2 遍
2、CSDN 技术博客 3 篇
3、 学习的 vlog 视频 1 个

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值