小动画函数封装

为了让元素在某个边界内运动,我们将代码封装以便下次使用;


目标:让网页中的元素从左到右边移动

前提条件:假定我们的大盒子的calss是box,我们的小盒子的class是smallbox;

步骤:

1.先要获取到元素(这里使用let)

let box_ = document.querySelector(".box");

let small_box_ = document.querySelector(".smallbox");

notice:注意,这里还可以写其他选择元素的方法;(ps:一切为了兼容)

2.获取到元素的属性值

let box_width = box_.clientWidth; //获取大盒子的width;

let small_box_left =  small_box_.setoffLeft;//获取到小盒子距离最近的祖先定位元素的距离

let small_box_width  = small_box_ .clientWidth;  //获取小盒子的width;

//根据实际问题来获取这些属性值,这个时候我们的小盒子的路程其实就是大盒子的宽度减去小盒子的宽度

let temp =   box_width  -  small_box_width  ;//设置变量保存小盒子的路程;

let speed = 5 ;//设置一个速度;

var left = _small_box.style.left;//获取小盒子的left值

var sum = 0 ;//用来存储运动的距离

3.设置定时器来让元素自动移动

//这里注意人眼对于的图像的接收是有一定的限度的,当图像的速度快到一秒24张的时候,图像的就是连贯的,所以这里取用1000/60

let timer = setInterval(function(){

sum += speed ;//运动根据速度变化

if(sum >= temp){//如果sum的值大于temp那就说明小盒子已经超出大盒子

left = temp +  small_box_left +"px";//那就永远的将小盒子固定死

clearInterval(timer);//清除定时器

}

left  = sum + small_box_left  +"px";//否则,小盒子继续移动

},1000/60);

//说明:这里的代码没有经过运行,可能会存在bug,所以可以用来理解思路,其实获取元素的left这些属性值还有很多,还有就是,让盒子移动的方法也很多,下面我们来封装一个函数;

/*
 *函数作用:获取元素属性值函数
 *函数名:getattr()
 *参数:element元素,attr属性名
 *返回值:元素属性值
 */
 function getattr(element,attr){
//获取元素的 属性值
 return window.getComputedStyle?window.getComputedStyle(element)[attr]:element.currentStyle[attr];//三目运算符
 }

/*
 *函数作用:实现元素动画
 *函数名:animate()
 *参数:element元素,attr属性名,time时间,fn后续动画执行函数
 *返回值:无
 */
 function animate(element,option,time,fn){
 clearInterval(element.timer);//清除元素带着的定时器
 var start = {};//获取元素运动开始前的状态
 var range = {};//获取元素运动结束后的状态
 //获取过程
 for(let attr in option){ console.log(attr);
 // debugger;
 //获取元素运动开始前的状态
 start[attr] = parseFloat( getattr(element,attr));
 //计算元素结束时候的状态
 range[attr] = option[attr]-start[attr]; }
 // console.log(start);
 // console.log(range);
//元素运动前的时间
 var startTime = Date.now();
 //元素移动定时器
 element.timer = setInterval(function(){
 var currTime = Date.now();
//获取定时器每运动一次的时间
 var elapsed = currTime - startTime;
//获取时间差
 elapsed = Math.min(elapsed,time);
//为保证元素不跑出边界,取最小值
 // console.log(time);
 // console.log(elapsed);
 for(var attr in option){
 var res = elapsed*range[attr]/time + start[attr];
//存储计算所得的距离差值
 element.style[attr] = res + (attr === "opacity"?"":"px");
//改变元素的属性值,判断该属性是否是opacity
 }
 if(elapsed === time){//如果时间相等,则清除定时器
 clearInterval(element.timer);
 fn && fn();
 }
 },1000/60); }

相信这里的注释会让你看的懂,但是还是要说明:

这里实现的函数封装:

getattr():这个函数是为了获得元素的属性值,好多时候利用element.style无法获得,是因为外部的一些css代码没有办法获取到;所以这个时候就要用到window.getComputeStyle()这个window对象的方法,但是这个方法具有兼容性问题,也就是ie9以下的浏览器不支持,所以这个时候就要判断window对象是否含有这个对象

window.getComputedStyle?window.getComputedStyle(element)[attr]:element.currentStyle[attr]; //如果支持就使用 getComputedStyle 方法返回元素的属性值,否则就使用 element.currentStyle 返回元素的返回值

animate ():这个函数最大的亮点就是将元素的属性放在对象里面进行操作

fn && fn();  //利用了短路运算符,来判断是否传入了后续的动画效果

注意:这里的函数不支持bg颜色的改变

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 14,315评论 1 92
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 29,104评论 1 45
  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,995评论 5 15
  • 一、CSS入门 1、css选择器 选择器的作用是“用于确定(选定)要进行样式设定的标签(元素)”。 有若干种形式的...
    宠辱不惊丶岁月静好阅读 1,761评论 0 6
  • 前端开发面试题 <a name='preface'>前言</a> 只看问题点这里 看全部问题和答案点这里 本文由我...
    自you是敏感词阅读 910评论 0 3

友情链接更多精彩内容