【Javascript】入门之实现轮播图效果(无缝轮播/箭头切换/圆点切换)

描述:

1. 布局, 有几张图就有几个小圆点
2. 在页面中,每隔2s图片切换到下一章
3. 点击左箭头, 让图片依次切换 4–3--2–1--4
4. 点击右箭头, 让图片依次切换 1–2--3–4--1
5. 点击小圆点,图片切换到对应的
6. 鼠标划上div,清除定时器
7. 划下div, 定时器重新开启

在这里插入图片描述

代码实现:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>轮播图</title>
    <style>
        *{
            margin: 0;
            padding: 0;
            list-style: none;
        }
        #content{
            width: 700px;
            height: 525px;
            border: 1px solid #000;
            margin: 0 auto;
            position: relative;
            overflow: hidden; 
        }
        #content ul{
            /* width = sum of all the width of pictures */
            width: 2800px;
            height: 525px;
            position: absolute;
            left: 0;
            top: 0;
            border:1px solid green
        }
        #content ul li{
            width: 700px;
            height: 525px;
            float: left;
        }
        #content p{
            width: 100%;
            height: 20px;
            position:absolute;
            left: 0;
            bottom: 22px;
            /* background-color: olivedrab; */
            text-align: center;
        }
        #content p span{
            width: 20px;
            height: 20px;
            background: #808080;
            display: inline-block;
            margin: 0 5px;
            border-radius: 50%;
        }
        #content button{
            width: 50px;
            height: 90px;
            line-height: 90px;
            background-color: #000;
            opacity: 0.3;
            color:#fff;
            font-size: 30px;
            position:absolute;
            top: 50%;
            margin-top:-45px;
            cursor: pointer;
        }
        #content .left{
            left: 0;
        }
        #content .right{
            right: 0;
        }
        #content p span.active{
            background-color:#FFA500;
        }
    </style>
</head>
<body>
    <!-- 1.轮播图布局 -->
    <div id="content">
        <!-- 图片列表 -->
        <ul>
            <!-- <li><img src="./img/1.jpg" alt=""></li>
            <li><img src="./img/2.jpg" alt=""></li>
            <li><img src="./img/3.jpg" alt=""></li>
            <li><img src="./img/4.jpg" alt=""></li> -->
        </ul>
        <!-- 小圆点列表 -->
        <p>
           <!--  <span class = "active"></span>
            <span></span>
            <span></span>
            <span></span> -->
        </p>
        <!-- 左右箭头 -->
        <button class = "left">&lt;</button>
        <button class = "right">&gt;</button>
    </div>
    <script src="./function.js"></script>
    <script>
       
       /*  1. 布局, 有几张图就有几个小圆点
        2. 在页面中,每隔5s图片切换到下一章
        3. 点击左箭头, 让图片依次切换  4--3--2--1--4
        4. 点击右箭头, 让图片依次切换  1--2--3--4--1
        5. 点击小圆点,图片切换到对应的
        6. 鼠标划上div,清除定时器
        7. 划下div, 定时器重新开启 */

        // 1.渲染页面

        // 动态实现布局效果
        var cont = document.querySelector('#content');
        var ul = cont.getElementsByTagName('ul')[0];
        var p = cont.getElementsByTagName('p')[0];
        // console.log(cont, p, ul);

        // 假设, 将所有图片存储到数组中
        var arr = ['./img/1.jpg','./img/2.jpg','./img/3.jpg','./img/4.jpg'];

        // 页面中渲染数据, 将每一张图片和每一个小圆点添加到content中
        // 初始化变量
        var html = '';
        var str = '';

        for(var i = 0; i < arr.length; i++){
            // 初始化图片
            html += '<li><img src="'+ arr[i] +'" alt=""></li>';
            // 初始化小圆点
            str += '<span></span>';
        }
        // html渲染到ul
        ul.innerHTML = html;
        // str渲染到p
        p.innerHTML = str;

        // 无缝轮播多加的最后一张图
        ul.innerHTML += '<li><img src="'+ arr[0] +'" alt=""></li>';

        // 第一个小圆点类为active
        var spans = p.getElementsByTagName('span');
        spans[0].className = 'active';

    
        // 2.图片每隔2s动一次

        // 获取图片宽度, 即为盒子的可视宽度
        var cw = cont.clientWidth;
        console.log(cw);

        // 重新计算ul的宽度
        ul.style.width = (arr.length + 1) * cw + 'px';
        console.log(ul);
        // 假设图片为第一张
        var n = 0;
        // 移动的距离 = 下标 * 一张图片的宽度
        // 移动方向 0 -- 1 -- 2 -- 3 -- 0
        cont.t = setInterval(auto, 2000);

        // 划上cont, 清除
        cont.onmouseenter = function(){
            clearInterval(cont.t);
        }
        // 离开cont, 重新激活定时器
        cont.onmouseleave = function(){
            cont.t = setInterval(auto, 2000);
        }
        // 点击右箭头, 切换到下一张图片
        var btns = document.getElementsByTagName('button');
        console.log(btns);
        btns[1].onclick = function(){
            auto();
        }
        // 点击左箭头, 切换到上一张
        btns[0].onclick = function(){
            n -= 2;
            auto();
        }
        // 点击每一个小圆点, 切换到对应图片
        for(var i = 0; i < spans.length; i++){
            // 自定义索引
            spans[i].index = i;
            // 给每一个小圆点添加点击事件
            spans[i].onclick = function(){
                // 小圆点与图片关系一一对应
                n = this.index - 1;
                auto();
            }
        }
        // 封装定时器
        function auto(){
            n++;
            // ul.style.left = n * (-cw) + 'px';
            // 如果n到达最后一张, 则返回第一张
            if(n > arr.length){
                n = 0;
                // 闪现回到第一张
                ul.style.left = n * (-cw) + 'px';
                // 回到第一张之后, 下标更新为第二张
                n = 1;
            }
            // 如果n到第一张, 则返回最后一张
            if( n < 0 ){
                n = arr.length - 1;
                // 闪现
                ul.style.left = n * -cw + 'px';
            }
            // 调用匀速运动函数
            move(ul, 'left', 50, n* (-cw));
            // 增加排他
            for(var i = 0; i < spans.length; i++){
                spans[i].className = '';
            }
            // 小圆点和图片关系一一对应
            spans[n == arr.length ? 0 : n].className = 'active';
        }
    </script>
