分享一个用原生JavaScript写的带缓动效果的图片幻灯
朋友让帮忙找个原生JS写的带缓动效果的图片幻灯,类似Tmall首页的效果,找了一圈后发现网上JS写的图片幻灯很多,相关的jQuery插件也很多,但用原生JS写的带缓动效果的却不多。没办法只好自己动手,现在把代码分享给大家,希望对大家有用。
代码中的缓动公式用了司徒正美博客中整理的代码: http://HdhCmsTestcnblogs测试数据/rubylouvre/archive/2009/09/17/1567607.html
缓动公式的推导主要利用了物理中的加速度知识,推荐过程可以看看这篇文章: http://floatyears.info/javascript-animation-easing
HTML部分:
< div id ="J-Slide" >
< ul class ="JSlide-list" >
< li >< img src ="http://images.cnblogs测试数据/cnblogs_com/artwl/357654/o_01.jpg" alt ="" /></ li >
< li >< img src ="http://images.cnblogs测试数据/cnblogs_com/artwl/357654/o_02.jpg" alt ="" /></ li >
< li >< img src ="http://images.cnblogs测试数据/cnblogs_com/artwl/357654/o_03.jpg" alt ="" /></ li >
< li >< img src ="http://images.cnblogs测试数据/cnblogs_com/artwl/357654/o_04.jpg" alt ="" /></ li >
< li >< img src ="http://images.cnblogs测试数据/cnblogs_com/artwl/357654/o_05.jpg" alt ="" /></ li >
</ ul >
< ul class ="JSlide-num" >
< li class ="current" > 1 </ li >
< li > 2 </ li >
< li > 3 </ li >
< li > 4 </ li >
< li > 5 </ li >
</ ul >
< div class ="JSlide-mask" ></ div >
</ div >
这部分比较简单,跟Tmall首页效果一样,几张图片,左下角是图片索引,并有一个半透明的遮罩层。
CSS部分:
body,ul,li {
margin : 0 ;
padding : 0 ;
}
ul {
list-style : none ;
}
#J-Slide {
width : 600px ;
height : 400px ;
position : relative ;
margin : 50px auto ;
overflow : hidden ;
}
#J-Slide .JSlide-list {
position : absolute ;
width : 3000px ;
left : 0 ;
top : 0 ;
}
#J-Slide .JSlide-list li {
float : left ;
}
#J-Slide .JSlide-list li img {
width : 600px ;
height : 400px ;
}
#J-Slide .JSlide-num {
position : absolute ;
left : 0 ;
bottom : 0 ;
height : 30px ;
padding : 5px ;
width : 100% ;
z-index : 10 ;
}
#J-Slide .JSlide-num li {
width : 30px ;
height : 30px ;
margin-left : 10px ;
float : left ;
font-size : 16px ;
color : white ;
background : #716584 ;
line-height : 30px ;
text-align : center ;
cursor : pointer ;
border-radius : 15px ;
}
#J-Slide .JSlide-mask {
position : absolute ;
left : 0 ;
background : black ;
bottom : 0 ;
width : 100% ;
height : 40px ;
opacity : 0.3 ;
filter : Alpha(opacity = 30) ;
z-index : 1 ;
}
#J-Slide .JSlide-num .current {
background : #B91919 ;
}
CSS部分比较简单,直接用absolute定位。
JavaScript库部分:
( function (){
/*
*参数说明:
*id 必须
*picwidth 可选
*speed 可选
*
*作者:artwl
*出处:http://artwl.cnblogs测试数据
*/
var JCP_Slide= function (id,picwidth,speed){
if ( this === window)
return new JCP_Slide(id,picwidth,speed);
var obj= document.getElementById(id),
childs =obj.getElementsByTagName("ul" );
this .author="artwl" ;
this .jslideList=childs[0 ];
this .jslideNums=childs[1 ].children;
this .speed= speed || 5000 ;
this .picwidth= picwidth || (obj.currentStyle ? parseFloat(obj.currentStyle.width) : parseFloat(document.defaultView.getComputedStyle(obj, null ).width));
this .currentIndex=0 ;
this .distance= this .picwidth;
this .currentLeftPos=0 ;
this .runHandle= null ;
this .len= this .jslideNums.length;
}
JCP_Slide.prototype = {
bindMouse: function (){
var self= this ;
for ( var i=0;i< this .len;i++ ){
this .jslideNums[i].onmouseover=( function (index){
return function (){
self.currentIndex = index;
clearInterval(self.runHandle);
var prev=-1 ;
for ( var k=0;k<self.len;k++ ){
if (self.jslideNums[k].className === "current" )
prev = k;
self.jslideNums[k].className = k === index ? "current" : "" ;
}
if (prev != index){
self.distance =(prev - index)* self.picwidth;
self.currentLeftPos = -prev * self.picwidth;
self.transition(self.jslideList,{field: 'left' ,begin:self.currentLeftPos,change:self.distance,ease:self.easeOutCirc})
}
}
})(i);
this .jslideNums[i].onmouseout= function (){
self.autoRun();
}
}
},
autoRun: function (){
var self= this ;
this .runHandle=setInterval( function (){
self.distance =- self.picwidth;
for ( var k=0;k<self.len;k++ ){
self.jslideNums[k].className = "" ;
}
self.currentIndex ++ ;
self.currentIndex %=5 ;
self.jslideNums[self.currentIndex].className = "current" ;
self.currentLeftPos = -(self.currentIndex-1) * self.picwidth;
if (self.currentIndex == 0 ){
self.distance = (self.len-1)* self.picwidth;
self.currentLeftPos = - self.distance;
}
self.transition(self.jslideList,{field: 'left' ,begin:self.currentLeftPos,change:self.distance,ease:self.easeOutCirc});
},self.speed);
},
easeOutCirc: function (pos){
return Math.sqrt(1 - Math.pow((pos-1), 2 ))
},
transition: function (el){
el.style.position = "absolute" ;
var options = arguments[1] || {},
begin = options.begin, // 开始位置
change = options.change, // 变化量
duration = options.duration || 500, // 缓动效果持续时间
field = options.field, // 必须指定,基本上对top,left,width,height这个属性进行设置
ftp = options.ftp || 50 ,
onStart = options.onStart || function (){},
onEnd = options.onEnd || function (){},
ease = options.ease, // 要使用的缓动公式
end = begin + change, // 结束位置
startTime = new Date().getTime(); // 开始执行的时间
onStart();
( function (){
setTimeout( function (){
var newTime = new Date().getTime(), // 当前帧开始的时间
timestamp = newTime - startTime, // 逝去时间
delta = ease(timestamp / duration);
el.style[field] = Math.ceil(begin + delta * change) + "px"
if (duration <= timestamp){
el.style[field] = end + "px" ;
onEnd();
} else {
setTimeout(arguments.callee, 1000/ftp);
}
}, 1000/ftp)
})();
},
play: function (){
this .bindMouse();
this .autoRun();
}
};
window.JCP_Slide = JCP_Slide;
})();
这个JS库是核心,入口有三个参数,第一个是最外层的div的id(必须),第二个参数是图片宽度(可选),默认为最外层DIV宽度,第三个参数为自动切换的时间间隔(可选),默认为5秒。
bindMouse是绑定鼠标的悬浮和移出事件,autoRun是让图片正动切换,play方法调用了这两个方法。
easeOutCirc是一个先快后慢的缓动公式,transition是缓动函数,这两个方法的用法请参考 司徒正美 的博客: http://HdhCmsTestcnblogs测试数据/rubylouvre/archive/2009/09/17/1567607.html
调用示例:
window.onload= function (){
JCP_Slide( "J-Slide" ).play();
};
完整代码为:
View Code
运行效果:
1 2 3 4 5
作者: Artwl
出处: http://artwl.cnblogs测试数据
本文首发博客园,版权归作者跟博客园共有。转载必须保留本段声明,并在页面显著位置给出本文链接,否则保留追究法律责任的权利。
分类: JavaScript
标签: javascript , 图片幻灯
作者: Leo_wl
出处: http://HdhCmsTestcnblogs测试数据/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于分享一个用原生JavaScript写的带缓动效果的图片幻灯的详细内容...