上一篇文章总结了过渡和2D变化,这一篇来总结一下动画和3D变换,动画可用的场景也很多,比如在加载的页面的时候,可以放置一个gif图,也可以自定义小动画来缓解用户等待的焦虑感,比如以下三个小圆圈转圈圈的动画。

想要完成一个动画的效果,首先要知道定义的语法

使用animation来实现动画,@keyframes来定义元素的运动规律
(1) animation-name: 动画的名称,即@keyframes定义的动画名字(必写)
(2) animation-duration: 动画的执行时间,一个动画多久执行完成(必写)
(3) animation-timing-function: 动画的速度曲线,默认ease(逐渐变慢),还有这些选项
linear 匀速
ease-in 加速
ease-in-out 先加速后减速
ease-out 减速
(4) animation-delay: 动画执行的延迟时间,默认0s
(5) animation-iteration-count: 动画的执行次数,默认为1,还可以选 infinite代表无限次
(6) animation-direction: 规定动画在下一周期是否逆向播放,默认 normal 不逆向播放,还可以选alternate 逆向播放
比如一个盒子从左走到右,如果执行次数是1,执行完成盒子就会立刻从右边弹回到最左边,如果设置了alternate逆向播放,那么盒子就会按照设定的速度曲线经过动画再回到左边
(7) animation-fill-mode: 规定动画的结束状态,默认backwards 回到起始状态,还可以选 保持状态 forwards
设置了之后,animation-direction就不生效了
(8) animation-play-state: 设置动画的运行状态,默认 running 运行,还可以选 paused 停止
// 这么多的属性可以合并在一起写,并不是每一个都需要写,如果使用默认项,就可以省略,animation-play-state没有合并写法
animation: name duration timing-function delay iteration-count direction fill-mode

用一个简单的动画来展示一下以上的属性,同时区分 ease、ease-in、ease-in-out、ease-out的速度曲线有什么不同

以上动画所设定的animation属性如下

// 规定每个时间的位移
@keyframes move {
0%{
transform: translateX(0px)
} 100%{
transform: translateX(1000px);
}
} .box {
margin-top: 20px;
width: 100px;
height: 80px;
background-color: brown;
animation-name: move; // 动画名称
animation-duration: 6s; // 动画执行时间
animation-timing-function: ease; // 动画速度曲线,分别为ease、ease-in、ease-in-out、ease-out
animation-delay: 1s; // 动画延迟1s执行
animation-fill-mode: forwards; // 执行完成后保持状态
}

下面演示一下 animation-direction 、animation-fill-mode和animation-play-state该怎么使用。
第一个方块的animation-direction和animation-fill-mode都是默认的配置,normal不逆向播放,backwards回到起始位置,默认属性可以不用定义。
第二个方块展示了animation-derection: alternate 逆向播放,逆向播放需要配合播放的次数,animation-direction,如果按照默认只播放一次的话,就不会生效。
第三个方块展示了animation-fill-mode: forwards 动画结束后保持状态。
第四个方块展示了当鼠标滑过时让方块停止运动 animation-play-state: paused

了解完动画的各项配置属性之后,就可以根据2D或者3D的变化来做一些小动画了,上方三个小圈的加载动画用到的就是动画+2D变化,通过缩放盒子的大小来达到一个动的效果,实现代码如下

// html代码
<div class="parent">
<div class="circle"></div>
<div class="circle"></div>
<div class="circle"></div>
</div> // css代码
.parent {
width: 80px;
} .circle {
display: inline-block;
width: 20px;
height: 20px;
background-color: orange;
border-radius: 50%;
animation: move 1.4s ease-in-out 0s infinite both;
} .circle:nth-child(1){
animation-delay: -0.32s;
} .circle:nth-child(2){
animation-delay: -0.16s;
} @keyframes move {
0%, 80%, 100% {
transform: scale(0)
} 40% {
transform: scale(1)
}
}

animation-timing-function运动曲线还可以选 steps 步长,代表需要多少步能够完成动画,比如动画的执行时间是2s,定义步长 steps(10),就代表2s内10步完成变化,即每一步0.2s,步长的执行效果有点像老式打印机,一个字一个字打出内容,可参考下面这个效果。

那用步长可以做出什么样的效果呢,我们来看看下图,下图里奔跑的白熊是在页面中展示一张gif图吗?

其实它只是一张有不同形态白熊的图片,计算每一个白熊的宽高,通过控制步长,形成动画

实现代码如下
.bear {
position: absolute;
left: 0;
width: 200px;
height: 200px;
background: url(./media/bear.png) no-repeat;
animation: run 1s steps(8) 7s infinite, move 3s linear 7s forwards;
} @keyframes run {
100% {
background-position: -1600px 0;
}
} @keyframes move {
100% {
left: 50%;
transform: translate(-50%)
}
}

动画还可以和3d变换结合使用,3d变换就是在2d的基础上增加了一个轴,Z轴,表示从人眼到屏幕这段距离,如果不做其它设置,是看不出3d与2d变化区别的,那此时要借助一个属性 透视perspective,添加到父元素上面,透视表示人眼到屏幕的距离,距离越小,图像越大,距离越大,图像越小

