<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<script>
//封装的图片预加载
var loadImg=(function () {
return{
//图片的预加载,输入要加载图片的数组,加载完成后抛出去(抛发形式)
loadImage:function (arr,callback) {
var img=new Image();
img.arr=arr;//以便在侦听函数中调用数组
img.list=[];//图片加载完成要存放的数组
img.num=0;
img.callback=callback;
img.addEventListener("load",loadImg.loadHandler);
img.src=arr[img.num];//从数组的第一项开始加载图片
},
//侦听事件函数
LOAD_IMAGE_FINISH:"load_image_finish",//如果没有回调函数,就用静态方法(常量)
loadHandler:function () {
this.list.push(this.cloneNode(false));//this是被侦听的对象img,将图片放到list数组中
this.num++;//图片加载完一张加载下一张
if(this.num===this.arr.length){
if(this.callback){//如果存在回调函数,同过回调函数返回出去加载完成的图片数组list
this.callback(this.list);
return;//图片加载完成返回出去
}
var evt=new Event(loadImg.LOAD_IMAGE_FINISH);
evt.list=this.list;
document.dispatchEvent(evt);//事件抛发的形式将图片加载完成抛发出去
return;//图片加载完成返回出去
}
this.src=this.arr[this.num];
}
}
})();
//写一个创建元素的函数:创建什么元素,放在哪里,内容是什么,样式是什么
function createElem(elem,parent,content,style) {
var ele=document.createElement(elem);
if(parent){
parent.appendChild(ele);
}
if(ele==="input"){
ele.value=content;
}else if(elem==="img"){
ele.src=content;
}else{
if(content){
var text=document.createTextNode(content);
ele.appendChild(text);
}
}
if(style){
setStyle(ele,style);
}
return ele;
}
//设置元素的样式
function setStyle(elem,css) {
//样式是一个对象:类似下面这种,可以遍历
/*var divStyle={
width:"100px",
height:"120x",
border:"1px solid #000000"
};*/
for(var str in css){
elem.style[str]=css[str];
}
}
var rollImage,imgCon,ul,preLi;
//rollImage最外面的大容器
//imgCon放图片的小容器
//轮播的大图
var arr = ["image/a.jpeg", "image/b.jpeg", "image/c.jpeg", "image/d.jpeg", "image/e.jpeg"];
//左右按钮
var bnArr = ["image/left.png", "image/right.png"];
//小图
var icon = ["image/icon_a.jpeg", "image/icon_b.jpeg", "image/icon_c.jpeg", "image/icon_d.jpeg", "image/icon_e.jpeg"];
var imgList;//加载出来的轮播图片放在里面
var bnList;//加载的左右按钮图片放在里面
var iconList;//加载的小图片放在里面
var position=0;//轮播的位置,就是轮播到第几张图
var direction;//图片轮播的方向
var bool=false;
var autoBool=false;
var time=120;
// loadImage(arr);//加载图片
loadImg.loadImage(arr,loadImageFinish);//加载图片
function loadImageFinish(list) {
imgList=list;
loadImg.loadImage(bnArr,loadBnFinish);
}
function loadBnFinish(list) {
bnList=list;
loadImg.loadImage(icon,loadIconFinish);
}
function loadIconFinish(list) {
iconList=list;
init();//初始化函数
}
function init() {
animation();
createRollImage();//再初始函数中创建
creatLi();
changeLi();
imgCon.appendChild(imgList[0]);
imgList[0].style.width=rollImage.offsetWidth+"px";
imgList[0].style.height=rollImage.offsetHeight+"px";
rollImage.addEventListener("mouseleave",mouseHandler);
rollImage.addEventListener("mouseenter",mouseHandler);
}
//创建框架
function createRollImage() {
var divStyle={
width:"960px",
height:"320px",
margin:"auto",
position:"relative",
overflow:"hidden"
};
var imgConStyle={
position:"absolute",
height:"320x"
};
var ulStyle={
position:"absolute",
listStyle:"none",
bottom:"30px",
dispaly:"none"
};
var leftStyle={
position:"absolute",
left:"5px"
};
var rightStyle={
position:"absolute",
right:"5px"
}
leftStyle.top=rightStyle.top=(parseInt(divStyle.height)-bnList[0].height)/2+"px";
rollImage=createElem("div",document.body,"",divStyle);//创建最外面的大容器
imgCon=createElem("div",rollImage,"",imgConStyle);//放图片的小容器
ul=createElem("ul",rollImage,"",ulStyle);
for(var i=0;i<bnList.length;i++){
rollImage.appendChild(bnList[i]);
setStyle(bnList[i],i===0 ? leftStyle : rightStyle);
bnList[i].addEventListener("click",bnClickHandler);
}
}
//创建小图
function creatLi() {
var liStyle={
width:"108px",
height:"67px",
marginLeft:"1px",
float:"left"
};
for(var i=0;i<imgList.length;i++){
var li=createElem("li",ul,"",liStyle);
li.num=i;
li.appendChild(iconList[i]);
li.addEventListener("click",liClickHandler);
}
ul.style.left=(rollImage.offsetWidth-ul.offsetWidth)/2+"px";
}
//左右按钮点击事件
function bnClickHandler(e) {
if(bool) return;
if(this===bnList[0]){
direction="right";
position--;
if(position<0) position=imgList.length;
}else if(this===bnList[1]){
direction="left";
position++;
if(position===imgList.length) position=0;
}
creatNext();
}
//小图点击事件
function liClickHandler(e) {
if(bool) return;
if(this.num===position) return;
direction=this.num>position ? "left" : "right";
position=this.num;
creatNext();
}
function mouseHandler(e) {
if(e.type==="mouseleave"){
autoBool=true;
}else if(e.type==="mouseenter"){
autoBool=false;
time=120;
}
}
function creatNext() {
imgList[position].style.width=rollImage.offsetWidth+"px";
imgList[position].style.height=rollImage.offsetHeight+"px";
imgCon.style.width=rollImage.offsetWidth*2+"px";
if(direction==="left"){
imgCon.appendChild(imgList[position]);
imgCon.style.left="0px";
}else if(direction==="right"){
imgCon.insertBefore(imgList[position],imgCon.firstElementChild);
imgCon.style.left=-rollImage.offsetWidth+"px";
}
bool=true;
}
function changeLi() {
if(preLi){
preLi.style.border="0";
}
preLi=ul.children[position];
preLi.style.border="1px solid #ff0000";
}
//图片轮播的速度
function animation() {
requestAnimationFrame(animation);
autoPlay();
if(!bool) return;
if(direction==="left"){
imgCon.style.left=imgCon.offsetLeft-20+"px";
if(imgCon.offsetLeft<-rollImage.offsetWidth){
imgCon.style.left=-rollImage.offsetWidth+"px";
bool=false;
direction="";
imgCon.firstElementChild.remove();
imgCon.style.left="0px";
}
}else if(direction==="right"){
imgCon.style.left=imgCon.offsetLeft+20+"px";
if(imgCon.offsetLeft>=0){
imgCon.style.left="0px";
bool=false;
direction="";
imgCon.lastElementChild.remove();
}
}
changeLi();
}
function autoPlay() {
if(!autoBool) return;
time--;
if(time===0){
direction="left";
position++;
if(position===imgList.length) position=0;
time=120;
creatNext();
}
}
</script>
</body>
</html>
结果截图:(不点击时自动轮播)