原生js 轮播图

威公
• 阅读 974

功能:

  • 自动轮播
  • 箭头向左向右切换
  • 小圆点点击切换

html:

<!doctype html>

<html>
<head>
    <meta charset="utf-8"/>
    <link rel="stylesheet" type="text/css" href="css/index.css"/> 
    <script src="js/index.js" type="text/javascript" > </script>
</head>
<body>
    <div id="container">
        <ul id="banner">
            <li>
                <a href="#">
                    <img src = "img/5.jpeg" />
                </a>
            </li>
            <li>
                <a href="#">
                    <img src = "img/1.jpg" />
                </a>
            </li>
            <li>
                <a href="#">
                    <img src = "img/2.jpg" />
                </a>
            </li>
            <li>
                <a href="#">
                    <img src = "img/3.jpg" />
                </a>
            </li>
            <li>
                <a href="#">
                    <img src = "img/4.jpg" />
                </a>
            </li>
            <li>
                <a href="#">
                    <img src = "img/5.jpeg" />
                </a>
            </li> 
            <li>
                <a href="#">
                    <img src = "img/1.jpg" />
                </a>
            </li>            
        </ul>
        
        <div id = "dots">
            <span class = "current"></span>
            <span ></span>
            <span ></span>
            <span ></span>
            <span ></span>
        </div>
        
        <a href="javascript:;" id="prev" class="arrow">&lt;</a>
        <a href="javascript:;" id="next" class="arrow">&gt;</a>
    </div>
    
    
</body>
</html>

css:

/* 父容器设置为相对定位,方便后面的小圆点和箭头布局, 子绝父相*/
#container{
    position: relative;
}

#banner,
#banner li{
    list-style:none;
    margin: 0;
    padding: 0;
}

#banner{
    position: absolute;
}

#banner li{
    float: left;
}

#banner li img{
    display:block;
}

#dots{
    position: absolute;
    bottom: 20px;
    z-index: 1;
    left: 50%;
    transform: translateX(-50%);
}

#dots span{
    cursor: pointer;
    float: left;
    width: 10px;
    height: 10px;
    border-radius: 50%;
    background: #333;
    margin-right: 5px;
}

#dots .current{
    background: orangered;
}

.arrow{
    cursor: pointer;
    display: none;
    height: 40px;
    line-height: 40px;
    text-align: center;
    font-size: 36px;
    font-weight: bold;
    width: 40px;
    position: absolute;
    z-index: 2;
    top: 50%;
    transform:translateY(-50%);
    background: rgba(0,0,0,.3);
    color: #fff;
}

#prev{
    left: 20px;
}

#next{
    right: 20px;
}

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

js:


window.onload = function(){
    var container = document.getElementById("container");
    var banner = document.getElementById("banner");
    var imgBoxs = document.querySelectorAll("#banner li");
    var imgs = document.querySelectorAll("#banner img");
    var img = imgs[0];
    var imgW = img.offsetWidth;
    var imgH = img.offsetHeight;
    
    /* 设置最外层盒子的高宽 */
    container.style.width = imgW + "px";
    container.style.height = imgH + "px";
    container.style.overflow = "hidden";
    
    banner.style.height = imgH + "px";
    banner.style.width = imgW * imgBoxs.length + "px";
    banner.style.left = - imgW + "px";
        
    
    var prev = document.getElementById("prev");
    var next = document.getElementById("next");
    
    var currentIndex = 1;// currentIndex : 1, 2 ... , imgBoxs.length - 2
    
    prev.onclick = function(){
        currentIndex --;
        animate(banner, - currentIndex * imgW, imgW, imgBoxs.length);
        
        if(currentIndex == 0){
            currentIndex = imgBoxs.length - 2;     
        }
        
        setCurrentButtonStyle(currentIndex - 1);
    }
    
    next.onclick = function(){
        currentIndex ++;
        animate(banner, - currentIndex * imgW, imgW, imgBoxs.length);
        
        if(currentIndex == imgBoxs.length - 1){
            currentIndex = 1;
        } 
        
        setCurrentButtonStyle(currentIndex - 1);
    }
     
    function setCurrentButtonStyle(index){ 
        var spans = document.querySelectorAll("#dots span");
        for(var i = 0; i < spans.length; i++){
            spans[i].className = "";
        } 
        
        spans[index].className = "current";
    }
    
    var spans = document.querySelectorAll("#dots span");
    for(var i = 0; i < spans.length; i++){
        spans[i].index = i;//缓存i
        spans[i].onclick = function(){
            currentIndex = this.index + 1;
            animate(banner, - currentIndex * imgW);
            setCurrentButtonStyle(this.index);               
        }
    }
    
    /* 开启自动轮播 */
    var autoTimer = setInterval(function(){               
        next.click();
    }, 2000);

    container.onmouseover = function(){
        clearInterval(autoTimer);
        autoTimer = null;
    }
    
    container.onmouseout = function(){
        autoTimer = setInterval(function(){               
            next.click();
        }, 2000);
    }
          
    
    // 图片顺序:5 1 2 3 4 5 1
    // 假的第一张:left = - imgW * (len - 1)
    // 假的最后一张: left = 0
    // next: 开始过渡到假的第一张时,开启和过渡时长相等的定时器, 过渡完成立即设置left为真的第一张上
    // prev:  开始过渡到假的最后一张时,开启和过渡时长相等的定时器, 过渡完成立即设置left为真的最后一张上
    //tansition 有坑,只对首尾状态有效,不能再一个函数内先取消动画,再开启,所以借助定时器
    function animate(element, leftTarget, imgW, len){
        element.style.transition = "left 0.5s linear";
        element.style.left = leftTarget + "px";
        if(leftTarget == (- imgW * (len - 1))){//next
            setTimeout(function(){
                element.style.transition = "left 0s linear";
                element.style.left = - imgW + "px";
            }, 500);
        }else if(leftTarget == 0){//prev
            setTimeout(function(){
                element.style.transition = "left 0s linear";
                element.style.left = - imgW * (len - 2) + "px";
            }, 500);
        }
    }
 
}
点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
1年前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Stella981 Stella981
4年前
Javascript使用三大家族和事件来DIY动画效果相关笔记(四)
1.图片轮播基础之缓速轮播◆使用封装的缓慢速动画来DIY滑动轮播图,也就是鼠标移动到123456这些数字上后,图片以缓慢速滑动的方式进行切换。<!DOCTYPEhtml<htmllang"en"<head<metacharset"UTF8"<title使用封装的缓速
Stella981 Stella981
4年前
AndroidStudio封装SDK的那些事
<divclass"markdown\_views"<!flowchart箭头图标勿删<svgxmlns"http://www.w3.org/2000/svg"style"display:none;"<pathstrokelinecap"round"d"M5,00,2.55,5z"id"raphael
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
JS实现小图放大轮播效果
JS实现小图放大轮播页面效果入下(图片为优行商旅页面照片):!(https://oscimg.oschina.net/oscnet/fea423c49d5f7430375068501d3f032d631.png) 实现效果:图片自动轮播,鼠标移入停止,移出继续轮播点击下方小图可以实现切换步骤一:建立HTML布局,具体
Python进阶者 Python进阶者
2年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这