目录

  • 5、mouseenter 和 mouseover 的区别
  • 6、动画函数封装
    • 动画实现原理
    • 简单动画函数封装
    • 动画函数给不同元素记录不同定时器
    • 缓动效果原理
      • 动画函数多个目标值之间移动
      • 缓动函数添加回调函数
      • 节流阀
        • 案例:动画函数封装 —— 网页轮播图
        • 案例:类似于右侧弹出返回顶部按钮
        • 案例:元素滚动scroll+动画函数封装 —— 返回顶部
        • 案例:动画函数封装 —— 筋头云图案跟随鼠标移动



学习来源: https://www.bilibili.com/video/BV1HJ41147DG

PC端网页特效一链接:https://blog.csdn.net/qq_45645902/article/details/105876298

5、mouseenter 和 mouseover 的区别

  • 当鼠标移动到元素上时就会触发 mouseenter 事件
  • 类似 mouseover,它们两者之间的差别是
    • mouseover 鼠标经过自身盒子会触发,经过子盒子还会触发
    • mouseenter 只会经过自身盒子触发(鼠标经过盒子后,只要不离开盒子,即使是父盒子,都不会触发)
  • 之所以这样,就是因为 mouseenter 不会冒泡
  • 跟 mouseenter 搭配的鼠标离开 mouseleave 同样不会冒泡

6、动画函数封装

动画实现原理

核心原理:通过定时器 setInterval() 不断移动盒子位置。

示例
实现步骤

  1. 获得盒子当前位置
  2. 让盒子在当前位置加上1个移动距离
  3. 利用定时器不断重复这个操作
  4. 加一个结束定时器的条件
  5. 注意此元素需要添加定位,才能使用 element.style.left
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>div {/* 添加定位,为了使用 element.style.left */position: absolute;left: 0;width: 100px;height: 100px;background-color: red;}</style>
</head><body><div></div><script>// div.offsetLeft 获得盒子当前位置var div = document.querySelector('div');var timer = setInterval(function () {if (div.offsetLeft >= 400) {// 停止动画 本质是停止定时器clearInterval(timer);}div.style.left = div.offsetLeft + 1 + 'px';}, 30);</script>
</body></html>

简单动画函数封装

函数需要传递2个参数,动画对象移动到的距离

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>div {position: absolute;left: 0;width: 100px;height: 100px;background-color: red;}span {position: absolute;left: 0;top: 200px;display: block;width: 150px;height: 150px;background-color: skyblue;}</style>
</head><body><div></div><span>我是一颗小小的石头</span><script>// 简单动画函数封装:obj 目标对象、target 目标位置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, 300);animate(span, 200);</script>
</body></html>

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