transform中有位移的3d变换是translateZ,表示物体沿着Z轴方向的移动距离。移动为正值的话,此时物体在眼睛到屏幕之间,离屏幕越远即离眼睛越近,显示在屏幕的物体则越大,移动为负值则相当于到屏幕的背后去了,显示在屏幕的物体越小。如下图,d表示透视 perspective,z表示translateZ的大小

用一个图来展示加了3d变化和本身的元素大小比较,左边盒子的透视设置的是300px,perspective: 300px,不同的电脑显示屏幕显示的大小可能不太一样

translateZ一般会配合rotate一起做3d的变化,rotate可以分别沿着x轴/y轴/z轴做旋转,沿着x轴的旋转效果可以想象一下运动员沿着单杠做上下的翻转,沿着y轴旋转可以想象一个钢管舞者,沿着竖着的钢管运动,沿着z轴的旋转可以参考抽奖的大转盘,就是平面内的旋转,没有立体效果。

旋转方向的判断可以使用左手法则,左手掌心朝外握拳,大拇指指向x轴的正方向,手指弯曲方向就是当物体沿着x轴进行旋转时,旋转的正方形,判断物体沿着y轴进行旋转时,左手掌心朝外握拳,大拇指左手掌心朝外握拳,手指弯曲方向就是正方向。用自己的手来做个演示

旋转的方向比较多,各个方向之间旋转的效果可以参考下面的动画,分别展示了从x轴、y轴、z轴、以及x和y轴同时旋转是什么样,3d效果一定要给父元素添加透视 perspective!

总结一下3d位移和3d旋转的语法

// 父元素一定要定义 perspective
perspective: 500px // 位移
transform: translateZ(100px)
transform: translate3d(0,0,100px)
// 也可以定义x和y轴方向的移动,那就是2d平面内的移动,没有3d近大远小的效果 // 旋转
transform: rotateX(45deg)
transform: rotateY(45deg)
transform: rotateZ(45deg)
transform: rotate3d(1, 1, 0, deg) // x轴和y轴都旋转45度, 此时是找矢量, 及对角线位置

3d变换还有一个属性要注意,上面演示的旋转只作用于当前元素,如果父子元素都要进行3d的变换,如果不设置transform-style,父元素进行3d变换的时候,子元素的3d变换就会失效,就像下图一样

结合透视 perspective、transform-style 以及位移transform和旋转rotate,就可以做出一些动画效果了,下面是一个3d导航栏,定义多个导航时,可以选中导航进行一个向上翻转的效果

实现代码如下

// html代码
<div class="box">
<div class="top">hello</div>
<div class="bottom">world</div>
</div> // css代码
body {
perspective: 500px;
} .box {
position: relative;
margin: 100px auto;
width: 100px;
height: 40px;
transform-style: preserve-3d;
transition: transform 1s;
} .box:hover {
transform: rotateX(90deg)
} .box div {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
text-align: center;
color: #fff;
line-height: 40px;
background-color: rosybrown;
} .box .bottom {
transform: translateY(20px) rotateX(-90deg)
} .box .top {
background-color: sandybrown;
transform: translateZ(20px)
}

结合位移和旋转,可以实现如下图的旋转木马效果,当鼠标移入某个图片时,旋转木马暂停旋转

实现代码如下

// html代码 

<section>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</section> // css代码
body {
/* 设置透视的距离 */
perspective: 1400px;
} section {
position: relative;
width: 300px;
height: 200px;
margin: 100px auto;
background: url(./media/pig.jpg) no-repeat;
transform-style: preserve-3d;
animation: rotateDog 10s linear infinite;
} section:hover {
/* 当鼠标滑过 动画状态为paused停止 */
animation-play-state: paused;
} section div {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
background: url(./media/dog.jpg) no-repeat;
} @keyframes rotateDog {
0% {
transform: rotateY(0);
} 100%{
transform: rotateY(360deg);
}
} section div:nth-child(1){
transform: translateZ(300px)
} section div:nth-child(2){
transform: rotateY(60deg) translateZ(300px)
} section div:nth-child(3){
transform: rotateY(120deg) translateZ(300px)
} section div:nth-child(4){
transform: rotateY(180deg) translateZ(300px)
} section div:nth-child(5){
transform: rotateY(240deg) translateZ(300px)
} section div:nth-child(6){
transform: rotateY(300deg) translateZ(300px)
}

以上就是动画和3d变换的结合使用,使用过渡、动画、2d/3d变换能提供更好的用户体验。

