前几天我在看一个广告,他们让一些字母飞入黑色屏幕,然后揭示下面的图像。 这是一个非常酷的效果,它让我想起了 WebKit 的酷炫 -webkit-background-clip
属性,它允许你通过文本显示背景。 所以,我开始尝试看看是否可以做类似的事情。 你可以,但有一些有趣的问题......
这是最终产品
这只会出现在 WebKit 浏览器中(Safari、Mobile Safari、Chrome)。 下载的文件将不会包含 fancy 字体(见下文)。
剔除基础知识
没什么特别的
.display-sweet-image-behind {
/* fallback color */
color: white;
/* overrides color with nothingness */
-webkit-text-fill-color: transparent;
/* remember non WebKit browsers will see all of this EXCEPT the text */
background: url(images/zombies-making-out.jpg) no-repeat;
/* the magic */
-webkit-background-clip: text;
font: bold 100px Impact, Sans-Serif;
}
<div class="display-sweet-image-behind">Nom nom nom</div>
移动字母
事实证明,如果你将字母包裹在 span 中,就像这样,这太酷了
<div class="display-sweet-image-behind">
<span>N</span>
<span>o</span>
<span>m</span>
nom nom
</div>
字母仍然会被剔除,一切正常。 它不仅仅是 span,而是你将它们包裹在一个内联级元素中。 如果你使用 inline-block
或 block
或任何其他元素,剔除功能将停止工作。 =(
所以,由于 span 有效,你可能会认为我们可以使用相对定位来移动它们。 太棒了!
.display-sweet-image-behind span {
position: relative;
}
.display-sweet-image-behind span:nth-child(1) {
top: -20px;
left: -20px;
}
上面的代码会将第一个字母向上和向左移动。 但是不行!失败!定位方面的某些问题导致剔除失败。 双重 =( =(
作为测试,我尝试在这些 span 上使用 margin,这是允许的,所以,感谢上帝,这将用于有趣的动画时间。 虽然,因为这些是内联元素,我们只能获得左右 margin,上下 margin 没有效果。
.display-sweet-image-behind span:nth-child(1) {
margin-left: -100px; /* remember this will yank all the letters over this far */
}
Lettering.js
所以,你需要手动将每个字母都包裹在 span 中吗? 不,那是在浪费时间。 Lettering.js 是一个 jQuery 插件,它正是这么做的。 真的。 你在元素集上调用它,它将用一个引用其位置的类名将每个字母都包裹在 span 中。
$(".display-sweet-image-behind").lettering();
超级简单,超级酷。 我应该早点想到的。
动画
这里的最终目标是让字母自己动画到正确位置。 所以,以下是最终示例的标记
<div id="poster">
<h1>Red Sonja</h1>
<p>Coming 2011</p>
</div>
我们将使用 Lettering.js 将所有字母都包裹在 span 中,只需一行 JavaScript 代码
$("#poster h1, #poster p").lettering();
对于剔除字母,我们将赋予它们一个过渡效果,这样,它们任何发生变化的属性都会进行动画处理。 只有 WebKit 浏览器会进行剔除,但我们也可以让字母的行为保持一致。
#poster h1 span {
-webkit-transition: all 2.5s;
-moz-transition: all 2.5s;
-o-transition: all 2.5s;
}
Lettering.js 应用的类名为 char1
、char2
等。 所以,我们将使用这些类来应用较大的 margin,并将字母踢出页面。
#poster h1 span.char1 { margin-left: -1450px; }
#poster h1 span.char2 { margin-left: 200px; }
#poster h1 span.char3 { margin-left: 200px; }
#poster h1 span.char5 { margin-left: 1450px; }
#poster h1 span.char6 { margin-left: 200px; }
#poster h1 span.char7 { margin-left: 200px; }
#poster h1 span.char8 { margin-left: 200px; }
#poster h1 span.char9 { margin-left: 200px; }
我们将让动画在短时间延迟后开始。 这将让 Lettering.js 有机会完成它的工作,并让 fancy 字体加载。 此外,这是一种“体验”效果,等待一秒钟只会让它更有悬念。
我们将做的是等待一秒钟,然后向 html
元素应用一个类名。
setTimeout(function() {$('html').addClass("step-one");}, 1000);
我们将使用该类名来覆盖我们设置的所有 margin,将它们重置为零,并将字母恢复到自然位置。
.step-one #poster h1 span { margin: 0; }
演示中的其他字母也使用 Lettering.js span,并通过 CSS 过渡和延迟应用的类名来完成它们的动画,只是它们不是剔除。 因为它们不是剔除(只是白色文本),所以我们**可以**使用 position: relative
。
让我们随机设置它们的 position,然后让动画的“第二步”在几秒钟后发生,此时一个类名将把它们踢回到正确位置。
$("#poster p span").each(function() {
$(this).css({
top: -(Math.floor(Math.random()*1001)+1500),
left: Math.floor(Math.random()*1001)-500,
});
});
setTimeout(function() {$('html').addClass("step-two");}, 3000);
这次,我们必须使用 !important 规则,因为 jQuery 会使用内联样式来应用 CSS 值,而 !important 是用来覆盖它的。
.step-two #poster p span {
top: 0 !important;
left: 0 !important;
}
总结
如果你好奇,这里使用的字体是 Newcomen,可以在 Typekit 上获取。
尽管 margin 只能处理左右 margin,但我得到的上下动画是通过对父元素的顶部 padding 进行动画处理来实现的。 狡猾。
哦,我也不知道他们是否真的会重拍红索尼娅。 似乎是谣言。
真的很棒,对于正在建设中的登陆页面来说是一个很好的技巧。
哈哈哈,让我开心了一整天!
现在只需要一个“跳过动画”按钮。 ;) 说真的,这看起来真的很棒。
这个比较有趣,而不是酷。 它让我回到了 flash5 的时代。
我不知道在向客户展示类似东西后,他们的反应会是什么。 我想,他们可能会开怀大笑。
你会告诉你的客户
1) 这是纯语义 HTML。 这意味着它是搜索引擎友好的,并且对任何人来说都是可访问的。
2) 更新文本很容易,因为它实际上就是网页文本。
3) 更新背景图形很容易,因为它只是一个普通的 JPG。
4) 并不是每个浏览器都能获得相同的体验,但它的每个部分都有回退,所以对所有人来说都是不错的。
然后你和你客户就会开怀大笑,谈论它有多棒,以及网络在如此短的时间内取得了多大的进步。
哈哈,Chris,我非常喜欢你在这里的回答。
我在谈论性能和质量。 糟糕的帧率,文本作为蒙版,没有抗锯齿等等。 这是你不能用有效代码和语义 HTML 来销售的东西。
我认为,如果你的客户想要这样的动画,这将是一种完全有效的实现方法。 我个人更喜欢这种方法,而不是 flash。
你有没有考虑过使用转换来实现动画,而不是使用 setTimeOut 方法? 目前的动画在 iPad 上非常卡顿,但我相信 CSS 3D translate 过渡会很流畅......
抱歉 - 当然,你已经使用了过渡,我没有仔细阅读源代码。 但是,你没有使用 3D 过渡,所以你没有利用硬件加速,也许这就是卡顿的原因......?
这里没有 3D 效果...... 尽管我还没有深入研究 3D 转换。 如果你了解得更多,请随时扩展这个演示,并向我们展示任何酷炫的扩展思路。
在 iOS 上使用 3D 的目的是触发硬件加速的使用。 常规的 2D translate 转换不会利用加速,因此在 iOS 上非常慢。
我不确定是谁第一个发现的,但我从 Thomas Fuchs 那里学到了它,并且可以完全用我们自己的代码确认:http://mir.aculo.us/2010/06/04/making-an-ipad-html5-app-making-it-really-fast/
*请注意使用它,因为 Mobile Safari 对内存分配很敏感 - 6.5 MB 的限制仍然有效,但使用 3D 变换,您现在有了另一个内存分配限制,如果超过它,将强制浏览器硬崩溃。 仅仅重置图像源是不够的,您必须消除正在变换的 DOM 元素以清除内存。
您只需使用 -webkit-transform3d: translate(x,y,0) 而不是 -webkit-transform:translate(x,y) 来获得硬件加速(显然!)。
我一直想做一个测试页面来检查这在 iOS4+ 中是否相同。
所以我们可以通过这种方式做,然后创建无数的 hack 来解决所有无法正确渲染它的浏览器,或者我们可以只创建一个图像并在需要时更新图像。 大概就是这样吧?
所以您是在说动画 GIF 吗? 如果您能比我更快地创建新的动画 GIF,而且文件大小可以接受,当然您可以这样做。 否则,这种方法更灵活,文件尺寸更小。
另外,这与特定使用案例场景相比,更多的是关于可能性、学习和新技术。 任何特定的使用案例场景都需要根据它本身进行评估。
没错,动画 gif 或(喘不过气来)Flash。 由于您需要针对各种浏览器进行 hack 以使其正常工作,因此除了可能减小的文件大小外,我看不出使用您概述的方法有什么优势。
我非常乐意学习新技术,但是这似乎是一种奇怪的方法。
我们不妨直接寄出多媒体 CD 演示文稿,这样我们可以确保他们可以正确渲染 :)。
这种技术只适用于现代浏览器(Webkit + Firefox 4),所以如果这在生产中使用,您就不会为传统浏览器包含动画。 如果我们继续为能力最弱的浏览器编写代码,网络将保持多年不变 - 我们需要创新!
@Rich,您将创新的愿望与为尚未完全开发的技术开发 hack 和解决方法的需要混为一谈。 使用您的 CD 邮件示例,如果有人没有电脑,我也应该寄一份纸质副本。
真的很酷。 一个行动呼吁按钮或条目:为摄影师的登陆页面准备…谢谢。
看到所有这些相对“新的”网络技术(jquery、css3 等)汇聚在一起创造出像这样的一种体验,我感到很惊讶。 从六年前我开始学习 HTML 和 CSS 开始,网络技术的发展速度似乎呈指数级增长。 我几乎希望事情能慢一点,这样我就能赶上。
现在越来越难真正定义什么是网页设计师了。 它可以包含视觉设计、前端编码、用户体验等。 以前,网页设计师什么都做。 但是随着网络变得更加复杂,我们发现不同的人被分配到特定的角色。 随着 HTML5 和 CSS3 继续扩展,我想知道角色将被分解成多少才能解决创建网络所需的知识和时间增加。
animation
更适合这个。题外话,但值得关注:您可能需要检查一下主页上的脚本。 我在工作时使用的是 IE7,在那个浏览器上,整个主要内容部分无法显示,直到我滚动到 Latest Screencast。 IE 还抛出一个“页面错误”消息。 这是一个受限制的系统,我无法进入设置进行任何窥探,否则我可能可以告诉您更多。 这是一个每次加载站点都会发生的持续错误。 虽然我启用了 JS,但问题可能出在我的这边。 我只是想提醒您一下。
简单修复:在@工作时专注于工作,在@家里使用基于 WebKit 的浏览器享受乐趣 :)。
Amit,确实如此,但 Chris 正在失去使用 IE7 和 6 的观众(我在家里有 6 个用于测试,它在那个浏览器中也失败了)。 在 8 和(我猜)9 中工作。
Jquery 很不错,但您的示例在我的计算机上不是非常流畅。
谢谢
使用 Firefox,我指定了…
使用 Jquery 制作的效果不错。 为什么 Firefox 还不支持呢,它可以在 Safari 中正常工作。
它应该在 Firefox 4 中工作。
在 Safari 浏览器中运行良好。
太棒了,Chris,迫不及待想尝试一下 :)
谢谢 :)
我认为这太棒了。 风格化、轻量级,下载速度非常快。 我希望将来能看到更多这样的东西。
喜欢它! Chris,很棒的工作。
很棒的工作… 真是美妙的想法,它很容易地取代了 Flash… 我很乐意从你那里看到更多酷炫的东西。
Flash 将不复存在… 我想。