使用原生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.原生 ...
随机推荐
- NFS服务器搭建与配置
原文:https://blog.csdn.net/qq_38265137/article/details/83146421 NFS服务简介什么是NFS?NFS就是Network File System ...
- NOIP模拟 17.8.16
NOIP模拟17.8.16 A 债务文件名 输入文件 输出文件 时间限制 空间限制debt.pas/c/cpp debt.in debt.out 1s 128MB[题目描述]小 G 有一群好朋友,他们 ...
- (续)使用Django搭建一个完整的项目(Centos7+Nginx)
django-admin startproject web cd web 2.配置数据库(使用Mysql) vim web/settings.py #找到以下并按照实际情况修改 DATABASES = ...
- Bnd教程(1):如何用命令行安装bnd
1. 如果你用的是MacOS,请运行: brew install bnd 然后运行bnd version看是否安装成功: $ bnd version 4.0.0.201801191620-SNAPSH ...
- sublime配置node开发环境
下载node插件 https://github.com/tanepiper/SublimeText-Nodejs 下载zip压缩包后解压,文件名改为Node 打开文件“Nodejs.sublime-s ...
- SDUT-3375_数据结构实验之查找三:树的种类统计
数据结构实验之查找三:树的种类统计 Time Limit: 400 ms Memory Limit: 65536 KiB Problem Description 随着卫星成像技术的应用,自然资源研究机 ...
- scrapy 调用js
依赖: PyExecJS 使用案例: from execjs import execjs text = response.xpath('//script/text()')[1].get() ctx = ...
- 《VIM教程》笔记
一:vi ,vim, gvim简介 vi的功能是最弱的,它是*nix操作系统下最基本的文本编辑器. vim一开始的功能还不如vi,那个时候它的全称是"Vi IMitation",即 ...
- 发布SaaS加速器:我们不做SaaS,我们只做SaaS生态的推进者和守护者
摘要: 此次阿里云推出的SaaS加速器,涵盖商业中心.能力中心.技术中心三大板块,是阿里巴巴商业.能力和技术的一次合力输出:技术能力在这里沉淀为一个个模块,ISV和开发者只要通过简单的操作,写很少的代 ...
- HTTP请求模型
HTTP请求模型 HTTP请求模型 一.连接至Web服务器一个客户端应用(如Web浏览器)打开到Web服务器的HTTP端口的一个套接字(缺省为80). 例如:http://www.myweb.com: ...