只是为了好玩,我想看看我是否可以在页面上制作一行图像,并在页面上无限地循环播放。 结果发现这并不难。

查看 CodePen 上 Chris Coyier (@chriscoyier) 的笔 无限幻灯片。
这个概念是移动长图形的位置
首先,应该设计图形,使其的一部分重复。 然后,您动画该图像的左侧位置,直到它看起来完成了一个完整的循环(但实际上只是移动到足够远的位置以看起来相同),然后它会迅速回到原始位置并重新开始。
我们只需要一个外部包装器设置为相对定位并隐藏溢出,然后是一个内部容器来动画(即图像)。
<div class="slideshow">
<div class="images">
A slideshow of images in here (whatever you want to say for screen readers)
</div>
</div>
.slideshow {
position: relative;
overflow: hidden;
}
.images {
background: url(slideshow.jpg);
position: absolute;
left: 0;
top: 0;
height: 100%;
width: 300%;
animation: slideshow 10s linear infinite;
}
@keyframes slideshow {
0% { left: 0; }
100% { left: -200%; }
}
让我们从这个东西中挤出一些更好的性能,牛仔。
上面的代码应该可以正常工作,但根据浏览器/平台/版本/可用资源,它可能会有点卡顿。 我们可以通过告诉浏览器我们将使用 3D 变换(即使我们没有使用)并使用 translateX
而不是 left
来获得更好的性能(至少在 WebKit / Mobile WebKit 中)。
注意:此技巧专门提高了 2D 变换和不透明度变化的性能(您通常不会获得)。 如果我们不切换到使用 translateX
,我们将看不到任何好处。
.images {
...
/* Hey browser, use your GPU */
transform: translate3d(0, 0, 0);
}
@keyframes moveSlideshow {
100% {
-webkit-transform: translateX(-200%);
}
}
我不太喜欢我们基本上需要欺骗浏览器以获得更好的性能的事实,但作为 CSS 人员,我想我们已经习惯了这种事情。 我认为我们最初编写它的方式很好,浏览器应该能够识别何时可以更有效地执行并这样做。
添加花哨
在我的幻灯片中,我想除了滚动图像之外,还要做两个额外的酷炫效果。 当您将鼠标悬停在幻灯片上时,它会
- 加速
- 从黑白变为彩色
为了加速它,您可能只是想,我们只需减少悬停时的持续时间! 因此
.slideshow:hover .images {
animation-duration: 5s;
}
但这将是卡顿的! 通过更改动画持续时间,您创建了一个新的时间线,说明哪些属性应该在什么值和时间。 它会计算出这些新值,并立即跳到它们应该在的位置。 它不会只是从它当前的精确位置“加速”。 恐怕我不知道有什么真正可靠的方法可以解决这个问题。
相反,我们只需要调整“加速”的概念。 如果我们将两个幻灯片叠放在一起,每个幻灯片以不同的速度运行,然后在悬停时隐藏/显示最顶层的运行更快的幻灯片,我们可以获得相当不错的“加速”效果。 我们将使用过渡使过渡更平滑。
<div class="slideshow">
<div class="images-1">
A slideshow of images in here (whatever you want to say for screen readers)
</div>
<div class="images-2">
</div>
</div>
.slideshow > div {
...
transition: opacity 0.5s ease-out;
/* Slow */
animation: moveSlideshow 60s linear infinite;
...
}
.images-1 {
/* Fast */
animation: moveSlideshow 20s linear infinite;
}
.slideshow:hover .images-2 {
opacity: 0;
}
对于黑白,我们将把最顶层的幻灯片设置为黑白,而较低/更快的幻灯片设置为彩色。 为了节省 HTTP 请求,我们将使它们都使用相同的图像,只是更改背景位置。

