关于 CSS3 为我们带来的这些花哨的过渡和动画是否属于 CSS,存在一些争议。 可能会有人争论,像那样四处移动的东西是“行为”而不是“设计”,因此属于 JavaScript。 我不同意这种观点,并且动画绝对是“设计”,如果我们可以将这些内容保留在 CSS 中,我们应该这样做。 因此,我正在更新这个想法(参见上面的原始链接)以利用 CSS3 关键帧动画。

声明关键帧动画
这就是声明关键帧动画的方式。 我们将把动画命名为“STAR-MOVE”
@-webkit-keyframes STAR-MOVE {
from {
left: 0;
top: 0;
}
to {
left: -10000px;
top: -2000px;
}
}
@-webkit-keyframes STAR-MOVE {
from {
background-position: 5% 5%
}
to {
background-position: 1300% 600%
}
}
您不限于“from”和“to”,您可以根据百分比在其中插入更多内容。 比如40% { }当动画完成 40% 时,它将动画到这些属性/值。
我们的动画非常简单,我们将为 background-image 的位置制作动画,基本上将元素拉向左上角。 并非所有属性都能够制作动画,但通常任何具有数值的属性(包括颜色)都可以。 但是,例如,您无法将字体从 Helvetica 动画到 Georgia。
这些属性将覆盖为指定属性设置的任何先前设置。 因此,例如,由于 IE 不支持这些属性,您可能希望使用常规 CSS 设置属性,以在没有动画的情况下使设置合理。 然后知道这些属性将被动画的 from/0% 属性覆盖。
使用关键帧动画
我们有三个“层”的星星,每个层都覆盖整个屏幕,并使用重复的 alpha 透明背景图形星星层。 我们可以对所有三个 div 调用相同的动画,只是持续时间不同。
#background {
background: black url(../images/background.png) repeat 5% 5%;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
z-index: 100;
-webkit-animation-name: STAR-MOVE;
-webkit-animation-duration: 200s;
-webkit-animation-timing-function: linear;
-webkit-animation-iteration-count: infinite;
}
#midground {
background: url(../images/midground.png) repeat 20% 20%;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
z-index: 200;
-webkit-animation-name: STAR-MOVE;
-webkit-animation-duration: 150s;
-webkit-animation-timing-function: linear;
-webkit-animation-iteration-count: infinite;
}
#foreground {
background: url(../images/foreground.png) repeat 35% 35%;
position: absolute;
top: 0; left: 0; right: 0; bottom: 0;
z-index: 300;
-webkit-animation-name: STAR-MOVE;
-webkit-animation-duration: 100s;
-webkit-animation-timing-function: linear;
-webkit-animation-iteration-count: infinite;
}
较大的星星移动得更快(它们在错觉中“更近”,因此应该更快地移动)。 它们看起来移动得更快,因为动画的持续时间更短,因此它们需要在更短的时间内移动更远的距离。
动画使用“缓动”函数。 也就是说,将应用一个数学公式来控制动画“加速”和减速的速度。 没有缓动,动画可能会显得生硬和笨拙。 webkit 中的默认值为“ease”,它会慢慢使动画加速,然后慢慢减速。 在这个特定示例中,这没有意义,因为在最大的星星使用的 100 秒结束时,动画速度非常慢,以至于它背后的星星移动得更快(很奇怪)。 因此请注意,在上面的代码中,我们将缓动重置为“linear”。 有关完整列表,请 参见此处。
浏览器支持
目前只有 WebKit 浏览器(Safari、Mobile Safari、Chrome)。 我知道 Firefox 3.7 将支持过渡,但我不知道它是否会为关键帧动画使用自己的前缀。 如果你知道,请告诉我。
非常好的帖子! 谢谢! 非常有帮助
很酷的东西,我只是担心这可能会让我们走上一条我们以前走过的道路,我认为我们已经从中恢复过来了。 我说的是滚动字幕、闪烁的文字、现成的 js 动画脚本、无用的 flash 动画。 我想我们已经学会了如何负责任地使用这些动画,但根据过去的经验,我感到担心。
有人前几天发表了一条评论,我发现它很有趣并且很恰当,关于这些东西。
那么我们也应该关闭浏览器渲染图像的能力吗? 人们可以用图像做一些非常不合口味的事情。 也许人们对它们不够负责任,我们不应该允许它们。
好吧,不,但你不能否认你在这里展示的概念证明与 90 年代中期的 geocities 陈词滥调非常相似。
我很高兴你正在创建这些东西来向我们展示新技术能够做什么,但有时我不得不怀疑:为什么? :)
毫无疑问,在未来 1 到 5 年内,将出现一个巨大的复发,回到我们在 90 年代中期看到的网站。
我认为这是一个非常棒的概念证明。
@ Dom,虽然有些人可能会只是复制、粘贴,然后重温 90 年代,但我认为 Chris 这里做的是向我们展示可能性。 所以,看看这些星星,想象一下其他所有可以利用视差效果实现的事情。
不仅如此,它还展示了 CSS3 的强大功能。
这让我对未来充满期待。
正如 Dom 指出,它是“我们以前走过的道路,我认为我们已经从中恢复过来了”。 那里关键的部分是我们已经从中恢复过来了。 我们不应该仅仅因为有滥用的可能性而削弱我们未来的能力。 从技术上讲,如果我想的话,我仍然可以用表格布局和内联 CSS 样式来构建一个网站。 那么我们也应该抛弃它们吗? 当然不是,因为我们学会了将它们用于它们的设计目的,我们也会对 CSS3 的所有炫酷功能做同样的事情。
请记住,我们可以构建抽象层,每个层都包含同一语言的特性。 换句话说,也许 CSS3 确实包含一些特性,这些特性在某种程度上会踩到 Javascript 的脚趾。 又怎么样? 如果您的交互保持分离,就像我们的内容和样式在自己的层中一样,那么语言就无关紧要。 也许这是我的桌面应用程序背景在说话,但当你习惯于在使用一种语言(例如 C#)时在层中构建软件时,这些问题在心理上已经得到解决。
很棒的演示 :)
不太实用,但很酷。
哎呀。
该动画使 Google Chrome 渲染器始终保持 75% 的 CPU 使用率(OS X)。
在我的有点过时的 Windows 机器上,大约是 12%
我在 8 核 Mac Pro 上甚至看到了 80 年代。 但它像婴儿的屁股一样光滑,似乎没有减慢其他任何东西的速度。 我听说 webkit 动画是硬件加速的(不像 JavaScript 动画,它可能更密集并且缺乏硬件加速)。
更新:我认为我能够稍微提高动画的 CPU 效率。 我没有扩大区域的大小(基本上是更改 top 和 left 值所做的事情),而是只为背景位置制作动画。 从观察自己的活动监视器来看,它似乎有所改进。 如果有人想自己尝试这两种方法并告诉我,那将非常棒。 我不确定衡量这些东西的最佳方法。
在 Safari MacBookPro 中,一个核心占用率为 60%。 令人印象深刻的演示,但我不知道它是否值得 CPU 周期。 从成本角度(CPU 角度)来看,感觉有点沉重。
当我向下滚动时,我看到的只是内容的半透明窗格。 其余的背景是白色的。
我正在使用 Mac 上最新的 Safari。
在 Win 上的 Chrome 上也是如此
但并不难解决
我同意那些不同意这些动画的人(还有那个 3D 圆圈旋转的东西(jQuery)),这些很酷的效果当然很好,但它们消耗大量的 CPU。 我想知道动画在我的上网本上会是什么样子。
例如
#background {
background: black url(../images/background.png) repeat 5% 5%;
position: fixed;
...
}
好在这动画在 FF 上不起作用,否则它可能会卡得一塌糊涂。
别管它,你可以看到另一个动画从哪里开始。
好吧
每当我看到目前的 CSS3 动画时,我总是很惊讶,如此简单的 *2D* 动画会占用这么多 CPU 资源。
对不起,但我认为这种效果让我们回到了 90 年代,当时人们还没有弄清楚如何用 javascript 来改善而不是恶化事情...
使用 CSS 而不是 JavaScript 还有另一个重要的部分:硬件加速.
你不会在 JS 动画中得到这一点,因为 JS 动画实际上只是每毫秒改变 DOM,并迫使浏览器每次都重新绘制。
重要的是要注意,你也不会在操作盒子模型(margin、position、width)的 CSS 中得到它,而是在使用新的 CSS transform 属性时才会得到。
很棒的演示。
我不知道为什么每个人都如此害怕我们正在走上一条危险的道路。Flash、JS、CSS 和 HTML 都可以用来创造糟糕的用户体验。不过在大多数情况下,自眨眼文本和滚动字幕的时代以来,这个行业已经发展得相当迅速。
尽管如此,我们仍然需要向前推进,并随着新技术的出现而进行试验……这是我们理解它们并负责任地使用它们的唯一途径。
继续努力,克里斯!
我认为这种效果很俗气,它让我想起了我用 MS frontpage 制作的第一个网站。正因为如此,我非常喜欢它!
对于所有对它有负面评价的人,你们知道蜘蛛侠的爸爸说了什么:“能力越大,责任越大”。我认为 CSS 和 JS 为网页设计师提供了强大的力量!只是不要过度使用它。
克里斯……我认为这是你思维和编码细微差别的有趣探索。但是,对不起,这种效果有点让我感到平淡,我并没有看到它有什么用处——也许是因为我不得不偶然发现“调整浏览器大小”的“关键”,然后故意做一些我在网上冲浪时几乎从不做的事情。
现在,如果它在滚动时也能工作——那是我几乎总是必须做的事情——那么它将成为那些“微妙”的效果之一,会带来惊喜的增值。
我喜欢你“清理”过去帖子的强迫症。
你可以通过观察 body 上的滚动位置的变化,并根据它加上某种 delta 乘数来设置 background-position,从而实现滚动时的视差效果。这将非常酷。
我正在考虑在我的网站上使用这种技巧,但会使用更微妙的效果,这样它就不会那么明显/烦人。
动画不应该分散对内容的注意力。
演示页面上的“折叠”下方空白背景问题是否已修复?我在 Safari 4.0.5(Windows 7)上仍然看到它。
很棒的教程,但我注意到移动不够平滑,我该如何使其变得平滑?
嗨,克里斯,
你还好吗?
很棒的教程——我做了一个只是为了观看它运行!不过,我注意到一件事,当应用到一个页面时,该页面包含需要滚动才能看到的元素(即页面比屏幕高),背景图像不会在整个页面(el)上平铺——它们只覆盖了最初可以看见的部分。我弄不清楚为什么!我不能看到它是设置为“fixed”的,例如?无论如何,我已经搜索了常用的地方,仍然找不到答案。你能帮我吗?
顺便说一下,只是阅读上面的帖子/查询/咆哮,很难相信人们是多么保守!所有这些关于“回到未来”的抱怨!如果让这些家伙说了算,我们现在还只能听收音机,或者充其量是看黑白电视!随着人们出于更多不同的原因上网,他们(以及我)正在寻求比这些家伙过去一直推出的暗淡、静止和无声的页面更丰富和更优质的内容。清教徒的时代已经过去了——未来正在到来……
干杯。