好用的css3特性-动画和3d变换的更多相关文章

  1. CSS3 03. 3D变换、坐标系、透视perspective、transformZ、transform-style添加3D效果、backface-visibility元素背面可见、动画animation、@keyfarmes、多列布局

    1.左手坐标系 伸出左手,让拇指和食指成“L”形,大拇指向右,食指向上,中指指向前方.这样我们就建立了一个左手坐标系,拇指.食指和中指分别代表X.Y.Z轴的正方向.如下图 CSS中的3D坐标系 CSS ...

  2. css3 3D变换和动画

    3D变换和动画 建立3D空间,transform-style: preserve-3d perspective: 100px; 景深 perspective-origin:center center ...

  3. 8款超酷而实用的CSS3按钮动画

    1.CSS3分享按钮动画特效 这是一款基于CSS3的社会化分享按钮,按钮非常简单,提供了分享到twitter.facebook.youtube等大型社交网站.每一个分享按钮都有个大社交网站的Logo图 ...

  4. 现在就能投入使用的12个高端大气上档次的CSS3特性

    原文:http://tutorialzine.com/2013/10/12-awesome-css3-features-you-can-finally-use/ 原文中有demo展示及下载. 翻译开始 ...

  5. 三分钟学会用 js + css3 打造酷炫3D相册

    之前发过该文,后来不知怎么回事不见了,现在重新发一下. 中秋主题的3D旋转相册 如图,这是通过Javascript和css3来实现的.整个案例只有不到80行代码,我希望通过这个案例,让正处于迷茫期的j ...

  6. CSS3基础03(3D②) 求粉丝

    3 D (3.1)rotateY 围绕着Y轴进行旋转 (1)正数是(站在右边推),负数是(站在左边推) (2.1)定义元素背过去是否可见 backface-visibility: visible|hi ...

  7. css3 animation动画特效插件的巧用

    这一个是css3  animation动画特效在线演示的网站 https://daneden.github.io/animate.css/ 下载 animate.css文件,文件的代码很多,不过要明白 ...

  8. GJM :JS + CSS3 打造炫酷3D相册 [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  9. CSS3之3D变换实例详解

    CSS3的3D效果很赞,本文实现简单的两种3D翻转效果.首先看效果和源代码,文末是文绉绉的总结部分^_^ 以下CSS代码为了简洁没有添加前缀,请视情况自行添加(自动化时代推荐使用其他的一些方法,如gu ...

  10. HTML5/jQuery动画应用 3D视觉效果

    今天我们要来分享几款很酷的HTML5/CSS3动画应用,虽然不是HTML5 3D应用,但也有3D的视觉效果.HTML5结合jQuery,让网页应用变得更加强大了.一起来看看这些HTML5/jQuery ...

随机推荐

  1. AspNetCoreRateLimit应用于MVC项目求助

    AspNetCoreRateLimit应用于MVC项目求助 前言 之前发过一篇文章: .NET Core WebApi接口ip限流实践 - 妙妙屋(zy) - 博客园 (cnblogs.com) 然后 ...

  2. Apache DolphinScheduler 开源之夏学生项目申请开启,6 大课题等你来拿万元奖金!

    开源之夏 2023 学生报名已经正式开启!Apache DolphinScheduler 今年继续参与开源之夏的活动,2023 年 4 月 29 日-6 月 3 日 15:00 UTC+8,同学们可以 ...

  3. 2023-05-01:给你一个整数 n , 请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字。 1 <= n <=

    2023-05-01:给你一个整数 n , 请你在无限的整数序列 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...] 中找出并返回第 n 位上的数字. 1 <= n ...

  4. 2020-11-23:go中,s是一个字符串,s[0]代表什么?是否等于固定字节数?

    福个答案2020-11-23:Golang 的字符串(string)是合法的 UTF-8 序列,这就涉及到了两种不同的遍历方式,一种是按照 Unicode 的 codepoint 遍历,另一种是把 s ...

  5. SQL Server:User, group, or role 'iemis' already exists in the current database.

    --最新的解决方法 --先创建用户帐户,不进行授权,然后通过下面的SQL语句将该用户帐户关联至对应的数据库用户.优点是避免了重新授权的操作. USE tempdbEXEC sp_change_user ...

  6. shader编程基础:画线

    以sin曲线为例,任何函数曲线画法类似. 画线原理虽然十分简单,却是复杂图形曲线绘制的基础. uv和smoothstep等函数不清楚请参考跳转链接: shader编程基础:画圆 #define T . ...

  7. Node.js卸载与重装

    卸载第一步:打开系统自带的卸载功能,找到node js 进行卸载第二步:删除C:\Users\Administrator\AppData\Roaming文件下的npm.npm-cache或者如果是zi ...

  8. RoCE多网卡时,报文可以过去,但是回不来

    摘要:虽然网卡是接入RoCE网络,但其实问题本身是单纯路由相关的,所以看的时候,不用关注RoCE,只当做一个独立子网就行了 本文分享自华为云社区<<跟唐老师学习云网络> - RoCE ...

  9. 代码随想录算法训练营Day18 二叉树

    代码随想录算法训练营 代码随想录算法训练营Day18 二叉树| 513.找树左下角的值 112. 路径总和 113.路径总和ii 106.从中序与后序遍历序列构造二叉树 105.从前序与中序遍历序列构 ...

  10. 【最佳实践】如何设计 RESTful API ?

    良好的 API 设计是一个经常被提及的话题,特别是对于那些试图完善其 API 策略的团队来说.一个设计良好的 API 的好处包括:改进开发者体验.更快速地编写文档以及更高效地推广你的 API.但是,到 ...