.images-1 {
/* Sprite */
background-position: 0 200px;
...
}
所以应该就可以了!
查看 CodePen 上 Chris Coyier (@chriscoyier) 的笔 无限幻灯片。
起源
这个想法来自于我们最近制作的 Wufoo Hearts Tech Events 页面,我想展示我们最近参加过的几个活动的图像。 而且,不可否认的是,我只是想玩玩这个想法。
首先 - 这是一个非常棒的 CSS 作品。
如果这听起来很笨拙,请原谅我; 但我看到所有这些动画都从 JS 移动到了 CSS,但对我来说,这感觉就像人们在做他们能做的事情,而不是它一定是一个改进。
我将这段代码与我在 JS 中编写的类似代码进行比较,我不禁想到在 JS 中调试、调整,更重要的是 - 只需构建,这有多么容易。 此外,JS 不是专门用于这类事情吗?
再说一次,非常棒的工作,但有人能详细说明为什么这是一种有益的做法吗? 我只是没有看到它。
这是一个有趣的讨论开始。
我会争辩说,另一方面,CSS 是为这类事情而设计的,而 JS 不是。
在“关注点分离”的经典对话中,CSS 用于设计/样式,而 JS 用于行为。 动画,如果你问我,更像是一种设计/样式的一部分,而不是行为的一部分。 不过,这取决于动画的使用方式。 幻灯片是一个相当灰色区域,因为它们可以附带很多行为。
另一个需要讨论的是动画是如何实现的。 要使用 JavaScript 为某个元素进行动画,您需要快速操作该元素的内联样式。 我会说这更像是一种巧妙的技巧,而不是一种处理动画的合适方法。 正如本教程所示,通过在 CSS 中进行动画,我们实际上可以利用 GPU(图形处理单元)来处理动画。 这几乎可以肯定比 JavaScript 更有效 =)
绝对是一个好点。
虽然,我认为使用 CSS 精灵滚动像这样有一些好处。
– 对于那些不太精通 javascript 的人来说,这可能是一个好方法。
– 如果网站构建所在的平台不允许使用 javascript 或附加 JQuery 或 MooTools 等 JS 库,这可能很有用。
我遇到过这类情况,所以在出现这种情况时,这可能会有所帮助。
但如果是我,我会在 JS 中做这件事 :)
无论如何,CC 干得漂亮。
谢谢,关于 GPU 参与的说明非常有帮助。
我想我明白了使用 CSS 进行“动画”的原因,我认为当我看到像这样的例子时,我被交互给难住了。
在选择 CSS 和 JS 之间时,最好权衡每种情况,但我猜这对于任何开发来说都是一个普遍的规则。 我很想找到一篇更详细地介绍这个主题的文章,因为这个主题似乎正在获得越来越多的关注。
Chris Coyier - 像往常一样,对 CSS(过渡)的新用途又有了很棒的见解。
但我想要补充一点关于 GPU 使用的说明。 IE9 也为 Javascipt 动画使用 GPU 加速。 因此,未来不仅是 CSS3 动画将从 GPU 加速中受益。
<marquee>?
也许吧。 做一个演示。
我一直在观看 Chris 提供的小提琴中的幻灯片,但有些不对劲。 我坐下来看了几次,花了很长时间才意识到发生了什么。
图像的重复部分位于原始部分上方一个像素。
然后我花了几分钟寻找有问题的代码。 当我意识到重复的部分是在图像中时,我感到非常愚蠢。 这可能是 Photoshop 中的快速复制问题,因此 Chris 可以提供演示!
是的,角落里就是我,戴着小丑帽! :-s
没关系,你甚至注意到了这一点。 完成的演示中的图像已修复了这个问题。
很酷,现在你能为它制作控件吗? 也许让 js 动态编辑样式表?
另外,当您将鼠标悬停在它上面时,快速滑动的通常位于与慢速滑动不同的位置,这使得它看起来像是在您将鼠标悬停在它上面时更改图片,然后在您将鼠标移回时再更改回来。 有没有解决方法?
我希望你能在那里多做一些画布魔法。我认为Jeffrey Way有一个关于如何使用画布制作图像的灰度版本的教程。在您的情况下,用于实现此目的的少量 JavaScript 的占用空间应该比这个带有两种颜色的精灵图像低得多。以下是链接:http://net.tutsplus.com/tutorials/javascript-ajax/how-to-transition-an-image-from-bw-to-color-with-canvas/
非常棒!
如何在代码片段中只包含 CSS3 属性?这将使它们更容易阅读。我认为现在大多数人应该知道如何添加前缀,对吗?
例如,它可以是
/* 在这里添加带前缀的属性 (-webkit-,-moz-,-ms-) 并且不要忘记 -o- 否则 @divya 会追捕你 :) */
transform: translateX(-200%);
而不是
-webkit-transform: translateX(-200%);
-moz-transform: translateX(-200%);
-ms-transform: translateX(-200%);
-o-transform: translateX(-200%);
transform: translateX(-200%);
在目前,我更喜欢列出所有供应商前缀。它让阅读它的人准确地得到他们需要的东西。如果他们被迫自己添加它们,他们可能会学得更好,但我认为更多的人不会这样做,而且会感到困惑/沮丧,或者只是让它崩溃。也许从现在起的一年左右,围绕这些东西的气氛可能会发生变化,我可能会改变主意。
也请查看此非常好的观点。
哈哈。这就是我从中提取代码片段的地方 :-)
很棒的发现,Ixolite!
非常酷的事情。我目前在我的投资组合网站上使用它,带有一点 x 和 y 的乐趣。
我假设这可以通过将图像放在 HTML 中来完成,而不是动画化该背景图像。(看起来在这个演示中它已经这样做了)。
然后,您实际上可以将它用作一个足够好的投资组合/特色滑块。:)
只是一个小问题,我是不是漏掉了什么,或者在 @-webkit-keyframes 中添加非 webkit 变换属性毫无意义?
哈哈,是的,呃,嗯,说得对。我修复了它。
哈哈哈 :p
很棒的工作!
使用 CSS3,你可以获得非常惊人的效果!
我一直认为可以使用更简单的方法来用 CSS 创建一个滑块。但是,它不能在许多浏览器中运行,这很糟糕。有没有办法使用 Modernizr 使它在不支持的浏览器中工作?
modernizr 会检查它是否有效,但它不会纠正问题。因此,如果是 IE8,您必须使用 jQuery 或其他方法来解决问题,因为 CSS3 不受支持。
很棒的工作!
我们能够只用 CSS 创建一个幻灯片,这太棒了。十年前谁会想到这一点呢?
覆盖图像没有对齐?即彩色图像。除此之外,它很酷!
能够用 CSS 做到这一点真是太棒了。在我的台式机上,它确实有点滞后(例如,它会滚动几秒钟,然后暂停几毫秒)。还有其他人看到这种情况吗,或者我的台式机速度很慢?无论如何,这只是一点小问题。
/Brian
也许,从“较慢”时间线到“较快”时间线的变化可以“过渡”以避免“抖动”。
animation-duration
,它可以从较低的值过渡/动画到较高的值吗?上面的“过渡”
animation-duration
可以用 CSS3 完成吗,还是需要求助于 JavaScript?非常酷的 CSS 技巧。我喜欢它,感谢你的分享。
Chris… 观察你和你的兴趣点很有趣。这个解决方案非常独特且有趣。对于图像在(或多个)悬停后没有对齐,有什么可以做的吗?有什么吗?
非常酷,感谢分享!
是我的机器有问题还是在 IE9 中不起作用?
在 FF6/Win7 中,将鼠标悬停在幻灯片上会导致图像的不同部分显示为彩色。它甚至都不接近(例如,在彩色悬停期间,图像的黑白中心甚至没有显示)。非常令人不安,感觉就像彩色图像与黑白图像无关,即使我知道它们不是。
太棒了:)
非常感谢
我从 Smashing Mag 的推特上看到这里,并且遇到了其他一些评论者写到的相同问题——幻灯片的彩色版本与黑白版本不同步。
使用 Firefox beta 7.0,很明显彩色版本和黑白版本都在以各自的速度连续滚动,无论当前向观看者显示哪个版本。如果它有用,可以截屏:http://www.damienking.net/slideshow.jpg
不得不说,这是一个很好的 CSS 使用方式——激励我更深入地研究仅使用 CSS 可以实现什么。
我在文章中提到了这个问题。这是规范中正确的方式,我不确定如何让它感觉更像加速了。可能没有实用的方法(或者可能会有,随意深入研究它!)
在 webkit 动画中使用“ease”而不是“linear”具有有趣的效果,可以温柔地减缓最后/第一帧的动画。如果您想对集合中的特定图像进行视觉强调,这可能是可取的。
鉴于 Demo 在 ie6 中不起作用
您好,这是一篇非常棒的文章,但我无法理解这个技巧。
代码的哪个部分完成了这个“然后它快速地回到原始位置并重新开始”的操作?
因为当我编辑 jsfiddle 并将 100% { left: -2000%; } 设置为加速过程时,图像在某个时刻消失了!
好吧,所以没有人理解这个技巧…
很酷的东西,感谢你为我们提供了构建想象力的精彩功能和想法。干得好,
无论如何,我只是想尝试获取文本而不是图像,比如段落或 h2 或其他内容,嗯,让我来试试
我是网页设计的新手!
我需要帮助。我想要两个幻灯片,中间有一个徽标图像。
我有这段代码——“http://jsfiddle.net/chriscoyier/Hyg3C/1/”请帮我将我的徽标插入中间,并将一个幻灯片移到左边,另一个幻灯片移到右边。就像在这个网站“http://www.mosa.nl/en/”中一样。提前感谢…
我想让滚动条从底部滚动到顶部,我该怎么做?
我怎样才能让它垂直滚动?
如果我想在鼠标悬停时添加链接怎么办?
这在 IE 中不起作用,我知道它来自 2011 年,但 这是解决方法(jsfiddle)
嘿,很棒的 Joe!你有没有关于如何让滚动效果生效的想法?我到目前为止还没有成功...
我搞定了。