2021-05-24 动画封装 和轮播图原理


自己封装的动画函数:

function animate(obj, target, callback) {

    // console.log(callback);  callback = function() {}  调用的时候 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);

}

pc端轮播图实现原理:

1.先设置一张图片大小的宽和高

2.先设置你要轮播的图片(5)比如五张,

3. 把第5张图片克隆一份放在最前面(点击左箭头切换到最后)

4.给左右箭头设置点击事件点击向右(向左)平移一张图片的大小。

5.当到第五张(负一张)的时候,快速切换到第一张(最后一张)。

6.动态的生成小圆点

7.给小圆点设置排他思想(点击那个那个高亮)

8.点击第几个小圆点图片就切换到第几个

9.把点击左右箭头切换图片小圆点也跟着切换

10.设置定时器 自动播放

11.设置一个节流阀 防止多次点击图片快速切换的问题

没写css  和 HTML

window.addEventListener('load', function() {

    // 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');

    // console.log(ul.children.length);

    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);

    // 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();

        }

    });

    function circleChange() {

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

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

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

        }

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

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

    }

    // 10. 自动播放轮播图

    var timer = setInterval(function() {

        //手动调用点击事件

        arrow_r.click();

    }, 2000);

})

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