</body>
</html>

AJAX实现轮播图和小圆点切换

在这里插入图片描述

代码实现

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            padding: 0;
            margin: 0;
            list-style: none;
        }

        #cont {
            width: 100%;
            height: 450px;
            background: rgb(142, 177, 255);
            position: relative;
        }

        #cont ul {
            display: block;
            width: 750px;
            height: 450px;
            position: absolute;
            left: 0;
            top: 0;
            right: 0;
            bottom: 0;
            margin: auto;
            background: yellow;
        }

        #cont ul li {
            position: absolute;
            top: 0;
            left: 0;
            width: 750px;
            height: 450px;
            opacity: 0;
        }

        #cont ul li.active {
            opacity: 1;
        }

        #cont p {
            width: 750px;
            height: 10px;
            margin: auto;
            position: absolute;
            bottom: 10px;
            left: 0;
            right: 0;
            text-align: center;
            line-height: 10px;
            font-size: 0;
        }

        #cont p span {
            width: 40px;
            height: 10px;
            display: inline-block;
            background: #000;
            margin: 0 5px;
            opacity: 0.5;
        }

        #cont p span.active {
            background: red;
        }
    </style>
</head>

<body>
    <!-- 
        1. 布局: 
        2. js
            2.1 请求数据
            2.2 数据渲染到页面  
            2.3 初始化页面的样式
            2.4 每隔5s中换下一张图  2个动画同时执行  所有的被清除  当前这一个被显示
            2.5 划上每一个小圆点也要去切换图片
    -->
    <div id="cont">
        <ul>
            <!-- <li class="active"><img src="./images/banner/banner1.jpg" alt=""></li>
            <li><img src="./images/banner/banner2.jpg" alt=""></li>
            <li><img src="./images/banner/banner3.jpg" alt=""></li>
            <li><img src="./images/banner/banner4.jpg" alt=""></li> -->
        </ul>
        <p>
            <!-- <span class="active"></span>
            <span></span>
            <span></span>
            <span></span> -->
        </p>
    </div>

    <script src="./ujiuye.js"></script>
    <script>
        // 2.1 请求数据
        ajax('get', './banner.txt', '', function (res) {
            // console.log(res);
            // 转换数据
            var r = JSON.parse(res);
            // console.log(r);
            // 2.2 数据渲染到页面
            // 2.2.1 原页面注释掉 
            // 2.2.2 将每一个数据生成html片段 渲染到父元素中
            var cont = document.getElementById('cont');
            // console.log(cont);
            var p = cont.querySelector('p');
            var ul = cont.querySelector('ul');
            // console.log(p, ul);

            // 声明变量存储html片段
            var html = '', str = '';
            for (var i = 0; i < r.length; i++) {
                console.log(r[i]);
                // 变量 += 单独一个单元
                html += '<li><img src="' + r[i].src + '" alt=""></li>';
                str += '<span></span>';
            }
            // 渲染到父元素中
            ul.innerHTML = html;
            p.innerHTML = str;

            // 2.3 初始化页面的样式
            // 第一个li加上类名 第一个span加上类名
            var lis = ul.getElementsByTagName('li');
            var spans = p.getElementsByTagName('span');
            console.log(lis, spans);

            lis[0].className = 'active';
            spans[0].className = 'active';



            // 2.4 每隔5s换一张图
            // 0---1---2---3---0
            // 不知道第几章图 存一下
            var n = 0;
            ul.timer = setInterval(auto, 2000);



            // 划上每一个小圆点 让图片显示对应的  小圆点  图片 一一对应 
            // 划下每一个小圆点  重新开始定时器
            for (var j = 0; j < spans.length; j++) {
                spans[j].index = j;
                spans[j].onmouseenter = function () {
                    // 清除定时器
                    clearInterval(ul.timer);
                    // 小圆点的下标
                    n = this.index - 1;
                    auto();
                }
                spans[j].onmouseleave = function () {
                    ul.timer = setInterval(auto, 2000);
                }
            }


            function auto() {
                n++;
                // 判断
                if (n == lis.length) {
                    n = 0;
                }
                // 排他
                for (var j = 0; j < lis.length; j++) {
                    buffMove(lis[j], { 'opacity': 0 });
                    spans[j].className = '';

                }
                // 操作元素的透明度
                buffMove(lis[n], { 'opacity': 1 });

                // 小圆点跟随切换
                spans[n].className = 'active';

                // 更换背景色
                cont.style.background = r[n].background;
            }
        });
        /*
            json数据的规矩:
                1. 最大级别  []  {}
                2. 所有的属性名和属性值都用双引号
                3. 多余的符号不要加
                4. 没有变量和函数   字符串 数值
        */
    </script>
</body>
</html>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值