轮播图
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>自动轮播广告(面向对象版)</title> <style> /*把body,div,ul,li的内外边距全部重置为0,并在下面重新设置,以保证轮播图在各浏览器中展示的效果一致*/ body, div, ul, li { margin: 0; padding: 0; } ul { list-style-type: none; /*去除列表样式*/ } body { background: #000; /*文档背景色设置为黑色*/ text-align: center; /*居中对齐*/ font: 12px/20px Arial;/*设置字号,行间距和字体*/ } #box { position: relative;/*这是最外部的div包含元素,需设置为相对*/ width: 492px; height: 172px; background: #fff;/*轮播图框背景设置为白色*/ border-radius: 5px; border: 8px solid #fff; margin: 10px auto; cursor: pointer; } #box .list { position: relative;/*这是第2个div包含元素,需设置为相对*/ width: 490px;/*内部div高度比外部div少2px,以此组成2px宽的外边框*/ height: 170px; overflow: hidden; } #box .list ul { position: absolute; /*内部轮播图的定位,须设置为绝对*/ top: 0; left: 0; } #box .list li { width: 490px; height: 170px; overflow: hidden; } /*count元素由script动态生成,定位于父元素的右下角*/ #box .count { position: absolute; right: 0; bottom: 5px; } #box .count li { color: #fff;/*轮播图按钮字体设置为白色*/ float: left; width: 20px; height: 20px; cursor: pointer; margin-right: 5px; overflow: hidden; background: #F90;/*轮播图按钮背景色设置为棕色*/ opacity: 0.7;/*透明度*/ filter: alpha(opacity=70);/*兼容老浏览器*/ border-radius: 20px; } #box .count li.current { color: #fff;/*轮播图选中按钮字体色彩设置为白色*/ opacity: 1; filter: alpha(opacity=100); font-weight: 700; background: #f60;/*轮播图按钮背景色设置为深棕色*/ } #tmp { width: 100px; height: 100px; background: red; position: absolute; } </style> <script type="text/javascript"> //获取ID(此函数为原代码所有) // var $ = function (id) { //使用tpeof操作符检测传入的参数是否为字符串,为真,则传递给getElementById命令,返回一个对象 //在下面的代码中,将使用此函数获取文档最外层的id名为"box"的元素引用。 // return typeof id === "string" ? document.getElementById(id) : id //}; //获取tagName(此函数为原代码所有) //var $$ = function (tagName, oParent) { //此函数即是传入由获取id函数返回的对象,并用此对象调用getElementsByTagName方法,获取内部标签名, //最后返回一个由标签名构成的数组。 // return (oParent || document).getElementsByTagName(tagName) // }; //自动播放对象 var AutoPlay = function (id) { //定义对象,此对象有一个方法,接受名为"id"的参数。 this.initialize(id) }; //给AutoPlay对象添加原型字面量,由多个方法和属性组成 //在变量命名方面,使用了匈牙利命名法, AutoPlay.prototype = { initialize: function (id) { //把this赋值给oThis,因为当函数以函数方式调用时,this指针会被错误绑定到全局对象上, //进而无法访问内部各属性与方法,采用这种方式就可避免此问题 //通常会命名为that或self,此处采用匈牙利命名法,oThis中的"o",表示是一引用类型 var oThis = this; //调用$函数,获取最外层的div引用,可用下面这行代码替换 //this.oBox = $(id); this.oBox = document.getElementById("box"); //获取div元素中的无序列表ul中的第一项引用 //this.oUl = $$("ul", this.oBox)[0]; this.oUl = document.getElementById("box").getElementsByTagName("ul")[0]; //this.oUl = this.oBox.getElementsByTagName("ul")[0]; //获取img对象 //this.aImg = $$("img", this.oBox); this.aImg = document.getElementById("box").getElementsByTagName("img"); //this.aImg = this.oBox.getElementsByTagName("img"); //定义计时器,值为null表示其值应为一个对象 this.timer = null; //定义自动计时器,值为null表示它的值应为一个引用(对象) this.autoTimer = null; //当前轮播图按钮索引值,i表示它应为整型 this.iNow = 0; //利用script动态创建轮播图按钮 this.creatBtn(); //获取按钮 //this.aBtn = $$("li", this.oCount); this.aBtn = this.oCount.getElementsByTagName("li"); //声明切换方法 this.toggle(); //定义自动计时器,每3000毫秒(每3秒)切换至下一张图片 this.autoTimer = setInterval(function () { oThis.next() }, 3000); //注册"mouseover"事件处理程序,当鼠标移入出后,清除自动计时器,此时图片静止,停止切换 this.oBox.onmouseover = function () { clearInterval(oThis.autoTimer) }; //注册"mouseout"事件处理程序,当鼠标移出后,恢复自动计时器,自动切换 this.oBox.onmouseout = function () { oThis.autoTimer = setInterval(function () { oThis.next() }, 3000) }; //for循环遍历轮播图按钮,注册mouseover事件处理程序,当鼠标指针悬浮悬浮于按钮上时, //调用toggle()方法,切换至此图 for (var i = 0; i < this.aBtn.length; i++) { this.aBtn[i].index = i; this.aBtn[i].onmouseover = function () { oThis.iNow = this.index; oThis.toggle() } } }, //定义creatBtn方法 creatBtn: function () { //创建ul元素 this.oCount = document.createElement("ul"); //创建文档片段对象,将创建的li元素附着在片段对象上,最后再添加到ul元素上 this.oFrag = document.createDocumentFragment(); //添加类名 this.oCount.className = "count"; //for循环创建li元素,并添加到文档片段对象上 for (var i = 0; i < this.aImg.length; i++) { var oLi = document.createElement("li"); oLi.innerHTML = i + 1;//轮播图片序号 this.oFrag.appendChild(oLi) } //把文档片段添加到ul元素上 this.oCount.appendChild(this.oFrag); //把ul添加到div元素上 this.oBox.appendChild(this.oCount) }, //定义toggle方法 toggle: function () { //遍历按钮并设置其类名为空 for (var i = 0; i < this.aBtn.length; i++) this.aBtn[i].className = ""; //为要切换至的图片设置类名 this.aBtn[this.iNow].className = "current"; //调用doMove方法,并传入偏移量 this.doMove(-(this.iNow * this.aImg[0].offsetHeight)) }, //定义next()方法 next: function () { this.iNow++; this.iNow == this.aBtn.length && (this.iNow = 0); this.toggle() }, //定义doMove方法 doMove: function (iTarget) { var oThis = this; clearInterval(oThis.timer); oThis.timer = setInterval(function () { var iSpeed = (iTarget - oThis.oUl.offsetTop) / 5; iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed); oThis.oUl.offsetTop == iTarget ? clearInterval(oThis.timer) : (oThis.oUl.style.top = oThis.oUl.offsetTop + iSpeed + "px") }, 30) } }; //注册页面加载事件 window.onload = function () { new AutoPlay("box"); }; </script> </head> <body> <!--文档主体结构由两个dvi包裹一个ul无序列表构成,内外div大小差2px,构成一个白色的方框,包裹着轮播图--> <div id="box"> <div class="list"> <ul> <li><img src="img/01.jpg" width="490" height="170" /></li> <li><img src="img/02.jpg" width="490" height="170" /></li> <li><img src="img/03.jpg" width="490" height="170" /></li> <li><img src="img/04.jpg" width="490" height="170" /></li> <li><img src="img/05.jpg" width="490" height="170" /></li> </ul> </div> </div> </body> </html>