普通轮播图

效果图如下:


普通轮播图

html结构代码:

<div class="carousel">
    <ul>
        <li class="active">
            <a href="./img/1.jpg">
                <img src="./img/1.jpg" alt="">
            </a>
        </li>
        <li>
            <a href="./img/2.jpg">
                <img src="./img/2.jpg" alt="">
            </a>
        </li>
        <li>
            <a href="./img/3.jpg">
                <img src="./img/3.jpg" alt="">
            </a>
        </li>
    </ul>
    <ol>
        <li class="active"></li>
        <li></li>
        <li></li>
    </ol>
    <a href="" class="leftBtn">&lt;</a>
    <a href="" class="rightBtn">&gt;</a>
</div>

样式代码:

.carousel {
    width: 600px;
    height: 300px;
    border: 1px solid #000;
    position: relative;
}
.carousel:hover {
    cursor: pointer;
}
.carousel ul, .carousel ol {
    list-style: none;
    padding: 0;
    margin: 0;
}
.carousel ul li a img {
    width: 600px;
    height: 300px;
}
.carousel ul li {
    display: none;
}
.carousel ul li.active {
    display: block;
}
.carousel ol {
    width: 60px;
    height: 20px;
    background-color: rgba(255, 255, 255, .7);
    border-radius: 10px;
    position: absolute;
    left: 50%;
    transform: translateX(-50%);
    bottom: 10px;
}
.carousel ol li {
    width: 10px;
    height: 10px;
    background-color: #333;
    border-radius: 50%;
    float: left;
    margin: 5px;
}
.carousel ol li.active {
    background-color: #f00;
}
.carousel>a {
    text-decoration: none;
    width: 20px;
    height: 40px;
    background-color: rgba(0, 0, 0, .7);
    color: #fff;
    text-align: center;
    line-height: 40px;
    position: absolute;
    top: 50%;
    transform: translateY(-50%);
}
.carousel>a.leftBtn {
    left: 0;
}
.carousel>a.rightBtn {
    right: 0;
}

js逻辑代码:

// 获取所有标签
var carousel = document.querySelector('.carousel');
var ulis = carousel.querySelectorAll('ul li');
var olis = carousel.querySelectorAll('ol li');
var leftBtn = carousel.querySelector('a.leftBtn');
var rightBtn = carousel.querySelector('a.rightBtn');
// 定义当前显示的li的下标
var index = 0;
// 定义定时器变量
var timerId;
// 右方向按钮的点击事件
rightBtn.onclick = function() {
    // 让下标++
    index++;
    // 限制下标最大值
    if(index === ulis.length) {
        index = 0; // 超过最大值就设置为0 - 循环轮播
    }
    // 将所有li的active类名去掉
    for(var i = 0; i < ulis.length; i++) {
        ulis[i].className = '';
        olis[i].className = '';
    }
    // 根据新的下标,显示对应的li
    ulis[index].className = 'active';
    olis[index].className = 'active';
    // 阻止a标签的默认行为
    return false;
}
// 左方向按钮的点击事件
leftBtn.onclick = function() {
    // 让下标--
    index--;
    // 限制下标最小值
    if(index < 0) {
        index = ulis.length - 1; // 超过最小值就设置为最大值 - 循环轮播
    }
    // 将所有li的active类名去掉
    for(var i = 0; i < ulis.length; i++) {
        ulis[i].className = '';
        olis[i].className = '';
    }
    // 根据新的下标,显示对应的li
    ulis[index].className = 'active';
    olis[index].className = 'active';
    // 阻止a标签的默认行为
    return false;
}
// 小圆点的点击事件
for(var i = 0; i < olis.length; i++) {
    // 给每一个li设置属性,值为自己的下标
    olis[i].index = i;
    // 给每个li绑定单击事件
    olis[i].onclick = function() {
        // 将自己的下标赋值给index变量
        index = this.index;
        // 将所有li的active类名去掉
        for(var j = 0; j < ulis.length; j++) {
            ulis[j].className = '';
            olis[j].className = '';
        }
        // 根据新的index变量让对应的li显示
        ulis[index].className = 'active';
        olis[index].className = 'active';
    }
}
// 自动轮播
timerId = setInterval(function() {
    // 让下标++
    index++;
    // 限制下标最大值
    if(index === ulis.length) {
        index = 0; // 超过最大值就设置为0 - 循环轮播
    }
    // 将所有li的active类名去掉
    for(var i = 0; i < ulis.length; i++) {
        ulis[i].className = '';
        olis[i].className = '';
    }
    // 根据新的下标,显示对应的li
    ulis[index].className = 'active';
    olis[index].className = 'active';
}, 1000);
// 鼠标移入大盒子停止自动轮播
carousel.onmouseover = function() {
    clearInterval(timerId);
}
// 鼠标移出大盒子再次开始自动轮播
carousel.onmouseout = function() {
    timerId = setInterval(function() {
        // 让下标++
        index++;
        // 限制下标最大值
        if(index === ulis.length) {
            index = 0; // 超过最大值就设置为0 - 循环轮播
        }
        // 将所有li的active类名去掉
        for(var i = 0; i < ulis.length; i++) {
            ulis[i].className = '';
            olis[i].className = '';
        }
        // 根据新的下标,显示对应的li
        ulis[index].className = 'active';
        olis[index].className = 'active';
    }, 1000);
}

其中有些重复代码,可以封装为函数重复调用:

// 获取所有标签
var carousel = document.querySelector('.carousel');
var ulis = carousel.querySelectorAll('ul li');
var olis = carousel.querySelectorAll('ol li');
var leftBtn = carousel.querySelector('a.leftBtn');
var rightBtn = carousel.querySelector('a.rightBtn');
// 定义当前显示的li的下标
var index = 0;
// 定义定时器变量
var timerId;
// 右方向按钮的点击事件
rightBtn.onclick = function() {
    rightMove()
    // 阻止a标签的默认行为
    return false;
}
// 左方向按钮的点击事件
leftBtn.onclick = function() {
    // 让下标--
    index--;
    move()
    // 阻止a标签的默认行为
    return false;
}
// 小圆点的点击事件
for(var i = 0; i < olis.length; i++) {
    // 给每一个li设置属性,值为自己的下标
    olis[i].index = i;
    // 给每个li绑定单击事件
    olis[i].onclick = function() {
        // 将自己的下标赋值给index变量
        index = this.index;
        move()
    }
}
// 自动轮播
autoMove()
// 鼠标移入大盒子停止自动轮播
carousel.onmouseover = function() {
    clearInterval(timerId);
}
// 鼠标移出大盒子再次开始自动轮播
carousel.onmouseout = function() {
    autoMove()
}
// 有按钮点击轮播的代码重复了3次,封装为函数
function rightMove() {
    // 让下标++
    index++;
    move()
}
// 轮播图的核心代码重复了很多次
function move() {
    // 限制下标最大值
    if(index === ulis.length) {
        index = 0; // 超过最大值就设置为0 - 循环轮播
    }
    // 限制下标最小值
    if(index < 0) {
        index = ulis.length - 1; // 超过最小值就设置为最大值 - 循环轮播
    }
    // 将所有li的active类名去掉
    for(var i = 0; i < ulis.length; i++) {
        ulis[i].className = '';
        olis[i].className = '';
    }
    // 根据新的下标,显示对应的li
    ulis[index].className = 'active';
    olis[index].className = 'active';
}
// 自动轮播重复了2次
function autoMove() {
    timerId = setInterval(function() {
        rightMove()
    }, 1000);
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容