css图片滑动切换图_CSS帧动画
前言
是不是很多人认为只有连续的变化才叫动画。
上图是连续旋转变化,下图是断断续续切换状态,请查看以下两个动画:
是否认知的感觉又强烈了一点呢?
假设我把下图的 loading 播放速度加快,继续看:
是否发现和图一的 loading 一样了,是否发现认知出现了偏差?
这种肉眼可见的断断续续的动画(如图一的下图,图二的下图其实也是,只是速度快而已,感知不明显)称为帧动画,又叫序列帧动画,定格动画,逐帧动画等,是一种动画技术,其原理为将每帧不同的图像连续播放,从而产生动画效果。
简而言之,实现帧动画需要两个条件:
1. 相关联的不同图像,即动画帧;
2. 连续播放。
原理
CSS 帧动画是通过不断变换 keyframes 中每个阶段的属性来实现,如上图的例子 0% 处和 100% 处分别使用不同的 transform 属性的 rotate 实现了 loading 效果。然而 CSS 动画默认的动画过渡方式的平滑的,平滑的过渡对逐帧动画会造成类似滑动的效果,所以需要动画时间函数 animation-timing-function 中的阶梯函数 steps 属性来设置过渡方式。
PS:steps 函数衍生出了 step-start 和 step-end 两个封装函数;cubic-bezier 函数则有linear,ease,ease-in,ease-out 以及 ease-in-out。
steps
steps 指定了一个阶梯函数,接受两个参数:
1. 第一个参数接受一个整数值,表示两个关键帧之间分几步完成;
2. 第二个参数可选,接受 start 和 end 两个值,默认值为 end,指定在每个间隔的起点或是终点发生阶跃变化;
PS:step-start 等同于 step(1, start)。step-end 等同于 step(1, end)。
动画时间函数 animation-timing-function 中的阶梯函数 steps 兼容性如下:
由上图可知,无论在移动端还是 PC 浏览器中,steps 的兼容性都是非常好的。
那么来理解 steps 的工作机制,如下图:
举个栗子,方便粉友们理解,有如下CSS3动画keyframes,定义了一段从0~100px的位移:
@keyframes move { 0% { left: 0; } 100% { left: 100px; }}
假设 steps 函数第一个参数值是5,则相当于把 100px 分成了 5 段,如下示例图:
假设 steps 函数第二个参数值是 start,如下示例图:
假设 steps 函数第一个参数值是 end,如下示例图:
是否瞬间思路清晰,必须感谢 CSS 大佬张鑫旭,栗子取自他的文章,有兴趣的粉友在文末找到本文相关参考文献。
稍微补充一个 animation-fill-mode 相关知识,后续会使用到。
CSS 属性的 animation-fill-mode 设置 CSS 动画在执行之前和之后如何将样式应用于其目标。
animation-fill-mode 的属性值为 forwards 目标将保留由执行期间遇到的最后一个关键帧计算值,使用其则表示如下示例图:
了解上述相关知识,那么赶紧来看个小姐姐的栗子,效果图如下:
示例代码如下:
CSS 逐帧动画 html, body { width: 100%;height: 100% } html, body, div { margin: 0; padding: 0; } .box { margin: 50px auto; } .sister { width: 204px; height: 133.3px; background: url('./images/sister.png') no-repeat 0 0 / 204px 800px; animation: smile 3s steps(1, end) 0s forwards; } @keyframes smile { 0% { background-position-y: 0px; } 20% { background-position-y: -133.3px; } 40% { background-position-y: -266.6px; } 60% { background-position-y: -400px; } 80% { background-position-y: -533.3px; } 100% { background-position-y: -667px; } }
示例代码中图片如下:
那么为什么上述小姐姐案例代码中的 step 第一个参数是1?
steps 是 animation-timing-function 的一个属性值,animation-timing-function 应该于两个 keyframes 之间,而非整个动画。在上述案例代码中的 keyframes 中,已经把每个帧都写出来了,因此两个 keyframes 之间的间隔是1。
于是就有了更简洁的写法,可以把 keyframes 的计算直接交给 steps 来完成。
可以把上述案例的 keyframes 处调整如下,
.sister { animation: smile 3s steps(5, end) 0s forwards;}@keyframes smile { 100% { background-position-y: -667px; }}
运行效果一样,而且写法更简洁。
应用场景
CSS 帧动画可以用于实现复杂点的动画效果,动画效果更细腻,并且设计师有更多自由的发挥空间,甚至可以定义到每一个时间刻度上的展现内容。可以应用于页面的 Loading、小人物及小物体元素的简单动画。具有以下优点:
1. 可以自由控制播放、暂停和停止
2. 可以控制播放次数,播放速度
3. 可以添加交互,在播放完成后添加事件
4. 浏览器兼容性好
注意事项
素材:帧动画素材图片宽高最好是偶数,合成雪碧图的素材数量最好是偶数,帧数最好是偶数,图片拼接处最好有一定的留白。
适配:移动端适配不推荐使用 rem,因为 rem 的计算会造成小数四舍五入,造成一定的抖动效果,建议直接用 px 作为单位,同时辅助以scale(zoom)媒体查询进行适配。如果使用 rem 适配,试试使用 transform 的方案,抖动问题可以得到优化解决。
关于上述提及的 rem 布局导致帧与帧之间的盈亏互补现象导致动画抖动,若想要深入了解,推荐阅读凹凸实验室的《CSS技巧:逐帧动画抖动解决方案》。
PS:使用 will-change 可以在元素属性真正发生变化之前提前做好对应准备。
总结
CSS 帧动画技术对于一些复杂的动画有了新的答案,甚至你的一些天马星空的想法,在它面前可能就变得轻而易举。
总的来说一句话,真香!!!
参考
张鑫旭
掘金-小玛丽在隔壁
掘金-迅雷前端
凹凸实验室-燕婷
炒粉不加蛋,香味少一半
css图片滑动切换图_CSS帧动画相关推荐
- html5中Canvas、绘制线条模糊、常见绘制工具、绘制基本图形、绘制图片、面向对象的方式绘制图形图片、绘制文本、帧动画绘制
Canvas容器: canvas标签用来定义图像的容器,必须配合脚本来绘制图像,canvas也运用于游戏开发.注意:canvas绘制图时会出现线条模糊情况,这是因为显示屏像素和canvas中定义的一个 ...
- android实现滑动切换图,Android:使用ViewPager实现左右滑动切换图片加点点
图片发自简书App 1.引入android-support-v4.jar包,在主布局里加入 < ?xml version="1.0" encoding="utf-8 ...
- 原生css页面滑动到指定位置开始动画_html/css 滚动到元素位置,显示加载动画
每次滚动到元素时,都显示加载动画,如何添加? 元素添加初始参数 以上图中的动画为例,添加俩个左右容器,将内容放置在容器内部. 添加初始数据,默认透明度0.左右分别移动100px.//左侧容器 .ite ...
- php图片滑动的属性,使用css怎么实现图片的滑动效果?(示例)
本篇文章主要给大家介绍关于css实现图片的滑动效果示例,希望大家阅读完本篇后对css滑动效果的相关知识有所了解. 下面给大家举一个简单的css图片滑动效果示例(自下而上滑动): css怎么实现图片滑动 ...
- css逐帧动画图片太大怎么办,不建议使用 CSS3 keyframe transform 实现逐帧动画
© Young 2018-12-26 21:43 Welcome to My GitHub 一般在使用 CSS3 keyframe transform 实现逐帧动画时,往往会先把逐帧动画图片合成精灵图 ...
- [练习]利用CSS steps 实现逐帧动画
网页逐帧动画的实现方式 网页中的逐帧动画,大致可分为两大类的实现方式, 分别是使用JS控制,和单纯使用CSS实现,两者的优劣总体概括来说就是: JS动画可控性更强,但开销大,实现复杂. CSS动画实现 ...
- python做flash帧动画_[练习]利用CSS steps 实现逐帧动画
网页逐帧动画的实现方式 网页中的逐帧动画,大致可分为两大类的实现方式, 分别是使用JS控制,和单纯使用CSS实现,两者的优劣总体概括来说就是: JS动画可控性更强,但开销大,实现复杂. CSS动画实现 ...
- css animation 平移,CSS动画相关(打字动画、逐帧动画、环形路径平移)
一. 逐帧动画 很多时候,我们需要一个很难只通过CSS属性来实现的动画,比如一个复杂的进度提示框,在这样场景下基于图片的逐帧动画才是王道. 看到动画,你可能会想:[直接用GIF不就得了嘛,搞这么复杂的 ...
- android 喇叭帧动画,CSS动画效果——语音播放小喇叭
写业务代码经常会碰到要自己实现一些设计交给的小动画,今天我们就来看下小喇叭那种类似倒过来的wifi图标一样的效果: 语音播放效果 对于这个有几种实现方案:一种是直接把图标.png文件放在下面,然后再在 ...
最新文章
- 基础学习总结(四)--SQLite
- I.MX6 修改调试串口号(ttymx0 - ttymxc2)
- cocos2d-x中几种存储数据的方式
- Spring Cloud 微服务入门(二)--Spring Cloud 架构
- 【机器学习】这次终于彻底理解了奇异值分解(SVD)原理及应用
- CISCN2020初赛_Web
- Spring框架集成mybatis框架的配置(笔记)
- java不带package和带package的编译方式
- android中prop配置参数名,【01-19 技术】安卓系统优化Build.prop 系统参数属性详解...
- AIL(Android init Language)
- node封装一个图片拼接插件
- 函数连续、可导、可微、连续可微
- 为什么很多人不喜欢甚至排斥用中文编程?
- APP安全测试点分析
- hihoCoder 1039:字符消除(字符串处理)
- 事业单位采购计算机的申请报告,事业单位采购申请报告
- 平阳县抖音平台直播运营主播带货第三期培训提升班开班啦!
- 微信小程序车牌组件代码
- sqlServer服务器名称
- shellmad-18_C++新特性 智能指针的简易实现及添加模板