逛哔哩哔哩 ( ゜-゜)つロPC版的时候看到一个蛮有意思的动画,指导用户去下载客户端,于是摸索实现了一个。

原动画效果

可以看到,一个静止的小电视人,当鼠标移动到电视人身上时,电视人慢慢变身成为一个小手机人,同时淡入一个对话框提示用户去下载客户端;当鼠标停在小手机人身上时,手机人抖腿,并且对话框持续显示;当鼠标从小手机人身上移开,小手机人慢慢恢复为小电视人,同时对话框淡出退场。

实现分析

通过上面的原动画分析出:

  • 机器人进场的动画和出场的动画正好是相反的,只要实现进场动画即可推测出场动画。
  • 对话框有一个淡入淡出的效果。
  • 鼠标停在小人身上时,小人有个抖腿动作和箭头上下浮动的动作。
  • 这些动作变化用到雪碧图实现。雪碧图文件如下:

代码分析

html代码:很简单的两句。引入一个div空间用于展示图片,引入一个div用于展示下载对话框。

<div id="elevator-mobile-app" class="app-icon" style="background-position-x: 0px;"></div>
<div id="cloud" class="cloud">下载手机客户端</div>

  

css淡入动画代码

关键点解读:

animation-timing-function:检索或者设置动画过渡类型,这里用到了steps阶跃函数,也就是说这个动画不需要补间过渡,只要一帧帧显示就行。steps函数两个参数,第一个是指定间隔数n,即分n步阶段性展示;第二个参数设置最后一步的状态,可取值start或者end,默认为end。我们的雪碧图一共16张小图,有15个间隔,所以参数为steps(15)。

@keyframes:指定动画名称或动画效果。0%指的是在指定的时间段1.5s中的时间点,即0s的时候;100%同理即1.5s的时候。在此我们改变的是background-position属性,也就是移动雪碧图。

.easy-in {
animation-timing-function: steps(15);
animation-name: phone-in;
animation-duration: 1.5s;
animation-iteration-count: 1;
animation-fill-mode: forwards;
background-position: left;
}
@keyframes phone-in {
0% {
background-position: left;
} 100% {
background-position: right;
}
}

  

小手机人抖腿动作,关键点解读:

  • 观察到是手机人的动作,基本是竖着的,猜测是从第九帧到第16帧图,所以步数设为steps(7)。
  • 此时雪碧图已经执行完一遍,想象box起始位置为一个向右向下为正的坐标系,此时只有最后一帧图在坐标轴右边,所以雪碧图起始位置距离box起始位置是负的。
  • 雪碧图总长度1280px,总共16张,得出每张小图80px。那第九帧图在坐标轴右边的时候,雪碧图起始位置是 -80*8 = -640px。
  • 同理得出第16帧图在坐标轴右边时,雪碧图起始位置距离box起始位置是 -80*15 = -1200px。
 .easy-over {
animation-timing-function: steps(7,start);
animation-name: phone-over;
animation-duration: 0.8s;
animation-iteration-count: infinite;
animation-fill-mode: forwards;
background-position: -640px;
} @keyframes phone-over {
0% {
background-position: -640px 50%;
} 100% {
background-position: -1200px ;
}
}

  

javascript 鼠标事件代码如下:

var phoneDom=$('#elevator-mobile-app');
var cloudDom=$('#cloud'); phoneDom.mouseenter(function () {
//添加雪碧图进场效果
if(phoneDom.hasClass('easy-out')){
phoneDom.removeClass('easy-out');
}
phoneDom.addClass('easy-in');
//执行完动画开始循环从第九张雪碧图开始循环执行抖腿动作
setTimeout(function () {
phoneDom.removeClass('easy-in');
phoneDom.addClass('easy-over');
},1500);
//添加对话云朵淡进效果
if(cloudDom.hasClass('mFadeOut')){
cloudDom.removeClass('mFadeOut');
}
cloudDom.addClass('mFadeIn');
cloudDom.css('opacity','1');
}) phoneDom.mouseleave(function () {
//添加雪碧图出场效果
if(phoneDom.hasClass('easy-in')){
phoneDom.removeClass('easy-in');
}
if(phoneDom.hasClass('easy-over')){
phoneDom.removeClass('easy-over');
}
phoneDom.addClass('easy-out');
//添加云朵淡出效果
if(cloudDom.hasClass('mFadeIn')){
cloudDom.removeClass('mFadeIn');
}
cloudDom.addClass('mFadeOut');
cloudDom.css('opacity','0');
})

  

  js事件主要用到了两个鼠标事件mouseenter和mouseleave,很简单。鼠标移入时触发mouseenter,此时给图片添加进场效果,给对话框添加淡入效果;鼠标移出时触发mouseleave事件,此时移除入场效果,添加出场效果。

效果展示

最后奉上完整代码地址: https://gitee.com/susan007/bilibili-demo

