原生js仿网易轮播图

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了原生js仿网易轮播图相关的知识,希望对你有一定的参考价值。

<!-- html部分 -->
<div id="wrap">
    <div class="picBox">    <!-- 图片区域 -->
        <div id="pic">
            <div><a href="#"><img src="imgs/1.jpg" alt=""/></a></div>
            <div><a href="#"><img src="imgs/2.jpg" alt=""/></a></div>
            <div><a href="#"><img src="imgs/3.jpg" alt=""/></a></div>
            <div><a href="#"><img src="imgs/4.jpg" alt=""/></a></div>
            <div><a href="#"><img src="imgs/5.jpg" alt=""/></a></div>
        </div>
    </div>
    <div id="ctrl">    <!-- 按钮控制区域 -->
        <span class="ctrlPrev"><</span>
        <span class="ctrlNext">></span>
    </div>
</div>
/* CSS部分 */
* {margin: 0;padding: 0;}
img {vertical-align: top;}
#wrap {width: 576px;height: 374px;margin: 150px auto;position: relative;overflow: hidden;}
.picBox {width: 576px;height: 324px;}
#pic {width: 1152px;height: 324px;}
#pic div {position: absolute;top: 0;left: 0;width: 576px;height: 324px;}
#pic div img{width: 100%;}
#ctrl {text-align: center;padding-top: 5px;}
.ctrlList {width: 24px;height: 5px;display: inline-block;background:#e4e4e4;margin: 0 5px;cursor: pointer;text-indent: 10em;overflow: hidden;}
.active {background: #7bbedf!important;}
.ctrlPrev,.ctrlNext {position: absolute;top: 35%;font-size:50px;color:#fff;line-height: 42px;width: 40px;height: 50px;opacity: 0.8;cursor: pointer;}
.ctrlPrev {left: 0;}
.ctrlNext {right: 0;}
// JS部分
function $(id) {
    return document.getElementById(id);
}

var aPic = $("pic").children;    //获取图片的个数
var disX = $("wrap").offsetWidth;    //获取大盒子的宽度,即图片要走的宽度
var aSpan = $("ctrl").children;    //获取按钮的个数

for (var i = 1; i < aPic.length; i++) {
    aPic[i].style.left = disX + "px";    //除了第一张,其他图片默认在大盒子之外
}

for (var i = 0; i < aPic.length; i++) {    //自动生成小按钮
    var span = document.createElement("span");    //创建span元素
    span.className = "ctrlList";
    span.innerHTML = aPic.length - i;       //添加序号
    $("ctrl").insertBefore(span, aSpan[1]);    //添加到#ctrl内
}

aSpan[1].className = "ctrlList active";    //第一个按钮默认选中

var index = 0;    //建立索引

for (var k in aSpan) {    //遍历按钮
    aSpan[k].onclick = function () {
        if (this.className == "ctrlPrev") {    //点击上一张
            move(aPic[index], disX)    //当前张右移出大盒子
            --index < 0 ? index = aPic.length - 1 : index;    //先运算后判断index是否大于图片长度 是则等于长度
            aPic[index].style.left = -disX + "px";    //下一张直接移动到大盒子左边
            move(aPic[index], 0)    //下一张左移进大盒子
            active();
        } else if (this.className == "ctrlNext") {    //点击下一张
            autoPlay();
        } else {    //点击小按钮
            var newIndex = this.innerHTML - 1;    //建立新索引匹配序号
            if (index < newIndex) {    //当前索引小于被点击索引号
                move(aPic[index], -disX)    //当前张左移出大盒子
                aPic[newIndex].style.left = disX + "px";    //下一张直接移动到大盒子右边
            } else if (index > newIndex) {    //当前索引大于被点击索引号
                move(aPic[index], disX)    //当前张右移出大盒子
                aPic[newIndex].style.left = -disX + "px";    //下一张直接移动到大盒子左边
            }
            move(aPic[newIndex], 0)    //下一张移进大盒子
            index = newIndex;    //当前索引赋值给旧索引
            active();
        }
    }
}

var timer = null;
timer = setInterval(autoPlay, 2000);    //添加定时器

$("wrap").onmouseover = function () {    //鼠标移入关闭定时器
    clearInterval(timer);
}

$("wrap").onmouseout = function () {    //鼠标移出开启定时器
    timer = setInterval(autoPlay, 2000);
}

function active() {    //小按钮选中
    for (var i = 1; i < aSpan.length - 1; i++) {
        aSpan[i].className = "ctrlList";
    }
    aSpan[index + 1].className = "ctrlList active";
}

function move(obj, left) {    //移动动画
    clearInterval(obj.timer);
    obj.timer = setInterval(function () {
        var step = (left - obj.offsetLeft) / 8;    //步长
        step = step > 0 ? Math.ceil(step) : Math.floor(step);    //处理小数除不净
        obj.style.left = obj.offsetLeft + step + "px";
        if (obj.offsetLeft == left) {
            clearInterval(obj.timer);
        }
    }, 30)
}

function autoPlay() {    //自动播放 等同于点击下一张
    move(aPic[index], -disX)    //当前张左移出大盒子
    ++index > aPic.length - 1 ? index = 0 : index;    //先运算后判断index是否大于图片长度 是则等于0
    aPic[index].style.left = disX + "px";    //下一张直接移动到大盒子右边
    move(aPic[index], 0)    //下一张右移进大盒子
    active();
}

 

以上是关于原生js仿网易轮播图的主要内容,如果未能解决你的问题,请参考以下文章

第65天:仿网易轮播图

仿网页轮播图

仿网易阴阳师官网轮播图效果

用原生js封装轮播图

原生js-实现轮播图效果

js原生 JavaScript轮播图渐变淡入淡出效果实现(附代码)