当前位置: 首页 > ai >正文

JavaScript:PC端特效-从mouseenter和mouseover的区别到动画函数

一、mouseenter和mouseover的区别

mouseenter鼠标事件:

当鼠标移动到元素上时就会触发mouseenter事件,这个看起来和mouseover事件很像

那它们的区别是什么呢?

mouseenter只会经过自身盒子才触发,而mouseover经过自身盒子以及子盒子都会触发

大家就要问了,主播主播,这是为什么呢?

因为mouseover会有一个冒泡的过程,鼠标经过父盒子时执行一次,经过子盒子时,把事件又放到子盒子上,经历冒泡后,又会触发绑定在父盒子身上的事件,而mouseenter没有这个过程,所有才会产生上面所说的区别

那跟mouseenter搭配使用mouseleave,mouseleave也同样不会冒泡

二、动画函数封装

1.动画实现原理

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

实现步骤:

  1. 获得盒子当前的位置
  2. 让盒子在当前位置上加1个移动距离
  3. 利用定时器不断重复这个动作
  4. 加一个结束定时器的条件
  5. 注意此元素要添加定位,才能使用element.style.left

 我们来做一个简单的动画练练手

先设置好一个div盒子以及它的css

<div>再见了妈妈,我今晚就要远航~</div>
div {position: absolute;left: 0;top: 0;width: 200px;height: 200px;background-color: pink;
}

要记得加上定位,否则它就动不起来

接下来我们来做动画

先把要用的参数定义好,然后再让盒子的位置在当前基础上加1

var div = document.querySelector('div');
var timer = setInterval(function () {div.style.left = div.offsetLeft + 1 + 'px';
}, 30)

 主播主播,它真的动起来了,不过它咋跑掉了,它真的要去远航了吗

不要急,我们还没有加上终止条件

if (div.offsetLeft >= 400) {clearInterval(timer);
}

在定时器里面加上终止条件,要让它停下来本质上就是清除掉定时器

2.简单动画函数封装

主播主播,页面里这么多要用动画的地方,除了每个都写一次动画,有没有更强势的写法

有的,孩子们有的,我们可以把动画封装成一个函数

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

function annimate(obj,target){var obj = document.querySelector('div');var timer = setInterval(function () {if (obj.offsetLeft >= target) {clearInterval(timer);}obj.style.left = obj.offsetLeft + 1 + 'px';}, 30)
}//obj目标对象,target目标位置

 这样一个简单的动画函数就做好啦,接下来谁需要动画效果调用就行

var div = document.querySelector('div');
animate(div,300);

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

我们已经封装了一个简单的动画函数,不过存在一个问题,每次调用函数时都得开辟一个内存空间来储存var那个参数,而且计时器也用的同一个,这样调用次数多了容易出现问题

我们可以给每个不同的对象指定它定制的定时器

function annimate(obj,target){var obj = document.querySelector('div');obj.timer = setInterval(function () {if (obj.offsetLeft >= target) {clearInterval(timer);}obj.style.left = obj.offsetLeft + 1 + 'px';}, 30)
}

我们来试一下能不能成功调用

var div = document.querySelector('div');
animate(div,300);

我们还可以来试一下点击按钮后来调用动画函数

 css:

div {position: absolute;left: 0;top: 40px;width: 200px;height: 200px;background-color: pink;
}

 HTML:

<div>再见了妈妈,我今晚就要远航~</div>
<button>点我</button>

JavaScript:

function annimate(obj, target) {var obj = document.querySelector('div');obj.timer = setInterval(function () {if (obj.offsetLeft >= target) {clearInterval(timer);}obj.style.left = obj.offsetLeft + 1 + 'px';}, 30)
}
var div = document.querySelector('div');
var button = document.querySelector('button');
button.addEventListener('click', function () {annimate(div, 1300);
})

点击按钮后,我们的div盒子继续去“远航”啦

 

http://www.xdnf.cn/news/6933.html

相关文章:

  • 202537 |《代码整洁之道》笔记
  • Linux进程异常退出排查指南
  • C++ 手撕shared_ptr
  • 基于朴素贝叶斯与 LSTM 的假新闻检测模型对比分析
  • Linux容器技术详解
  • TransmittableThreadLocal使用场景
  • 编译原理实验五:LR语法分析器的控制程序
  • 类方法_静态方法_实例方法
  • RAG流程介绍
  • [Windows] 自动关机辅助工具 Shutdown Timer Classic 1.2.3
  • 反向海淘爆发期:独立站系统如何打造跨境代购新基建?​
  • BrepGen中的几何特征组装与文件保存详解 deepwiki occwl OCC包装库
  • 如何用AI优化简历:自动读取与精华浓缩
  • Python训练营打卡 Day28
  • 【SpringBoot】MyBatisPlus(MP | 分页查询操作
  • 通过向量化数据结合大模型解释进行物料智能辨别
  • USRP 射频信号 采集 回放 系统
  • 博客打卡-求解流水线调度
  • Redis学习专题(二)事务和锁机制
  • spring cache使用指南
  • Python绘制克利夫兰点图:从入门到实战
  • Scanner对象
  • 微机电子拉伸试验机
  • Vue-事件修饰符
  • 56.合并区间(java)
  • 【springboot】HttpClient快速入门
  • 数组名既可作为指针也可作为变量名
  • 2025春训第二十场
  • vector(c++)
  • Mysql触发器(附案例)