前端动画小记---bilibili ( ゜-゜)つロ客户下载小动画的更多相关文章

  1. 如何实现微信小程序动画?添加到我的小程序动画实现详细讲解,轻松学会动画开发!附壁纸小程序源码下载链接

    为了让用户能尽可能多地使用小程序,也算是沉淀用户,现在很多小程序中,都有引导用户"添加到我的小程序"的操作提示,而且大多都是有动画效果.在高清壁纸推荐小程序首页,用户每次进入,都会 ...

  2. CSS3-实现单选框radio的小动画

    在微信上看到一个教程文,觉得制作的小动画还是很有意思的,自己也试验了一下.一开始动画怎么都不执行(我用的HB),因为内置浏览器对css3的不兼容.加上各种浏览器前缀后就好了.但是旋转那个效果,在HB里 ...

  3. TabbarItem超炫小动画

    本文转载自 不灭的小灯灯  的博客 Tabbar点击时候超炫小动画 感谢这位大神的分享! 对UITabBarController上TabBar按钮动画详细介绍-->>保证你有意外收获,如有 ...

  4. css实现web前端最美的loading加载动画!

    这些好看的loading效果,你还只会用第三方库吗?CSS3教你实现 ​前言 loading效果在实际开发中是很常见的,尤其是在Ajax请求的时候,可以给用户一个很好的交互体验. 今天这篇文章我们一起 ...

  5. 在线视频转gif动画工具 在线视频转gif动画工具下载

    在线视频转gif动画工具 在线视频转gif动画工具下载 http://www.leawo.cn/space-1723875-do-thread-id-60715.html http://www.lea ...

  6. WPF之小动画三

    如果前两篇的博客太为普通,那么接下来的内容将让你动画实在是太厉害了.本文将会介绍两个关于纯手工实现动画的形式,当然动画效果就不用我多说了. 基于帧的动画: 此处的帧并不是之前介绍的Animation这 ...

  7. WPF之小动画一

    定义动画: 直接使用Element进行BeginAnimation DoubleAnimation animation = new DoubleAnimation(); animation.By = ...

  8. 如何制作网页小动画?——gif or png

    一.场景与动画 为了拉动网站氛围,或者吸引用户浏览焦点,需要使用一些小动画.这种动画不是(gif)单纯的重复,而是需要需要一些控制和交互,比如在动画完成后打开一个对话框.动画有几个基本要素(时间控制, ...

  9. 利用jQuery实现用户名片小动画

    我爱撸码,撸码使我感到快乐!大家好,我是Counter.下面给大家介绍利用jQuery实现的小动画,非常的简便,如果有原生js操作的话,那么就不止这么多行了.至于CSS,个人觉得,这边CSS布局也蛮重 ...

随机推荐

  1. python3的嵌套函数

    背景 最近在学python3 嵌套函数 顾名思义,即使在函数中还有函数,实现了函数的多级嵌套 def test1(): age = 10 print(age) def test2(): te = 5 ...

  2. vue2.0用法技巧汇总

    1.class拼接: 2.select下拉截取: <template> <!--vip班支付报名页面--> <div id="payRecordMain&quo ...

  3. LINQ中的"延迟查询"特性【转】

    本文转载自:LINQ中的"延迟查询"特性 详细了解“延迟查询”:C#学习笔记(八)—–LINQ查询之延迟执行 很多标准查询操作符的设计原型都是返回一个IEnumerable< ...

  4. HDU – 1050 Moving Tables

    http://acm.hdu.edu.cn/showproblem.php?pid=1050 当时这道题被放在了贪心专题,我又刚刚做了今年暑假不AC所以一开始就在想这肯定是个变过型的复杂贪心,但是后来 ...

  5. django.core.exceptions.ImproperlyConfigured: The SECRET_KEY setting must not be empty

    https://www.e-learn.cn/content/wangluowenzhang/165461 问题: I created a new project in django and past ...

  6. Mac下使用Wine安装Notepad++

    下载: (链接: https://pan.baidu.com/s/1miOjLXY 密码: 2egg) 安装: 1.安装Wine 参考:http://www.cnblogs.com/EasonJim/ ...

  7. C#方法重载和方法重写的区别

    一.重载的条件: 1.必须在同一个类中: 2.方法名必须相同: 3.参数列表不能相同. 二.重写的条件: 1. 在不同的类中2. 发生方法重写的两个方法返回值,方法名,参数列表必须完全一致(必须具有相 ...

  8. Fetch使用方法

    前言: fetch是用来取代传统的XMLHttpRequest的. 它的优点很多,包括链式调用的语法.返回promise等. 什么是fetch? fetch api是基于promise的设计,它是为了 ...

  9. 利用setTimeout来实现setInterval

    在Js中,当我们要在一定间隔时间内不断执行同一函数,我们可以使用setInterval函数,但setInterval在某些情况下使用时也存在一定问题. 1.不去关心回调函数是否还在运行 在某些情况下, ...

  10. Android版本信息及与Linux和Java的关系

    1.Android与Linux和Java的关系 Android严格来说,不能算是Linux,Android是一个统称,具体来说,是Google用了Linux的一个核心,用这个核心来管理进程,控制硬件. ...