js-轮播图

轮播图
需求:
1、能自动在几张图片之间来回切换
2、在图片切换的同时,下方的与之相对应图片按钮也会随之显示不同样式
3、第一张与最后一张可以连接循环播放
4、点击前进或后退按钮,图片也会随之前进后退
下面是源码

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
        <title>轮播图 </title> 

    </head>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        #box {
            position: relative;
            margin: auto;
            width: 810px;
            height: 324px;
            overflow: hidden;
        }
        .img {
            list-style: none;
            position: absolute;
            left: 0;
            top: 0;
            width: 4050px;
            overflow: hidden;
        }
        img {
            width: 810px;
            height: 324px;
        }
        .img li {
            float: left;

        }
        .nav {
            list-style: none;
            position: absolute;
            right : 50px;
            bottom: 25px;
        }
        .nav li {
            float: left;
            width: 20px;
            height: 20px;
            border-radius: 50%;
            background: rgba(0,0,0,0.5);
            margin-right: 15px;
            cursor: pointer;
        }
        .nav .active {
            background-color: #fff;
        }
        #leftBtn {
            background: url(btn.gif);
            width: 60px;
            height: 60px;
            position: absolute;
            top: 120px;
            left: 20px;
            cursor: pointer;
        }
        #rightBtn {
            background: url(btn.gif) 0 -60px;
            width: 60px;
            height: 60px;
            position: absolute;
            top: 120px;
            right: 20px;
            cursor: pointer;
        }
    </style>
    <script src="../../common.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        onload = function(){
            var oul = document.getElementById("box").children[0];
            var nav = document.getElementsByClassName("nav")[0].children;
            var leftBtn = document.getElementById("leftBtn");
            var rightBtn = document.getElementById("rightBtn");

            //定义index为第几张图片
            var index = 0;
            //运动函数,方便多出功能的实现,从定时器里提出
            function _move(){
                // ++index >3 ? index = 0 : "";
                //自增
                ++index;
                //建立for循环清除当前图片对应的按钮以外的按钮样式
                for(var i=0; i<nav.length; i++) {
                    nav[i].className = "";
                }
                //赋予当前图片对应的按钮不同的样式
                nav[index==4? 0 : index].className = "active";

                //图片的运动缓冲
                animate(oul,{left : -810 *index},function(){//回调函数
                    //判断当图片播放到最后一张时,迅速跳到第一张图片,形成无缝播放
                    if(index >= 4){
                        //index归0
                        index = 0;
                        //left归0
                        oul.style.left = 0;
                    }
                })
            }
            //建立定时器,实现轮播
            var timer = setInterval(_move,3000);
            //鼠标划入时,停止定时器,停止轮播
            box.onmouseenter = function(){
                clearInterval(timer);
            }
            //鼠标划出时,再次开启定时器,实现轮播
            box.onmouseleave = function(){
                timer = setInterval(_move,3000);
            }
            //建立for循环,实现按钮点击
            for(var i=0; i<nav.length; i++){
                //另类的伪数组下标
                nav[i].num = i;
                //点击事件,鼠标点击按钮时,显示按钮所对应的图片
                nav[i].onclick = function(){
                    index = this.num-1;
                    //调用函数
                    _move();
                }
            }
            //点击,向左滑动图片
            leftBtn.onclick = function(){
                index -=2;
                //当index为-2时,转为2,也就是第一张图片与第4张图片链接
                index == -2 ? index =2 : "";
                _move();
            }
            //点击,向右滑动图片
            rightBtn.onclick = function(){
                _move();
            }
        }
    </script>
    <body>
        <div id="box">
            <ul class="img">
                <li><img src="001.jpg" ></li>
                <li><img src="002.jpg" ></li>
                <li><img src="003.jpg" ></li>
                <li><img src="004.jpg" ></li>
                <li><img src="001.jpg" ></li>
            </ul>
            <ul class="nav">
                <li class="active"></li>
                <li></li>
                <li></li>
                <li></li>
            </ul>
            <div id="leftBtn"></div>
            <div id="rightBtn"></div>
        </div>
    </body>
</html>

源码中引入的封装函数

//元素的运动缓冲
//animate( obj, {left: 300, width: 400})
function animate(ele /*元素*/ , option /*元素属性,是一个对象,对象的值为百分制*/ , callback) {
    if (ele.isMoving) return;

    ele.isMoving = true;
    //遍历对象
    for (var i in option) {
        //自调用函数
        (function (prop) {
            //设定终点距离
            var end = option[prop];
            //设定时器,ele[prop+"-timer"]:元素中的遍历出的每一个属性
            ele[prop + "-timer"] = setInterval(function () {
                //判断是不是opacity透明度属性
                if (prop == "opacity") {
                    //定义变量并赋值当前元素的透明度数值并转为百分制
                    var currentValue = getStyle(ele)[prop] * 100;
                    //定义变量,算出速度,用终点数值减去当前已进行的数值在除以8,得到每次前进的数值
                    var speed = (end - currentValue) / 8;
                    //判断speed变量是否大于0
                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                    //将逐渐进行的数值,依次转为浮点数,在添加到元素中
                    //                  ele.style[prop] = (currentValue + speed) / 100;
                    //                  //判断该当该元素值已经超过或者等于设定的终点数值时,结束定时器
                    //                  //一般来说,由于前面已经向上或向下取整了,所以一般不会出现超过终点值的情况
                    //                  if ("opacity" >= end) {
                    //                      clearInterval(ele[opacity + "-timer"]);
                    //                  }
                    ele.style.opacity = (currentValue + speed) / 100;
                    ele.style.filter = "alpha(opacity=" + (currentValue + speed) + ")"
                    if (ele.style.opacity == end / 100) {
                        clearInterval(ele["opacity-timer"]);
                        if (isAllover()) {
                            callback ? callback() : "";
                        }
                    }

                } else {
                    //定义变量并赋值当前元素的值并取整
                    var currentValue = parseInt(getStyle(ele)[prop]);
                    //定义变量,算出速度,用终点距离减去当前已进行的鞠丽丽在除以8,得到每次前进的距离
                    var speed = (end - currentValue) / 8;
                    //判断speed变量是否大于0
                    speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
                    //将每次前进的距离依次添加到元素中
                    ele.style[prop] = currentValue + speed + "px";
                    //                  //判断该当该元素值已经超过或者等于设定的终点数值时,结束定时器
                    //                  //一般来说,由于前面已经向上或向下取整了,所以一般不会出现超过终点值的情况
                    //                  if (parseInt(getStyle(ele)[prop]) >= end) {
                    //                      clearInterval(ele[prop + "-timer"]);
                    //                  }
                }
                if (parseInt(getStyle(ele)[prop]) == end) {
                    clearInterval(ele[prop + "-timer"]);
                    if (isAllover()) {
                        callback ? callback() : "";
                    }
                }
            }, 30)
        })(i);
    }

    function isAllover() {
        var flag = true;
        for (var attr in option) {
            var end = option[attr];
            var curtVal = parseInt(getStyle(ele)[attr]);
            if (attr == "opacity") {
                curtVal = getStyle(ele)[attr] * 100;
            }
            if (curtVal != end) {
                flag = false;
                return flag;
            }
        }
        ele.isMoving = false;
        return flag;
    }
}

//获取非行内样式
function getStyle(ele) {
    if (ele.currentStyle) {
        return ele.currentStyle; //IE
    } else {
        return getComputedStyle(ele); //非IE
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值