JS轮播图的n种方法

第一种 

轮播图, 没有耳朵, 自动轮播, 鼠标放上去会停止, 只需在body里面更改图片宽高和图片路径

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>第一种轮播图,没有耳朵,自动轮播,鼠标放上去会停止,只需在body里面更改图片宽高和图片路径</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            list-style: none;
        }
 
        .wrap {
            margin: 60px auto;
            overflow: hidden;
            position: relative;
            margin: 100px auto;
        }
 
        .wrap ul {
            position: absolute;
            width: 100%;
            height: 100%;
        }
 
        .wrap ul li {
            height: 100%;
        }
 
        .wrap ul li img {
            width: 100%;
            height: 100%;
        }
 
        .wrap ol {
            position: absolute;
            width: inherit;
            display: flex;
            justify-content: center;
            bottom: 10px;
        }
 
        .wrap ol li {
            height: 5px;
            width: 30px;
            background: #c5c0c0;
            border-radius: 10px;
            margin-left: 5px;
            float: left;
            line-height: center;
            text-align: center;
            cursor: pointer;
        }
 
        .wrap ol .on {
            background: white;
        }
    </style>
    <!-- 轮播图处理的事件 -->
    <script type="text/javascript">
        window.onload = function () {
            var wrap = document.getElementsByClassName('wrap')[0],
                pic = document.getElementById('pic').getElementsByTagName("li"),
                list = document.getElementById('list').getElementsByTagName('li'),
                index = 0,
                timer = null;
            // 定义并调用自动播放函数
            timer = setInterval(autoPlay, 2000);
            // 鼠标划过整个容器时停止自动播放
            wrap.onmouseover = function () {
                clearInterval(timer);
            }
            // 鼠标离开整个容器时继续播放至下一张
            wrap.onmouseout = function () {
                timer = setInterval(autoPlay, 2000);
            }
            // 遍历所有数字导航实现划过切换至对应的图片
            for (let i = 0; i < list.length; i++) {
                list[i].onmouseover = function () {
                    clearInterval(timer);
                    index = i;
                    changePic(index);
                };
            };
            // 自动播放
            function autoPlay() {
                if (++index >= pic.length) index = 0;
                console.log('-------------')
                changePic(index);
            }
            // 定义图片切换函数
            function changePic(curIndex) {
                console.log(curIndex)
                for (var i = 0; i < pic.length; ++i) {
                    pic[i].style.display = "none";
                    list[i].className = "";
                }
                pic[curIndex].style.display = "block";
                list[curIndex].className = "on";
            }
        };
    </script>
</head>
<body>
    <div class="wrap" style="height: 324px; width: 324px;">
        <ul id="pic">
            <li><img src="img/1.jpg" alt=""></li>
            <li><img src="img/2.jpg" alt=""></li>
            <li><img src="img/3.jpg" alt=""></li>
            <li><img src="img/4.jpg" alt=""></li>
        </ul>
        <ol id="list">
            <li class="on"></li>
            <li></li>
            <li></li>
            <li></li>
        </ol>
    </div>
</body>
</html>

 第二种

第二种轮播图,有耳朵,功能基本齐全,只需在body里面更改图片宽高和图片路径

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>第二种轮播图,有耳朵,功能基本齐全,只需在body里面更改图片宽高和图片路径</title>
    <style>
        #mlBox {
            position: relative;
            margin: 50px auto;
            border: 1px #ececec solid;
        }

        #mlImg {
            width: 100%;
            height: 100%;
        }

        #mlImg img {
            width: 100%;
            height: 100%;
            display: none;
        }

        #mlSpan {
            width: inherit;
            height: 10px;
            position: absolute;
            bottom: 10px;
            display: flex;
            justify-content: center;
        }

        #mlSpan span {
            display: block;
            float: left;
            width: 32px;
            height: 4px;
            background: white;
            border-radius: 2px;
            margin: 0 2px;
            z-index: 100;
            opacity: 0.4;
        }

        #mlImg #mlShow {
            display: block;
        }

        #mlSpan #mlOn {
            opacity: 1;
        }

        #mlLeft {
            width: 30px;
            height: 30px;
            background: rgb(245, 245, 245, 0.3);
            position: absolute;
            border-radius: 50%;
            left: 0;
            top: 47%;
            display: none;
            text-align: center;
            line-height: 30px;
        }

        #mlRight {
            width: 30px;
            height: 30px;
            background: rgb(245, 245, 245, 0.3);
            position: absolute;
            border-radius: 50%;
            right: 0;
            top: 47%;
            display: none;
            text-align: center;
            line-height: 30px;
        }

        #mlLeft span,
        #mlRight span {
            color: rgb(255, 255, 255);
        }

        #mlLeft:hover {
            background: rgb(245, 245, 245, 0.7);
        }

        #mlRight:hover {
            background: rgb(245, 245, 245, 0.7);
        }
    </style>
