JavaScript--封装好的运动函数+旋转木马例子
封装好的运动函数:
1.能控制目标元素的多种属性
2.能自动获取元素的样式表:
3.获取样式函数兼容
4.能对于元素的多属性进行动画(缓动动画)修改
5.能区分透明度等没单位的属性和px属性的变化
animate.js
/**
* 获取样式函数
* @param element 要获取的样式的对象
* return 目标css样式对象
* */
function getStyle(element) {
if(window.getComputedStyle) {
return window.getComputedStyle(element,null);
}else if(element.currentStyle){
return element.currentStyle;
}
} /**
* 动画函数
* @param element html标签
* @param attr 标签属性
* @param target 目标参数
* */
function animate(element,obj) {
clearInterval(element.timer);
element.timer = setInterval(function () {
var flag = true;
for(var attr in obj){
// 在for in 的内部要区别开到底是透明度还是像素px的变化
if( attr == "opacity") {
var current = getStyle(element)[attr];
var target = obj[attr];
current = current * 100;
target = target * 100;
// Math.round() 函数返回一个数字四舍五入后最接近的整数值。
current = Math.round(current);
var step = (target - current) / 10;
current += current <= target ? Math.ceil(step):Math.floor(step);
if(current != target) {
flag = false;
}
// element.style.left等
element.style[attr] = current / 100;
}else if(attr == "zIndex"){
element.style[attr] = obj[attr];
} else{
var current = parseInt(getStyle(element)[attr]);
var target = obj[attr];
var step = (target - current) / 10;
current += current <= target ? Math.ceil(step):Math.floor(step);
if(current != target) {
flag = false;
}
// element.style.left等
element.style[attr] = current+ "px";
}
}
if(flag) {
clearInterval(element.timer);
}
},40);
}
animate2.js
// 多个属性运动框架 添加回调函数
function animate(obj,json,fn) { // 给谁 json
clearInterval(obj.timer);
obj.timer = setInterval(function() {
var flag = true; // 用来判断是否停止定时器 一定写到遍历的外面
for(var attr in json){ // attr 属性 json[attr] 值
//开始遍历 json
// 计算步长 用 target 位置 减去当前的位置 除以 10
// console.log(attr);
var current = 0;
if(attr == "opacity")
{
current = Math.round(parseInt(getStyle(obj,attr)*100)) || 0;
console.log(current);
}
else
{
current = parseInt(getStyle(obj,attr)); // 数值
}
// console.log(current);
// 目标位置就是 属性值
var step = ( json[attr] - current) / 10; // 步长 用目标位置 - 现在的位置 / 10
step = step > 0 ? Math.ceil(step) : Math.floor(step);
//判断透明度
if(attr == "opacity") // 判断用户有没有输入 opacity
{
if("opacity" in obj.style) // 判断 我们浏览器是否支持opacity
{
// obj.style.opacity
obj.style.opacity = (current + step) /100;
}
else
{ // obj.style.filter = alpha(opacity = 30)
obj.style.filter = "alpha(opacity = "+(current + step)* 10+")"; }
}
else if(attr == "zIndex")
{
obj.style.zIndex = json[attr];
}
else
{
obj.style[attr] = current + step + "px" ;
} if(current != json[attr]) // 只要其中一个不满足条件 就不应该停止定时器 这句一定遍历里面
{
flag = false;
}
}
if(flag) // 用于判断定时器的条件
{
clearInterval(obj.timer);
//alert("ok了");
if(fn) // 很简单 当定时器停止了。 动画就结束了 如果有回调,就应该执行回调
{
fn(); // 函数名 + () 调用函数 执行函数
}
}
},30)
}
function getStyle(obj,attr) { // 谁的 那个属性
if(obj.currentStyle) // ie 等
{
return obj.currentStyle[attr]; // 返回传递过来的某个属性
}
else
{
return window.getComputedStyle(obj,null)[attr]; // w3c 浏览器
}
}
旋转木马例子
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>旋转木马轮播图</title>
<style>
/*初始化 reset*/
blockquote,body,button,dd,dl,dt,fieldset,form,h1,h2,h3,h4,h5,h6,hr,input,legend,li,ol,p,pre,td,textarea,th,ul{margin:0;padding:0}
body,button,input,select,textarea{font:12px/1.5 "Microsoft YaHei", "微软雅黑", SimSun, "宋体", sans-serif;color: #666;}
ol,ul{list-style:none}
a{text-decoration:none}
fieldset,img{border:0;vertical-align:top;}
a,input,button,select,textarea{outline:none;}
a,button{cursor:pointer;} .wrap{
width:1200px;
margin:100px auto;
}
.slide {
height:500px;
position: relative;
}
.slide li{
position: absolute;
left:200px;
top:0;
}
.slide li img{
width:100%;
}
.arrow{
/*opacity: 0;*/
}
.prev,.next{
width:76px;
height:112px;
position: absolute;
top:50%;
margin-top:-56px;
background: url(images/prev.png) no-repeat;
z-index: 99;
}
.next{
right:0;
background-image: url(images/next.png);
}
</style>
</head> <body>
<div class="wrap" id="wrap">
<div class="slide" id="slide">
<ul>
<li>
<a href="#"><img src="data:images/slidepic1.jpg" alt="" /></a>
</li>
<li>
<a href="#"><img src="data:images/slidepic2.jpg" alt="" /></a>
</li>
<li>
<a href="#"><img src="data:images/slidepic3.jpg" alt="" /></a>
</li>
<li>
<a href="#"><img src="data:images/slidepic4.jpg" alt="" /></a>
</li>
<li>
<a href="#"><img src="data:images/slidepic5.jpg" alt="" /></a>
</li>
</ul>
<div class="arrow" id="arrow">
<a href="javascript:;" class="prev" id="arrLeft"></a>
<a href="javascript:;" class="next" id="arrRight"></a>
</div>
</div>
</div>
<!--把动画函数封装好,再通过script标签的属性引入到当前文件-->
<script src="animate.js"></script>
<script>
/**
* 第一个功能:
* 让图片都散开,到达每一张图片应该到达的位置
* 根据config数组,设置每一张图片的位置即可
*
* 第二个功能
* 旋转
* 点击左右按钮
*/
var config = [
{
width: 400,
top: 20,
left: 50,
opacity: 0.2,
zIndex: 2
}, //
{
width: 600,
top: 70,
left: 0,
opacity: 0.8,
zIndex: 3
}, //
{
width: 800,
top: 100,
left: 200,
opacity: 1,
zIndex: 4
}, //
{
width: 600,
top: 70,
left: 600,
opacity: 0.8,
zIndex: 3
}, //
{
width: 400,
top: 20,
left: 750,
opacity: 0.2,
zIndex: 2
} //
]; var slide = document.getElementById('slide');
var slideItem = slide.children[0].children;
var arrLeft = document.getElementById("arrLeft");
var arrRight = document.getElementById("arrRight");
// 页面加载完毕后,运行散开动画
for(var i = 0 ; i < slideItem.length; i++ ) {
animate(slideItem[i],config[i]); }
// 给右按钮添加点击事件 arrRight.onclick = function () {
//splice() 方法通过删除现有元素和/或添加新元素来更改一个数组的内容。
// config.splice(0,1)[0] 截取数组的第一个元素
// 再把截取的元素放到改变之后的数组的最后位置
config.splice(config.length,0,config.splice(0,1)[0]);
for(var i = 0 ; i < slideItem.length; i++ ) {
animate(slideItem[i],config[i]);
}
}
arrLeft.onclick = function () {
config.splice(0,0,config.splice(config.length-1,1)[0]);
for(var i = 0 ; i < slideItem.length; i++ ) {
animate(slideItem[i],config[i]);
}
} </script>
</body> </html>
JavaScript--封装好的运动函数+旋转木马例子的更多相关文章
- JavaScript封装
js封装就是把使用方式简单化,内部逻辑和使用解耦.使用人员知道参数和返回值就可以了,其他不用使用人员设置. 封装就是将属性,方法,字段等封装成类. JavaScript封装方法 1,函数方式 func ...
- Javascript之封装运动函数
@ 目录 阶段一.仅适用单位带px属性的匀速运动 阶段二.可适用单位不带px属性(如opacity)的匀速运动 阶段三.适用于多元素单一属性的匀速运动 阶段四.适用于多元素单一属性的匀速或缓冲运动 阶 ...
- 我自己的Javascript 库,封装了一些常用函数 Kingwell.js
我自己的Javascript 库,封装了一些常用函数 Kingwell.js 博客分类: Javascript javascript 库javascript库 现在Javascript库海量,流行的 ...
- JavaScript封装一个函数效果类似内置方法concat()
JavaScript封装一个函数效果类似内置方法concat() 首先回忆concat()的作用: concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,而仅仅会返回被连接数组的一个 ...
- 原生JS封装时间运动函数
/*讲时间运动之前先给大家复习一下运动函数 通常大家都会写运动框架,一个定时器(Timer),一个步长(step 就是每次运动的距离),一个当前位置(current)一个目标位置(target),然后 ...
- 运动函数封装(js)
// 运动函数 function starMove(obj,json,fnEnd){ clearInterval(obj.timer); obj.timer = setInterval(functi ...
- Javascript 封装方法
基本封装方法 请看下面的例子: var Person = function(name,age){ this.name = name; this.age = age || "未填写" ...
- javaScript封装的各种写法
在javascript的世界里,写法是个神奇的现象,真是百家齐开放啊!每次看到老外写的js组件,思想和写法都怪异,就没看到一个js结构基本相同的代码出来.今天,我就来谈谈js写法,我在开发过程中,也写 ...
- 分享几个Javascript 封装方法
基本封装方法 请看下面的例子: var Person = function(name,age){ this.name = name; this.age = age || "未填写" ...
随机推荐
- [编织消息框架][JAVA核心技术]数值与逻辑分离
为什么要分离? 业务需求是不停地变,如果把条件写进代码里,当用户需求变时要改代码发版本更新才能生效,这过程无疑是漫长的 就算是在开发期,不停的变开发者精力耗光在沟通,小修改上,无法专注逻辑部分 分离的 ...
- Ionic 生成icon图标
1.直接切换到项目跟目录 运行以下命令 备注:运行第一次ionic rescoures 后自动生成文件夹rescoures ,让后帮你自己的icon.png 文件放进入就ok ,在次运行ionic r ...
- leetcode算法题笔记|Reverse Integer
/** * @param {number} x * @return {number} */ var reverse = function(x) { var s; if(x<0){ s=-x; } ...
- iframe加载完成事件
var iframe = document.createElement("iframe"); iframe.src = "http://www.jb51.net" ...
- Flask中cookie和session设置与csrf原理攻防
Flask之操作cookie app.py from flask import Flask, request, Response app = Flask(__name__) @app.route('/ ...
- 架构hive2mysql流程
1.分析参数 args = new String[5]; args[0]="d:/3-20.sql"; args[1]="-date"; args[2]=&qu ...
- VS2015使用Nuget安装OpenCV3.X以及Python3安装OpenCV3.X
VS2015已经自带Nuget安装工具了,所以,新建一个项目,点击管理Nuget包 搜索OpenCV3 注意,目前只有这个版本支持VS2015,也就是平台工具集可以为vs140,其他的都会报错,报错我 ...
- UVA11722 Jonining with Friend
Joining with Friend You are going from Dhaka to Chittagong by train and you came to know one of your ...
- getBoundingClientRect介绍
getBoundingClientRect用于获取元素相对与浏览器视口的位置 由于getBoundingClientRect()已经是w3c标准,所以不用担心兼容,不过在ie下还是有所区别 { top ...
- python 中的split()函数和os.path.split()函数
Python中有split()和os.path.split()两个函数: split():拆分字符串.通过指定分隔符对字符串进行切片,并返回分割后的字符串列表. os.path.split():将文件 ...