LOL六周年里的按钮动画——处理复杂动画的方式

LOL六周年按钮

最近LOL六周年官网网页得到了更新,里面出现了这样的一个动画:


LOL六周年动画按钮

我看这个动画挺有意思的,想看看是怎么做的,就通过检查元素看了下。
本来以为是通过canvas做的,没想到看到了这样的背景图:

LOL六周年按钮动画背景图

其原理就是一帧一帧的变化,就像做动画一样。

动画原理

动画是通过连续播放一系列静止的画面,当连续播放达到一定的速度时,我们用肉眼看到的就是动画了。它的基本原理与电影,电视一样,都是利用视觉原理。医学已经证明,人的眼睛具有“视觉暂留”特性,就是人的眼睛看到一幅画面或一个物体后,在1/24秒内不会消失,利用这一视觉变化效果。因此电影采用了每秒24幅画的速度拍摄播放,电视采用了每秒25幅(PAL制)或30幅(NSTC制)画面的速度拍摄播放,如果以每秒低于24幅画面的速度拍摄播放,就会出现停顿现象。
帧频:即每秒播放的帧数。帧频的大小直接影响到动画的快慢。帧频的单位是“帧/秒”,即“fps”,flash中默认为12fps.由于计算机显示器的荧光刷新特性,实际看到的相当于24帧,刚好达到了动画的一般要求。

仔细一想,的确,要实现这样的动画,感觉真的很难,太费时间了。
对于很复杂的动画,完全可以把动画截成一帧一帧的图片,然后通过一定的速度去更替。

下面是这个动画的代码:

HTML

<html>
  <body>
    <div class="animate_div"></div>
  </body>
</html>

CSS

.animate_div {
    width: 280px;
    height: 90px;
    background-image: url(./images/btn1_sprite.png);
    background-repeat: no-repeat;
}

/*下面这部分是直接复制的原网页的*/
.animate_div.ans_btn1 {
    background-position: 0 0;
}

.animate_div.ans_btn2 {
    background-position: -280px 0;
}

.animate_div.ans_btn3 {
    background-position: -560px 0;
}

.animate_div.ans_btn4 {
    background-position: 0 -90px;
}

.animate_div.ans_btn5 {
    background-position: -280px -90px;
}

.animate_div.ans_btn6 {
    background-position: -560px -90px;
}

.animate_div.ans_btn7 {
    background-position: 0 -180px;
}

.animate_div.ans_btn8 {
    background-position: -280px -180px;
}

.animate_div.ans_btn9 {
    background-position: -560px -180px;
}

.animate_div.ans_btn10 {
    background-position: 0 -270px;
}

.animate_div.ans_btn11 {
    background-position: -280px -270px;
}

.animate_div.ans_btn12 {
    background-position: -560px -270px;
}

.animate_div.ans_btn13 {
    background-position: 0 -360px;
}

.animate_div.ans_btn14 {
    background-position: -280px -360px;
}

.animate_div.ans_btn15 {
    background-position: -560px -360px;
}

.animate_div.ans_btn16 {
    background-position: 0 -450px;
}

.animate_div.ans_btn17 {
    background-position: -280px -450px;
}

.animate_div.ans_btn18 {
    background-position: -560px -450px;
}

.animate_div.ans_btn19 {
    background-position: 0 -540px;
}

.animate_div.ans_btn20 {
    background-position: -280px -540px;
}

.animate_div.ans_btn21 {
    background-position: -560px -540px;
}

.animate_div.ans_btn22 {
    background-position: 0 -630px;
}

.animate_div.ans_btn23 {
    background-position: -280px -630px;
}

.animate_div.ans_btn24 {
    background-position: -560px -630px;
}

.animate_div.ans_btn25 {
    background-position: 0 -720px;
}

JavaScript

let i = 1
let div = document.getElementsByClassName('animate_div')[0]
let className = 'ans_btn' + i

// 每隔一段时间更换背景图
const run = function () {
    if (i > 25) {
        i = 1
    }

    div.classList.remove(className)  //移除之前的背景类
    className = 'ans_btn' + i
    div.classList.add(className)  //添加当前背景类

    i++

    setTimeout(run, 50)
}

run()
根据@荷塘白露的建议,其实可以通过单纯js来实现动画, 而不需要写那么多CSS
注意到原图是每排三个,那么我们可以这样写达到同样的效果:
let div = document.getElementsByClassName('animate_div')[0]
let i = 0

const run = function () {
    i = i > 23 ? 0 : i+1
    div.style.backgroundPosition = -i%3*280 + 'px ' + -Math.floor(i/3)*90 + 'px'
    setTimeout(run, 50)
}

run()

纯CSS版

根据@甜虾的建议,可以使用CSSsteps来实现,这个可能存在兼容问题。纯CSS版本可能有些帧没显示到。

<html>
    <head>
        <style>
            .animate_div {
                width: 280px;
                height: 90px;
                background-image: url(./images/btn1_sprite.png);
                background-repeat: no-repeat;

                animation: play_x 300ms steps(3) infinite;
                animation: play_y 900ms steps(8) infinite;
            }

            @keyframes play_x {
                from {
                    background-position: 0px 0;
                }
                to {
                    background-position: -560px 0;
                }
            }
            @keyframes play_y {
                from {
                    background-position: 0px 0;
                }
                to {
                    background-position: 0 -720px;
                }
            }
        </style>
    </head>
    <body>
        <div class="animate_div"></div>
    </body>
</html>

效果图

效果图

源代码:
Github: tomfriwel/lol6anniversary

参考:
关于帧数与人眼的问题
LOL六周年原网页
CSS3 animation的steps方式过渡

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,413评论 25 707
  • 动画,顾名思义,就是能“动”的画。人的眼睛对图像有短暂的记忆效应,所以当眼睛看到多张图片连续快速的切换时,就会被认...
    彬_仔阅读 1,608评论 1 8
  • 什么是动画动画,顾名思义,就是能“动”的画。人的眼睛对图像有短暂的记忆效应,所以当眼睛看到多张图片连续快速的切换时...
    M_慕宸阅读 3,392评论 0 6
  • 在建筑工程中,钢筋一般的加工过程包括了除锈、调直、剪切、弯曲等。 1、钢筋除锈方法 钢筋除锈的方法也有多种,合理的...
    工程宝阅读 9,203评论 0 1
  • 现在随便点开某个求职网站,就会有“大学生兼职”的专栏,聘用岗位涉及行业之多,门类之全。似乎大学生已是用人单位不可或...
    Starwarming阅读 542评论 0 1