</head>
<body>
    <div id="mlBox" style="width: 324px; height: 324px;">
        <div id="mlImg">
            <img src="img/1.jpg" alt="" id="mlShow">
            <img src="img/2.jpg" alt="">
            <img src="img/3.jpg" alt="">
            <img src="img/4.jpg" alt="">
        </div>
        <p id="mlSpan">
            <span id="mlOn"></span>
            <span></span>
            <span></span>
            <span></span>
        </p>
        <div id="mlLeft">
            <span>&lt;</span>
        </div>
        <div id="mlRight">
            <span>&gt;</span>
        </div>
    </div>
    <script>
        ml(true); //调用ml函数  注:传参是否需要左右指示  默认false
        function ml(indicator) {
            var oMlBox = document.getElementById('mlBox'); //获取id:mlBox
            var oMlImg = document.getElementById('mlImg'); //获取id:mlImg
            var oMlSpan = document.getElementById('mlSpan'); //获取id:mlSpan
            var aSpan = oMlSpan.getElementsByTagName('span'); //获取id:mlSpan里面的span标签
            var aImg = oMlImg.getElementsByTagName('img'); //获取id:mlImg里面的img标签
            var oMlLeft = document.getElementById('mlLeft'); //获取id:mlLeft
            var oMlRight = document.getElementById('mlRight'); //获取id:mlRight
            var u = 0; //当前照片位置
            var shut = null; //定时器的名字
            function f1() {
                for (var i = 0; i < aSpan.length; i++) { //循环id:mlSpan里面的span标签
                    aSpan[i].id = ''; //让span标签的id等于空
                    aImg[i].id = ''; //让id:mlImg里面img标签id等空
                }
                aSpan[u].id = 'mlOn'; //当前位置的span标签id等于mlOn
                aImg[u].id = 'mlShow'; //当前位置的img标签id等于mlShow
            }
            for (var f = 0; f < aSpan.length; f++) { //循环id:mlSpan里面的span标签
                aSpan[f].index = f; //span标签第f个的index等于f
                aSpan[f].onclick = function () { //点击span标签  注:照片下面的三个点
                    u = this.index; //当前位置等于当前span标签index的位置
                    f1(); //调用f1函数
                }
            }
            oMlBox.onmousemove = function () { //鼠标悬浮id:mlBox
                clearInterval(shut); //关闭定时器
                if (indicator) { //是否显示左右指示  注:调用ml函数传参
                    oMlLeft.style.display = 'block'; //显示左指示
                    oMlRight.style.display = 'block'; //显示右指示
                    oMlRight.onclick = function () { //点击右指示
                        u++; //当前位置加一
                        if (u >= aImg.length) { //当前位置大于照片的数量就等于0
                            u = 0;
                        }
                        f1(); //调用f1函数
                    };
                    oMlLeft.onclick = function () { //点击左指示
                        u--; //当前位置减一
                        if (u < 0) { //当前位置小于0时就让当前位置等于照片数量减一
                            u = aImg.length - 1; //注:因为计算机从零开始数所以要减一
                        }
                        f1(); //调用f1函数
                    };
                } else {
                    oMlLeft.style.display = 'none'; //左指示消失
                    oMlRight.style.display = 'none'; //右指示消失
                }
            };
            oMlBox.onmouseout = function () { //当鼠标移出id:mlBox
                f2(); //调用f2函数
                oMlLeft.style.display = 'none'; //左指示消失
                oMlRight.style.display = 'none'; //右指示消失
            };

            function f2() {
                shut = setInterval(function () { //定时器
                    u++; //每3秒当前位置加一
                    if (u >= aImg.length) { //当前位置大于等于照片的数量当前位置等于0
                        u = 0;
                    }
                    f1(); //调用f1函数
                }, 3000);
            }
            f2(); //调用f2函数
        }
    </script>
