PC端网页特效异读

2 篇文章 0 订阅


其他,opacity是半透明的意思

一、三大系列

1.元素偏移量(offset系列)

一般用来动态获得元素位置和自身大小

(1)一些属性

在这里插入图片描述
在这里插入图片描述

(2).offset和style的区别

在这里插入图片描述

(3).一些例子

**获取鼠标在盒子内坐标
在这里插入图片描述

在这里插入图片描述
**模拟框拖拽
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2.元素可视区(client系列)

获取边框大小,元素大小

(1).一些属性

前两个专门获得上、左边框的大小
后两个不包含边框
在这里插入图片描述

(2).flexible.js源码分析

1.立即执行函数
不需调用
创建了一个独立的作用域,避免命名冲突
里面的变量是局部变量
第二个括号是调用函数,可传递参数
在这里插入图片描述
2.pageshow,重新加载页面事件
给window添加
e.persissted返回的是true
在这里插入图片描述
用pageshow不用load的原因
在这里插入图片描述

3.scroll系列

常用来获取滚动宽度
内容的宽度高度
在这里插入图片描述
在这里插入图片描述
例子,淘宝右侧边栏
某元素上面被卷去的长度用element.scrollTop
整个页面用window.pageYOFFset
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
兼容性问题
在这里插入图片描述

(4).三大系列小结

在这里插入图片描述
在这里插入图片描述

二、mouseenter和mouseover区别

在这里插入图片描述

三、动画

需添加定位才能使用动画和element.style.left

1.动画原理,封装动画

给不同元素记录不同定时器可以这样起名
obj.timer=setInterval()

在这里插入图片描述
动画封装function
在这里插入图片描述
在执行前先删除,保证只有一个定时器
在这里插入图片描述

2.缓动动画原理

运动速度改变
每次移动距离step变小
当前位置等于目标位置停止,即清除定时器
在这里插入图片描述
代码实现

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 - obj.offsetLeft) / 10;
        step = step > 0 ? Math.ceil(step) : Math.floor(step);
        //step会有除不尽的情况,因此要向上取整和向下取整
        if (obj.offsetLeft == target) {
            // 停止动画 本质是停止定时器
            clearInterval(obj.timer);
            // 回调函数写到定时器结束里面
            // if (callback) {
            //     // 调用函数
            //     callback();
            // }
            callback && callback();
        }
        // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10
        obj.style.left = obj.offsetLeft + step + 'px';

    }, 15);
}

一个例子
在这里插入图片描述

四、常见网页特效

网页轮播图/焦点图
1.功能需求
在这里插入图片描述
2.一些操作
(1).自动生成小圆点
利用for循环
(2).无缝滚动
第一张放最后利用克隆,不会妨碍指定生成小圆点
快速复原位置
(3).节流阀
防止轮播图按钮连续点击造成播放较快
上一个函数执行完毕,再执行下一个,让事件无法触发
利用回调函数
3.代码实现

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;
    // 2. 鼠标经过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();
        }, 2000);
    });
    // 3. 动态生成小圆圈  有几张图片,我就生成几个小圆圈
    var ul = focus.querySelector('ul');
    var ol = focus.querySelector('.circle');
    // console.log(ul.children.length);
    for (var i = 0; i < ul.children.length; i++) {
        // 创建一个小li 
        var li = document.createElement('li');
        // 记录当前小圆圈的索引号 通过自定义属性来做 
        li.setAttribute('index', i);
        // 把小li插入到ol 里面
        ol.appendChild(li);
        // 4. 小圆圈的排他思想 我们可以直接在生成小圆圈的同时直接绑定点击事件
        li.addEventListener('click', function() {
            // 干掉所有人 把所有的小li 清除 current 类名
            for (var i = 0; i < ol.children.length; i++) {
                ol.children[i].className = '';
            }
            // 留下我自己  当前的小li 设置current 类名
            this.className = 'current';
            // 5. 点击小圆圈,移动图片 当然移动的是 ul 
            // ul 的移动距离 小圆圈的索引号 乘以 图片的宽度 注意是负值
            // 当我们点击了某个小li 就拿到当前小li 的索引号
            var index = this.getAttribute('index');
            // 当我们点击了某个小li 就要把这个li 的索引号给 num  
            num = index;
            // 当我们点击了某个小li 就要把这个li 的索引号给 circle  
            circle = index;
            // num = circle = index;
            console.log(focusWidth);
            console.log(index);

            animate(ul, -index * focusWidth);
        })
    }
    // 把ol里面的第一个小li设置类名为 current
    ol.children[0].className = 'current';
    // 6. 克隆第一张图片(li)放到ul 最后面
    var first = ul.children[0].cloneNode(true);
    ul.appendChild(first);
    // 7. 点击右侧按钮, 图片滚动一张
    var num = 0;
    // circle 控制小圆圈的播放
    var circle = 0;
    // flag 节流阀
    var flag = true;
    arrow_r.addEventListener('click', function() {
        if (flag) {
            flag = false; // 关闭节流阀
            // 如果走到了最后复制的一张图片,此时 我们的ul 要快速复原 left 改为 0
            if (num == ul.children.length - 1) {
                ul.style.left = 0;
                num = 0;
            }
            num++;
            animate(ul, -num * focusWidth, function() {
                flag = true; // 打开节流阀
            });
            // 8. 点击右侧按钮,小圆圈跟随一起变化 可以再声明一个变量控制小圆圈的播放
            circle++;
            // 如果circle == 4 说明走到最后我们克隆的这张图片了 我们就复原
            if (circle == ol.children.length) {
                circle = 0;
            }
            // 调用函数
            circleChange();
        }
    });

    // 9. 左侧按钮做法
    arrow_l.addEventListener('click', function() {
        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  说明第一张图片,则小圆圈要改为第4个小圆圈(3)
            // if (circle < 0) {
            //     circle = ol.children.length - 1;
            // }
            circle = circle < 0 ? ol.children.length - 1 : circle;
            // 调用函数
            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();
    }, 2000);

})
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值