Web APIs:PC 端网页特效--动画函数封装

news2024/11/20 13:27:40

动画原理

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

实现步骤:

1. 获得盒子当前位置

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

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

4. 加一个结束定时器的条件

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

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			div{
				position: absolute;
				width:100px ;
				height: 100px;
				left: 0px;
				background-color: pink;
				border: 1px solid red;
			}
		</style>
	</head>
	<body>
		<div></div>
		<script>
			
			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>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			div{
				position: relative;
				width:100px ;
				height: 100px;
				left: 0px;
				background-color: pink;
				border: 1px solid red;
			}
			span{
				position: relative;
				display: block;
				left: 0;
				width: 150px;
				height: 150px;
				background-color: yellow;
			}
		</style>
	</head>
	<body>
		<div></div>
		<span>123</span>
		<script>
			// 简单动画封装obj目标函数 target目标位置
			var div=document.querySelector('div');
			var span=document.querySelector('span')
			function animate(obj,target){
				var timer=setInterval(function(){
					if(obj.offsetLeft>=target){
						// 停止动画 本质是停止定时器
						clearInterval(timer);
					}
					obj.style.left=obj.offsetLeft+1+'px';
				},30)
			}
			// 调用函数
			animate(div,300)
			animate(span,200)
			
		</script>
	</body>
</html>

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

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

核心原理:利用 JS 是一门动态语言,可以很方便的给当前对象添加属性。

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			div{
				position: absolute;
				width:100px;
				height:100px;
				left: 0;
				background-color: pink;
				/* border: 1px solid red; */
			}
			span{
				position: absolute;
				display: block;
				left: 0;
				top: 200px;
				width: 150px;
				height: 150px;
				background-color: yellow;
			}
		</style>
	</head>
	<body>
		<button>点我123才走</button>
		<div></div>
		<span>123</span>
		<script>
			// 简单动画封装obj目标函数 target目标位置
			// 给不同的元素指定了不同的定时器
			var div=document.querySelector('div');
			var span=document.querySelector('span');
			var btn=document.querySelector('button');
			function animate(obj,target){
				// 当我们不断的点击按钮,这个元素的速度会越来越快,因为开启了太多的定时器
				// 解决方案就是让我们只有一个定时器执行 
				// 先清除以前的定时器,只有一个定时器
				clearInterval(obj.timer)
				obj.timer=setInterval(function(){
					if(obj.offsetLeft>=target){
						// 停止动画 本质是停止定时器
						clearInterval(obj.timer);
					}else{
						obj.style.left=obj.offsetLeft+1+'px';
					}		
				},30)
			}
			// 调用函数
			animate(div,300)
			// animate(span,200)
			btn.addEventListener('click',function(){
				animate(span,2000);
			})
			
			
		</script>
	</body>
</html>

 缓动动画原理

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

思路:

1. 让盒子每次移动的距离慢慢变小,速度就会慢慢落下来。

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

就是每秒走的路 

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

4. 注意步长值需要取整

 缓动动画基本代码实现

匀速动画 就是 盒子是当前的位置+固定的值(例如10    )
缓动动画 就是 盒子是当前的位置+变化的值(目标-现在的位置)/10

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			div{
				position: absolute;
				width:100px;
				height:100px;
				left: 0;
				background-color: pink;
				/* border: 1px solid red; */
			}
			span{
				position: absolute;
				display: block;
				left: 0;
				top: 200px;
				width: 150px;
				height: 150px;
				background-color: yellow;
			}
		</style>
	</head>
	<body>
		<button>点我123才走</button>
		<div></div>
		<span>123</span>
		<script>
			// 简单动画封装obj目标函数 target目标位置
			// 给不同的元素指定了不同的定时器
			var div=document.querySelector('div');
			var span=document.querySelector('span');
			var btn=document.querySelector('button');
			function animate(obj,target){
				// 当我们不断的点击按钮,这个元素的速度会越来越快,因为开启了太多的定时器
				// 解决方案就是让我们只有一个定时器执行 
				// 先清除以前的定时器,只有一个定时器
				clearInterval(obj.timer)
				obj.timer=setInterval(function(){
					// 步长值写到定时器的里面
					var step=(target-obj.offsetLeft)/10;
					if(obj.offsetLeft==target){
						// 停止动画 本质是停止定时器
						clearInterval(obj.timer);
					}else{
						// 把1改为步长(目标值 - 现在的位置 ) / 10 做为每次移动的距离 步长
						obj.style.left=obj.offsetLeft+step+'px';
					}		
				},15)
			}
			// 调用函数
			animate(div,500)
			// animate(span,200)
			btn.addEventListener('click',function(){
				animate(span,2000);
			})
			//匀速动画 就是 盒子是当前的位置+固定的值(例如10	)
			//缓动动画 就是 盒子是当前的位置+变化的值(目标-现在的位置)/10
			
		</script>
	</body>