</body>
</html>

 第三种

第三种轮播图,功能也基本齐全,问题是图片多宽就得多款,否则容易出问题,要改匿名函数里面的循环值,在body里面改宽高和路径

<!DOCTYPE html>
<html>

<head>
    <meta charset="UTF-8">
    <title>第三种轮播图,功能也基本齐全,问题是图片多宽就得多款,否则容易出问题,要改匿名函数里面的循环值,在body里面改宽高和路径</title>
    <style>
        * {
            margin: 0;
            padding: 0;
            text-decoration: none;
        }

        #container {
            margin: 20px auto;
            overflow: hidden;
            position: relative;
        }

        #list {
            height: 100%;
            width: 30000px;
            position: absolute;
            z-index: 1;
        }

        img {
            display: block;
            float: left;
        }

        #buttons {
            position: absolute;
            width: inherit;
            height: 10px;
            z-index: 2;
            bottom: 25px;
            display: flex;
            justify-content: center;
        }

        #buttons span {
            float: left;
            border: 1px solid #fff;
            width: 10px;
            height: 10px;
            border-radius: 50%;
            margin: 0 5px;
            color: #333;
            cursor: pointer;
        }

        #buttons .on {
            background: white;
        }

        .arrow {
            cursor: pointer;
            display: none;
            width: 30px;
            height: 30px;
            position: absolute;
            z-index: 2;
            top: 45%;
            background-color: RGBA(0, 0, 0, .2);
            border-radius: 50%;
        }

        .arrow:hover {
            background-color: RGBA(0, 0, 0, .5);
        }

        #container:hover .arrow {
            display: block;
        }

        #prev {
            left: 10px;
        }

        #next {
            right: 10px;
        }
    </style>
    <!-- 事件哦~ -->
    <script>
        (function (window, document) {
            // 默认的图片宽高
            let defaultSetting = {
                "width": "500",
                "height": "500"
            }
            function Carousel(options) {
                var self = this;
                self.setting = Object.assign(defaultSetting, options);
                self.container = document.querySelector(self.setting.container);
                // 设置container的宽高,才能看到,否则一篇空白
                self.container.style.width = options.width + 'px';
                self.container.style.height = options.height + 'px';
                self.list = document.querySelector("#list");
                self.sliderItems = self.list.getElementsByTagName('img');
                self.buttons = document.querySelector("#buttons").getElementsByTagName('span');
                self.prev = document.querySelector("#prev");
                self.next = document.querySelector("#next");
                self.index = 1;
                self.prev.onclick = function () {  // 点击按钮调用rotate方法切换到上一张
                    self.rotate('left');
                }
                self.next.onclick = function () { // 点击按钮调用rotate方法切换到下一张
                    self.rotate('right');
                }
                // 打开页面就循环轮播

            }
            Carousel.prototype = {
                rotate: function (dir) {  // 定义rotate方法
                    let self = this;
                    let newLeft; // 变化后的left值
                    let selfLeft = self.list.style.left; // 原left值
                    let sliderWidth = parseInt(self.setting.width); // 可见视口宽度,这里也是一张图片宽度
                    let len = self.sliderItems.length; // 图片总张数
                    let totalWidth = len * sliderWidth
                    // 点击左按钮,往前一张
                    if (dir === 'left') {            
                        if (!selfLeft) {
                            newLeft = selfLeft + sliderWidth;

                        } else {
                            newLeft = parseInt(selfLeft) + sliderWidth
                            self.index--;
                        }
                        if (newLeft > 0) {  // 如果是第一张图片往前切换,则切换到最后一张
                            newLeft = -totalWidth + sliderWidth;
                            self.index = len;
                        }
                        self.list.style.left = newLeft + 'px' // 改变left值
                        showButtons();
                    }
                    // 点击右按钮,往后一张, 则left值增加一个负sliderWidth
                    if (dir === 'right') {
                        if (!selfLeft) {
                            newLeft = selfLeft - sliderWidth
                            self.index++;
                        } else {
                            newLeft = parseInt(selfLeft) - sliderWidth
                            self.index++;
                        }
                        if (newLeft <= -totalWidth) {
                            newLeft = 0;
                            self.index = 1;
                        }
                        self.list.style.left = newLeft + 'px' // 改变left值
                        showButtons();
                    }
                    function showButtons() {  // rotate方法里面又定义了showButtons方法
                        for (let i = 0; i < self.buttons.length; i++) {
                            if (self.buttons[i].className === 'on') {
                                self.buttons[i].className = ''; // 清除原圆点高亮状态
                                break;
                            }
                        }
                        self.buttons[self.index - 1].className = 'on';
                    }
                }
            }
            window.Carousel = Carousel; // 暴露出去,供全局对象使用
        })(window, document);
    </script>
