start_time: 2024-04-20 11:42:15 +0800

CSS 动画(transition和animation)

96
kim_jin
IP属地: 上海
2018.10.29 10:23 字数 1674

CSS Transition

基本的用法
动画的概念主要的引入是在CSS3中进行引入的,在CSS3引入transition之前,CSS是没有时间轴的,也就是说所有的变化都是在一瞬间完成的,也就是即使完成的。不会有从某一个状态慢慢转化成另外一个状态的过程,都是在一瞬间就完成,但是我们在transition这个引入之后,就可以在网站上显示一个实现的过程。

img{
    height:15px;
    width:15px;
}
img:hover{
    height: 450px;
    width: 450px;
}

在这样的一个例子中,我们会在一瞬间就实现img大小的变化,我们如果想要实现动态的效果,但是我们可以通过设置transition来指定变化所需要的时间。我们也可以设置高度来指定,动画的效果仅仅在高度上面发生,但是其他的属性,如宽度,依旧是突然发生。

img{
  transition: 1s;
  transition: 1s heigth;
}

transition-delay
我们在上面的例子里面发现我们可以在transition里面分别指定多个属性。但是这样的话就会导致宽度和高度的变化是一样的,这样就和不指定他们没有什么区别。

img{
    transition: 1s height, 1s width;
}

如果我们希望看到一个非常明显的动画效果,让height先发生变化,结束之后,再让width发生变化,这样做就很容易,就是给width指定一个delay参数

img{
  transition: 1s height,1s 1s width
}

上面的代码指定,在width在1s之后,再开始变化。也就是延迟了1s的时间。delay的真正意义在于,它指定了动画发生的顺序,可以将多个不同的transition可以连接在一起,形成复杂的效果。

transition-timing-function
transition的状态变化速度(timing function)默认并不是匀速的,而是逐渐放慢的,叫做:ease

img{
    transition: 1s ease;
}

除了ease之外还有其他的几种模式:

  • linear:匀速模式
  • ease-in:加速模式
  • ease-out:减速
  • cubi-bezier函数:自定义的速度模式

transition的各项属性
transition的完整写法

img{
  transition: 1s 1s height ease;
}

这个是最简单的写法,我们还可以单独的定义各个属性。

img{
  transition-prototype:height;
  transition-duration:1s;
  transition-delay:1s;
  transition-timing-function: ease;
}

transition注意事项:
(1)transition的兼容性已经做的很好,不需要再前面添加浏览器的前缀
(2)transition需要明确的指挥刀,开始状态和结束状态的具体数值,这样才能计算出中间的状态,比如上面的例子我们的宽度从15px到达450px。在这个过程中transition可以为我们计算,但是我们不能计算出0auto的中间状态,也就是说一旦我们将开始或是最终状态设置为auto的话我们就不能产生动画效果,类似的情况举个例子:display:noneblock等等。

transition的局限
transition的优点在于简单易用,那么是不是可以完全的取代js渲染出来的动画吗?事实证明我们现在的transition属性还存在很大的局限性:
(1)transition需要事件触发,所以没有办法在网页加载的时候自动的发生。
(2)transition是一次性的,不能重复大声的,除非是一而再在文山的被触发。
(3)transition只能定义开始状态和最终转台,没有中间状态,也就是说,只能拥有2个状态。
(4)一条transition规则,只能定义一个属性的变化,不能涉及多个属性。

CSS Animation

CSS Animation需要制定动画一个周期持续的时间,以及动画的名称

div :hover{
  animation: 1s rainbow;
}

也就是说上面的代码的意思是在鼠标悬停在div元素上面的时候,会产生一个名为rainbow的动画效果,而且持续时间为1s,现在我们需要使用keyframes关键字来定义rainbow的效果:

@keyframes rainbow {
  0% { background: #c00; }
  50% { background: orange; }
  100% { background: yellowgreen; }
}

其中的0%、50%、100%指的是时间轴上面的时间时刻,如果有需要的话完全可以插入更多的状态。

/*infinite的意思是可以无限次的播放*/
div:hover {
  animation: 1s rainbow infinite;
}
/*3的意思是可以播放3次*/
div:hover {
  animation: 1s rainbow 3;
}

animation-fill-mode
动画结束之后,我们会立即从结束状态跳回到开始状态。如果想要动画保持结束的状态,我们需要使用animation-fill-mode属性。

div:hover {
  animation: 1s rainbow forwards;
}

当然animation-fill-mode还可以使用下列值

  • none:默认值,回到动画没开始时的状态。
  • backwards:让动画回到第一帧的状态
  • both:根据animation-direction轮流应用forwards和backwards规则。

animation-direction
我们在进行动画循环播放的时候,每一次都从结束状态跳到起始状态,在开始循环的播放。animation-direction属性,可以改变这种行为。
来说明人如何使用animation-direction这个属性,假定一个动画是这样定义的。

@keyframes rainbow {
  0% { background-color: yellow; }
  100% { background: blue; }
}

默认情况是animation-direction等于normal

div:hover{
  animation:1s rainbow 3 normal;
}

animation-direction指定了动画播放的方向,最常用的值是normalreverse。效果如下图:

animation-direction

animation的各项属性
transition一样都有简写,animation也是一个简写的格式。

div:hover {
  animation: 1s 1s rainbow linear 3 forwards normal;
}

现在先写一个简写的形式,可以划分为各个单独的属性。

div:hover {
  animation-name: rainbow;
  animation-duration: 1s;
  animation-timing-function: linear;
  animation-delay: 1s;
    animation-fill-mode:forwards;
  animation-direction: normal;
  animation-iteration-count: 3;
}

keyframes的写法
keyframes关键字用来定义动画的各个状态,写法非常的自由。

@keyframes rainbow {
  0% { background: #c00 }
  50% { background: orange }
  100% { background: yellowgreen }
}

我们制定的是开始状态的标识是0%,结束状态是100%,中间状态是50%。但是我们也可以使用from来代表0%,100%可以通过to来代表,因此上面的代码等价于下面的形式。

@keyframes rainbow {
  from { background: #c00 }
  50% { background: orange }
  to { background: yellowgreen }
}

如果省略中间的某个状态,浏览器会自动的推算中间的状态,所以下面的都是一些合格的写法。

@keyframes rainbow {
  50% { background: orange }
  to { background: yellowgreen }
}

@keyframes rainbow {
  to { background: yellowgreen }
}

也可以将多个状态写在一行

@keyframes pound {
  from,to { transform: none; }
  50% { transform: scale(1.2); }
}

我们一般实现一个状态向另外一个状态过度,一般是平滑过度的,但是steps函数可以实现分步过渡。

animation-play-state
有的时候,动画的播放过程中,会突然停止,然后,对于动画的默认状态是跳回到动画的开始状态。如果我们希望动画可以保持停在终止状态,就要使用animation-play-state属性。

div {
    animation: spin 1s linear infinite;
    animation-play-state: paused;
}

div:hover {
  animation-play-state: running;
}

当前现状
现在IE10、火狐浏览器支持不带浏览器前缀的animations,但是chrome是不支持的,所以必须使用webkit前缀。

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