Heim >Web-Frontend >js-Tutorial >JavaScript 图片切换展示效果alibaba拓展版_图象特效JavaScript 图片切换展示效果

JavaScript 图片切换展示效果alibaba拓展版_图象特效JavaScript 图片切换展示效果

PHP中文网
PHP中文网Original
2016-05-16 19:01:11878Durchsuche

看到alibaba的一个图片切换效果,感觉不错,想拿来用用。但代码一大堆的,看着昏,还是自己来吧。 由于有了做图片滑动展示效果的经验,做这个就容易得多了。

首先需要一个容器,设置它的overflow为hidden,position为relative;
容器里面还要一个滑动对象,设置它的position为absolute;
在initialize()函数里初始化一些属性。

在切换之前先执行Start()函数,进行相关设置,
主要是设置Index属性(索引)和_target属性(目标值): 

if(this.Index < 0){ 
this.Index = this._count - 1; 
} else if (this.Index >= this._count){ this.Index = 0; } 
this._target = -1 * this._parameter * this.Index;

接着就执行Move()函数开始移动了,原理通过设置滑动对象的top(或left)来做出移动的效果,
而减速的效果就需要执行GetStep()函数来获取步长: 

var iStep = (iTarget - iNow) / this.Step;用目标值减当前值再除以一个参数,得到步长,

这样取得的步长在当前值越接近目标值时会越来越小,也做成了减速的效果,
然后在top(或left)的设置中加上这个步长,并设置定时器继续Move(),直到到达目标值:

this._slider.style[style] = (iNow + iStep) + "px"; 
this._timer = setTimeout(function(){ oThis.Move(); }, this.Time);

下面例子里的容器结构: 

<p class="container" id="idTransformView"> 
<ul class="slider" id="idSlider"> 
<li><img src="http://shundebk.cn/temp/1.jpg"/></li> 
<li><img src="http://shundebk.cn/temp/2.jpg"/></li> 
<li><img src="http://shundebk.cn/temp/3.gif"/></li> 
</ul> 
<ul class="num" id="idNum"> 
<li>1</li> 
<li>2</li> 
<li>3</li> 
</ul> 
</p>

要美观的话需要css设置一下: 

.container, .container *{margin:0; padding:0;} 
.container{width:408px; height:168px; overflow:hidden;} 
.slider{position:absolute;} 
.slider li{ list-style:none;display:inline;} 
.slider img{ width:408px; height:168px; display:block;} 
.slider2{width:2000px;} 
.slider2 li{float:left;} 
.num{ position:absolute; right:5px; bottom:5px;} 
.num li{ 
float: left; 
color: #FF7300; 
text-align: center; 
line-height: 16px; 
width: 16px; 
height: 16px; 
font-family: Arial; 
font-size: 12px; 
cursor: pointer; 
overflow: hidden; 
margin: 3px 1px; 
border: 1px solid #FF7300; 
background-color: #fff; 
} 
.num li.on{ 
color: #fff; 
line-height: 21px; 
width: 21px; 
height: 21px; 
font-size: 16px; 
margin: 0 1px; 
border: 0; 
background-color: #FF7300; 
font-weight: bold; 
}

样式的设置跟程序也有一定关系,例如宽和高,这里就不说明了。
接着就可以实例化了: 

var tv = new TransformView ("idTransformView", "idSlider", 168, 3, { 
onStart : function(){ Each(objs, function(o, i) { o.className = tv.Index == i ? "on" : ""; }) }//按钮样式 
});

这里主要有4个参数,分别是容器对象、滑动对象、切换参数和切换数量。
当程序是上下切换时,切换参数切换的高度,当左右切换时,是切换的宽度。
切换数量就是有多少个切换对象了,例如上面的例子就是3个。
最后的参数是一些设置:
属性: 默认值//说明
Up: true,//是否向上(否则向左)
Step: 5,//滑动变化率
Time: 10,//滑动延时
Auto: true,//是否自动转换
Pause: 2000,//停顿时间(Auto为true时有效)
onStart: function(){},//开始转换时执行
onFinish: function(){}//完成转换时执行
例子里设置了onStart属性,作用是在切换开始时,设置按钮的样式
例子里完整的测试代码: 