</head>

<body>
    <div id="container">
        <div id="list">
            <img src="img/1.jpg" alt="">
            <img src="img/2.jpg" alt="">
            <img src="img/3.jpg" alt="">
            <img src="img/4.jpg" alt="">
        </div>
        <div id="buttons">
            <span index="1" class="on"></span>
            <span index="2"></span>
            <span index="3"></span>
            <span index="4"></span>
        </div>
        <a href="javascript:;" class="arrow" id="prev"></a>
        <a href="javascript:;" class="arrow" id="next"></a>
        <script>
            // 初始化
            var Carousel = new Carousel({
                container:"#container",
                // 图片的宽高
                width:"324",
                height:"324"
            });
        </script>
    </div>
</body>
</html>

 第四种

第四种轮播图,功能也挺齐全,适合图片宽的,问题是下面滚动的小圆点没变色

<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8" />
		<title>第四种轮播图,功能也挺齐全,适合图片宽的,问题是下面滚动的小圆点没变色</title>
		<style type="text/css">
			* {
				margin: 0;
				padding: 0;
			}
			
			li {
				list-style: none;
			}
			
			.box {
				margin: 20px auto;
				display: flex;
				align-items: center;
				position: relative;
				overflow: hidden;
			}
			
			.box>* {
				position: absolute;
			}
			
			.side-btns {
				width: inherit;
				height: 100px;
				display: flex;
				justify-content: space-between;
				z-index: 2;
			}
			
			.side-btns>div {
				width: 50px;
				height: inherit;
				text-align: center;
				line-height: 100px;
				font-size: 18px;
				background-color: rgba(0, 0, 0, .3);
				color: white;
				cursor: pointer;
				user-select: none;
			}
			
			.btns {
				width: inherit;
				height: 20px;
				display: flex;
				justify-content: center;
				z-index: 2;
				position: absolute;
				bottom: 20px;
			}
			
			.btns>li {
				width: 16px;
				height: 16px;
				border-radius: 50%;
				margin-right: 12px;
				cursor: pointer;
				background-color: rgba(0, 0, 0, .4);
			}
			
			.btn>li .on {
				background-color: white;
			}
			
			.wins {
				width: 100%;
				height: 100%;
				display: flex;
			}
			
			.wins>li {
				width: 100%;
				height: 100%;
				flex-grow: 0;
				flex-shrink: 0;
			}
			
			.wins>li img {
				width: 100%;
				height: 100%;
			}
		</style>
		<script>
			(function(window, undefined) {
				// 获取元素css属性值
				function getCss(elem, attr) {
					return elem.currentStyle ?
						elem.currentStyle[attr] :
						window.getComputedStyle(elem, null)[attr];
				}
				// 去除字符串中的非数字,不包括负号
				function toInt(str) {
					var rex = /[^0-9]/ig;
					return Number((str[0] === '-' && str[1] !== '=') ? '-' + str.replace(rex, '') : str.replace(rex, ''));
				}
				// 封装动画函数,参数:dom对象、css属性值对象、动画执行时间、动画完成后回调
				function animation(elem, params, speed, callback) {
					for(var param in params) {
						(function(param) {
							var elemValue = toInt(getCss(elem, param)),
								targetValue = toInt(params[param]),
								currentDis = elemValue,
								unit = params[param].substr(params[param].indexOf('[A-Za-z]+') - 1);
							if(params[param].length > 2) {
								var prefix = params[param].substr(0, 2);
								if(prefix === '+=')
									targetValue = elemValue + targetValue;
								else if(prefix === '-=')
									targetValue = elemValue - targetValue;
							}
							var dis = (targetValue - elemValue) / speed,
								sizeFlag = targetValue < elemValue;
							var timer = setInterval(function() {
								elemValue = toInt(getCss(elem, param));
								if(sizeFlag) {
									if(currentDis <= targetValue) {
										clearInterval(timer);
										elem.style[param] = targetValue + unit;
									} else {
										currentDis += dis;
										elem.style[param] = currentDis + unit;
									}
								} else {
									if(currentDis >= targetValue) {
										clearInterval(timer);
										elem.style[param] = targetValue + unit;
									} else {
										currentDis += dis;
										elem.style[param] = currentDis + unit;
									}
								}
							}, 1);
						})(param);
					}
					if(typeof callback === 'function') {
						callback();
					}
				};
				// 向右轮播数组移动
				function rightRoundArrayMove() {
					var winsLen = wins.length;
					var lastWin = wins[winsLen - 1];
					for(var i = winsLen - 1; i > 0; i--) {
						wins[i] = wins[i - 1];
					}
					wins[0] = lastWin;
				}
				// 向左轮播
				function rightRound(time) {
					rightRoundArrayMove();
					wins.forEach(function(win, index) {
						(index === 0) ?
						win.style.left = index * winWidth - winWidth + 'px':
							animation(win, {
								left: '+=' + winWidth + 'px'
							}, time ? time : animationTime);
					});
				}
				// 向右轮播
				function leftRound(time) {
					var winsLen = wins.length;
					var firstWin = wins[0];
					for(var i = 0; i < winsLen - 1; i++) {
						wins[i] = wins[i + 1];
					}
					wins[winsLen - 1] = firstWin;
					wins.forEach(function(win, index) {
						(index === wins.length - 1) ?
						win.style.left = index * winWidth - winWidth + 'px':
							animation(win, {
								left: '-=' + winWidth + 'px'
							}, time ? time : animationTime);
					});
				}
				var
					// wins, btns, sbtns用于保存构造函数的参数
					wins,
					btns,
					sbtns,
					// 窗口的宽度
					winWidth,
					// 过渡动画时间(毫秒),默认为100
					animationTime = 100,
					// 点击按钮轮播间隔
					clickInterval = animationTime << 2,
					// 保存自动轮播定时器、定时器间隔、是否向右轮播
					autoRoundTimer,
					qinterval,
					qisRight,
					// slide构造函数,参数:窗口数组,按钮数组,侧边按钮数组
					slide = function(wins, btns, sbtns) {
						return new slide.prototype.init(wins, btns, sbtns);
					};
				slide.prototype = {
					// 初始化窗口元素
					init: function(awins, abtns, asbtns) {
						if(!awins) {
							throw new Error('The window array cannot be empty.');
						}
						wins = Object.values(awins), btns = abtns, sbtns = asbtns;
						// 处理窗口少于3个的情况
						if(wins.length === 1) {
							var winParent = wins[0].parentNode;
							var winHTML = wins[0].outerHTML;
							winParent.innerHTML += winHTML + winHTML;
							wins = Object.values(winParent.children);
						} else if(wins.length === 2) {
							var winParent = wins[0].parentNode;
							winParent.innerHTML += wins[0].outerHTML + wins[1].outerHTML;
							wins = Object.values(winParent.children);
						}
						winWidth = wins[0].offsetWidth;
						wins.forEach(function(win, index) {
							win.style.position = 'absolute';
							win.index = index;
						});
						rightRoundArrayMove();
						wins.forEach(function(win, index) {
							win.style.left = index * winWidth - winWidth + 'px';
						});
					},
					// 设置过渡动画时间
					setAnimationTime: function(time) {
						animationTime = time;
						clickInterval = animationTime << 2;
					},
					// 自动轮播,参数:轮播时间间隔、是否为向右轮播
					autoRound: function(interval, isRight) {
						autoRoundTimer = setInterval(function() {
							isRight ? rightRound() : leftRound();
						}, interval);
						qinterval = interval;
						qisRight = isRight;
					},
					// 侧边按钮点击,参数为侧边按钮元素数组,该参数可在构造函数中传递或现在传递
					sideBtnClickRound: function(sabtns) {
						var leftBtn = sabtns ? sabtns[0] : sbtns[0],
							rightBtn = sabtns ? sabtns[1] : sbtns[1];
						var isclick = true;
						leftBtn.onclick = function() {
							if(isclick) {
								isclick = false;
								rightRound();
								setTimeout(function() {
									isclick = true;
								}, clickInterval);
							}
						};
						rightBtn.onclick = function() {
							if(isclick) {
								isclick = false;
								leftRound();
								setTimeout(function() {
									isclick = true;
								}, clickInterval);
							}
						};
					},
					// 普通按钮点击,参数:普通按钮数组、回调
					btnsClickRound: function(abtns, callback) {
						var ibtns = abtns ? abtns : btns;
						var isclick = true;
						ibtns.forEach(function(btn, index) {
							btn.onclick = function() {
								if(isclick) {
									isclick = false;
									if(typeof callback === 'function') {
										callback(ibtns, btn, index);
									}
									var poor = index - wins[1].index;
									var count = Math.abs(poor);
									if(poor < 0) {
										var absPoor = count;
										var timer = setInterval(function() {
											// console.log((absPoor + 1))
											rightRound(animationTime / (absPoor + 2));
											if((--count) === 0)
												clearInterval(timer);
										}, animationTime);
									} else if(poor > 0) {
										var timer = setInterval(function() {
											leftRound(animationTime / (poor + 2));
											if((--count) === 0)
												clearInterval(timer);
										}, animationTime);
									}
									setTimeout(function() {
										isclick = true;
									}, clickInterval << 1);
								}
							}
						});
					},
					// 设置鼠标移入取消自动轮播,参数:移入的元素、移入元素回调、移出元素回调
					setOverStop: function(box, overCallback, outCallback) {
						box.onmouseover = function(e) {
							clearInterval(autoRoundTimer);
							if(typeof overCallback === 'function') {
								overCallback(e);
							}
						}
						box.onmouseout = function(e) {
							slide.prototype.autoRound(qinterval, qisRight);
							if(typeof outCallback === 'function') {
								outCallback(e);
							}
						}
					}
				}
				slide.prototype.init.prototype = slide.prototype;
				window.slide = _slide = slide;
			})(window);
		</script>
		<script>
			window.onload = function() {
				var wins = document.querySelectorAll('.wins > li');
				var btns = document.querySelectorAll('.btns > li');
				var sideBtns = document.querySelectorAll('.side-btns > div');
				var box = document.querySelector('.box');
				var s = slide(wins, btns, sideBtns); // 创建轮播对象,参数:窗口dom数组、下方按钮dom数组(可选)、
				s.autoRound(2000); // 设置自动轮播
				s.setAnimationTime(200); // 设置过渡动画时间
				s.setOverStop(box); // 设置鼠标移入元素时自动轮播停止,参数:移入的dom元素、移入元素回调、移出元素回调
				s.sideBtnClickRound(); // 设置点击侧边按钮时轮播,参数:按钮dom数组(可选)
				s.btnsClickRound(); // 设置下方按钮点击时轮播,参数:按钮dom数组(可选)、回调
			}
		</script>
	</head>

	<body>
		<div class="box" style="width: 324px; height: 324px;">
			<div class="side-btns">
				<div class="left-btn">&lt;</div>
				<div class="right-btn">&gt;</div>
			</div>
			<ul class="btns">
				<li class="on"></li>
				<li></li>
				<li></li>
				<li></li>
			</ul>
			<ul class="wins">
				<!-- <li><img src="img/1.png" /></li>
				<li><img src="img/2.png" /></li>
				<li><img src="img/3.png" /></li>
				<li><img src="img/4.png" /></li> -->
				<li><img src="img/1.jpg" /></li>
				<li><img src="img/2.jpg" /></li>
				<li><img src="img/3.jpg" /></li>
				<li><img src="img/4.jpg" /></li>
			</ul>
		</div>
	</body>
