JS轮播图

1.结构层


结构层



2.样式层


样式1


样式2


样式三

.focus {

    position: relative;

    width: 721px;

    height: 455px;

    /* background-color: purple; */

    overflow: hidden;

    margin: 0 auto;

}

.focus ul {

    position: absolute;

    top: 0;

    left: 0;

    width: 600%;

}

.focus ul li {

    float: left;

}

.arrow-l,

.arrow-r {

    display: none;

    position: absolute;

    top: 50%;

    margin-top: -20px;

    width: 24px;

    height: 40px;

    background: rgba(0, 0, 0, .3);

    text-align: center;

    line-height: 40px;

    color: #fff;

    font-size: 18px;

    z-index: 2;

}

.arrow-r {

    right: 0;

}

.circle {

    position: absolute;

    bottom: 10px;

    left: 50px;

}

.circle li {

    float: left;

    width: 8px;

    height: 8px;

    border: 2px solid rgba(255, 255, 255, 0.5);

    margin: 0 3px;

    border-radius: 50%;

    /*鼠标经过显示小手*/

    cursor: pointer;

}

.current {

    background-color: #fff;

}



3.逻辑层


先封装一个动画函数,滚动的时候会用到

  //动画函数

function animate(obj, target, callback) {

            // 先清除以前的定时器,只保留当前的一个定时器执行

            clearInterval(obj.timer);

            obj.timer = setInterval(function() {

                    // 步长值写到定时器的里面

                    // 把我们步长值改为整数 不要出现小数的问题

                    // var step = Math.ceil((target - obj.offsetLeft) / 10);

                    var step = (target - obj.offsetLeft) / 10;

                    step = step > 0 ? Math.ceil(step) : Math.floor(step);

                    if (obj.offsetLeft == target) {

                        // 停止动画 本质是停止定时器

                        clearInterval(obj.timer);

                        // 回调函数写到定时器结束里面

                        // if (callback) {

                        // 调用函数

                        //     callback();

                   // }

                    callback && callback();

            }

            // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式:(目标值 - 现在的位置) / 10

            obj.style.left = obj.offsetLeft + step + 'px';

        }, 15);

}



实现鼠标经过盒子 显示和隐藏 左右按钮

鼠标经过盒子 显示和隐藏 左右按钮

   // 1. 获取元素

        var arrow_l = document.querySelector('.arrow-l');

        var arrow_r = document.querySelector('.arrow-r');

        var focus = document.querySelector('.focus');

        // 获取父元素的宽度

        var focusWidth = focus.offsetWidth;

        // 2. 鼠标经过focus 就显示隐藏左右按钮

        focus.addEventListener('mouseenter', function() {

            arrow_l.style.display = 'block';

            arrow_r.style.display = 'block';

            clearInterval(timer);

            timer = null; // 清除定时器变量

        });

        focus.addEventListener('mouseleave', function() {

            arrow_l.style.display = 'none';

            arrow_r.style.display = 'none';

            timer = setInterval(function() {

                //手动调用点击事件

                arrow_r.click();

            }, 2000);

        });



动态生成小圆圈  有几张图片,我就生成几个小圆圈


动态生成小圆圈并且绑定点击事件


同上

   // 3. 动态生成小圆圈  有几张图片,我就生成几个小圆圈

        var ul = focus.querySelector('ul');

        var ol = focus.querySelector('.circle');

        for (var i = 0; i < ul.children.length; i++) {

            // 创建一个小li 

            var li = document.createElement('li');

            // 记录当前小圆圈的索引号 通过自定义属性来做 

            li.setAttribute('index', i);

            // 把小li插入到ol 里面

            ol.appendChild(li);

            // 4. 小圆圈的排他思想 我们可以直接在生成小圆圈的同时直接绑定点击事件

            li.addEventListener('click', function() {

                // 干掉所有人 把所有的小li 清除 current 类名

                for (var i = 0; i < ol.children.length; i++) {

                    ol.children[i].className = '';

                }

                // 留下我自己  当前的小li 设置current 类名

                this.className = 'current';

                // 5. 点击小圆圈,移动图片 当然移动的是 ul 

                // ul 的移动距离 小圆圈的索引号 乘以 图片的宽度 注意是负值

                // 当我们点击了某个小li 就拿到当前小li 的索引号

                var index = this.getAttribute('index');

                // 当我们点击了某个小li 就要把这个li 的索引号给 num  

                num = index;

                // 当我们点击了某个小li 就要把这个li 的索引号给 circle  

                circle = index;

                // num = circle = index;

                // console.log(focusWidth);

                // console.log(index);

                animate(ul, -index * focusWidth);

            })

        }


        // 把ol里面的第一个小li设置类名为 current

        ol.children[0].className = 'current';

        // 6. 克隆第一张图片(li)放到ul 最后面

        var first = ul.children[0].cloneNode(true);

        ul.appendChild(first);



点击左右按钮切换


先封装一个添加类的函数
点击右按钮切换


同上


左边按钮点击

 circleChange函数封装

   function circleChange() {

            // 先清除其余小圆圈的current类名

            for (var i = 0; i < ol.children.length; i++) {

                ol.children[i].className = '';

            }

            // 留下当前的小圆圈的current类名

            ol.children[circle].className = 'current';

        }



右按钮

   // 7. 点击右侧按钮, 图片滚动一张

        var num = 0;

        // circle 控制小圆圈的播放

        var circle = 0;

        // flag 节流阀

        var flag = true;

        arrow_r.addEventListener('click', function() {

            if (flag) {

                flag = false; // 关闭节流阀

                // 如果走到了最后复制的一张图片,此时 我们的ul 要快速复原 left 改为 0

                if (num == ul.children.length - 1) {

                    ul.style.left = 0;

                    num = 0;

                }

                num++;

                animate(ul, -num * focusWidth, function() {

                    flag = true; // 打开节流阀

                });

                // 8. 点击右侧按钮,小圆圈跟随一起变化 可以再声明一个变量控制小圆圈的播放

                circle++;

                // 如果circle == 4 说明走到最后我们克隆的这张图片了 我们就复原

                if (circle == ol.children.length) {

                    circle = 0;

                }

                // 调用函数

                circleChange();

            }

        });



左按钮

   // 9. 左侧按钮做法

        arrow_l.addEventListener('click', function() {

            if (flag) {

                flag = false;

                if (num == 0) {

                    num = ul.children.length - 1;

                    ul.style.left = -num * focusWidth + 'px';

                }

                num--;

                animate(ul, -num * focusWidth, function() {

                    flag = true;

                });

                // 点击左侧按钮,小圆圈跟随一起变化 可以再声明一个变量控制小圆圈的播放

                circle--;

                // 如果circle < 0  说明第一张图片,则小圆圈要改为第4个小圆圈(3)

                // if (circle < 0) {

                //     circle = ol.children.length - 1;

                // }

                circle = circle < 0 ? ol.children.length - 1 : circle;

                // 调用函数

                circleChange();

            }

        });



自动播放


自动播放

   // 10. 自动播放轮播图

        var timer = setInterval(function() {

            //手动调用点击事件

            arrow_r.click();

        }, 2000);

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容