轮播图---左右切换无长滚动效果轮播图-中级难度版
左右切换无长滚动轮播图
思路:首先设有全局变量position(确定当前图片是第几张),arr数组:存放图片地址,方向:direction,
及lis小圆点数组,prev,记录小圆点的前一个, moveBool是否进入运动函数等
1、点击事件:点击左边的leftBn,设置direction="right",position--,在这要确定position不能超出数组长度范围,
超出要重新赋值,点击小圆点把小圆点的当前是lis数组中的第几个赋值给position,然后图片生成
2、图片生成:图片根据当前direction值以及position来确定插入当前图片的前面和后面,如果direction=”right“,
插在当前图片的前面,并把装图片的盒子宽度乘以2倍,设置控制图片运动的moveBool为true,
3、图片运动:根据当前direction值运动,如果值为right,则让装图片的盒子的left值为offset.left+40,即向右运动,
当运动完成后设置相关属性停止进入运动函数并设置其他相关属性
4、自动运动:设置控制自动运动的变量,初值为0,每次进入定时器++,当等于一定值时,给direction赋值,position++,
生成图片,当点击事件发生时,则给这个变量的值设成负值,让其时间更久才能再次生成图片。
5、关于小圆点及其它琐碎事情。每次清空之前prev的属性设置,然后给prev设置当前的li所在的position,再重新设置背景属性。
易错点:插入图片位置,给装图片的大盒子定位及运动。及图片生成和图片运动这一块。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>中级轮播图重构</title>
<style>
*{margin: 0; padding: 0; }
#carousel,#imgCon img{width: 1200px; height: 400px; }
#carousel {position: relative; margin: auto; overflow: hidden; }
#imgCon{width: 1200px; height: 400px; position: absolute; left: 0; font-size: 0; }
#leftBn,#rightBn {position: absolute; top:170px; cursor: pointer; }
#leftBn{left: 20px;}
#rightBn {right: 20px; }
ul{position: absolute; bottom: 20px; list-style: none; margin: auto; }
li {width: 20px; height: 20px; border: 1px solid red; border-radius: 10px;
float: left; margin-left: 8px; cursor: pointer; }
</style>
<script src="../universalMethod.js"></script>
</head>
<body>
<div id="carousel">
<div id="imgCon">
<img src="img/a.jpeg">
</div>
<ul>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ul>
<img src="img/left.png" id="leftBn">
<img src="img/right.png" id="rightBn">
</div>
<script>
var imgCon,leftBn,rightBn,ul,lis,prev
var arr=["img/a.jpeg","img/b.jpeg","img/c.jpeg","img/d.jpeg","img/e.jpeg"]
var position=0
var direction
var autoNum=0
var moveBool=false
const WIDTH=1200
const HEIGHT=400
init()
function init(){
imgCon=document.getElementById("imgCon")
leftBn=document.getElementById("leftBn")
rightBn=document.getElementById("rightBn")
ul=document.getElementsByTagName("ul")[0]
leftBn.addEventListener("click",clickHandler)
rightBn.addEventListener("click",clickHandler)
lis=ul.children
for(var i=0;i<lis.length;i++){
lis[i].index=i
lis[i].addEventListener("click",liClickHandler)
}
ul.style.left=(WIDTH-ul.clientWidth)/2+"px"
liBG()
setInterval(animation,16)
}
function createImg(){
var data1=new Date()
var img=Method.createElem("img",null,{
width:WIDTH+"px",
height:HEIGHT+"px"
})
img.src=arr[position]
imgCon.style.width=WIDTH*2+"px"
if(direction==="left"){
imgCon.appendChild(img)
}
if(direction==="right"){
imgCon.insertBefore(img,imgCon.lastElementChild)
imgCon.style.left=-WIDTH+"px"
}
var data2=new Date()
moveBool=true
console.log(data2-data1)
liBG()
}
function moveImg(){
if(!moveBool) return
if(direction==="left"){
if(imgCon.offsetLeft<=-WIDTH){
imgCon.style.left=0+"px"
imgCon.firstElementChild.remove()
imgCon.style.width=WIDTH+"px"
moveBool=false
return
}
imgCon.style.left=(imgCon.offsetLeft-40)+"px"
}
if(direction==="right"){
if(imgCon.offsetLeft>=0){
imgCon.lastElementChild.remove()
imgCon.style.width=WIDTH+"px"
moveBool=false
return
}
imgCon.style.left=(imgCon.offsetLeft+40)+"px"
}
}
function animation(){
moveImg()
autoMove()
}
function autoMove(){
autoNum++
if(autoNum===240){
autoNum=0
position++
if(position>arr.length-1) position=0
direction="left"
createImg()
}
}
function clickHandler(){
if(moveBool) return
autoNum=-120
if(this===leftBn){
position--
if(position<0) position=arr.length-1
direction="right"
createImg()
return
}
position++
if(position>arr.length-1) position = 0
direction="left"
createImg()
}
function liClickHandler(){
if(moveBool) return
autoNum=-120
if(this.index>position) direction="left"
if(this.index<position) direction="right"
position=this.index
createImg()
}
function liBG(){
if(prev){
prev.style.background="rgba(255,0,0,0)"
}
prev=lis[position]
prev.style.background="rgba(255,0,0,0.5)"
}
</script>
</body>
</html>