上次的jQuery幻灯片播放效果使用jQuery做的,这次我们再尝试用原生的js做一个,嘿嘿
还是老一套,先是html和css,如下:
<div id="slidBox">
<ul>
<li>
<a href="http://www.baidu.com" target="_blank"><img src="1.jpg" title="百度" alt="百度" /></a>
</li>
<li>
<a href="http://www.google.cn" target="_blank"><img src="2.jpg" title="谷歌" alt="谷歌" /></a>
</li>
<li>
<a href="http://www.bing.com" target="_blank"><img src="3.jpg" title="必应" alt="必应" /></a>
</li>
<li>
<a href="http://www.youdao.com" target="_blank"><img src="4.jpg" title="有道" alt="有道" /></a>
</li>
</ul>
<p>
<a href="#nogo"></a>
<a href="#nogo"></a>
<a href="#nogo"></a>
<a href="#nogo"></a>
<span></span>
</p>
</div>
body{font-size:12px; background-color:#FFF; text-align:center;}
#page{ width:950px; margin:0 auto; text-align:left;}
a,a:link,a:visited,a:hover,a:active{text-decoration:none;}
p,a img,ul,li{margin:0; padding:0;}
a img{ border:none; }
ul,li{list-style-type:none;}
#slidBox{padding:4px; width:410px; height:324px; border:1px solid red;}
#slidBox ul li{ float:left; padding:1px;}
#slidBox ul li img{ width:203px; height:160px; display:block;}
#slidBox ul.slidBoxImages{ width:410px; height:300px; overflow:hidden; }
#slidBox ul.slidBoxImages li{position:relative; width:410px; height:300px; top:0; left:0; }
#slidBox ul.slidBoxImages li img{width:410px; height:300px;}
#slidBox p{ background:#F5F5F5; height:18px; line-height:18px; margin-top:2px; padding:2px 10px; font-weight:bold; position:relative; display:none;}
#slidBox p span{float:right; margin-right:60px;}
#slidBox p a { display:block; width:18px; height:18px; background:transparent url(t1.jpg) no-repeat; position:relative; left:4px; float:left;}
#slidBox p a.current{background-image:url(t2.jpg);}
这次使用的是ul li 保存图片,而且定义了在没有js的情况下图片的展示效果,保证用户禁用js之后还能让图片正常展示:
禁用了js的显示效果:
使用js的效果:
哈哈,看着还不错。下面我们来说最主要的东西:js,嘿嘿,代码如下:
function getTarget(e){//获得事件源
var target=e?e.target:(window.event?window.event.srcElement:null);
if(!target){return null;}
while(target.nodeType!=1&&target.nodeName.toLowerCase()!="body"){target=target.parentNode;}
return target;
}
var slideImages={
//公共变量
"slideBoxId":"",
"dynamicClass":"",
"IntervalSpeed":4000,
"nowPosition":0,
"liList":null, //图片列表
"pointerList":null, //幻灯片下方的指示器列表
"slideIntro":null, //各个大图的说明
"interval":null, //幻灯片轮转
"init":function(slideBoxId,dynamicClass,IntervalSpeed){
if(!document.getElementById||!document.createTextNode) {return;}
if(!dynamicClass||!slideBoxId){return;}
slideImages.slideBoxId=slideBoxId; //图片幻灯片容器id
slideImages.dynamicClass=dynamicClass; //变换后的类名
slideImages.IntervalSpeed=(!IntervalSpeed)?slideImages.IntervalSpeed:IntervalSpeed; //轮换的时间间隔
slideImages.nowPosition=Math.floor(Math.random()*4); //指示现在所轮换到的图片
//得到幻灯片容器,并且为函数中经常使用的变量赋值
var targetObj=document.getElementById(slideImages.slideBoxId); //幻灯片容器
if(!targetObj){return;}
var slideUl=targetObj.getElementsByTagName("ul");
if(!slideUl){return;}
slideImages.liList=slideUl[0].getElementsByTagName("li"); //得到图片集合li
if(!slideImages.liList){return;}
var slideP=targetObj.getElementsByTagName("p");
if(!slideP){return;}
slideImages.pointerList=slideP[0].getElementsByTagName("a"); //得到指示器集合a
if(!slideImages.pointerList){return;}
slideImages.slideIntro=slideP[0].getElementsByTagName("span");
if(!slideImages.slideIntro){return;}
slideImages.slideIntro=slideImages.slideIntro[0]; //得到说明性文字span
for(var i=0;i<slideImages.liList.length;i++){ //隐藏其他的图片,显示nowPosition指示的那一张图片
if(i!=slideImages.nowPosition) slideImages.liList[i].style.display="none";
}
slideP[0].style.display="block";
slideImages.pointerList[slideImages.nowPosition].className="current";
slideImages.slideIntro.innerHTML=slideImages.liList[slideImages.nowPosition].getElementsByTagName("img")[0].getAttribute("title");
slideUl[0].className=slideImages.dynamicClass; //改变图片的显示状态
slideImages.interval=setInterval(slideImages.playIt,slideImages.IntervalSpeed);
slideImages.addPointerMouseEvent(); //添加鼠标事件
},
//工具方法
"getPointerIndex":function(pointer){ //得到特定指示器的位置
for(var i=0;i<slideImages.pointerList.length;i++){
if(slideImages.pointerList[i]==pointer){return i;}
}
return -1;
},
"mouseOverPointer":function (e){ //鼠标放在特定的指示器上面
clearInterval(slideImages.interval);
slideImages.liList[slideImages.nowPosition].style.display="none"; //隐藏上一个
var pointer=getTarget(e);
var index=slideImages.getPointerIndex(pointer);
slideImages.pointerList[slideImages.nowPosition].className="";
slideImages.nowPosition=(index-1+4)%4;
slideImages.playIt();
},
"mouseOutPointer":function (e){ //鼠标离开指示器
slideImages.interval=setInterval(slideImages.playIt,slideImages.IntervalSpeed);
},
"playIt":function (){ //播放幻灯片
slideImages.liList[slideImages.nowPosition].style.display="none"; //隐藏上一个
slideImages.pointerList[slideImages.nowPosition].className="";
slideImages.nowPosition=(slideImages.nowPosition+1)%4; //显示下一个
slideImages.liList[slideImages.nowPosition].style.display="";
slideImages.pointerList[slideImages.nowPosition].className="current"; //改变指示器和说明文字
slideImages.slideIntro.innerHTML=slideImages.liList[slideImages.nowPosition].getElementsByTagName("img")[0].getAttribute("title");
},
"addPointerMouseEvent":function (){ //添加指示器鼠标事件
for(var i=0;i<slideImages.pointerList.length;i++){
slideImages.pointerList[i].οnmοuseοver=slideImages.mouseOverPointer;
slideImages.pointerList[i].οnmοuseοut=slideImages.mouseOutPointer;
}
}
};
slideImages.init("slidBox","slidBoxImages");
唉,真是的,jQuery的几代码就搞定的东西现在我们用js写的话就用近百行代码啦,哈哈,不过原生的js的代码执行的效率快得多,毕竟少了jQuery这个框架。
首先是这个getTarget方法,用来获得一个事件的事件源,获取事件源ie和其他的浏览器有不同的方法,ie的是window.event.secElement,而其他的浏览器是e.target就行了,嘿嘿。
这次主要使用了一个js对象slideImages来保存使用到的方法,最最主要的方法就是init方法,他增加了各种对象的事件添加方法。呵呵,结束……