<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>完全体轮播图</title>
<style>
*{
padding: 0;
margin-top: 0;
list-style: none;
}
.box{
width: 520px;
height: 280px;
margin:100px auto ; /* 居中 */
/* border: 1px solid black; */
position: relative;
overflow: hidden; /*多余部分隐藏*/
}
.box ul{
width: 600%; /*宽度要变大,因为有一张假图片*/
height: 100%;
position: absolute;
/* 子绝父相 */
}
.box ul li{
float: left;
}
.box ol{
position: absolute;
left: 50%;
transform: translateX(-50%);
bottom: 5px;
background-color: rgba(255, 255, 255, 0.5);
border-radius: 10px;
padding: 0 3px;
}
.box ol li{
width: 12px;
height: 12px;
background-color: #fff;
border-radius: 50%;
float: left;
margin-left: 8px;
margin-right: 8px;
cursor: pointer;/*鼠标上去变成手型*/
}
/* 增加权重 */
.box ol li.current{
background-color: red;
}
/* 左右箭头 */
.box .arrow{
display: none;
}
.box:hover .arrow {
display: block;
}
.box .arrow span{
width: 20px;
height: 60px;
line-height: 60px;
text-align: center;
background-color: rgba(0,0,0,.5);
font-size: 24px;
font-family: "宋体";
cursor: pointer;
position: absolute;
top: 50%;
transform: translateY(-50%);
}
.box .arrow span.left{
left:0;
}
.box .arrow span.right{
right:0;
}
</style>
</head>
<body>
<div class="box" id="box">
<ul>
<!--装图片的 -->
<li><a href="#"><img src="image/1.jpg" alt=""></a></li>
<li><a href="#"><img src="image/2.jpg" alt=""></a></li>
<li><a href="#"><img src="image/3.jpg" alt=""></a></li>
<li><a href="#"><img src="image/4.jpg" alt=""></a></li>
<li><a href="#"><img src="image/5.jpg" alt=""></a></li>
<!-- 假图片 -->
<!-- <li><a href="#"><img src="image/1.jpg" alt=""></a></li> -->
</ul>
<!-- 小圆点 -->
<ol id="ol">
<!-- <li class="current" value="0"></li>
<li value="1"></li>
<li value="2"></li>
<li value="3"></li>
<li value="4"></li> -->
</ol>
<!-- 左右箭头 -->
<div class="arrow">
<!-- 小于号 大于号 -->
<span class="left"><</span>
<span class="right">></span>
</div>
</div>
<script src="animate.js"></script>
<script>
// 需求
// 点击小圆点
// 小圆点排他
// 移动ul 获取小圆点的下标
var box = document.querySelector('#box')
// var xyd = document.querySelectorAll("#ol li")
var ul =document.querySelector("#box ul")
var images = ul.children//动态的获取li元素
var arrow = document.querySelector(".arrow")
var left = document.querySelector(".left")
var right = document.querySelector(".right")
// js添加小圆点 和 假图片
for(var j=0;j<=images.length-1;j++){
var li = document.createElement('li')
ol.appendChild(li)
}
var xyd = ol.children;
xyd[0].className = "current"
// 假图片
ul.appendChild(ul.firstElementChild.cloneNode(true))
for(var i = 0;i<xyd.length;i++){
xyd[i].index = i
xyd[i].onclick=function (){
for(var i = 0;i<xyd.length;i++){
xyd[i].className="" //清除所有小圆点类名
}
this.className = "current" //给当前点击的小圆点 添加类名
// ul.style.left =-this.index*box.offsetWidth+"px" 没有动画效果
if(index>=images.length-1){
ul.style.left =0
index = 0 //写不写无所 下面已经同步了index的值
}
index = this.index// 同步index的值为 小圆点的下标
animate(ul,-this.index*box.offsetWidth,50)
}
}
// ul.onmouseover = function (){
// arrow.style.display ="block"
// }
// ul.onmouseout = function (){
// arrow.style.display = "none"
// }
// 左右箭头的点击事件
// 箭头实现 无缝效果
// 原理 把第一张 复制一份 ,添加到 最后一张的后面(假图片)
// 单击箭头的时候,判断此时展示的是否是第一张图片(假图片)
// 让ul瞬间移动到left为0 的位置(展示的就是第一张没有动画效果)
// index = 0
// index++,index = 1 ,展示的就是第二张
// 点击左右箭头 展示小圆点
var index = 0;
left.onclick = function () {
if(index==0){
index = images.length-1 //
ul.style.left = -index*box.offsetWidth+"px" //瞬间跳到假图片
}
index--
animate(ul,-index*box.offsetWidth,30)
// 同步小圆点
for(var i = 0;i<xyd.length;i++){
xyd[i].index = i
for(var i = 0;i<xyd.length;i++){
xyd[i].className="" //清除所有小圆点类名
}
xyd[index].className = "current" //给当前点击的小圆点 添加类名
// ul.style.left =-this.index*box.offsetWidth+"px" 没有动画效果
}
}
right.onclick = function () {
if(index>=images.length-1){
// 不仅需要把ul的left变成0,index 也要变成0 ,因为下面自加
index = 0; //展示的就是第一张
ul.style.left =0; //瞬间跳回第一张
}
index++
animate(ul,-index*box.offsetWidth,30)
// 同步小圆点
for(var i = 0;i<xyd.length;i++){
xyd[i].index = i
for(var i = 0;i<xyd.length;i++){
xyd[i].className="" //清除所有小圆点类名
}
if(index>=5){
xyd[0].className = "current" //给当前点击的小圆点 添加类名
}else{
xyd[index].className = "current" //给当前点击的小圆点 添加类名
}
// ul.style.left =-this.index*box.offsetWidth+"px" 没有动画效果
}
}
// 自动播放效果
var time = setInterval(function () { right.onclick() } ,3000)
// 鼠标移入 清除定时器
box.onmouseover = function (){
clearInterval(time)
}
box.onmouseout = function () {
// 不能加var
time = setInterval(function () { right.onclick() },3000)
}
</script>
</body>
</html>
function animate(element,target,num) { //该函数 实现任意元素去任意left位置
// 每次调用前 清除上一次定时器
clearInterval(element.time)
element.time= setInterval(function () { //将time属性 存在 element DOM对象上
var wd = element.offsetLeft
//如果wd小于需要移动的距离 step =10往左走,否则step=-10 往右走
var step = wd<target?num:-num
// Math.abs()取绝对值
if(Math.abs(target-wd)<Math.abs(step)){
// 当div没有到终点的时候,直接设置到终点
// 因为step = 10 当移动到96px的时候 会到90px就停下来
element.style.left = target+"px"
clearInterval(element.time)
}else{
wd+=step
element.style.left = wd+"px"
}
},30)
}