我养成了在闲暇时间创建 CSS 动画的习惯,灵感来自我在白天遇到的各种事物。为了用尽可能少的元素创建我设想的动画,我发现了一些技巧,让 CSS 做一些你可能不知道它能做的事情。 我想与大家分享这些技巧。
#1) 动画过程中跳转到另一个状态
CSS 动画让属性随着时间推移过渡到新值变得容易。 它们还有能力在几乎瞬间跳转属性到一个新值。 诀窍是使用两个关键帧,它们之间的差异非常小,大约 .001%
就很有效。
@keyframes toggleOpacity {
50% { opacity: 1; } /* Turn off */
50.001% { opacity: 0.4; }
/* Keep off state for a short period */
52.999% { opacity: 0.4; } /* Turn back on */
53% { opacity: 1; }
}
下面是一个极端的例子,它切换不透明度和文本阴影来模拟闪烁的广告牌灯光。
查看 CodePen 上 Zach Saucier (@Zeaklous) 的 No Vacancy 404 纯 CSS。
#2) 负动画延迟
正动画延迟是指动画等待一段时间才能开始。 负动画延迟是指动画立即开始,就好像已经过去了这段时间一样。 换句话说,在动画循环中更后面的状态开始动画。 这使得动画可以在多个元素中重复使用,因为唯一需要改变的是时间。
这是一个例子,每个圆圈在动画循环中不同的状态立即开始。
查看 CodePen 上 Zach Saucier (@Zeaklous) 的 圆圈蛇。
#3) 比例动画
我尽量让所有投入生产的东西都尽可能地响应式,包括我的动画。 我创建的所有动画都不可能都实现响应式,但有时可以,使用百分比和其他相对单位。
在我的许多动画中,我使用圆形和正方形之类的元素,它们需要比例宽度和高度。 你可能认为我需要使用固定宽度和高度值来保持这种比例,但事实并非如此! 我可以使用百分比宽度、零高度和百分比填充来创建它们。 底部填充是保持它与宽度成比例的诀窍,就像这样
.container {
position: relative;
display: block;
width: 100%;
height: 0;
padding-bottom: 100%;
}
你可以在下面的演示中看到它的实际效果,通过改变它所在的窗口大小。 演示还使用了负动画延迟。
查看 CodePen 上 Zach Saucier (@Zeaklous) 的 响应式 CSS 条形。
#4) 动画过程中更改 transform-origin
在制作我的一个动画时,我惊讶地发现,不仅可以 变换原点
在动画过程中改变,它也可以进行动画! 在下面的例子中,这使我们能够使用不同轴上的旋转来创建一个动画,而不是使用四个单独的动画。
查看 CodePen 上 Zach Saucier (@Zeaklous) 的 在动画过程中更改变换原点。
这个技巧的缺点是,你无法将 animation-mode: forwards;
应用到动画的一部分。 这意味着我们必须将元素重新定位到等效于其状态的位置,然后再应用 变换原点
的更改。 在上面的例子中,这是通过使用平移来模拟旋转的效果来实现的。 然而,这种技术在更复杂的例子中可能会变得很繁琐,就像这里所看到的。
#5) 负变换原点
你可以设置一个负的 transform-origin
,这对创建圆形运动路径很有用。 相比于使用一个元素来创建圆形动画,像 Lea Verou 所描述的那样,通过指定特定的平移和旋转值,我们只需使用负 transform-origin
值以及第二个元素或伪元素(如果我们希望元素旋转并沿圆形路径移动,则为一个元素)就可以更简单地实现。 通过使用不同的负变换原点值,我们可以对多个元素重复使用相同的动画,同时仍然保持每个元素的圆形运动。
查看 CodePen 上 Zach Saucier (@Zeaklous) 的 CSS 圆形运动技术。
#6) 盒阴影魔法
对于简单的无内容形状的动画,盒阴影
非常有用。 盒阴影属性可以 在元素周围创建多个边框。 结合一些位移,这个想法可以从没有额外的 HTML 元素中创建新的可动画的“元素”。 这使我们能够创建以下动画,它看起来像是六个圆形元素在圆周上旋转,但实际上是一个元素,带有一些偏移的盒阴影形状。
查看 CodePen 上 Zach Saucier (@Zeaklous) 的 单元素颜色加载器。
遗憾的是,百分比不受任何盒阴影属性的支持,因此它们不像原生 HTML 元素那样容易实现响应式。 然而,它们仍然可以在动画中手动更改,或者通过对它们所属的实际 HTML 元素使用 transform:scale(n)
来更改。
#7) 使用伪元素
与盒阴影类似,伪元素可以用来为单个元素的外观添加更多内容。 它们可以与它们的父元素拥有独立的动画、自己的盒阴影,并且与 HTML 标记中的子元素非常相似。 这使我们能够创建像下面这样的惊人的单元素创作。
查看 CodePen 上 Zach Saucier (@Zeaklous) 的 单元素 GIF 复制。
在例子中,中间闪烁的圆圈周围的所有大圆圈,以及边缘上的两个小圆圈(彼此相对),都是主元素的盒阴影。 另外两个小圆圈是伪元素的盒阴影的一部分,由短划线组成的圆环是一个作为另一个伪元素的背景应用的 SVG。
其他一些需要注意的事项
尽可能使用变换
变换比非变换的对应方法性能更好,正如 Paul Irish 所示(此外)。 主要意味着使用缩放和平移,而不是改变尺寸或顶部/左边的值。
变换也能实现更具响应性的设计,例如使用 `scale` 相对于原始大小进行缩放,正如 Amos 的这个动画 所示。
不使用变换可能会导致难以发现的问题。例如,在我的 这个动画 中,元素在 Chrome 中的颜色显示不正确,尽管值本身是正确的。在 切换到使用变换 后,我的所有问题都解决了。
z-index 可能导致问题
我可能在修复动画的 `z-index` 问题上花费的时间比其他任何问题都多。各个供应商对 z-index 的处理方式不同。在动画中,主要区别在于 Mozilla 不对 z-index 值进行动画处理,而是让元素从一个 z-index 跳到另一个 z-index,而 Webkit 等供应商则对 z-index 值进行动画处理。
需要注意的是,如果希望伪元素显示在父元素后面,则伪元素必须具有负 z-index,而父元素不能有除默认值以外的堆叠,这意味着不能应用 z-index 或任何其他将父元素从其自然堆叠上下文移除的东西。
关于 z-index 的最后一个技巧是与透明度相关的。当元素被赋予除默认值 "1" 以外的透明度时,它会获得自己的堆叠上下文。有关更多信息,请查看 Philip Walton 的文章
获得灵感
无论是现实世界中看到的、在线上找到的有趣的网页、视频介绍的一部分、gif 还是其他任何东西,找到你认为有可能创建的东西,然后尝试去创造!
我发现不看原始作者是如何创建的可以让我学习,以独特的风格进行创造,有时甚至以更高效的方式进行。即使最终没有达到最初的意图,我也总会对所使用的语言更加熟悉或了解更多。很多时候我会有东西可以展示,即使它没有达到我的最初期望那么宏伟。有时我会对自己的作品的出色程度感到完全惊讶,因为我根本没有想过要让它变得如此出色!
我希望这篇文章能帮助你构建更出色的作品,即使你没有从具体的技巧中学到任何东西!
哇... 很棒的东西...
很棒的东西,谢谢!我认为值得一提的是,伪元素动画在 桌面浏览器 中的支持非常薄弱,几乎不受移动浏览器的支持。干杯!
"桌面浏览器支持非常薄弱" 似乎有点夸张。
IE 从支持任何动画开始就一直支持伪元素动画(10+)。
Chrome 一年前就开始支持它,这基本上是永远,考虑到 Chrome 用户采用新版本的速度。
Firefox 从 2011 年初就开始支持它。
根据 Statcounter,使用 15 以下版本的 Opera 用户约为 0.5%。
主要是老 Safari 影响了桌面(和移动)版本,但这应该会改变,因为 Safari 6.1 已经发布了半年多了。
感谢你发布这篇酷炫的文章!所有这些都太棒了,有些东西很疯狂。但第一个闪烁的标志真的非常酷而且实用。
第三个比例动画也很赞。没有使用 JavaScript 太疯狂了。
迫不及待地想玩玩这些。
必须爱上 CSS3 动画!有点让我惊讶的是它没有被更多地使用。
太棒了... :D
所以... 我听到的是伪元素支持动画的 Gallifreyan...
看起来确实像这样,对吧?xD
哇... 使用 CSS3 的惊人动画...
绝对值得阅读和分享。我越来越喜欢这些客座文章了。太棒了,Chris。顺便说一下,Chris,为什么你的文章没有分享按钮?
太棒了!!!
这篇文章真是关于 CSS 动画的绝妙技巧。
我对你提到的第六个技巧 "CSS 魔术" 进行了练习。
链接在这里:http://jsbin.com/afEGeGAq/2/
哇!确实很酷!可能会为我的网站使用其中一两个,继续努力,伙计们... 感谢你们:)
哇... 扎克,太棒了。CSS3 是未来,毫无疑问!!
这些很棒。现在我请求你发布一篇后续文章,讲解如何为那些需要兼容 IE9 及以下版本的我们添加回退。
我猜使用 JavaScript 进行一些浏览器功能检测,然后要么用 js 进行动画处理,要么提供替代体验。但我非常想知道像 Chris 或 Zach 这样的人是如何实现的。
你描述的没有创建后续文章的主要原因是,JavaScript 实现这些东西更加直接。此外,这篇文章的目的是传播一些有用的 CSS 技巧的意识,并激发灵感。所有演示都不是为了在没有大量定制的情况下直接投入生产而设计的。
太棒了!!
哇!非常酷的东西。谢谢!
哇,太酷了... 我喜欢这些动画,但你能够对 box-shadow 形状进行动画处理对我来说是新的。这开辟了一系列动画机会。太棒了... 马上就要尝试一下。
不错的文章,我甚至不知道 CSS 可以创建如此广泛的不同的动画:)你几乎可以说 "天空才是极限"。
哇!这超出了我所见过的所有内容。
太棒了... 期待在 sass 中看到这种魔法。
这个页面在 iPhone 上经常崩溃(尝试过几个浏览器)。
干得好!
哇。很棒的文章!学习 CSS 动画对我来说最令人生畏的事情是,嗯,当浏览 codepen 时,通常会看到很多代码。我开始通过查看基本、摇摆的按钮和类似的东西来学习,但我不知道我是否会在自己的时间里学会这些技巧和窍门。
非常令人兴奋。动画是编写 CSS 最具游戏性的部分。我只是希望它们能附带成就。
干得好!第二个例子让我想起了我的 3D 笔:)http://codepen.io/haldunatar/pen/FDaot
不错!我fork了你的作品来创建一个我之前见过的幻觉,来看看吧!
哇!从来没意识到可以设置负延迟!
这在几个月前对我来说非常有用。
我有一个 30 秒的动画,我不得不一遍又一遍地观看它才能调整好!本可以直接跳到最后。
很高兴知道!
谢谢,扎克!
我喜欢!谢谢!
这些太棒了!
太酷了!
哇!这些太棒了!我最近在一个小的项目上尝试过动画,但这超出了我的想象。太酷了!感谢分享!
太棒了!建议:将动画更改为从
scale(.33)
(或您所用比例)到scale(1)
,而不是相反。这将防止它放大时出现模糊(您应该将其放到CodePen并发送给我链接,我很想分叉它并自己修改它
负动画延迟演示让我头疼。而且我喜欢它><
很棒的技巧!
我的天哪!太棒了!所有想要的CSS技巧!没有Javascript?!!!我喜欢这个!我可以复制代码吗…… :*
这很棒!不幸的是,animate css框架在IE<9中非常不稳定,而且令人遗憾的是,很多用户仍然使用IE。Javascript似乎仍然在JQuery中统治所有动画。
我想……如果我编写一个浏览器嗅探器,是否有办法将这些技巧只应用于兼容的浏览器,并为不支持的浏览器提供替代方案?
如果是这样,我愿意为我的一个客户这样做,他们坚持使用我实现的这个css技巧来实现一部超自然活动电影的开场效果
PA超自然协会
哇,多么漂亮的动画,它们是用纯css3制作的真是太神奇了
非常鼓舞人心的文章,绝对值得尝试。
谢谢。
将@keyframes和animation-fill-mode结合起来有很大的潜力。太可惜IE9不支持。我喜欢jQuery Transit (http://ricostacruz.com/jquery.transit/),它非常适合典型的动画。
真的很棒。感谢分享。
CS-tricks.com总是强迫我留在上面。干得好
ERROR 404很酷!
超级…我喜欢负动画延迟…它看起来像震动移动
很棒的东西,Zack…我爱上了这些动画,尤其是#7…伪元素…它看起来很不错…伟大的想象者,zach…