如果多个元素都使用这个动画函数,每次都要 var 声明定时器。我们可以给不同的元素使用不同的定时器(自己专门用自己的定时器)。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>div {position: absolute;left: 0;width: 100px;height: 100px;background-color: red;}span {position: absolute;left: 0;top: 200px;display: block;width: 150px;height: 150px;background-color: skyblue;}</style>
</head><body><button>点击我开启动画</button><div></div><span>点击按钮让我走</span><script>function animate(obj, target) {// 当我们不断的点击按钮,这个元素的速度会越来越快,因为开启了太多的定时器// 解决方案就是:让我们元素只有一个定时器执行。先清除以前的定时器,只保留当前的一个定时器执行clearInterval(obj.timer);// 给不同的元素指定了不同的定时器。div传过来,这个obj就是div;span传过来,这个obj就是spanobj.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');// 调用函数animate(div, 300);// 点击按钮 span盒子调用函数能走了btn.addEventListener('click', function () {animate(span, 200);})</script>
</body></html>

缓动效果原理

缓动动画就是让元素运动速度有所变化,最常见的是让速度慢慢停下来

思路

  1. 让盒子每次移动的距离慢慢变小,速度就会慢慢落下来。
  2. 核心算法: (目标值 - 现在的位置) / 10 做为每次移动的距离步长
  3. 停止的条件是: 让当前盒子位置等于目标位置就停止定时器
  4. 注意步长值需要取整

总结
匀速动画:盒子当前的位置 + 固定的值
缓动动画:盒子当前的位置 + 变化的值(目标值 - 现在的位置) / 10)

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>div {position: absolute;left: 0;width: 100px;height: 100px;background-color: red;}span {position: absolute;left: 0;top: 200px;display: block;width: 150px;height: 150px;background-color: skyblue;}</style>
</head><body><button>点击</button><span>启动</span><script>function animate(obj, target) {// 先清除以前的定时器,只保留当前的一个定时器执行clearInterval(obj.timer);obj.timer = setInterval(function () {// 步长值写到定时器的里面var step = (target - obj.offsetLeft) / 10;if (obj.offsetLeft == target) {// 停止动画 本质是停止定时器clearInterval(obj.timer);}// 把每次加1这个步长值改为一个慢慢变小的值:step// 步长(step)公式:(目标值 - 现在的位置) / 10obj.style.left = obj.offsetLeft + step + 'px';}, 15);}var span = document.querySelector('span');var btn = document.querySelector('button');btn.addEventListener('click', function () {// 调用函数animate(span, 500);})</script>
</body></html>
动画函数多个目标值之间移动

可以让动画函数从 800 移动到 500。

点击按钮时,判断步长是正值还是负值
​ 1.如果是正值,则步长往大了取整
​ 2.如果是负值,则步长往小了取整

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><style>div {position: absolute;left: 0;width: 100px;height: 100px;background-color: red;}span {position: absolute;left: 0;top: 200px;display: block;width: 150px;height: 150px;background-color: skyblue;}</style>
</head><body><button class="btn500">点击500</button><button class="btn800">点击800</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);}// 把每次加1这个步长值改为一个慢慢变小的值:step// 步长(step)公式:(目标值 - 现在的位置) / 10obj.style.left = obj.offsetLeft + step + 'px';}, 15);}var span = document.querySelector('span');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>
</body></html>
缓动函数添加回调函数

回调函数原理:函数可以作为一个参数。将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数,这个过程就叫做回调。

