[前端学习笔记]JavaScript 常见网页特效和移动端补充知识

一、PC端网页特效

1.offset系列

1)offset(偏移量):动态得到该元素的位置、偏移、大小等。【含边框】
2)常用属性
offset
3)offsetWidth与style.width区别

offsetWidthstyle.width
只读属性可读写属性
可得任何样式表值可得行内样式表值
包含padding、border不包含padding、border
无单位有单位

获取元素大小用offsetWidth;改变元素大小用style.width
4)常用搭配
鼠标在页面中的坐标(e.pageX, e.pageY)
盒子在页面中的坐标(box.offsetLeft, box.offsetTop)
鼠标在盒子的坐标=鼠标在页面中的坐标-盒子在页面中的坐标

// 鼠标在盒子内的横纵坐标
var x = e.pageX - this.offsetLeft;
var y = e.pageY - this.offsetTop;

2.client系列

1)client(客户端):获取元素可视区的相关信息、边框大小、元素大小等。【不含边框】
2)常用属性
client

3.scroll系列

1)scroll(滚动):动态获取滚动距离、元素大小等。【不含边框】
2)常用属性
scroll
注意区分element.scrollTop和window.pageYOffset,一个是卷去元素的,一个是卷去页面的。

4.动画

动画
示例1:动画函数

// obj目标对象 target目标位置
function animate(obj, target) {
// 1)不断点击按钮元素速度会越来越快,因为开启了太多定时器
// 先清除以前的定时器,只保留当前的一个定时器执行
     clearInterval(obj.timer);
// 2)不再用var去开辟空间;每个对象有自己的定时器
     obj.timer = setInterval(function () {
         if (obj.offsetLeft >= target) {
               clearInterval(obj.timer);
         }
         obj.style.left = obj.offsetLeft + 1 + 'px';
     }, 30);
}

示例2:缓慢动画回调函数【需要时调用即可】

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);
             // 回调函数写到定时器结束里面
             callback && callback();
      	}
      obj.style.left = obj.offsetLeft + step + 'px';
      }, 15);
}

5.PC端轮播图

轮播图/焦点图是比较常见的网页特效。需求如下:
1)鼠标经过轮播图模块「左右按钮」显示,鼠标离开则「左右按钮」隐藏;
2)点击「左右按钮」滚动一张,且「小圆圈」随之变化;
3)点击「小圆圈」可以播放相应的图片;
4)鼠标不经过轮播图,自动播放图片;鼠标经过轮播图,停止播放图片。
HTML结构:

<!-- 轮播图结构 -->
<div class="focus fl">
     <!-- 左侧按钮 -->
     <a href="javascript:;" class="arrow-l">&lt;</a>
     <!-- 右侧按钮 -->
     <a href="javascript:;" class="arrow-r"></a>
     <!-- 核心的滚动区域 -->
     <ul>
          <li>
               <a href="#"><img src="upload/focus.jpg" alt=""></a>
          </li>
          <li>
               <a href="#"><img src="upload/focus1.jpg" alt=""></a>
          </li>
          <li>
               <a href="#"><img src="upload/focus2.jpg" alt=""></a>
          </li>
          <li>
               <a href="#"><img src="upload/focus3.jpg" alt=""></a>
          </li>
     </ul>
     <!-- 动态生成小圆圈 -->
     <ol class="circle">
     </ol>
</div>

CSS样式省略。JS代码如下:

