动画轮播图具体的思路:
1、把所有能用到的标签全部获取到
2、动态生成结构:按钮li
- 根据ul 中的li 动态生成ol中的li,ul中有几个li 生成ol中几个li
- 设置li中的文本,把li追加到ol中
- 获取ol中的li
- 根据第一张图,动态克隆,并追加到ul最后
3、鼠标经过按钮,移动ul到指定的位置
- 鼠标经过按钮,按钮排他(干掉所有人,留下我自己)
- 经过按钮,ul移动到指定位置
- 指定位置:-this.index * imgWidth和当前按钮的索引以及图片的宽度有关,向左移动是负数①设置索引②取图片的宽度③调用动画函数
4、鼠标点击箭头
- 显示出箭头
- 点击右箭头,把ul移动到指定位置
①鼠标点击事件
②ul移动到指定位置:-index * imgWidth 和图片索引和图片宽度有关
③判断图片移动到最后一张后(假的第一张),瞬间调到开头,然后做从第一张到第二张的动画
ulObj.style.left = 0; //瞬间移动到开头
index = 0;//索引后归零,后续让ul从第一张渐渐移动到第二张 - 点击左箭头,当图片移动到第一张后,瞬间跳到最后,然后做从最后一张到倒数第二张的动画
5、按钮也要跟着左右箭头移动
- 根据当前图片的索引,计算出下一个应该亮起的按钮的索引 干掉所有人、、留下相应的
6、添加自动滚动
- 每隔一秒播放下一张(让点击右箭头的事件每隔一秒执行一次)
- 鼠标放在图片上自动滚动停止,离开后继续自动滚动 鼠标经过图片清除自动滚动,离开时继续自动滚动
- 在图片自动滚动时,经过按钮放开后,图片会接着自动滚动时的顺序继续滚动,而不是从经过按钮的图片开始滚动:把记录显示按钮的索引变为当前按钮的索引
- 把记录显示图片的索引变为当前图片的索引
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
<style type="text/css">
* {
padding: 0;
margin: 0;
list-style: none;
border: 0;
}
.all {
width: 500px;
height: 200px;
padding: 7px;
border: 1px solid #ccc;
margin: 100px auto;
position: relative;
}
.screen {
width: 500px;
height: 200px;
overflow: hidden;
position: relative;
}
.screen li {
width: 500px;
height: 200px;
overflow: hidden;
float: left;
}
.screen ul {
position: absolute;
left: 0;
top: 0px;
width: 3000px;
}
.all ol {
position: absolute;
right: 10px;
bottom: 10px;
line-height: 20px;
text-align: center;
}
.all ol li {
float: left;
width: 20px;
height: 20px;
background: #fff;
border: 1px solid #ccc;
margin-left: 10px;
cursor: pointer;
}
.all ol li.current {
background: #DB192A;
}
#arr {
display: none;
}
#arr span {
width: 40px;
height: 40px;
position: absolute;
left: 5px;
top: 50%;
margin-top: -20px;
background: #000;
cursor: pointer;
line-height: 40px;
text-align: center;
font-weight: bold;
font-family: '黑体';
font-size: 30px;
color: #fff;
opacity: 0.3;
border: 1px solid #fff;
}
#arr #right {
right: 5px;
left: auto;
}
</style>
</head>
<body>
<div class="all" id='box'>
<div class="screen"><!--相框-->
<ul>
<li><img src="images/1.jpg" width="500" height="200"/></li>
<li><img src="images/2.jpg" width="500" height="200"/></li>
<li><img src="images/3.jpg" width="500" height="200"/></li>
<li><img src="images/4.jpg" width="500" height="200"/></li>
<li><img src="images/5.jpg" width="500" height="200"/></li>
</ul>
<ol>
</ol>
</div>
<div id="arr"><span id="left"><</span><span id="right">></span></div>
</div>
<script>
//把所有能用到的标签全部获取到
var box = my$('box');
var screen = box.querySelector('.screen');
var width = screen.offsetWidth;
var ulObj = screen.getElementsByTagName('ul')[0];
var liList = ulObj.getElementsByTagName('li');
var olObj = screen.getElementsByTagName('ol')[0];
var arr = my$('arr');
var hh = 0;
// 动态生成结构 生成ol下的li
for (var i = 0; i < liList.length; i++) {
var liobj = document.createElement('li');
liobj.innerText = i + 1;
olObj.appendChild(liobj);
// 添加索引
liobj.setAttribute('index', i);
//ol下的li注册移入事件
liobj.onmouseover = function () {
var liObjs = olObj.children;
for (var j = 0; j < liObjs.length; j++) {
liObjs[j].removeAttribute('class');
}
this.className = 'current';
hh = this.getAttribute('index');
animate(ulObj, -hh * width);
}
}
olObj.children[0].className = 'current';
//根据第一张图,动态克隆,并追加到ul最后
ulObj.appendChild(liList[0].cloneNode(true));
// 每一段时间播放下一张(让点击右箭头的事件每隔一秒执行一次)
var timeId=setInterval(clickHandle,2000);
// 左右焦点按钮 移动图片
box.onmouseover = function () {
arr.style.display = 'block';
clearInterval(timeId);
}
box.onmouseout = function () {
arr.style.display = 'none';
clearInterval(timeId);
timeId=setInterval(clickHandle,2000);
}
my$('right').onclick = clickHandle;
// 右键点击之后的函数封装
function clickHandle() {
// 判断图片移动到最后一张后,设置left从头开始
if (hh == liList.length-1) {
hh=0;
ulObj.style.left = '0px';
}
hh++;
animate(ulObj, -hh * width);
// 按钮也要跟着左右箭头移动
if (hh == liList.length-1) {
olObj.children[hh-1].removeAttribute('class');
olObj.children[0].className='current';
}else {
for (var i=0;i<olObj.children.length;i++){
olObj.children[i].removeAttribute('class');
}
olObj.children[hh].className='current';
}
}
my$('left').onclick=function () {
//当图片移动到第一张后,瞬间跳到最后,然后做从最后一张到倒数第二张的动画
if (hh==0){
hh=liList.length-1;
ulObj.style.left = -hh*width+'px';
}
hh--;
animate(ulObj, -hh * width);
// 按钮也要跟着左右箭头移动,根据当前图片的索引,计算出下一个应该亮起的按钮的索引
for (var i=0;i<olObj.children.length;i++){
olObj.children[i].removeAttribute('class');
}
olObj.children[hh].className='current';
}
/**
* 移动任意的元素到任意的位置
* @param element 要移动的元素
* @param target 目标值
*/
function animate(element, target) {
clearInterval(element.timeId);
element.timeId = setInterval(function () {
var current = element.offsetLeft;
// 按钮也要跟着左右箭头移动,根据当前图片的索引,计算出下一个应该亮起的按钮的索引
var step = current > target ? -10 : 10;
current += step;
if (Math.abs(target - current) < Math.abs(step)) {
//走最后一步后current超过目标(向右)或小于目标(向左)
clearInterval(element.timeId);
element.style.left = target + 'px';
} else {
element.style.left = current + 'px';
}
}, 10);
}
function my$(id) {
return document.getElementById(id);
}
</script>
</body>
</html>