IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> JavaScript知识库 -> 用js/javascript 封装标签多属性运动函数 带有回调函数 实现方法更加灵活 -> 正文阅读

[JavaScript知识库]用js/javascript 封装标签多属性运动函数 带有回调函数 实现方法更加灵活

<!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{

????????????width:?100px;

????????????height:?100px;

????????????background:?pink;

????????????position:?fixed;

????????????top:?50px;

????????????left:?calc(50%?-?50px);

????????}

????????h1{

????????????width:?100px;

????????????height:?100px;

????????????background:?orange;

????????????position:?fixed;

????????????top:?300px;

????????????left:?calc(50%?-?50px);

????????}

????????p{

????????????width:?100px;

????????????height:?100px;

????????????background:?green;

????????????position:?fixed;

????????????top:?580px;

????????????left:?calc(50%?-?50px);

????????}

????</style>

</head>

<body>

????<button>div的按钮</button>

????<button>h1的按钮</button>

????<button>P的按钮</button>

????<div></div>

????<h1></h1>

????<p></p>

????<script>

????????//?获取各个标签

????????let?oBtn?=?document.querySelectorAll('button');

????????let?oDiv?=?document.querySelector('div');

????????let?oH1?=?document.querySelector('h1');

????????let?oP?=?document.querySelector('p');


?

????????//?多属性运动函数封装完毕后??对button绑定?click?事件

????????//?并调用封装好的多属性运动函数

????????//?根据个人需求写入具体的参数值

????????oBtn[0].addEventListener('click',function(){

????????????move(oDiv,{width:500,?height:200,left:60},function(){oDiv.style.background?=?'red'})

????????})

????????oBtn[1].addEventListener('click',function(){

????????????move(oH1,{height:300,width:400,top:50},function(){oH1.style.background?=?'black'})

????????})

????????oBtn[2].addEventListener('click',function(){

????????????move(oP,{height:200,width:500,right:80},function(){oP.style.background?=?'blue'})

????????})





?

????????//?move?多属性运动函数

????????//?@param?参数1?element??要运动的标签对象

????????//?@param?参数2?typeObj??要运动的属性??和最终属性值

????????//?@param?参数3?comeBack?运动执行的回调函数??默认返回值为空函数

????????function?move(element?,?typeObj,?comeBack?=?function(){}){

????????????//?定义变量num??方便用于记录定时器目前存在的个数

????????????var?num?=?0;

????????????//?对typeObj执行遍历操作

????????????//?获取每一个属性type

????????????for(let?type?in?typeObj){

????????????????//?获取初始值???如果初始属性为?opacity??则需要做兼容出理

????????????????let?startNum?=?type?===?'opacity'???window.getComputedStyle(element)[type]*100?:?parseInt(window.getComputedStyle(element)[type]);

????????????????

????????????????//?获取最终值??同样需要对?opacity?情况做兼容处理

????????????????let?endNum?=?type?===?'opacity'???typeObj[type]*100?:?typeObj[type];

????????????????//?给?num++?记录产生定时器的个数

????????????????num?++?;

????????????????//?设定计时器??表变量time?记录定时器的序号??时间间隔为30毫秒

?????????????let?time?=?setInterval(function(){

????????????????//?计算步长??每一次步长即为?对应标签属性值的增减??也即是标签对象每次运动的距离

????????????????let?step?=?(endNum?-?startNum)/20;

????????????????//?因为步长的产生???并不一定就是整数值?其可能为小数参与运算的值

????????????????//?小数参与运算?会产生精度丢失的问题??导致最终函数的执行也会产生问题

????????????????//?故需要做步长的向上或向下取整的操作????向上取整为正数运算???向下取整为负数时操作?

????????????????//?从而避免精度丢失的问题?为函数造成的一些列问题

????????????????step?=?step?>?0???Math.ceil(step)?:?Math.floor(step);

????????????????startNum?+=?step?;?

????????????????//?将程序算得的最终运动值?符值给要运动标签的属性的值

????????????????element.style[type]?=?type?===?'opacity'???startNum/100?:?startNum?+?'px';

????????????????//?进行条件判断??条件满足??即为移动到最终位置??则需要清楚计时器

????????????????if(startNum?===?endNum){

????????????????????clearInterval(time);

????????????????????//?计时器被清楚??也意味着计时器个数减少??故需要num--

????????????????????num--;

????????????????//?进行条件判断?条件满足?即为所有计时器被器出完毕??

????????????????//?也即是所有属性运动完毕?则回调函数

????????????????????if(num?===?0){

????????????????????????comeBack();

????????????????????}

????????????????}

?????????????},30)

????????????}

????????}

????????//?@码上成功~

????</script>

</body>

</html>

  JavaScript知识库 最新文章
ES6的相关知识点
react 函数式组件 & react其他一些总结
Vue基础超详细
前端JS也可以连点成线(Vue中运用 AntVG6)
Vue事件处理的基本使用
Vue后台项目的记录 (一)
前后端分离vue跨域,devServer配置proxy代理
TypeScript
初识vuex
vue项目安装包指令收集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-10 23:05:17  更:2021-08-10 23:05:29 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年4日历 -2025/4/20 18:07:37-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码