</html>

 第五种 

第五种轮播图,功能也基本齐全,问题是图片多宽就得多款,否则容易出问题,要改匿名函数里面的循环值,在body里面改宽高和路径 

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>第五种轮播图,功能也基本齐全,问题是图片多宽就得多款,否则容易出问题,要改匿名函数里面的循环值,在body里面改宽高和路径</title>
    <script src="js/jquery-2.1.0.min.js"></script>
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }

        ul,
        li {
            list-style: none;
        }

        .container {
            margin: 100px auto;
            position: relative;
            overflow: hidden;
        }

        .slide {
            float: left;
        }

        img {
            display: block;
        }

        .pagination {
            width: 160px;
            position: absolute;
            bottom: 30px;
            margin-left: -80px;
            left: 50%;
        }

        .pagination li {
            float: left;
            width: 20px;
            height: 20px;
            background-color: rgb(0, 0, 0, .2);
            margin: 0 10px;
            border-radius: 50%;
        }

        .button-pre,
        .button-next {
            width: 22px;
            height: 40px;
            position: absolute;
            top: 50%;
            margin-top: -20px;
        }

        .button-pre {
            left: 10px;
            width: 30px;
            height: 30px;
            background-color: rgb(0, 0, 0, .2);
            border-radius: 50%;
            /* background: url('../image/left.png') no-repeat center center; */
        }

        .button-next {
            right: 10px;
            width: 30px;
            height: 30px;
            background-color: rgb(0, 0, 0, .2);
            border-radius: 50%;
            /* background: url('../image/right.png') no-repeat center center; */
        }

        .button-pre:hover, .button-next:hover{
            background-color: rgb(0, 0, 0, .5);
        }

        .pagination .active {
            background-color: white;
        }
    </style>
    <script>
        ; (function ($) {
            // 默认设置
            var defaults = {
                speed: 1000,
                interval: 2000,
                width: '324',
                height: '324'
            }
            function Banner(ele, options) {
                // 获得container元素, 设置container的宽高,才能看到,否则一篇空白
                this.container = document.querySelector('.mycontainer');
                this.container.style.width = options.width + 'px';
                this.container.style.height = options.height + 'px';
                // 获取元素对象
                this.element = $(ele);
                // 合并设置项
                this.options = $.extend({}, defaults, options);
                // 获取包裹图片的父元素
                this.wrapper = this.element.children().first();
                // 获取要克隆的元素
                this.firstChild = this.wrapper.find('.slide:first');
                // 获取一张图片宽度
                this.Width = this.firstChild.width();
                // 记录图片下标
                this.n = 0;
                // 获取图片个数
                this.len = this.wrapper.find('.slide').length;
                // 获取切换导航按钮
                this.prev = this.element.find('.button-pre');
                this.next = this.element.find('.button-next');
                // 获取分页器
                this.pagination = this.element.find('.pagination');
                // 计时器
                this.timer = null;
            }
            // 初始化
            Banner.prototype.init = function () {
                var self = this;
                (function () {
                    // 克隆第一张图片并添加到元素的最后边,设置包裹图片父盒子的宽度
                    self.wrapper.append(self.firstChild.clone(true));
                    self.wrapper.css({ width: self.Width * (self.len + 1) });
                    // 生成对应的分页器按钮
                    for (var i = 0; i < self.len; i++) {
                        $('<li></li>').appendTo(self.pagination);
                    }
                    // 动态设置分页器的样式
                    self.pagination.find('li:first').addClass('active');
                    var btnWidth = self.pagination.find('li:first').outerWidth(true) * self.len;
                    self.pagination.css({ width: btnWidth, marginLeft: -btnWidth / 2 })
                })()
                // 调用所有绑定的事件
                this.nextClick();
                this.preClick();
                this.btnClick();
                this.autoPlay();
                this.clearPlay(this.element);
            }
            // 切换下一张图片事件
            Banner.prototype.nextClick = function () {
                var self = this;
                this.next.click(function () {
                    self.moveNext();
                })
            }
            // 切换图片,同时也为实现自动播放
            Banner.prototype.moveNext = function () {
                this.n++;
                // 判断重置时机和重置样式
                if (this.n > this.len) {
                    this.n = 1;
                    this.wrapper.css({ marginLeft: 0 });
                }
                this.changeBtn(this.n > 3 ? 0 : this.n);
                this.wrapper.stop(true, true).animate({ marginLeft: -this.Width * this.n }, this.options.speed)
            }

            // 点击切换上一张图片
            Banner.prototype.preClick = function () {
                var self = this;
                this.prev.click(function () {
                    self.n--;
                    if (self.n < 0) {
                        self.n = self.len - 1;
                        self.wrapper.css({ marginLeft: -(self.len) * self.Width });
                    }
                    self.changeBtn(self.n < 0 ? self.n = 3 : self.n);
                    self.wrapper.animate({ marginLeft: -self.Width * self.n }, self.options.speed)
                })
            }
            // 点击分页器切换图片
            Banner.prototype.btnClick = function () {
                var self = this;
                this.pagination.find('li').click(function () {
                    var index = $(this).index();
                    self.n = index;
                    self.changeBtn(index);
                    self.wrapper.animate({ marginLeft: -self.Width * index }, self.options.speed)
                })
            }
            // 动态修改分页器按钮的样式
            Banner.prototype.changeBtn = function (index) {
                this.pagination.find('li').eq(index).addClass('active').siblings().removeClass('active');
            }
            // 自动轮播
            Banner.prototype.autoPlay = function () {
                var self = this;
                /* 计时器中调用函数是,函数中的this 指向 window, 所以需要使用self.timer = setInterval(function(){
                 self.moveNext();
                 },2000);
                 不能直接使用 self.timer = setInterval(self.moveNext(),2000); 形式 */
                self.timer = setInterval(function () {
                    self.moveNext();
                }, self.options.interval);
            }
            // 清除自动播放
            Banner.prototype.clearPlay = function (ele) {
                var self = this;
                ele.mouseenter(function () {
                    clearInterval(self.timer)
                }).mouseleave(function () {
                    // 再次开启自动轮播
                    self.timer = setInterval(function () {
                        self.moveNext();
                    }, self.options.interval);
                })
            }
            // jQuery插件实现
            $.fn.myBanner = function (params) {
                // params 是自定义的配置项
                var banner = new Banner(this, params);
                banner.init();
                // 如果需要链式调用
                return this;
            }
        })(jQuery)
    </script>
</head>
<body>
    <div class="container mycontainer">
        <div class="wrapper">
            <div class="slide">
                <img src="img/1.jpg" alt="">
            </div>
            <div class="slide">
                <img src="img/2.jpg" alt="">
            </div>
            <div class="slide">
                <img src="img/3.jpg" alt="">
            </div>
            <div class="slide">
                <img src="img/4.jpg" alt="">
            </div>
        </div>
        <!-- 分页器 -->
        <ul class="pagination"></ul>
        <!-- 导航按钮 -->
        <div class="button-pre"></div>
        <div class="button-next"></div>
    </div>
    <script>
        $(function () {
            $('.mycontainer').myBanner({
                // speed:图片切换速度 interval:图片切换的时间间隔 width:图片宽 height:图片高
                speed: 500,
                interval: 3000,
                width: '324',
                height: '324'
            });
        })
    </script>
</body>
</html>

 备注:暂时是整理出来这几种,可以根据自己需要的情况使用,都是简单操作,没有太多比较好看的样式,写法略有不同....如有发现,会放在后面,希望对你们有所帮助

  • 35
    点赞
  • 237
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值