JavaScript 图片切换展示效果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);

  下面例子里的容器结构:

  

复制代码 代码如下:

  <div 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>

  </div>

  要美观的话需要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";

  }

  };

  

   [Ctrl+A 全选 注:如需引入外部Js需刷新才能执行]