0
点赞
收藏
分享

微信扫一扫

页面特效&&本地存储

2.3 PC端网页特效

2.3.1 元素偏移量offset系列

1、作用:使用offset系列相关属性可以动态的得到该元素的位置(偏移)、大小等

  • 获得元素距离带有定位父元素的位置

  • 获得元素自身的大小(宽高)

  • 返回数值不带单位

2、offset系列常用属性

offset系列属性作用
element.offsetParent返回作为该元素带有定位的父级元素。如果父级都没有定位则返回body
element.offsetTop返回元素相对带有定位父元素上方的偏移
element.offsetLeft返回元素相对带有定位父元素左边框的偏移
element.offsetWidth返回自身包括padding、边框、内容区的宽度,返回数值不带单位
element.offsetHeight返回自身包括padding、边框、内容区的高度,返回数值不带单位

3、offset和style的区别

(1)offset

  • offset可以得到任意样式表中的样式值

  • offset系列获得的数值是没有单位的

  • offsetWidth包含padding+border+width

  • offsetWidth等属性是只读属性,只能获取不能赋值

  • 获取元素大小位置,用offset更合适

(2)style

  • style只能得到行内样式表中的样式值

  • style.width获得的是带有单位的字符串

  • style.width获得不包含padding和border的值

  • style.width是可读写属性,可以获取也可以赋值

  • 给元素更改值,用style更合适

2.3.2 元素可视区client系列

1、作用:

使用client系列的相关属性获取元素可视区的相关信息

2、client系列属性

client系列属性作用
element.clientTop返回元素上边框大小
element.clientLeft返回元素左边框大小
element.clientWidth返回自身包括padding、内容区的宽度,不含边框,返回数值不带单位
element.clientHeight返回自身包括padding、内容区的高度,不含边框,返回数值不带单位

2.3.3 元素滚动scroll系列

1、作用:

使用scroll系列的相关属性可以动态的得到该元素的大小、滚动距离等

2、scroll系列属性

scroll系列属性作用
element.scrollTop返回被卷去的上侧距离,返回数值不带单位
element.scrollLeft返回被卷去的左侧距离,返回数值不带单位
element.scrollWidth返回自身实际的宽度,不含边框,返回数值不带单位
element.scrollHeight返回自身实际的高度,不含边框,返回数值不带单位

3、页面被卷去的头部

滚动条向下滚动时,页面上面的内容被隐藏,滚动条会触发onscroll事件

4、mouseenter和mouseover区别

(1)当鼠标移动到元素上时会触发事件

(2)mouseover鼠标经过自身盒子会触发,经过子盒子还会触发

(3)mouseenter只会经过自身盒子触发

(4)mouseenter不会冒泡

(5)鼠标离开mouseleave不会冒泡

2.3.4 动画函数封装

1、动画原理

  • 获得盒子当前位置

  • 让盒子在当前位置加上1个移动距离

  • 利用定时器不断重复这个操作

  • 加一个结束定时器的条件

  • 注意此元素需要添加定位,才能使用element.style.left

2、动画函数简单封装

注意:函数需要传递两个参数,动画对象和移动到的距离

//例子
<style>
    div{
        position: absolute;/* 加定位 */
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
    }
​
    span {
        position: absolute;/* 加定位 */
        left: 0;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
    }
</style>
<div></div>
<span></span>
<script>
    function animate(obj,target) {
        var timer = setInterval(function() {
            if(obj.offsetLeft >= target){
                clearInterval(timer);
            }
            obj.style.left = obj.offsetLeft + 1 + 'px';
        },30);
    }
​
    var div = document.querySelector('div');
    var span = document.querySelector('span');
    animate(div,400);
    animate(span,100);
</script>

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

问题:不断点击按钮,速度会变快,开了太多定时器

解决:让元素只有一个定时器

<style>
    div{
        position: absolute;/* 加定位 */
        left: 0;
        width: 100px;
        height: 100px;
        background-color: pink;
    }
​
    span {
        position: absolute;/* 加定位 */
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
    }
</style>
​
<button>点击</button>
<div></div>
<span></span>
<script>
    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);
    }
​
    var div = document.querySelector('div');
    var span = document.querySelector('span');
    var btn = document.querySelector('button');
    btn.addEventListener('click',function(){
        animate(span,200);
    })
    animate(div,400);
</script>

4、缓动效果原理

让元素的速度有变化(不是一直匀速),速度慢慢停下来

(1)让盒子每次移动的距离慢慢变小,速度就慢慢降下来了

(2)算法:(目标值-现在的位置)/10作为每次移动的距离(步长)

(3)停止条件:让当前盒子的位置等于目标位置就停止定时器

//减速效果
<style>
    span {
        position: absolute;/* 加定位 */
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
    }
</style>
​
<button class="btn1">点击距离200</button>
<button class="btn2">点击距离300</button>
<span></span>
<script>
    function animate(obj,target) {
    //先清除之前的定时器
        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);
                
            if(obj.offsetLeft == target){
                clearInterval(obj.timer);
            }
            //将步长慢慢变小
            obj.style.left = obj.offsetLeft + step + 'px';
        },15);
    }
