在JS中如何实现offset和匀速动画

亚连
Freigeben: 2018-06-07 14:39:29
Original
1641 Leute haben es durchsucht

这篇文章主要介绍了JavaScript动画:offset和匀速动画详解(含轮播图的实现),并把实现代码做了分享,有兴趣的朋友参考下。

offset简介

我们知道,三大家族包括:offset/scroll/client。今天来讲一下offset,以及与其相关的匀速动画。

offset的中文是:偏移,补偿,位移。

js中有一套方便的获取元素尺寸的办法就是offset家族。offset家族包括:

  • offsetWidth

  • offsetHight

  • offsetLeft

  • offsetTop

  • offsetParent

下面分别介绍。

1、offsetWidth 和 offsetHight

用于检测盒子自身的宽高+padding+border,不包括margin。如下:

offsetWidth = width + padding + border;

offsetHeight = Height + padding + border;

这两个属性,他们绑定在了所有的节点元素上。获取之后,只要调用这两个属性,我们就能够获取元素节点的宽和高。

举例如下:

      

Nach dem Login kopieren

2、offsetLeft 和 offsetTop

返回距离上级盒子(带有定位)左边的位置;如果父级都没有定位,则以body为准。

offsetLeft: 从父亲的 padding 开始算,父亲的 border 不算。

举例:

      

Nach dem Login kopieren

在父盒子有定位的情况下,offsetLeft == style.left(去掉px之后)。注意,后者只识别行内样式。但区别不仅仅于此,后面会讲。

3、offsetParent

检测父系盒子中带有定位的父盒子节点。返回结果是该对象的父级(带有定位)。

如果当前元素的父级元素,没有CSS定位(position为absolute、relative、fixed),那么offsetParent的返回结果为body。

如果当前元素的父级元素,有CSS定位(position为absolute、relative、fixed),那么offsetParent的返回结果为最近的那个父级元素。

举例:

     

Nach dem Login kopieren

打印结果:

offsetLeft和style.left区别

(1)最大区别在于:

offsetLeft 可以返回没有定位盒子的距离左侧的位置。如果父系盒子中都没有定位,以body为准。

style.left 只能获取行内式,如果没有,则返回""(意思是,返回空);

(2)offsetTop 返回的是数字,而 style.top 返回的是字符串,而且还带有单位:px。

比如:

p.offsetLeft = 100; p.style.left = "100px";
Nach dem Login kopieren

(3)offsetLeft 和 offsetTop 只读,而 style.left 和 style.top 可读写(只读是获取值,可写是赋值)

(4)如果没有给 HTML 元素指定过 top 样式,则style.top 返回的是空字符串。

总结:我们一般的做法是:用offsetLeft 和 offsetTop 获取值,用style.left 和 style.top 赋值(比较方便)。理由如下:

style.left:只能获取行内式,获取的值可能为空,容易出现NaN。

offsetLeft:获取值特别方便,而且是现成的number,方便计算。它是只读的,不能赋值。

动画的种类

  • 闪现(基本不用)

  • 匀速(本文重点)

  • 缓动(后续重点)

简单举例如下:(每间隔500ms,向右移动盒子100px)

      

Nach dem Login kopieren

效果如下:

匀速动画的封装:每间隔30ms,移动盒子10px【重要】

代码如下:

      

Nach dem Login kopieren

实现的效果:

上方代码中的方法封装,可以作为一个模板步骤,要记住。其实,这个封装的方法,写成下面这样,会更严谨,更容易理解:(将if语句进行了改进)

//【重要】方法的封装:每间隔30ms,将盒子向右移动10px function animate(ele, target) { //要用定时器,先清除定时器 //一个盒子只能有一个定时器,这样的话,不会和其他盒子出现定时器冲突 //我们可以把定时器本身,当成为盒子的一个属性 clearInterval(ele.timer); //我们要求盒子既能向前又能向后,那么我们的步长就得有正有负 //目标值如果大于当前值取正,目标值如果小于当前值取负 var speed = target > ele.offsetLeft ? 10 : -10; //speed指的是步长 ele.timer = setInterval(function () { //在执行之前就获取当前值和目标值之差 var val = target - ele.offsetLeft; //移动的过程中,如果目标值和当前值之差如果小于步长,那么就不能在前进了 //因为步长有正有负,所有转换成绝对值来比较 if (Math.abs(val) < Math.abs(speed)) { //如果val小于步长,则直接到达目的地;否则,每次移动一个步长 ele.style.left = target + "px"; clearInterval(ele.timer); } else { ele.style.left = ele.offsetLeft + speed + "px"; } }, 30) }
Nach dem Login kopieren

代码举例:轮播图的实现

完整版代码如下:(注释已经比较详细)

    无标题文档   

< >

Nach dem Login kopieren

实现效果:

上面是我整理给大家的,希望今后会对大家有帮助。

相关文章:

使用Node.js实现压缩和解压缩功能

有关Vue打包map文件的问题

使用vue2.0如何实现前端星星评分功能组件

Das obige ist der detaillierte Inhalt von在JS中如何实现offset和匀速动画. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!