</html>

 缓动动画多个目标值之间移动

除法运算,涉及小数会出现问题 

向上取整 ,但这样有问题,如何倒的取,那么他就不对了

用三元运算符就可以了 

缓动动画添加回调函数

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

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

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title></title>
		<style>
			div{
				position: absolute;
				width:100px;
				height:100px;
				left: 0;
				background-color: pink;
				/* border: 1px solid red; */
			}
			span{
				position: absolute;
				display: block;
				left: 0;
				top: 200px;
				width: 150px;
				height: 150px;
				background-color: yellow;
			}
		</style>
	</head>
	<body>
		<button class="btn500">点我500才走</button>
		<button class="btn800">点我800才走</button>
		<div></div>
		<span>123</span>
		<script>
			// 简单动画封装obj目标函数 target目标位置
			// 给不同的元素指定了不同的定时器
			var div=document.querySelector('div');
			var span=document.querySelector('span');
			var btn500=document.querySelector('.btn500');
			var btn800=document.querySelector('.btn800');
			function animate(obj,target,callBack){
				// console.log(callBack);callBack=function(){}  调用的时候 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);
						// 回调函数写到定时器结束后面
						if(callBack){
							// 调用函数
							callBack();
						}
					}else{
						// 把1改为步长(目标值 - 现在的位置 ) / 10 做为每次移动的距离 步长
						obj.style.left=obj.offsetLeft+step+'px';
					}		
				},15)
			}
			// 调用函数
			// animate(div,500)
			// animate(span,200)
			btn500.addEventListener('click',function(){
				animate(span,500,function(){
					// alert(1)
					span.style.backgroundColor='red';
				});
			})
			btn800.addEventListener('click',function(){
				animate(span,800);
			})
			//匀速动画 就是 盒子是当前的位置+固定的值(例如10	)
			//缓动动画 就是 盒子是当前的位置+变化的值(目标-现在的位置)/10
			
		</script>
	</body>
</html>

动画函数的使用

动画函数封装到单独JS文件里面

因为以后经常使用这个动画函数,可以单独封装到一个JS文件里面,使用的时候引用这个JS文件即可。

1. 单独新建一个JS文件。 2. HTML文件引入 JS 文件。

 

<!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>
        .sliderbar {
            position: fixed;
            right: 0;
            bottom: 100px;
            width: 40px;
            height: 40px;
            text-align: center;
            line-height: 40px;
            cursor: pointer;
            color: #fff;
        }
        
        .con {
            position: absolute;
            left: 0;
            top: 0;
            width: 200px;
            height: 40px;
            background-color: purple;
            z-index: -1;
        }
    </style>
    <script src="js/animate.js"></script>
</head>

<body>
    <div class="sliderbar">
        <span>←</span>
        <div class="con">问题反馈</div>
    </div>

    <script>
        // 1. 获取元素
        var sliderbar = document.querySelector('.sliderbar');
        var con = document.querySelector('.con');
        // 当我们鼠标经过 sliderbar 就会让 con这个盒子滑动到左侧
		sliderbar.addEventListener('mouseenter',function(){
			animate(con,-160,function(){
				sliderbar.children[0].innerHTML='>'
			})
		})
        // 当我们鼠标离开 sliderbar 就会让 con这个盒子滑动到右侧
		sliderbar.addEventListener('mouseleave',function(){
			animate(con,0,function(){
				sliderbar.children[0].innerHTML='<'
			})
		})
    </script>