回调函数写的位置:定时器结束的位置。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title><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>
</head><body><button class="btn500">点击500</button><button class="btn800">点击800</button><span>启动</span><script>function animate(obj, target, 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);if (obj.offsetLeft == target) {// 停止动画 本质是停止定时器clearInterval(obj.timer);// 回调函数写到定时器结束里面// if (callback) {//     // 调用函数//     callback();// }callback && callback();}}// 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10obj.style.left = obj.offsetLeft + step + 'px';}, 15);}var span = document.querySelector('span');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 () {// 将函数传给 callbackspan.style.backgroundColor = 'red';});})</script>
</body></html>
节流阀

目的

当上一个函数动画内容执行完毕,再去执行下一个函数动画,让事件无法连续触发。

例如:防止轮播图按钮连续点击造成播放过快。

思路

利用回调函数,添加一个变量来控制,锁住函数和解锁函数。

  • 开始设置一个变量 var flag= true;
  • 关闭水龙头 if (flag) { flag = false; do something }
  • 利用回调函数动画执行完毕
  • 打开水龙头 flag = true
案例:动画函数封装 —— 网页轮播图

相关链接:https://blog.csdn.net/qq_45645902/article/details/106388071

案例:类似于右侧弹出返回顶部按钮

相关链接:https://blog.csdn.net/qq_45645902/article/details/105907028

案例:元素滚动scroll+动画函数封装 —— 返回顶部

相关链接:https://blog.csdn.net/qq_45645902/article/details/105915864

案例:动画函数封装 —— 筋头云图案跟随鼠标移动

相关链接:https://blog.csdn.net/qq_45645902/article/details/105920846

PC端网页特效二:mouseenter 和 mouseover 的区别、动画函数封装相关推荐

  1. javaScript PC端网页特效

    PC端网页特效 1. 元素偏移量 offset 系列 1.1 offset 概述 1.2 offset 与 style 区别 2. 元素可视区 client 系列 2.1 立即执行函数 2.2 loa ...

  2. JS PC端网页特效 (一)

    2022年7月27日 周三学习记录博客  学习进度:PC端网页特效(一).学习时长:6h. 目录 PC端网页特效 1.元素偏移量 offset 系列 1.1 offset 概述 1.2 offset ...

  3. JavaScript—— PC 端网页特效

    目录 一.PC 端网页特效 1. 元素偏移量 offest 系列 1.1 offset 概述 1.2 offset 与 style 区别 案例:获取鼠标在盒子内的坐标 案例:模拟框拖拽 html cs ...

  4. 05【JS 高级】-【PC端网页特效】元素偏移量 offset 系列, 元素可视区 client 系列, 元素滚动 scroll 系列, 动画函数封装, 常见网页特效案例

    04[JS 高级]-[PC端网页特效] 学习内容: 元素偏移量 offset 系列, 元素可视区 client 系列, 元素滚动 scroll 系列, 动画函数封装, 常见网页特效案例 1. 元素偏移 ...

  5. 【第五部分 | JS WebAPI】6:PC端网页特效与本地存储

    目录 | 概述 | PC端网页特效之三大系列 1-1 elementObj . offsetXXX 属性 1-2 elementObj . style 和 offset 的区别 1-3 案例:获取鼠标 ...

  6. 移动端、PC端 网页特效

    移动端网页特效 标题触屏事件 移动端浏览器兼容性较好,不需要考虑以前 JS 的兼容性问题,可以放心的使用原生 JS 书写效果,但是移动端也有自己独特的地方.比如触屏事件 touch(也称触摸事件),A ...

  7. JavaScript——PC端网页特效

    目录 一.元素偏移量offset系列 1. offset概述 2. 常见属性 3. offset与style区别 案例--鼠标在盒子内坐标 案例--拖动模态框 案例--京东放大镜 二.元素可视区cli ...

  8. JavaScript核心-5. PC端网页特效

    一.元素偏移量 offset 系列 1. offset offset 翻译过来就是偏移量, 我们使用 offset 系列相关属性可以动态的得到该元素的位置(偏移).大小等. 获得元素距离带有定位父元素 ...

  9. JavaScript(八)—— PC 端网页特效

    本篇为 JavaScript 系列笔记第八篇,将陆续更新后续内容.参考:黑马程序员JavaScript核心教程,前端基础教程 系列笔记: JavaScript(一)-- 初识JavaScript / ...

最新文章

  1. 列了一些自己会但是不怎么精通的编程语言和知识,做个记录,空余时间加强学习...
  2. Python编程基础:第十节 while循环While Loops
  3. 下载Java Jar包的网站(托管厂库)
  4. ITK:将图像投射为另一种类型
  5. SAP Customer Data Cloud的administrator设置
  6. mysql 二次 聚合,MySql-聚合查询
  7. mybatis plus 事务管理器_SpringBoot第七篇:springboot开启声明式事务
  8. python取的键不存在_Python3基础 dict get 在查询不存在的键时,返回指定的内容
  9. C++接收字符串数组_Java 中初始化数组
  10. SAP FICO面试题目+答案
  11. 关于蛙跳算法的计算机文献,文化蛙跳算法性能分析研究.PDF
  12. 可变字符串 插入,删除,替换,赋值
  13. P5018 对称二叉树
  14. post请求测试软件,简单的Http请求测试工具(支持get,post)
  15. linux hg 图形,Linux下Mercurial (hg)配置说明
  16. xzp android webview,加载gif动态图的三种方式
  17. 更改公众号名称对用户关注的影响
  18. 这年头,当帅哥不容易呀!!
  19. Datawhale优秀学习者4月名单!
  20. 读《一个人的朝圣》| 沾染上称为信仰的东西,都会不一样

热门文章

  1. 【添柴】12010.解密QQ号 解题报告
  2. 云服务器和独立服务器各自的定义以及相似之处
  3. ESET(NOD32) ESS/EAV 4.2.64.12 BE(32bit) 汉化正式版【8.19更新】
  4. react native: Unrecognized font family 'antoutline'
  5. WIN10 当中装BDM驱动
  6. php报错cURL error 60: SSL certificate problem: unable to get local issuer certifica
  7. css 霓虹灯转动效果,CSS3 文本霓虹灯闪烁特效
  8. Beyond Compare对比文件不同
  9. Seventh season nineteenth episode,what did Ross do to his cousin ?????so sick
  10. 开始记录自己的搬砖学习生涯(尽力周更~~)