HTML
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
- <title>Untitled Document</title>
- <style>
- .Marquee{ width:490px; margin:50px auto 0; overflow:hidden;}
- body,div,ul,li{ margin:0; padding:0;}
- ul,li{ list-style:none;}
- img{ display:block; border:none;}
- .content-main{ width:490px; height:170px; overflow:hidden;}
- .content{ width:490px; height:170px; overflow:hidden;}
- .hide{ display:none;}
- .menu{ width:490px; height:22px; overflow:hidden; background:#966;}
- .menu li{ width:160px; height:22px; overflow:hidden; float:left; line-height:22px; text-align:center;}
- .menu li.last-col{ width:170px; height:22px; overflow:hidden;}
- .current{ background: #F00;}
- .content a{ width:490px; height:170px; overflow:hidden; display:block;}
- </style>
- <script src="base.js"></script>
- </head>
- <body>
- <div id="Marquee" class="Marquee">
- <div class="content-main">
- <div class="content"><a href="#" target="_blank"><img src="p_w_picpaths/1.jpg"/></a></div>
- <div class="content hide"><a href="#" target="_blank"><img src="p_w_picpaths/2.jpg"/></a></div>
- <div class="content hide"><a href="#" target="_blank"><img src="p_w_picpaths/3.jpg"/></a></div>
- </div>
- <ul class="menu">
- <li class="list1">tab1</li>
- <li class="list1">tab2</li>
- <li class="list1 last-col">tab3</li>
- </ul>
- </div>
- <script src="slide.js"></script>
- <script>
- var tabMenu = getElementsByClassName("list1"),
- tabContent = getElementsByClassName("content");
- new Slider({tabMenu :tabMenu,tabContent : tabContent,autoPlay : true});
- </script>
- </body>
- </html>
base.js
- function getElementsByClassName(className,context){
- context = context || document;
- if(context.getElementsByClassName){
- return context.getElementsByClassName(className);
- }
- var nodes = context.getElementsByTagName("*"),ret=[];//获取页面上的所有节点
- for(var i=0;i<nodes.length;i++){ //遍历所有的节点
- if(hasClass(nodes[i],className)) ret.push(nodes[i]);
- }
- return ret;
- }
- //检查有没有类
- function hasClass(node,className){
- var names = node.className.split(/\s+/);//正则表达式所有的类名用空格分开
- //遍历这个类名
- for(var i=0;i<names.length;i++){
- if(names[i]==className)
- return true;
- }
- return false;
- }
- /**
- 参数说明
- curTime 当前时间 即动画已经进行了多长时间 开始时间为0
- start : 开始值
- dur : 动画持续多长时间
- alter : 总的变化量
- */
- function animate(o,start,alter,dur,fx){
- var curTime=0;
- var t = setInterval(function(){
- if(curTime>=dur) clearInterval(t);
- for(var i in start){
- o.style[i] = fx(start[i],alter[i],curTime,dur) + "px";
- }
- curTime+=50;
- },50)
- return function(){
- clearInterval(t);
- };
- }
- function Linear(start,alter,curTime,dur){
- return start + curTime/dur * alter;
- //最简单的线性变化 即匀速运动
- }
- //加速运动
- function Quad(start,alter,curTime,dur){
- return start + Math.pow(curTime/dur,2)*alter;
- }
- function addClass(obj,className){
- obj.className+=" " +className;
- return obj;
- }
- function delClass(obj,className){
- var s = obj.className.split(/\s+/);//正则把类名分开
- for(var i=0;i<s.length;i++){
- if(s[i]==className){
- delete s[i];
- }
- }
- obj.className = s.join(" ");
- return obj;
- }
- function addEvent(obj,type,fn,status){
- if(obj.addEventListener){
- obj.addEventListener(type,fn,false);
- }else{
- obj.attachEvent("on"+type,function(){
- fn.call(obj);
- })
- }
- }
slider.js
- /**
- * @author tugenhua
- * @param {Object} config 在构造函数内 config以对象的方式传入参数
- * 以前我们传参数(xx,x,y)这样传的 但是以对象方式传入参数有个好处 就是当实例化对象时候 不需要按照顺序写!
- * 那个写在前面或者写在后面没有关系
- * 在页面上调用方式 如下:new Slider({tabMenu :tabMenu,tabContent : tabContent,autoPlay : true});
- * autoPlay为true 说明可以自动播放 如果传参数为flase的话 那么他就不会自动切换,
- * 当然在函数内 config.trigger 有这样的传递参数 默认情况下为鼠标移动 我们在传参数时候
- * 也可以传click事件 方式:trigger :"click" 就是以点击形式
- * 在写HTML结构时 尽量以列表项和内容项有相同的class 这样就可以获取class 进行操作
- * 此js 获取类名依赖于底层base.js
- * 在写setInterval时候 一定要注意一个地方 就是要保存时间t保存下来 否则的话在轮播时候会有bug的
- * 这个幻灯片原里其实就是和tab自动切换的原理是一样的 那么tab自动切换我就不写了,原理是一模一样的.
- */
- function Slider(config){
- this.tabMenu = config.tabMenu;
- this.tabContent = config.tabContent;
- this.currentClass = config.currentClass || "current";
- var trigger = config.trigger || "mouseover";
- var playTime = config.playTime || 3000;
- var autoPlay = config.autoPlay;
- this.currentIndex =0;// 当前的索引从1开始
- var that = this;
- var t;
- this.tabMenu[0].className +=" " +this.currentClass;
- if(autoPlay){
- clearInterval(t);
- t = setInterval(function(){
- that.autoHandler()
- },playTime);
- }
- for(var i=0;i<this.tabMenu.length;i++){
- this.tabMenu[i]._index = i; //保存当前的索引
- addEvent(this.tabMenu[i],trigger,function(){
- that.showItem(this._index);
- this.currentIndex = this._index;//当前的索引i 保存在变量this.currentIndex里面
- })
- this.tabMenu[i].onmouseover = function(){
- clearInterval(t);
- }
- this.tabMenu[i].onmouseout = function(){
- t = setInterval(function(){
- that.autoHandler();
- },playTime)
- }
- for(var j=0;j<this.tabContent.length;j++){
- this.tabContent[j].onmouseover = function(){
- clearInterval(t);
- }
- this.tabContent[j].onmouseout = function(){
- t = setInterval(function(){
- that.autoHandler();
- },playTime)
- }
- }
- }
- }
- Slider.prototype = {
- showItem : function(n){
- for(var i=0;i<this.tabContent.length;i++){
- this.tabContent[i].style.display = "none";
- }
- this.clearClass();
- addClass(this.tabMenu[n],this.currentClass);
- this.tabContent[n].style.display = "block";
- },
- clearClass : function(){
- for(var k=0;k<this.tabMenu.length;k++){
- if(hasClass(this.tabMenu[k],this.currentClass)){
- delClass(this.tabMenu[k],this.currentClass);
- }
- }
- },
- autoHandler : function(){
- this.currentIndex++;
- if(this.currentIndex>=this.tabMenu.length){
- this.currentIndex = 0;
- }
- this.showItem(this.currentIndex);
- }
- }
注意事项:this.currentIndex = this._index;//当前的索引i 保存在变量this.currentIndex里面 这段代码中 this.currentIndex 改成 that.currentIndex 否则的话会有bug产生,我一开始没有注意到!