js轮播图

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
   
    <title>完全体轮播图</title>
    <style>
        *{
            padding: 0;
            margin-top: 0;
            list-style: none;
        }
        .box{
            width: 520px;
            height: 280px;
            margin:100px auto ;  /* 居中 */
            /* border: 1px solid black; */
            position: relative;  
            overflow: hidden;  /*多余部分隐藏*/
        }
        .box ul{
            width: 600%;  /*宽度要变大,因为有一张假图片*/
            height: 100%;
            position: absolute;
            /* 子绝父相 */
        }
        .box ul li{
            float: left;
        }
        .box ol{
            position: absolute;
            left: 50%;
            transform: translateX(-50%);
            bottom: 5px;
            background-color: rgba(255, 255, 255, 0.5);
            border-radius: 10px;
            padding: 0 3px;
            
        }
        .box ol li{
            width: 12px;
            height: 12px;
            background-color: #fff;
            border-radius: 50%;
            float: left;
            margin-left: 8px;
            margin-right: 8px;
            cursor: pointer;/*鼠标上去变成手型*/
        }
        /* 增加权重 */
        .box ol li.current{
            background-color: red;
        }
        /* 左右箭头 */
        .box .arrow{
            display: none;
        }
        .box:hover .arrow {
            display: block;
        }
        .box .arrow span{
            width: 20px;
            height: 60px;
            line-height: 60px;
            text-align: center;
            background-color: rgba(0,0,0,.5);
            font-size: 24px;
            font-family: "宋体";
            cursor: pointer;
            position: absolute;
            top: 50%;
            transform: translateY(-50%);
        }
        .box .arrow span.left{
            left:0;
        }
        .box .arrow span.right{
            right:0;
        }
    </style>
</head>
<body>
    <div class="box" id="box">
        <ul>
            <!--装图片的 -->
            <li><a href="#"><img src="image/1.jpg" alt=""></a></li>
            <li><a href="#"><img src="image/2.jpg" alt=""></a></li>
            <li><a href="#"><img src="image/3.jpg" alt=""></a></li>
            <li><a href="#"><img src="image/4.jpg" alt=""></a></li>
            <li><a href="#"><img src="image/5.jpg" alt=""></a></li>
            <!-- 假图片 -->
            <!-- <li><a href="#"><img src="image/1.jpg" alt=""></a></li> -->

            
        </ul>
        <!-- 小圆点 -->
        <ol id="ol">
            <!-- <li class="current" value="0"></li>
            <li value="1"></li>
            <li value="2"></li>
            <li value="3"></li>
            <li value="4"></li> -->
        </ol>

        <!-- 左右箭头 -->
        <div class="arrow">
            <!-- 小于号   大于号 -->
            <span class="left">&lt;</span>  
            <span class="right">&gt;</span>
        </div>
    </div>

<script src="animate.js"></script>
    <script>
    // 需求
    // 点击小圆点  
    // 小圆点排他
    // 移动ul   获取小圆点的下标
    var box = document.querySelector('#box')
    // var xyd = document.querySelectorAll("#ol li")
    var ul  =document.querySelector("#box ul")
    var images  = ul.children//动态的获取li元素
    var arrow = document.querySelector(".arrow")
    var left = document.querySelector(".left")
    var right = document.querySelector(".right")

    // js添加小圆点  和 假图片
    for(var j=0;j<=images.length-1;j++){
       var li = document.createElement('li')
        ol.appendChild(li)
    }
    var xyd = ol.children;
    xyd[0].className = "current"

    // 假图片
    ul.appendChild(ul.firstElementChild.cloneNode(true))

    for(var i = 0;i<xyd.length;i++){
    xyd[i].index = i
    xyd[i].onclick=function (){
        for(var i = 0;i<xyd.length;i++){
            xyd[i].className="" //清除所有小圆点类名
        }   
        
       this.className = "current" //给当前点击的小圆点  添加类名
        
    //    ul.style.left =-this.index*box.offsetWidth+"px"   没有动画效果
       if(index>=images.length-1){
           ul.style.left =0
           index = 0  //写不写无所  下面已经同步了index的值
       }



    index = this.index// 同步index的值为  小圆点的下标

    animate(ul,-this.index*box.offsetWidth,50)

    }
    }

    // ul.onmouseover = function (){
    //          arrow.style.display ="block"
    // }
    // ul.onmouseout  = function (){
    //     arrow.style.display = "none"
    // }
    //   左右箭头的点击事件
    // 箭头实现  无缝效果
    // 原理   把第一张  复制一份  ,添加到  最后一张的后面(假图片)
    // 单击箭头的时候,判断此时展示的是否是第一张图片(假图片)
    // 让ul瞬间移动到left为0 的位置(展示的就是第一张没有动画效果)
    // index = 0
    // index++,index = 1 ,展示的就是第二张

    // 点击左右箭头  展示小圆点
    var index = 0;
    left.onclick = function () { 
        if(index==0){
            
            index = images.length-1 //
            ul.style.left  = -index*box.offsetWidth+"px" //瞬间跳到假图片
            
            
            
        }
        index--
        animate(ul,-index*box.offsetWidth,30)

        // 同步小圆点
        for(var i = 0;i<xyd.length;i++){
          xyd[i].index = i
    
         for(var i = 0;i<xyd.length;i++){
            xyd[i].className="" //清除所有小圆点类名
        }   
        
          xyd[index].className = "current" //给当前点击的小圆点  添加类名
        
    //    ul.style.left =-this.index*box.offsetWidth+"px"   没有动画效果
    }

}

     
     right.onclick = function () { 
         if(index>=images.length-1){

            // 不仅需要把ul的left变成0,index 也要变成0 ,因为下面自加
            index = 0; //展示的就是第一张
            ul.style.left  =0; //瞬间跳回第一张
         }
        index++
        animate(ul,-index*box.offsetWidth,30)
        //  同步小圆点
        for(var i = 0;i<xyd.length;i++){
          xyd[i].index = i
    
         for(var i = 0;i<xyd.length;i++){
            xyd[i].className="" //清除所有小圆点类名
        }   
        if(index>=5){
            xyd[0].className = "current" //给当前点击的小圆点  添加类名
        }else{
            xyd[index].className = "current" //给当前点击的小圆点  添加类名
        }
   //    ul.style.left =-this.index*box.offsetWidth+"px"   没有动画效果
    }

     }


    //  自动播放效果
    var time = setInterval(function () { right.onclick() } ,3000)

    // 鼠标移入  清除定时器
    box.onmouseover = function (){
        clearInterval(time)
    }

    box.onmouseout = function () { 
        // 不能加var
        time = setInterval(function () {  right.onclick() },3000)
     }
    </script>
</body>
</html>
function animate(element,target,num) {    //该函数  实现任意元素去任意left位置
         
    //    每次调用前 清除上一次定时器
         clearInterval(element.time)  
         element.time= setInterval(function () {    //将time属性  存在 element  DOM对象上
             var wd = element.offsetLeft 
//如果wd小于需要移动的距离  step =10往左走,否则step=-10  往右走
             var step = wd<target?num:-num   

    // Math.abs()取绝对值
             if(Math.abs(target-wd)<Math.abs(step)){

                //  当div没有到终点的时候,直接设置到终点
                // 因为step = 10  当移动到96px的时候  会到90px就停下来
                 element.style.left = target+"px"
                 clearInterval(element.time)
             }else{
                 wd+=step
                element.style.left  = wd+"px"
             }
            
           },30)
     }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值