使用原生JS封装一个动画函数
最近一直在忙项目,很少有时间回顾之前的知识,今天刚好要做一个轮播,因为对兼容性有一定的要求,使用了各种插件和库中的轮播,效果都不是很理想,一怒之下,使用原生JS封装了一个轮播组件,其中重要的功能就是一个动画,看了一下以前封装的函数,千疮百孔,又进行了重新封装,先上代码,有详细的备注。
function animate(el, target, step, dtime) {
/**
* 参数说明:
* - el 表示操作的元素对象
* - target 表示移动的目标距离 单位 px
* - step 表示步长,即每次移动的距离 单位 px
* - dtime 表示移动的间隔时间 单位 ms
*/
// 步长和间隔时间设置了默认值
step = step || 10;
dtime = dtime || 30;
// 判断是否开启定时器,如果有就清除
if (el.timeId) {
clearInterval(el.timeId);
el.timeId = null;
};
// 开启一个定时器,并将定时器挂载道当前元素上
el.timeId = setInterval(function () {
/**
* 获取盒子移动前的水平方向的位置(当前位置) - 偏移的位置
* - 可以使用 el.offsetLeft 获取,但会将外边距也获取到,不精准,不采用
* - 这里移动实现方式是改变 left的值,保持统一,还是使用 el.style.left 获取
* - 使用 el.style.left 有个弊端是,若元素对象上最初没有 left 属性时,获取返回的是 NAN
* - 这种情况只有在第一次会出现,故最开始的时候,还需要判断返回的值,若为 NAN,则重置为 0;如下
*/
var current = parseInt(el.style.left);
current = current ? current : 0;
// 判断目标距离是否小于当前位置,若小于将 步长 变为 负数,让元素反着移动
if (current > target) {
step = -Math.abs(step);
}
// 当目标距离与当前位置的差距小于步长时,直接当目标的水平位置设置为目标距离,并清除定时器后跳出函数
if (Math.abs(current - target) < Math.abs(step)) {
clearInterval(el.timeId);
el.style.left = target + 'px';
return;
}
// 定时器每执行一次,就让元素移动一个 步长
el.style.left = current + step + 'px';
}, dtime)
}
有两个地方需要特别说明:
- 计时器的是直接挂载到被操作的元素对象上的
el.timeID方便复用 - 获取当前水平偏移位置时,没使用 offsetLeft,因为当元素存在外边距时会产生误差,故还时使用原生获取left 的,并对不存在的问题做了判断处理。
若有不足或有更好建议的,欢迎留言交流。
使用原生JS封装一个动画函数的更多相关文章
- 原生JS封装简单动画效果
原生JS封装简单动画效果 一致使用各种插件,有时候对原生JS陌生了起来,所以决定封装一个简单动画效果,熟悉JS原生代码 function animate(obj, target,num){ if(ob ...
- 原生Js封装的动画类
算法用的是Tween类,需要研究的参考这篇文章: http://www.cnblogs.com/cloudgamer/archive/2009/01/06/Tween.html 网页里常用的动画 放大 ...
- Js封装的动画函数实现轮播图
---恢复内容开始--- 效果图说明:当鼠标移到哪一个按钮上的时候会自动跳转到某一张图片上,并且按钮会以高亮显示 项目目录结构 用到的js封装的animate()动画 function ...
- JS21. 使用原生JS封装一个公共的Alert插件(HTML5: Shadow Dom)
效果预览 Shadow DOM Web components 的一个重要属性是封装--可以将标记结构.样式和行为隐藏起来,并与页面上的其他代码相隔离,保证不同的部分不会混在一起,可使代码更加干净.整 ...
- 原生JS封装时间运动函数
/*讲时间运动之前先给大家复习一下运动函数 通常大家都会写运动框架,一个定时器(Timer),一个步长(step 就是每次运动的距离),一个当前位置(current)一个目标位置(target),然后 ...
- 使用原生JS封装一个ajax
function ajax(data){ //第一步,创建XHR对象 var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpReque ...
- 原生JS封装ajax方法
http://blog.sucaijiayuan.com/article/89 jquery框架的ajax方法固然好用,但是假如某天我们的项目不能引入jquery或项目需求很简单,没有很多交互功能,只 ...
- 原生JS封装创建多级菜单函数
手写一个使用原生JS封装的多级菜单的函数,满足以下几点需求. 子类层级不确定,可根据数据自动生成多级菜单. 操作便捷,只需传入一个HTML标签. 缺点: 需要满足特定的数据结构 废话不多说,展示代码. ...
- 原生JS封装_new函数,实现new关键字的功能
1.前言 众所周知:没有对象怎么办?那就new一个! 那么在JS中,当我们new一个对象的时候,这个new关键字内部都干了什么呢? 现在我们就来剖析一下原生JS中new关键字内部的工作原理. 2.原生 ...
随机推荐
- Neo4j文档
Neo4j 图数据库 主要有节点和关系,关系是有向边,节点和关系都有属性,属性是键值对 Neo4j使用CQL语句,代表Cypher查询语言 相当于SQL 统一声明 在所有的语句中均有结构 <no ...
- Directx11教程36 纹理映射(6)
原文:Directx11教程36 纹理映射(6) 本章主要是整理代码,做以下两件事情: 1.把世界坐标矩阵的计算,放在GraphicsClass的渲染函数中,之前放在D3DClass中,而且只是 ...
- 微信公众号系统在Linux下的部署操作
ps -ef | grep tomcat 查看tomcat进程
- React 入门笔记
一.什么是React React: A JAVASCRIPT LIBRARY FOR BUILDING USER INTERFACES 上面的话直译过来就是,React是一个用于构建用户界面的Java ...
- 如何在“代码”视图中工作并充分利用 Dreamweaver 的编码功能。如 Emmet 缩写
可通过多种方式在 Dreamweaver 中处理代码. 您可以使用“新建文档”对话框打开新的代码文件,然后开始键入您的代码. 在 Dreamweaver 中创建新的代码文件 键入时,会显示代码提示以帮 ...
- mysql 语句的查询过程解析
select * from tb where ID = 1 下面解析的查询过程都是基于上面的简单查询,该系列的所有素材都来自于丁奇的mysql的45讲 1.建立连接 a.客户端发出请求,请求首先到达连 ...
- Effective C++: 03资源管理
所谓资源,就是一旦用了它,将来必须还给系统.C++中的资源有:内存.文件描述符.互斥锁.数据库连接.网络socket等. 13:以对象管理资源 1:像下面这个函数: void f() { Invest ...
- 页面头部<meta>中的属性和含义
1<meta name="robots" content="index, follow" /> none:搜索引擎将忽略此网页,等价于noin ...
- 【转载】GAWK AWK工具使用手册
IBM GAWK入门资料http://www.ibm.com/developerworks/cn/education/aix/au-gawk/ AWK 是什么? 最简单地说,AWK 是一种用于处理文本 ...
- Android 监听软键盘搜索键
现在很多的Android应用都有了数据搜索功能,在以往的设计上,会使用搜索框+搜索按钮来实现搜索功能: 现在呢,越来越流行的是,去除搜索按钮,直接监听软键盘搜索键,当用户输入完搜索关键字后,直接点击软 ...