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 || "未填写" ...
随机推荐
- C++ 赋值函数为什么返回reference to *this?
赋值操作为什么要返回 reference to *this? 要弄清这个问题之前,先了解函数的返回值类型:返回值类型,返回引用类型 返回值类型:返回的是一个对象的副本. test operator= ...
- Java中将字符串转为驼峰格式
本文不再更新,可能存在内容过时的情况,实时更新请移步我的新博客:Java中将字符串转为驼峰格式: 使用CaseUtils 对Java字符串进行转换为驼峰格式: CaseUtils.toCamelCas ...
- [Swoole系列入门教程 2] 入门级的Swoole的demo.服务端与客户端
- linux负载均衡(什么是负载均衡)
linux负载均衡(什么是负载均衡) 一.总结 一句话总结: 建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽.增加吞吐量.加强网络数据处理能力.提高网络的灵活性和可用 ...
- s3fs 挂载minio为本地文件系统
https://github.com/s3fs-fuse/s3fs-fuse echo ACCESS_KEY_ID:SECRET_ACCESS_KEY > ${HOME}/.passwd-s3f ...
- 【DM642学习笔记六】TI参考文档--DM642 Video Port Mini Driver
这个文档介绍了在DM642EVM板上视频采集和显示微驱动的使用和设计.用EDMA进行存储器和视频端口的数据传输.为了增强代码的复用性和简化设计过程,驱动分为通用视频端口层和特定编解码芯片微驱动层两个 ...
- Composer安装Yii2以及相关扩展
1.安装redis扩展 命令:composer require yiisoft/yii2-redis Git地址:https://github.com/yiisoft/yii2-redis/blob/ ...
- 关于开启Eureka安全Security认证后,客户端死活注册不上的问题
遇到一个问题"开启Eureka服务端的安全认证后,客户端死活注册不到Eureka上",已经尝试了以下办法,完全搞不定... 客户端出错的版本: spring-boot:2.0.3. ...
- 2019-8-31-dotnet-获取用户设备安装了哪些-.NET-Framework-框架
title author date CreateTime categories dotnet 获取用户设备安装了哪些 .NET Framework 框架 lindexi 2019-08-31 16:5 ...
- Ionic Cordova 环境配置window
1.安装java jdk http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 2.安 ...