​
    var span = document.querySelector('span');
    var btn1 = document.querySelector('.btn1');
    var btn2 = document.querySelector('.btn2');
    btn1.addEventListener('click',function(){
        animate(span,200);
    });
    btn2.addEventListener('click',function(){
        animate(span,300);
    });
    
</script>

5、动画函数添加回调函数

  • 回调函数写在定时器结束的位置

  • 动画函数可以封装在JS文件中

//例子
//以上功能执行完变色
​
<style>
    span {
        position: absolute;/* 加定位 */
        left: 0;
        top: 200px;
        display: block;
        width: 150px;
        height: 150px;
        background-color: purple;
    }
</style>
​
<button class="btn1">点击距离200</button>
<button class="btn2">点击距离300</button>
<span></span>
<script>
    function animate(obj,target,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);
                
            if(obj.offsetLeft == target){
                clearInterval(obj.timer);
                //回调函数
                if(callback){
                    //调用函数
                    callback();
                }
            }
            //将步长慢慢变小
            obj.style.left = obj.offsetLeft + step + 'px';
        },15);
    }
​
    var span = document.querySelector('span');
    var btn1 = document.querySelector('.btn1');
    var btn2 = document.querySelector('.btn2');
    btn1.addEventListener('click',function(){
       animate(span,200,function() {
           span.style.backgroundColor = 'orange';
       });
    });
    btn2.addEventListener('click',function(){
        animate(span,300,function() {
            span.style.backgroundColor = 'yellow';
        });
    });
    
</script>

6、节流阀

  • 防止轮播图按钮连续点击造成播放过快

  • 利用回调函数,使得上一个函数动画执行完在执行下一个

  • 设置var flag = true;if(flag){flag = false;}当完成后flag = true;

2.4 移动端网页特效

2.4.1 触屏事件

1、触屏事件

触屏touch事件说明
touchstart手指触摸到一个DOM元素时触发
touchmove手指在一个DOM元素上滑动时触发
touchend手指在一个DOM元素上移开时触发

2、触摸事件对象(TouchEvent)

targetTouches更常用

触摸列表说明
touches正在触摸屏幕的所有手指的一个列表
targetTouches正在触摸当前DOM元素上的手册的一个列表
changedTouches手指状态发生了改变的列表,从无到有,从有到无变化

3、移动端拖动元素

(1)touchstart、touchmove、touchend可以实现拖动元素

(2)手指坐标值:targetTouches[0]里面的pageX和pageY

(3)原理:位置是:盒子原来的位置+手指移动的距离

(4)手指移动的距离=手指滑动中的位置-手指刚触摸时的位置

(5)注意:手指移动会发生滚动,这里要阻止默认的屏幕滚动e.preventDefault();

2.4.2 移动端常见特效

1、过渡:transition

检测过渡完成的事件:transitionend

2、classList属性

(1)是H5的属性,返回元素的类名

(2)该属性用于在元素中添加、移除和切换CSS类

  • 添加类:element.classList.add('类名');

  • 移除类:element.classList.remove('类名');

  • 切换类:element.classList.toggle('类名');(有类名就删除,没有就添加)

3、click问题

问题:在移动端click有延时问题(300ms)

原因:移动端屏幕双击会缩放页面

解决方案: (1)禁用缩放:浏览器禁用双击缩放行为

<meta name="viewport" content="user-scalable=no">

(2)利用touch事件自己封装这个事件解决300ms延迟

  • 当手指触摸屏幕记录时间

  • 当手指离开屏幕记录时间

  • 时间小于150ms且无滑动,则为点击

(3)使用插件:fastclick插件

2.4.3 移动端常见开发插件

1、fastclick插件:https://github.com/ftlabs/fastclick

2、Swiper插件(轮播滑动):Swiper中文网-轮播图幻灯片js插件,H5页面前端开发

3、superslide:SuperSlide | TouchSlide 官方网站 大话主席

4、iscroll:GitHub - cubiq/iscroll: Smooth scrolling for the web

2.5 本地存储

数据存储在浏览器中

2.5.1 window.sessionStorage

1、生命周期为关闭浏览器窗口

2、在同一个窗口下可以共享

3、以键值对的形式存储使用

4、运用

(1)存储数据:sessionStorage.setItem(key,value);

(2)获取数据:sessionStorage.getItem(key);

(3)删除数据:sessionStorage.removeItem(key);

(4)清空所有数据:sessionStorage.clear();

2.5.2 window.localStorage

1、生命周期永久生效,除非手动删除,否则关闭页面也存在

2、可以多窗口(页面)共享(同一浏览器共享)

3、以键值对的形式存储使用

4、运用

(1)存储数据:localStorage.setItem(key,value);

(2)获取数据:localStorage.getItem(key);

(3)删除数据:localStorage.removeItem(key);

(4)清空所有数据:localStorage.clear();

举报

相关推荐

0 条评论