</body>

</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C语言】三子棋小游戏

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f40c; 个人主页&#xff1a;蜗牛牛啊 &#x1f525; 系列专栏&#xff1a;初出茅庐C语言 ☀️ 学习格言&#xff1a;眼泪终究流不成海洋&#xff0c;人总要不断成长&am…

Selenium基础 — iframe表单操作

1、什么是iframe表单 实际上就是HTML页面中使用iframe/frame标签&#xff0c;是在当前页面中引用了其他页面的链接&#xff0c;真正的页面数据并没有出现在当前页面源码中&#xff0c;但是在浏览器中我们时看到的。简单理解可以使页面中开了一个窗口显示另一个页面。 我们在We…

谷粒商城-支付业务

目录 商城业务-支付-支付宝沙箱&代码 商城业务-支付-RSA、加密加签、密钥等 商城业务-支付-内网穿透 商城业务-订单服务-整合支付前需要注意的问题 商城业务-订单服务-整合支付 商城业务-订单服务-支付成功同步回调 商城业务-订单服务-订单列表页渲染完成 商城业务…

网络请求+基于Node.js的WebSocket

目录 前言 网络访问配置 1.配置流程 注意事项 使用限制 网络请求详情API wx.request请求数据API ​编辑 wx.uploadFile文件上传API wx.downloadFile文件下载API WebSocket会话API 基于Node.js的WebSocket 为什么WebSocket连接可以实现全双工通信而HTTP连接不行呢&…

git命令记不住?可视化git操作平台Sourcetree入门教程

1、为什么要用Sourcetree 在应届生在参加实习或者工作的时候&#xff0c;往往需要配置各种各样的环境&#xff0c;git肯定是程序员必不可少的分布式版本控制系统&#xff0c;但刚出来工作时往往对git代码不熟悉&#xff0c;老是会忘掉一些命令&#xff0c;所以笔者在此推荐一个…

算法《第四版》笔记整理

算法第四版 先导例子&#xff1a;动态连通性 - 书中1.5 知识点&#xff1a;并查集-一种用于解决动态连通性问题的算法 描述&#xff1a;对于N个对象&#xff0c;有两种操作&#xff1a;1.连接两个对象 2.判断两个对象是否存在连接路径 如巨大的连通性问题&#xff1a; 在分析…

【力扣刷题】Day32——单调栈专题

文章目录单调栈1.每日温度2.下一个更大元素 I3.下一个更大元素II4. 接雨水5.柱状图中最大的矩形单调栈 单调栈基础知识回顾&#xff1a;单调栈与单调队列_塔塔开!!!的博客-CSDN博客_单调栈 单调队列 单调栈一般模板&#xff1a; int[] stk new int[N] //Stack<Integer>…

倒排索引-字符串相似匹配(结巴分词、中文转拼音)

工作中&#xff0c;遇到有两个不同的系统&#xff0c;两个系统中有相同的功能&#xff0c;维护一个主播的名称。现在准备将两个系统的主播合并到一起。因为主播名称可能由不同的人维护的&#xff0c;他们也不知道主播的真实姓名&#xff0c;比如一条小团团&#xff0c;可能维护…

香橙派3LTS部署ROS2阿克曼开源平台

1.系统镜像下载 这里我们需要安装ROS2的humble版本&#xff0c;需要ubuntu 22.04版本的系统。 香橙派镜像下载&#xff1a;http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3-LTS.html 点击Ubuntu镜像&#xff0c;选择jamm…

【linux】进程概念详述

进程概念一、冯诺依曼系统二、操作系统2.1 OS层次图2.2 操作系统的意义2.2.1 系统调用与库函数的区别2.3 管理的理解三、进程3.1 进程的概念3.2 描述进程-PCB3.3 进程和程序3.4 PCB内容3.4.1 查看进程3.4.2 标识符3.4.3 状态3.4.4 程序计数器3.4.5 记账信息3.4.6 上下文信息❗️…

