这就是我们要构建的
它的完整效果(包括过渡动画)将在较新的 WebKit 和 Opera 浏览器以及 Firefox 4 中工作(截至今天,在 真正的 Beta 版 中)。 任何其他浏览器都会旋转块,但没有过渡动画。
有趣的部分
所有动画都是 CSS3 过渡。 JavaScript 仅观察点击并根据需要应用和删除类。 为什么不也使用 JavaScript 进行动画以获得更广泛的浏览器支持? CSS3 更适合这种情况。 动画效果更好(硬件加速)。 它不会减慢其他 JavaScript。 将动画保存在 CSS 中也更容易编写。 使用 JavaScript,我们无法轻松地 *将动画应用到类*。
随着时间的推移,越来越多的动画将从 JavaScript 库转移到 CSS。
HTML
我们将给自己一个语义包装器,它也为所有块提供相对定位上下文。 块使用绝对定位进行定位,最终通过更改其顶部/左侧值来进行动画,因此该相对上下文非常重要。 每个块都有一个带有唯一 ID 的 div 包装器,以及一个指示其当前状态的类名。 有三个不言自明的状态类,从显而易见的 active
开始,它是当前处于完全可见的左端状态的块。
每个块都有一个仅在非活动状态下可见的副标题,以及另一个包含在块处于活动状态时要显示的所有内容的 div 包装器。 副标题的想法提供了提供某种简短预告片并吸引点击的机会。
<div id="rotator">
<div id="block-1" class="active">
<h2>Subtitle #1</h1>
<div>
<h1>Seven Space Frogs Descend On Canada's Largest City</h1>
<img src="spacefrog.jpg" alt="space frog">
<p>Commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>
</div>
</div>
<div id="block-2" class="non-active-top">
<h2>Subtitle #2</h2>
<div>
<h1>The Power of the Voodoo. Who do? You do.</h1>
<img src="goblins.jpg" alt="goblins">
<p>Ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>
</div>
</div>
<div id="block-3" class="non-active-bottom">
<h2>Subtitle #3</h2>
<div>
<h1>You May Find Yourself Living in a Shotgun Shack</h1>
<p>Vestibulum tortor quam, feugiat vitae, ultricies eget, tempor sit amet, ante. Donec eu libero sit amet quam egestas semper. Aenean ultricies mi vitae est. Mauris placerat eleifend leo. Quisque sit amet est et sapien ullamcorper pharetra. Vestibulum erat wisi, condimentum sed, commodo vitae, ornare sit amet, wisi. Aenean fermentum, elit eget tincidunt condimentum, eros ipsum rutrum orci, sagittis tempus lacus enim ac dui. Donec non enim in turpis pulvinar facilisis. Ut felis. Praesent dapibus, neque id cursus faucibus, tortor neque egestas augue, eu vulputate magna eros eu erat. Aliquam erat volutpat. Nam dui mi, tincidunt quis, accumsan porttitor, facilisis luctus, metus</p>
</div>
</div>
</div>
CSS
设置包装器和上下文
#rotator { width: 920px; height: 280px; position: relative; background: white; padding: 20px; }
对任何块的唯一样式可以通过 ID 完成
#block-1 { background: #d5fcff; }
#block-2 { background: #e1ffd5; }
#block-3 { background: #ffffd8; }
每个块共享一些属性,因为溢出是隐藏的,它们是绝对定位的,并且将以相同的速度进行动画
#rotator > div {
position: absolute;
overflow: hidden;
-webkit-transition: all 0.5s ease;
-moz-transition: all 0.5s ease;
-o-transition: all 0.5s ease;
}
框的三个状态决定了它们的大小和位置
#rotator .active { top: 20px; left: 20px; width: 580px; height: 280px; }
#rotator .non-active-top { top: 20px; left: 620px; height: 130px; width: 320px; }
#rotator .non-active-bottom { top: 170px; left: 620px; height: 130px; width: 320px; }
副标题(h2)最终与框大小相同,方法是将其行高设置为与框高度相同。 由于溢出是隐藏的,这会将所有其他内容推开并隐藏。 然后,当框处于活动状态时,我们隐藏副标题,所有其他内容自然地显示出来。
#rotator h2 {
text-align: center;
line-height: 130px;
}
#rotator .active h2 {
display: none;
}
jQuery
我们创建了一个 rotate
函数,该函数根据 current
值将正确的类应用于正确的块。 可能有一种更干净的方法可以做到这一点,并且扩展性更好……
function rotate() {
if (current == 1) {
$("#block-1").removeClass().addClass("active");
$("#block-2").removeClass().addClass("non-active-top");
$("#block-3").removeClass().addClass("non-active-bottom");
} else if (current == 2) {
$("#block-1").removeClass().addClass("non-active-bottom");
$("#block-2").removeClass().addClass("active");
$("#block-3").removeClass().addClass("non-active-top");
} else {
$("#block-1").removeClass().addClass("non-active-top");
$("#block-2").removeClass().addClass("non-active-bottom");
$("#block-3").removeClass().addClass("active");
}
}
然后,我们为每个块附加一个点击处理程序。 当它们被点击时,我们通过其 ID 确定它是哪个,将当前值设置为该值,并调用 rotate 函数。
$("#rotator div").click(function() {
current = this.id.substr(6);
rotate();
});
感谢 Andrea Canton 提供的关于检查哪个块被点击的想法,这使块能够双向旋转,这更令人满意。
现在全部放在一起
因此,您点击一个块,该块的类会被调整。 新的类具有不同的尺寸和位置值。 由于块应用了过渡 CSS,因此这些新的尺寸和位置值会进行动画。 简单易懂。
*jQuery UI 能够通过扩展 jQuery 的 addClass 将动画应用到类。 但是,在这种情况下它不够好,因为我们需要先删除之前的类(将其移回默认位置),然后才能添加新的类,这会导致动画跳跃和错误。
对使用 CSS 动画的简单技术的出色概述。 :)
我迫不及待地想看到 FF4 变得更标准。 基于 Mozilla 的浏览器真的错过了这些东西。
感谢 Chris!
Firefox Beta 9 包含许多在之前版本中缺失的新的 Html5 和 CSS3 功能。
https://hacks.mozilla.ac.cn/2011/01/firefox-4-beta-9-a-huge-pile-of-awesome/
跳舞!跳舞魔法舞!
很棒,chris…:)
继续努力…:)
太棒了!
我们可以将这个技巧命名为“do-si-do”吗?
微软也做了类似的事情
http://www.beautyoftheweb.com/#/highlights/all-around-fast
好吧——微软 EPIC 了它。 真是太棒了!
感谢! 你知道当你开始学习某件事并迷路时会发生什么吗? 然后你得到一个教程,你会想“哦,我现在明白了!” 嗯,这对我来说就是那个教程。 感谢 Chris。
我忍不住一直点击!
嗖! 真是太酷的效果了! 感谢 :)
可能的增强功能
1. 添加一个计时器,使其自动切换。 例如每 10 秒
2. 添加鼠标悬停暂停功能以临时停止计时器。 或者添加暂停和播放按钮。 或两者。
3. 对于长内容添加一个滚动条,以便所有内容都可见。
4. 添加一些东西来指示用户可以点击副标题框,使其显示在主框中。
很酷的效果,但在我看来完全不符合可用性标准。
我很想知道是什么让它“完全不符合可用性标准”。
我同意。 它只是一个噱头。
我认为对于旋转标题来说这是一个非常酷的想法; 特色文章等。
在大多数浏览器(没有动画)中,很难跟踪,但添加控件(或 JavaScript 备用动画)可以解决这个问题。
这太棒了,但我认为最酷的事情是你使用的 substr();。 我之前一直在寻找一种方法来做到这一点,但我无法弄明白,这真的很有用。
迷宫!!!!!!!!!!!!!!! 很好。
非常酷,Chris =)
Chris,你是说在其他条件相同的情况下,CSS > JavaScript 用于任何动画吗?
是的。
首先,我要说这篇文章很棒 :-)
我仍然认为 JavaScript 更适合动画,因为它是一种真正的编程语言。
CSS3 只能做简单的动画。像 3D 游戏,或任何需要逻辑的游戏都不行。
很酷!在禁用 JS 的情况下无法工作,但是实际上有多少人禁用 JS 呢?另外,你的示例 html 中有一个小错误 - <h2> 副标题 #1 </h1>
使用 CSS 和 :target 而不是点击事件,不是更有意义吗?
以下是我想表达的意思的一个(简单)示例 http://jsfiddle.net/wKw9Y/
我唯一看到的问题是,现在默认情况下有一个框是“打开”的。
在 IE 中不起作用 :(
喜欢它.. 在这些效果之后,Flash 显然会下降..
出于某种原因,Safari 5.0.3 for Leopard 没有显示 #1 文本和图像。只有空的蓝色框。有什么想法吗?
见上面的 Piers 的评论
很棒的效果。
我无法让这个网站上任何精彩的东西在 squarespace 上运行 :( :(
很漂亮,我一定会用这个,谢谢!
我不知道该说些什么...
我喜欢这个网站 Chris...
专业的网页开发人员会为那些禁用了 JavaScript 的浏览器提供服务。任何不这样做的人都是业余爱好者。
是的,因为大多数公司不考虑网络分析和目标受众。
非常感谢你提到我,即使我只是做了一个很小的改进。
无论如何,我希望 CSS3 能够很快在所有浏览器上得到很好的支持。用它做像这样的技巧真的很容易!
Flash 正在成为过去!
一开始只是一个很酷的效果……然后迷宫的引用出现了,它突然变成了“传奇”
感谢分享。
这太不可思议了。可惜它在 Firefox 中无法按预期工作,但至少它仍然可以工作。我在 Safari 中试过了,它工作得很好。很棒的东西。
太酷了!!!谢谢
感谢你提供这个。我正在测试它,并考虑在 http://familylegacy.com/home-test-page/ 上实施它。
一直响应到移动 css 版本。
< http://www.pushinpixels.co.uk/portfolio.html >
移动版本改天再做。
继续跳舞…
我很想看到 WordPress 循环代码的小片段,以及 jQuery 的细微变化,这些变化将使它在 WP 中工作。
有没有才华横溢的人有仁慈的心肠?
哦,真有趣!这给了我一些关于现有项目的想法。……这是我第一次看到你的网站。我喜欢所有细节。评论区域中的姓名、电子邮件和网站字段中的图标非常酷,动画背景也很酷。你新获得了一个粉丝!:-) 谢谢。
简洁明了…!最好的部分是没有任何复杂之处。将基本的东西捆绑在一起…
做得好
这太有趣了。哇,简直是魔法。谢谢。
如果你能写一篇关于在指定时间间隔后让幻灯片变化的文章,那就太好了。
然后这可以用来替换今天流行的 jQuery 幻灯片,用来显示内容和图像..
大家好,
我非常喜欢这个“技巧”,我不得不玩弄它。以下是我想到的
CSS3 动画演示
有人认为这个网站使用的这种自定义布局动画效果可以用今天的 HTML/CSS/jQuery 功能实现吗?
http://www.hybridworks.jp/
老兄,你拥有非凡的创造力,就像艺术家一样,拥有优秀网页开发人员的精妙之处!
这很棒,你的网站非常有用/用户友好。我在我的网站上实施了这些框。 http://www.designsourced.com 。
再次感谢!
您好,感谢您的教程!
这个旋转器在这里有一个固定的高度,在 CSS 中有没有可能让高度适应内容?
再次感谢 Css-tricks,我在我的文章页面上实施了这个框,
旋转块
并对其进行了修改,使其可以与 php 和 mysql 一起使用,看看我修改了哪些行
这里
再次感谢….
看到这个之后,我受到启发,做出了我自己的(在我看来更酷)版本。虽然我对 CSS 过渡非常了解,但是这个对我来说太复杂了,无法用 CSS 完成,因为我同时对同一个元素进行多个动画 并且 立即更改一些 CSS 属性。很难解释,所以你只能 自己试试