轮播动画

github请点这里

一、简介:轮播动画是日常常见的前端动画之一,有许多优秀的轮播库,比如:swiper,基于css3实现的Animate.css,以及bootstrap等,这些动画库提供了种类繁多的动画形式,在实际的项目开发中为了做个别动画而引入,显得多余,为此,本人实现了一个轮播动画函数(类).

二、主要功能:

​ pc端:

​ 1.自动播放

​ 2.左右切换

​ 3.支持鼠标移入移出动画暂停和播放

​ 移动端:

​ 1.自动播放

​ 2.自由滑动

三、实现过程
阅读前考虑两个问题:
1.当前图片是第一张,用户仍然向右滑动怎么办?
2.当前图片是最后一张,用户向左滑动图片怎么办?

​ 1.自动播放

​ ·考虑到动画的流畅性,播放速度为1000ms/60(取16毫秒切换完成一张图片)

​ ·每张图片自动播放完后等待3秒播放下一张,时间可自由配置

​ ·通过css3动画属性实现图片切换

    var timer = setInterval(function() {

         that.bar.style.transitionDuration='.3s'//css3动画

         that.left=-that.index*that.w

         setLeft(that.bar,that.left)

         that.index=that.index+1

    },3000)

​ 考虑到上面的两个问题,在初始化轮播动画时,复制该组图片(为区别,初始的轮播图片视为第一组,复制的视为第二组),在每次css3动画完成时,监听其完成事件,判断如果播放计数已经超过初始的轮播长度,重置当前的播放计数,并且瞬间移动轮播条到第一组图片的相应位置

    that.ele.addEventListener('transitionend',function() {

         that.stop()

         that.bar.style.transitionDuration=' '

         if (that.index>that.len) {

             that.index=that.index%that.len?that.index%that.len:1

             that.left=-(that.index-1)*that.w

             setLeft(that.bar,that.left)

          }

            that.showNav()

            that.move(that)

        })

​ 2.左右切换

​ 给轮播动画的可视区域添加向左切换和向右切换的按钮,用户点击向左按钮,可视区域切换成当前图片的前一张图片,点击向右切换按钮,可视区域切换成当前图片的后一张图片,可以选择切换时有动画效果或者瞬间移动.以下采用瞬间移动

    functionprevPic(that) {

        if (that.index===1) {

            that.index=that.len*2

            that.left=-that.w*(that.len*2-1)

            setLeft(that.bar,that.left)

          } else {

            that.left=-that.w*(that.index-2)

            setLeft(that.bar,that.left)

            that.index=that.index-1

         }

    }

functionnextPic(that) {

    if (that.index===that.len*2) {

        that.index=1

        that.left=0

        setLeft(that.bar,that.left)

    } else {

        that.left=-that.w*that.index

        setLeft(that.bar,that.left)

        that.index=that.index+1

   }

}

​ 3.鼠标移入移出

​ ]添加鼠标移入移出事件

that.ele.addEventListener('mouseover',function(ev) {
    that.stop()
    if (ev.target.className==='navigation_index') {
        var e=ev.target
        showPic(e.dataset.index)
        that.index=+e.dataset.index
        that.showNav()
     }
    return
})

that.ele.addEventListener('mouseout',function(ev) {

    if (ev.target.className==='navigation_index') {

        that.showNav()

        that.move(that)

    }

    return

})

​ 移动端区别于pc端在以下几点:

​ 1.移动端有touch事件,pc端没有,此时应该注意touch事件和click事件冲突的处理;

​ 2.移动端有灵敏的touch事件,因此把左右切换按钮隐藏,用户通过touch事件移动图片同样能左右切换图片,自由滑动

    that.ele.ontouchstart = function(ev) {

        that.bar.style.transitionDuration=''

        that.stop()

        ev.preventDefault()

        startPoint=ev.changedTouches[0].pageX//获得手指触摸屏幕的坐标

        startEle=that.bar.offsetLeft//保存当前轮播条的位置

    }

    that.ele.ontouchmove=function(ev) {

        curPoint=ev.changedTouches[0].pageX

        distance=curPoint-startPoint;

        if (that.index===1&&distance>0) {

            that.left = -that.w*that.len+distance

            that.bar.style.left=that.left+'px'

       } else {

        that.left=startEle+distance

        that.bar.style.left=that.left+'px'

   }

}

that.ele.ontouchend = function (ev) {

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

        clearTimer(touchTimer[i], 2);

    }

    that.bar.style.transitionDuration = '.3s';

    if (Math.abs(distance) >= that.w / 3) {

        if (distance > 0) {

            if (that.index === 1) {

                that.index = that.len + 1;

            }

            prevPic(that);

            that.showNav();

        } else {

            if (that.index === that.len * 2) {

                that.index = that.len;

            }

            nextPic(that);

            that.showNav();

    }

} else {

if (that.index === 1 && distance > 0) {

    that.index = that.len + 1;

}

if (that.index === that.len * 2 && distance < 0) {

    that.index = that.len;

}

showPic(that.index);

//如果distance===0,无法触发transitionend事件,通过移动一点点距离来触发

if (Math.abs(distance) === 0) {

    that.bar.style.left = that.bar.offsetLeft - 0.1 + 'px';

}

}

distance = 0;

};

总结:仔细看上面的代码,会发现,每个事件在触发前都把当前所有的定时器清除掉,这是为了避免在特定事件发生的时候,定时器动画产生干扰而导致体验不佳,定时器在动画中是一个非常重要的使用,详细了解,请参考我的下一篇文章.

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

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    X先生_未知数的X阅读 15,937评论 3 118
  • 就在前几天,约到了一位许久未见的老友。按理说,两人见面本该有说有笑的,对吧? 可他刚坐下第一句话竟然是“这里的WI...
    雍和公子阅读 408评论 0 0
  • 这周和小哥哥去了贵阳,我们住在了贵阳最繁华的地方花果园。那里真的很方便,吃的住的玩的一体化,是一个超级超级大的楼盘...
    Skyy_阅读 211评论 0 1
  • 要读的书很多?没工夫看咋办?没关系! 日本的剑圣宫本武藏,有一本书叫《五轮书》。书中他说:“即使面对千军万马,你要...
    铁娃娇涯阅读 125评论 1 3
  • 刚刚在共读群读完爱叛逆课程里《从舒缓到接纳》,学习了三个部分的舒缓,分别是针对现状的舒缓,针对父母自己的舒缓,以及...
    清心0606阅读 187评论 0 6