步骤:
1、布局:
outer[div]
----imgList[ul]
----li(总共5个)
----img(放轮播图)
----navDiv[div]
----a(总共5个)
2、原理:
- outer作为“屏幕”,超出屏幕的部分hidden。
- imgList里面的li排成一排,imgList包含在outer中。
- JS控制imgList,左右移动。
- a标签根据索引值:-indexA*li宽度,得出每张图片的开始位置,完成点击a标签,切换图片。
3、注意:
- move函数的实现,应该好好理解。
- 点击a标签的优先级,应该高于定时轮播,所有点击a标签的时候,停止定时器,完成动画后,开启定时器。
- 这是一个类似循环播放的效果——最后一张图片很关键,用于完成瞬间移动。
测试代码
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title></title>
<!--
步骤:
1、布局:
outer[div]
----imgList[ul]
----li(总共5个)
----img(放轮播图)
----navDiv[div]
----a(总共5个)
2、原理:
- outer作为“屏幕”,超出屏幕的部分hidden。
- imgList里面的li排成一排,imgList包含在outer中。
- JS控制imgList,左右移动。
- a标签根据索引值:-indexA*li宽度,得出每张图片的开始位置,完成点击a标签,切换图片。
3、注意:
- move函数的实现,应该好好理解。
- 点击a标签的优先级,应该高于定时轮播,所有点击a标签的时候,停止定时器,完成动画后,开启定时器。
- 这是一个类似循环播放的效果——最后一张图片很关键,用于完成瞬间移动。
-->
<style type="text/css">
* {
margin: 0;
padding: 0;
}
#outer {
width: 500px;
height: 333px;
margin: 10px auto; /*左右居中*/
background-color: greenyellow;
padding: 10px 0; /*设置上下的padding为10px*/
position: relative;
overflow: hidden;
}
#imgList {
list-style: none; /*去除li的默认样式*/
width: 2600px;
left:0px;
position: absolute; /*开启绝对定位,便于移动*/
}
#imgList li {
float: left; /*float:父元素够大的时候,才会横排*/
}
#navDiv {
position: absolute; /*设置绝对定位,才能显示到上面*/
bottom: 15px;
}
#navDiv a {
float: left; /*浮动,脱离文档流,横排*/
width: 12px;
height: 12px;
margin: 0 5px;
background-color: red;
opacity: 0.5;
/*兼容IE8透明*/
filter: alpha(opacity=50);
}
#navDiv a:hover {
background-color: black;
}
</style>
<script src="js/tools.js" type="text/javascript" charset="utf-8"></script>
<script type="text/javascript">
window.onload = function() {
//获取节点
var outer = document.getElementById("outer");
var imgList = document.getElementById("imgList");
var countImg = imgList.getElementsByTagName("li");
var navDiv = document.getElementById("navDiv");
var allA = navDiv.getElementsByTagName("a");
//第一张图片的a标签先被选中
var indexA = 0;
allA[indexA].style.backgroundColor = "black";
//为所有的a标签绑定单击响应函数
for (var i = 0; i < allA.length; i++) {
//保存超链接所在索引(前面的课程说过为什么这样)
allA[i].num = i;
//绑定单击响应函数
allA[i].onclick = function() {
//点击超链接时,应该停止轮播定时器,不然会出现两个动画
clearInterval(idTimer);
//点击超链接,切换图片
indexA = this.num;
move(imgList,"left",indexA*-500,20,function(){
//点击的动画执行完了,开启轮播定时器
autoChange();
});
//a标签颜色处理
mutexA();
}
}
//设置导航按钮居中
var navDivWidth = parseInt(getComputedStyle(navDiv,null)["width"]);
var outerWidth = parseInt(getComputedStyle(outer,null)["width"]);
navDiv.style.left = (outerWidth - navDivWidth)/2 + "px";
//设置imgList宽度(图片+20)*数量
var imgWidth = 500;
var imgMargin = 0;
imgList.style.width = (imgMargin + imgWidth)*countImg.length + "px";
//轮播图片
var idTimer;
function autoChange() {
idTimer = setInterval(function() {
indexA++;
//a标签设置
move(imgList,"left",indexA*-500,20,function(){
mutexA(allA,indexA);
});
},3000);
}
//开启定时器
autoChange();
//互斥a标签
function mutexA() {
//索引值回到开头
if( indexA >= countImg.length - 1) {
indexA = 0;
imgList.style.left = 0 + "px";
}
//该索引a标签变黑色,其它标签红色
for (var j = 0; j < allA.length; j++) {
if( j == indexA ) {
allA[j].style.backgroundColor = "black";
} else {
allA[j].style.backgroundColor = ""; //这样做是因为,内联样式优先级更高,
//直接设置为red,会覆盖hover效果,
//这里直接去掉内联样式,它就受style里面的样式控制了
}
}
}
}
</script>
</head>
<body>
<div id="outer">
<ul id="imgList">
<li>
<img src="img/1.jpg"/>
</li>
<li>
<img src="img/2.jpg"/>
</li>
<li>
<img src="img/3.jpg"/>
</li>
<li>
<img src="img/4.jpg"/>
</li>
<li>
<img src="img/5.jpg"/>
</li>
<li>
<img src="img/1.jpg"/>
</li>
</ul>
<!-- 导航按钮 -->
<div id="navDiv">
<a href="javascript:;"></a>
<a href="javascript:;"></a>
<a href="javascript:;"></a>
<a href="javascript:;"></a>
<a href="javascript:;"></a>
</div>
</div>
</body>
</html>