window.addEventListener('load', function () {
    var focus = document.querySelector('.focus'); // 焦点图
    var arrow_l = document.querySelector('.arrow-l'); // 左按钮
    var arrow_r = document.querySelector('.arrow-r'); // 右按钮
    // 焦点图区域的宽度=一张图片的宽度
    var focusWidth = focus.offsetWidth;
    // 1. 鼠标经过焦点图 显示隐藏左右按钮 & 开启停止自动播放
    focus.addEventListener('mouseenter', function () {
        arrow_l.style.display = 'block';
        arrow_r.style.display = 'block';
        clearInterval(autoclick);
        autoclick = null;
    });
    focus.addEventListener('mouseleave', function () {
        arrow_l.style.display = 'none';
        arrow_r.style.display = 'none';
        autoclick = setInterval(function () {
            arrow_r.click();// 手动调用事件
        }, 2000);
    });
    // 3. 动态生成小圆圈
    var ul = focus.querySelector('ul'); // 焦点图列表
    var ol = focus.querySelector('.circle'); // 小圆圈列表
    // 焦点图片有几张,小圆点就有几个
    for (var i = 0; i < ul.children.length; i++) {
        var li = document.createElement('li');
        // 记录当前小圆圈的索引号
        li.setAttribute('index', i);
        // 把小li插入到ol里面
        ol.appendChild(li);
        // 4. 点击小圆圈变白【排他思想】
        li.addEventListener('click', function () {
            // 干掉所有人
            for (var i = 0; i < ol.children.length; i++) {
                ol.children[i].className = '';
            }
            // 留下我自己
            this.className = 'current';
            // 5. 点击小圆圈,移动图片
            // ul的移动距离=小圆圈的索引号*图片的宽度 向左注意是负值
            // 当我们点击了某个小li 就拿到当前小li的索引号
            var index = this.getAttribute('index');

            // 让小圆圈、箭头同步起来【number控制箭头;circle控制小圆圈】
            num = index;
            circle = 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;
    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)
            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 autoclick = setInterval(function () {
        //手动调用点击事件
        arrow_r.click();
    }, 2000);
})

二、移动端网页特效

1.像素比

像素比

2.触屏事件

触屏事件
示例:移动端拖动元素

var div = document.querySelector('div');
        var startX = 0; // 记录手指位置
        var startY = 0;
        var x = 0; // 记录盒子位置
        var y = 0;
        div.addEventListener('touchstart', function (e) {
            //  获取手指和盒子的初始坐标
            startX = e.targetTouches[0].pageX;
            startY = e.targetTouches[0].pageY;
            x = this.offsetLeft;
            y = this.offsetTop;
        });
        div.addEventListener('touchmove', function (e) {
            //  手指的移动距离
            var moveX = e.targetTouches[0].pageX - startX;
            var moveY = e.targetTouches[0].pageY - startY;
            // 移动盒子 = 盒子原来的位置 + 手指移动的距离
            this.style.left = x + moveX + 'px';
            this.style.top = y + moveY + 'px';
            e.preventDefault(); // 【注意:阻止屏幕滚动的默认行为】
        });

3.移动端轮播图

1) 自写轮播图

重点如下:
自写轮播图
手指滑动切换图片关键代码:

var startX = 0;//记录手指初始坐标
var moveX = 0;//记录手指移动距离
var flag = false;
    // 1)触摸元素touchstart:获取手指初始坐标
    ul.addEventListener('touchstart', function (e) {
        startX = e.targetTouches[0].pageX;
        // 清除自动滚动的定时器
        clearInterval(timer);
    });
    // 2)移动手指touchmove:计算手指的滑动距离,随之移动盒子
    ul.addEventListener('touchmove', function (e) {
        // 移动距离 = 手指现在的位置 - 手指起始的位置
        moveX = e.targetTouches[0].pageX - startX;
        var translatex = -index * w + moveX;
        // 取消过渡效果
        ul.style.transition = 'none';
        ul.style.transform = 'translateX(' + translatex + 'px)';
        flag = true;
        e.preventDefault(); // 阻止滚动屏幕的行为
    });
    // 3)手指离开touchend:根据移动距离判断回弹还是播放上一张/下一张
    ul.addEventListener('touchend', function (e) {
        // 如果用户手指移动过我们再去判断,否则不做判断效果
        if (flag) {
            // 如果移动距离大于50像素就 播放上一张/下一张
            if (Math.abs(moveX) > 50) {
                // 如果是右滑播放上一张 moveX是正值
                if (moveX > 0) {
                    index--;
                } else {
                    // 如果是左滑播放下一张 moveX是负值
                    index++;
                }
                var translatex = -index * w;
                ul.style.transition = 'all .3s';
                ul.style.transform = 'translateX(' + translatex + 'px)';
            } else {
                // 如果移动距离小于50像素回弹,index不变
                var translatex = -index * w;
                ul.style.transition = 'all .1s';
                ul.style.transform = 'translateX(' + translatex + 'px)';
            }
        }
        // 手指离开的时候就重新开启定时器
        clearInterval(timer);
        timer = setInterval(function () {
            index++;
            var translatex = -index * w;
            ul.style.transition = 'all .3s';
            ul.style.transform = 'translateX(' + translatex + 'px)';
        }, 2000);
    });
2) 使用轮播图插件

插件
例如Swiper:在Swiper官网下载,查看下图位置根据你需要的轮播图示例的代码+API文档套用修改即可。
Swiper示例
1
2
在代码中引入以下两个文件【位置swiper-5.4.5-package文件夹-css/js文件夹
3

<!-- 引入swiper css文件 -->
<link rel="stylesheet" href="css/swiper.min.css">
<!-- 引入swiper js 文件 -->
 <script src="js/swiper.min.js"></script>
3) 使用BootStrap框架

框架
1。下载BootStrap并引入所需文件

<!-- 使用BootStrap框架,首先要引入其CSS JQ JS文件 -->
<link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
<script src="bootstrap/js/jquery.min.js"></script>
<script src="bootstrap/js/bootstrap.min.js"></script>

2。在官网首页-JavaScript插件中找到Carousel,即轮播图的示例,套用修改即可。
在这里插入图片描述
👉BootStrap更多知识请查看:响应式布局

4.视频插件zy.media

视频
获取方式:zyMedia
1。下载并引入文件

<!-- 引入文件 -->
<link rel="stylesheet" href="zy.media.min.css">
<script src="zy.media.min.js"></script>

2。根据示例套用即可
示例

三、移动端补充知识

1.类名列表classList

在这里插入图片描述

2.fastclick插件

在这里插入图片描述

3.本地存储

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值