function Each(list, fun){ 
for (var i = 0, len = list.length; i < len; i++) { fun(list[i], i); } 
}; 
var objs = $("idNum").getElementsByTagName("li"); 
var tv = new TransformView("idTransformView", "idSlider", 168, 3, { 
onStart : function(){ Each(objs, function(o, i) { o.className = tv.Index == i ? "on" : ""; }) }//按钮样式 
}); 
tv.Start(); 
Each(objs, function (o, i){ 
o.onmouseover = function(){ 
o.className = "on"; 
tv.Auto = false; 
tv.Index = i; 
tv.Start(); 
} 
o.onmouseout = function(){ 
o.className = ""; 
tv.Auto = true; 
tv.Start(); 
} 
})

源码: 

var $ = function (id) { 
return "string" == typeof id ? 
document.getElementById(id) : id; 
}; 

var Class = { 
create: 
function() { 
return function() { 
this.initialize.apply(this, arguments); 
} 
} 
} 

Object.extend = function(destination, source) { 
for (var property in source) { 
destination[property] = source[property]; 
} 
return destination; 
} 

var TransformView = Class.create(); 
TransformView.prototype = { 
//容器对象,滑动对象,切换参数,切换数量 
initialize: 
function(container, slider, parameter, count, options) { 
if(parameter <= 
0 || count <= 0) return; 
var oContainer = $(container), oSlider = 
$(slider), oThis = this; 

this.Index = 0;//当前索引 

this._timer = 
null;//定时器 
this._slider = oSlider;//滑动对象 
this._parameter = 
parameter;//切换参数 
this._count = count || 0;//切换数量 
this._target = 0;//目标参数 

this.SetOptions(options); 

this.Up = !!this.options.Up; 
this.Step = Math.abs(this.options.Step); 
this.Time = 
Math.abs(this.options.Time); 
this.Auto = !!this.options.Auto; 
this.Pause 
= Math.abs(this.options.Pause); 
this.onStart = this.options.onStart; 
this.onFinish = this.options.onFinish; 

oContainer.style.overflow = 
"hidden"; 
oContainer.style.position = "relative"; 

oSlider.style.position = "absolute"; 
oSlider.style.top = 
oSlider.style.left = 0; 
}, 
//设置默认属性 
SetOptions: function(options) { 
this.options = {//默认值 
Up: true,//是否向上(否则向左) 
Step: 5,//滑动变化率 
Time: 10,//滑动延时 
Auto: true,//是否自动转换 
Pause: 2000,//停顿时间(Auto为true时有效) 
onStart: function(){},//开始转换时执行 
onFinish: function(){}//完成转换时执行 
}; 
Object.extend(this.options, options || {}); 
}, 
//开始切换设置 
Start: 
function() { 
if(this.Index < 0){ 
this.Index = this._count - 1; 
} 
else if (this.Index >= this._count){ this.Index = 0; } 

this._target = 
-1 * this._parameter * this.Index; 
this.onStart(); 
this.Move(); 
}, 
//移动 
Move: function() { 
clearTimeout(this._timer); 
var oThis = 
this, style = this.Up ? "top" : "left", iNow = 
parseInt(this._slider.style[style]) || 0, iStep = this.GetStep(this._target, 
iNow); 

if (iStep != 0) { 
this._slider.style[style] = (iNow + iStep) 
+ "px"; 
this._timer = setTimeout(function(){ oThis.Move(); }, this.Time); 
} else { 
this._slider.style[style] = this._target + "px"; 
this.onFinish(); 
if (this.Auto) { this._timer = setTimeout(function(){ 
oThis.Index++; oThis.Start(); }, this.Pause); } 
} 
}, 
//获取步长 
GetStep: function(iTarget, iNow) { 
var iStep = (iTarget - iNow) / 
this.Step; 
if (iStep == 0) return 0; 
if (Math.abs(iStep) < 1) return 
(iStep > 0 ? 1 : -1); 
return iStep; 
}, 
//停止 
Stop: 
function(iTarget, iNow) { 
clearTimeout(this._timer); 
this._slider.style[this.Up ? "top" : "left"] = this._target + "px"; 
} 
};
Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn