<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>轮播图</title>
<style>
* {
margin: 0px;
padding: 0px;
list-style: none;
}
.wrapper {
position: relative;
width: 400px;
height: 250px;
margin: 100px auto;
border: 1px solid #000;
overflow: hidden;
}
.wrapper .sliderPage {
position: absolute;
width: 2000px;
height: 250px;
}
.wrapper .sliderPage li {
width: 400px;
height: 250px;
float: left;
}
.wrapper .sliderPage li img {
width: 100%;
height: 100%;
}
.wrapper .btn {
position: absolute;
width: 40px;
height: 40px;
background: #000;
color: #fff;
text-align: center;
line-height: 40px;
top: 50%;
margin-top: -20px;
opacity: 0.1;
}
.wrapper .btn:hover {
opacity: 1;
}
.wrapper .leftBtn {
position: absolute;
left: 10px;
cursor: pointer;
}
.wrapper .rightBtn {
position: absolute;
right: 10px;
cursor: pointer;
}
.wrapper .sliderIndex {
position: absolute;
width: 100%;
bottom: 10px;
text-align: center;
}
.wrapper .sliderIndex span {
display: inline-block;
width: 8px;
height: 8px;
background: #ccc;
border-radius: 50%;
margin-right: 10px;
cursor: pointer;
}
.wrapper .sliderIndex span.active {
background: #f40;
}
</style>
<script>
/**
* 多物体多值运动+回调机制(一个物体多个值改变)
* @param {*} elem
* @param {*} attrObj
* @param {*} callback
*/
function startMove(elem, attrObj, callback) {
clearInterval(elem.timer);
var iSpeed = null, iCur = null;
elem.timer = setInterval(function () {
var bStop = true;
for (var attr in attrObj) {
if (attr == 'opacity') {
iCur = parseFloat(getStyle(elem, attr)) * 100;
} else {
iCur = parseInt(getStyle(elem, attr));
}
iSpeed = (attrObj[attr] - iCur) / 7;
iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed);
if (attr == 'opacity') {
elem.style.opacity = (iCur + iSpeed) / 100;
} else {
elem.style[attr] = iCur + iSpeed + 'px';
}
if (iCur != attrObj[attr]) {
bStop = false;
}
}
if (bStop) {
clearInterval(elem.timer);
typeof (callback) == 'function' && callback();
}
}, 30);
}
</script>
</head>
<body>
<div class="wrapper">
<ul class="sliderPage">
<li>
<img src="imgs/1.jpg" />
</li>
<li>
<img src="imgs/2.jpg" />
</li>
<li>
<img src="imgs/3.jpg" />
</li>
<li>
<img src="imgs/4.jpg" />
</li>
<li>
<img src="imgs/1.jpg" />
</li>
</ul>
<div class="btn leftBtn"><</div>
<div class="btn rightBtn">></div>
<div class="sliderIndex">
<span class="active"></span>
<span></span>
<span></span>
<span></span>
</div>
</div>
<script src="utils.js"></script>
<script>
var timer = null;
var sliderPage = document.getElementsByClassName('sliderPage')[0];
var moveWidth = sliderPage.children[0].offsetWidth;
var num = sliderPage.children.length - 1;
var leftBtn = document.getElementsByClassName('leftBtn')[0];
var rightBtn = document.getElementsByClassName('rightBtn')[0];
var oSpanArray = document.getElementsByClassName('sliderIndex')[0].getElementsByTagName('span');
var lock = true;
var index = 0;
leftBtn.onclick = function () {
autoMove('right->left');
}
rightBtn.onclick = function () {
autoMove('left->right');
}
for (var i = 0; i < oSpanArray.length; i++) {
(function (myIndex) {
oSpanArray[i].onclick = function () {
lock = false;
clearTimeout(timer);
index = myIndex;
startMove(sliderPage, {
left: - index * moveWidth
}, function () {
lock = true;
timer = setTimeout(autoMove, 1500);
changeIndex(index);
});
}
}(i));
}
// 默认轮播方向/right按钮 'left->right' / undefined
// 点击left按钮 'right->left'
function autoMove(direction) {
if (lock) {
lock = false;
clearTimeout(timer);
if (!direction || direction == 'left->right') {
index++;
startMove(sliderPage, {
left: sliderPage.offsetLeft - moveWidth
}, function () {
if (sliderPage.offsetLeft == - num * moveWidth) {
index = 0;
sliderPage.style.left = '0px';
}
lock = true;
timer = setTimeout(autoMove, 1500);
changeIndex(index);
});
} else if (direction == 'right->left') {
if (sliderPage.offsetLeft == 0) {
sliderPage.style.left = - num * moveWidth + 'px';
index = num;
}
index--;
startMove(sliderPage, {
left: sliderPage.offsetLeft + moveWidth
}, function () {
lock = true;
timer = setTimeout(autoMove, 1500);
changeIndex(index);
});
}
}
}
function changeIndex(_index) {
for (var i = 0; i < oSpanArray.length; i++) {
oSpanArray[i].className = '';
}
oSpanArray[_index].className = 'active';
}
timer = setTimeout(autoMove, 1500);
</script>
</body>
</html>