1.极限与连续-——“机器学习中的数学”

1.通过集合相等来讲解什么是映射关系 上面问的这个问题&#xff08;2N N2&#xff09;说明了什么&#xff1f; ——两个无穷集合&#xff0c;如果能找到一种对应关系&#xff08;映射关系&#xff09;&#xff0c;那么我们就可以说这两个集合是等价的。 数列的极限就是趋势 …

字符串转二叉树

一. 题目介绍 二. 题目分析 首先 题目让我们以先序遍历的方式用字符串建立一个二叉树 输入是一个字符串 输出是是以中序遍历二叉树打印 我们先来看最简单的输入 这里只要建立一个字符数组 然后等测试用例输入就好了 // 接受输入值char arr[100]{0};scanf("%s",…

网络原理 --- 传输层Ⅳ TCP协议中的延迟应答、捎带应答、面向字节流、TCP中的异常处理

文章目录网络原理传输层TCP协议7.延迟应答8.捎带应答9. 面向字节流10.TCP中的异常处理总结网络原理 介绍TCP/IP协议中每一层里面的核心内容~ 应用层传输层网络层数据链路层物理层 传输层TCP协议 7.延迟应答 提高传输效率的机制 又是基于流量控制,来引入的提高效率的机制 实…

数据在内存中的存储

目录 数据在内存中的存储&#xff1a;&#xff1a; 整型及其浮点型存储方式: 1.数据类型介绍 2.整形在内存中的存储&#xff1a;原码 反码 补码 3.大小端字节序介绍及判断 4.浮点型在内存中的存储 5.两道经典指针选择题 C语言编程训练(牛客网) 1.喝汽水问题 2.字符串逆序 3.打…

Python编程运算符 ——算数运算符

作者简介&#xff1a;一名在校计算机学生、每天分享Python的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.运算符 1.在Python运算符中分为 2.算数运算符 3.比较重要的运算符 4…

网络原理——No.1 传输层_TCP的确认应答机制与超时重传

JavaEE传送门JavaEE JavaEE——网络原理_应用层 网络原理——传输层_UDP 目录传输层TCPTCP 的基本特性确认应答机制超时重传传输层 端到端之间的传输, 重点关注的是起点和终点 核心的协议有两个: UDP: 无连接, 不可靠传输,面向数据报, 全双工 TCP: 有链接, 可靠传输, 面向字…

黑猫带你学UFS协议第11篇:什么是逻辑单元(LU)与逻辑块(Sector)

本文依据UFS3.1 JEDEC协议及个人工作经验整理而成,如有错误请留言。 文章为个人辛苦整理,付费内容,已加入原创维权,禁止私自转载。 文章所在专栏:《黑猫带你学:UFS协议详解》 1 LU简介 我们对与UFS、emmc一类存储芯片,最重要的功能是什么?无非就是存数据和取出数据,也…

神经网络的输入稀疏矩阵,神经网络中的矩阵运算

1、BP神经网络模型各个参数的选取问题 样本变量不需要那么多&#xff0c;因为神经网络的信息存储能力有限&#xff0c;过多的样本会造成一些有用的信息被丢弃。如果样本数量过多&#xff0c;应增加隐层节点数或隐层数目&#xff0c;才能增强学习能力。 一、隐层数 一般认为&am…

牛客前端刷题(九)—— 打包篇

还在担心面试不通过吗&#xff1f;给大家推荐一个超级好用的刷面试题神器&#xff1a;牛客网&#xff0c;里面涵盖了各个领域的面试题库&#xff0c;还有大厂真题哦&#xff01; 赶快悄悄的努力起来吧&#xff0c;不苒在这里衷心祝愿各位大佬都能顺利通过面试。 面试专栏分享&a…

greenplum 源码解析 FTS辅助进程--ReadMe

简介 在greenplum数据库中master节点有一个专属进程Fault Tolerance Service (FTS: 容错服务)&#xff0c;其主要功能是检测所有segment节点的健康信息&#xff0c;如果其检测到segment节点的primary出现异常[硬件故障/宕机]&#xff0c;会在第一时间将其对应的mirror提升为新的…