最下方有源码文件!!!!
这里面我封装了一个animate.js这个js代码主要实现的是ul的移动,按钮事件处理函数中的代码(让一个元素,从左往右,或者从右往左缓慢移动)(可参考之前写的简单动画案例)
animate.js代码
//封装 按钮事件处理函数中的代码(让一个元素,从左往右,或者从右往左缓慢移动)
/*
* 作用: 让一个元素,从左往右,或者从右往左缓慢移动
* element: 要求传入一个元素 元素
* target : 元素移动的目标位置 数字
* step: 步进(每次元素移动的距离)
* callback : 回调函数 到达目标位置之后,会被调用
* */
function animate(element, target, step, callback){
// 清除定时器
if(element.timeid){
clearInterval(element.timeid);
}
// 1. 设置定时器
element.timeid = setInterval(function(){
// 2. 获取元素的当前位置
var current = element.offsetLeft;
// 3. 根据当前位置加上/减去我们的步进
// 如果当前位置大于目标位置,就是减去步进.否则就是加上步进
if(current > target){
// 证明是从右往左,应该减去step
var pos = current - step;
}else{
// 证明是从左往右,应该加上step
var pos = current + step;
}
// 4. 给element赋值新的位置
element.style.left = pos + \'px\';
// 5. 判断是否到达目标位置,如果到达目标位置就停下来
// 5.1 如何判断已经到达目标位置
// 如果 当前位置(赋值之后的位置 pos)- 目标位置 的差值绝对值,小于步进,证明马上要到目标位置了
if(Math.abs(pos - target) <= step){
//证明马上就要到达目标位置了
// 5.2 清除定时器,直接把目标位置给元素
clearInterval(element.timeid);
element.style.left = target + \'px\';
//判断用户有没有传第四个参数,如果传了就调用,如果没传就不调用
// 如果传入了函数,callback转换成布尔就是true,如果什么都没传,callback转换成布尔,就是false
if(callback){
callback();
}
}
}, 15);
}
在 轮播图.html中填入(style代码,盒子代码(放在body里面),script代码)
style代码
<style type="text/css">
* {
padding: 0;
margin: 0;
list-style: none;
border: 0;
}
.all {
width: 500px;
height: 300px;
padding: 7px;
border: 1px solid #ccc;
margin: 100px auto;
position: relative;
}
.screen {
width: 500px;
height: 300px;
overflow: hidden;
position: relative;
}
.screen li {
width: 500px;
height: 300px;
overflow: hidden;
float: left;
}
.screen ul {
position: absolute;
left: 0px;
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: yellow;
}
#arr {
display: none;
z-index: 1000;
}
#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>
盒子代码
<div class="all" id=\'box\'>
<div class="screen" id="screen">
<ul>
<li>
<img src="images/1.jpg" width="500" height="300"/>
</li>
<li>
<img src="images/2.jpg" width="500" height="300"/>
</li>
<li>
<img src="images/3.jpg" width="500" height="300"/>
</li>
<li>
<img src="images/4.jpg" width="500" height="300"/>
</li>
<li>
<img src="images/5.jpg" width="500" height="300"/>
</li>
</ul>
<ol>
</ol>
</div>
<div id="arr">
<span id="left"><</span>
<span id="right">></span>
</div>
</div>
script代码
<script src="animate.js"></script>
<script>
//需求:
// 1. 根据ul中li的个数,动态的创建出ol中的li(数字按钮)
// 1.1 获取元素 ul, ul里面的li, ol
var screen = document.getElementById(\'screen\');
var ul = screen.getElementsByTagName(\'ul\')[0];
var lis = ul.children;
var ol = screen.getElementsByTagName(\'ol\')[0];
var indexGlobal = 0; //用于存储当前展示的是哪张图片的下标
// 1.2 遍历ul里面的li
for (var i = 0; i < lis.length; i++) {
// 1.3 在遍历的过程中,动态的创建ol中的li,然后把新创建的li放到ol中
var li = document.createElement(\'li\');
//由于点击的时候,需要获取当前li的下标,所以在创建的时候就存储一下
li.setAttribute(\'index\', i);
// 1.4 给每一个数字按钮,添加数字
li.innerText = i + 1;
//1.5 默认一打开,展示第一个图片,所以要给数字按钮1默认高亮
if (i == 0) {
// li.style.backgroundColor = \'yellow\';
li.className = \'current\';
}
ol.appendChild(li);
// 2. 点击数字按钮,让轮播图滚动(修改ul的left).
// 2.1 获取元素 ol里面的li
// 2.2 给每一个ol中的li注册点击事件
li.onclick = fn;
}
//要实现无缝轮播的效果,需要克隆第一张图放到最后面
// 注意:一定要在数字按钮,创建完毕之后在克隆
var newone = lis[0].cloneNode(true);
ul.appendChild(newone);
console.log(lis);
// 数字按钮li的事件处理函数
function fn() {
// 2.3 在事件处理函数中,修改ul的left
// 2.3.1 目标值是多少?
// 目标值 = 当前图片的下标 * 图片的宽度
// 目标值 = 数字按钮的下标(this.getAttribute(\'index\') * screen的宽度(screen.offsetWidth)
// console.log(this);
var target = this.getAttribute(\'index\') * screen.offsetWidth;
// 2.3.2 将目标值赋值为ul, 注意值是负值
// ul.style.left = -target + \'px\'; //直接到了目标位置
//我们需要慢慢滚动过去
animate(ul, -target, 20);
// 2.4 点击哪个数字按钮,就让谁高亮
//排他
for (var i = 0; i < ol.children.length; i++) {
ol.children[i].className = \'\';
}
this.className = \'current\';
// /动态的修改indexGlobal的值,因为indexGlobal要时刻和展示的图片的下标保持一致
indexGlobal = this.getAttribute(\'index\');
console.log(indexGlobal);
}
//3. 鼠标移入到box中,arr展示,鼠标移出到box外,arr消失
//3.1 获取元素
var box = document.getElementById(\'box\');
var arr = document.getElementById(\'arr\');
// 3.2 给box注册鼠标移入,移出事件
box.onmouseenter = function () {
// 3.3 移入事件,arr展示
arr.style.display = \'block\';
// 7.1 鼠标移入停止自动轮播
clearInterval(timeid);
}
box.onmouseleave = function () {
// 3.5 移出事件,arr消失
arr.style.display = \'none\';
//7.2 鼠标移出,开始自动轮播
timeid = setInterval(function(){
right.onclick();
}, 3000); //注意: 自动轮播的时间不能太短,因为图片滚动也需要时间
}
//4. 点击右边的arr,滚动到下一张图
// 4.1 获取元素
var right = document.getElementById(\'right\');
// 4.2 给right注册点击事件
right.onclick = function () {
// 4.3 在事件处理函数中,滚动到下一张图
// 4.3.1 当前是哪一张? 通过indexGlobal获取到当前的下标
// 4.4 判断当前是否是第5张图,如果是第5张图,就需要自己写代码,慢慢滚动到第6张
if(indexGlobal == ol.children.length - 1){
//证明是第5张,需要自己写代码,滚动过去,实现高亮
// 4.4.1 滚动到第6张
indexGlobal++;
//计算展示第6张图,ul应该处于的位置
var target = indexGlobal * screen.offsetWidth;
animate(ul,-target, 20, function(){
//4.4.2 滚动到第6张之后,要立刻跳到第一张
ul.style.left = \'0px\';
//indexGlobal应该和展示的图片保持一致
indexGlobal = 0;
});
// 4.4.3 实现高亮
//排他
for (var i = 0; i < ol.children.length; i++) {
ol.children[i].className = \'\';
}
ol.children[0].className = \'current\';
}else{
// 4.3.2 根据当前找到下一个数字按钮,触发数字按钮的点击事件
indexGlobal++;
// console.log(ol.children[indexGlobal]);
ol.children[indexGlobal].onclick();
}
}
// 5. 点击左边的arr,滚动到上一张图
// 5.1 获取元素
var left = document.getElementById(\'left\');
// 5.2 给left注册点击事件
left.onclick = function(){
// 5.3 在事件处理函数中,根据当前的图片,展示上一张
//5.3.1 判断当前展示的是不是第一张,如果是第一张,直接跳到最后一张,然后滚动到第5张
if(indexGlobal == 0){
//直接跳到最后一张
indexGlobal = ol.children.length;
ul.style.left = -indexGlobal * screen.offsetWidth + \'px\';
//然后再滚动到第五张
indexGlobal--;
ol.children[indexGlobal].onclick();
}else{
indexGlobal--;
ol.children[indexGlobal].onclick();
}
}
// 6. 让轮播图自动轮播
var timeid = setInterval(function(){
right.onclick();
}, 3000); //注意: 自动轮播的时间不能太短,因为图片滚动也需要时间
</script>
源码连接
https://www.lanzous.com/i7enozi
密码:c851