Lucas Bebber 的 故障 是一种超级酷炫的效果。就像您正在查看以逐行扫描显示器显示的某些文本,该显示器已多次掉落在地板上,因此像素的对齐方式在时间和空间上以奇怪的不均匀量偏移。
如果曾经有过,它就是货真价实的 CSS 技巧!我花了一段时间才弄清楚它是如何工作的,所以我想我会解释一下。然后我最终使其也适用于其他类型的內容,并将其制作成一组 Sass @mixin
,以便更轻松地使用它。
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
CSS 故障文本
在 CodePen 上。
文本的三个副本
虽然 HTML 只是
<div class="glitch" data-text="GLITCH">GLITCH</div>
通过伪元素创建了它的三个副本,并且它们彼此重叠放置。
.glitch {
position: relative;
}
.glitch::before,
.glitch::after {
content: attr(data-text);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
生成三个可以单独控制的唯一副本

更改副本
每个副本都相同,除了
- 它向左或向右偏移
- 它有一个突出显示,以文本阴影的形式显示
在偏移和突出显示之间,它给它一种断裂的感觉。
.glitch::before {
/* ... anything needed to make it identical */
/* variation */
left: 2px;
text-shadow: -1px 0 red;
/* important: opaque background masks the original */
background: black;
}
.glitch::after {
/* ... anything needed to make it identical */
/* variation */
left: -2px;
text-shadow: -1px 0 blue;
/* important: opaque background masks the original */
background: black;
}
所以现在这三个副本是这样的

裁剪副本
如果保持原样,您只会看到最顶层的副本。可能是 ::after
版本,除非您使用 z-index
进行更改。但不用担心,我们将只使用 clip
属性 显示顶部已更改副本的部分。此属性显然已弃用,取而代之的是 clip-path
,但在撰写本文时,只有 clip
对我有用。我相信这种情况会随着时间的推移而改变,因此我们必须密切关注它,并且可以预期,Autoprefixer 会处理它。
更新!2019 年 8 月:已经过去了很多时间,clip
通常仍然受支持,但已弃用,取而代之的是(更好的)clip-path
。clip
语法可以执行 clip-path
的 inset()
函数值的功能,因此我正在更新本文以使用它。看起来 Autoprefixer 并没有处理转换。
clip
的语法有点奇怪。对于四个值,您可能期望类似于 top/left/width/height 或 point-at-top-left/point-at-bottom-right 的内容。但实际上,它类似于 margin 和 padding:top/right/bottom/left
.glitch::before {
clip: rect(44px, 450px, 56px, 0);
/*
Essentially a box from 0, 44px
to 450px, 56px
*/
/* clip-path: inset(); needs how far you want to push in from the edges instead */
}
以下是在这些图层上的一些示例剪辑,现在应用了完全不透明的背景(但仍然旋转并带有额外的颜色,以便您可以看到发生了什么)

动画剪辑
事实证明 clip 可以进行动画处理,因此,如果被告知,裁剪的框会随着时间的推移动画到一个新的位置。这是一个关键帧示例
@keyframes noise-anim {
0% {
clip-path: inset(40% 0 61% 0);
}
20% {
clip-path: inset(92% 0 1% 0);
}
40% {
clip-path: inset(43% 0 1% 0);
}
60% {
clip-path: inset(25% 0 58% 0);
}
80% {
clip-path: inset(54% 0 7% 0);
}
100% {
clip-path: inset(58% 0 43% 0);
}
}
请注意,左值和右值保持不变,只有顶部和底部发生变化。并且这些值有点随机。
您可以使用 Sass 轻松生成它,例如
@keyframes noise-anim {
$steps: 20;
@for $i from 0 through $steps {
#{percentage($i*(1/$steps))} {
$top: random(100);
$bottom: random(101 - $top);
clip-path: inset(#{$top}% 0 #{$bottom}% 0);
}
}
}
因为您需要两组随机的剪辑位置,所以您将创建这两组 @keyframes
,并将它们应用于副本
.glitch::before {
...
animation: glitch-anim-1 2s infinite linear alternate-reverse;
}
.glitch::after {
...
animation: glitch-anim-2 2s infinite linear alternate-reverse;
}
在那里我们设置速度(关键帧的数量也影响速度)以及使其无限地来回运行。
观看它很有趣

虽然应该不言而喻,但少即是多。
Sass @mixins
我认为如果该技术更可重用会很不错。基本上,使用参数调用 @mixin
以控制效果并获得您需要的内容。
.example-one {
font-size: 100px;
@include textGlitch("example-one", 17, white, black, red, blue, 450, 115);
}
这是我的看法
/*
(TEXT) PARAMS
=================
1. Namespace
2. Intensity
3. Text color
4. Background color (flat)
5. Highlight #1 color
6. Highlight #2 color
7. Width (px)
8. Height (px)
*/
@mixin textGlitch($name, $intensity, $textColor, $background, $highlightColor1, $highlightColor2, $width, $height) {
color: $textColor;
position: relative;
$steps: $intensity;
// Ensure the @keyframes are generated at the root level
@at-root {
// We need two different ones
@for $i from 1 through 2 {
@keyframes #{$name}-anim-#{$i} {
@for $i from 0 through $steps {
$top: random(100);
$bottom: random(101 - $top);
#{percentage($i*(1/$steps))} {
clip-path: inset(#{$top}% 0 #{$bottom}% 0);
}
}
}
}
}
&::before,
&::after {
content: attr(data-text);
position: absolute;
top: 0;
left: 0;
width: 100%;
background: $background;
}
&::after {
left: 2px;
text-shadow: -1px 0 $highlightColor1;
animation: #{$name}-anim-1 2s infinite linear alternate-reverse;
}
&::before {
left: -2px;
text-shadow: 2px 0 $highlightColor2;
animation: #{$name}-anim-2 3s infinite linear alternate-reverse;
}
}
有无数种不同的方法可以实现它,这只是其中一种。完全取决于您希望 mixin 为您做多少事情、您希望或需要的可定制性程度、您希望在 HTML 中保留哪些内容等。
我还制作了另外两个 mixin,一个用于将此效果应用于图像,另一个用于内联 SVG。它们有所不同,因为它们不使用伪元素来制作副本,着色方式不同,定位方式也不同等。这三个放在一起。
以及一个演示
查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
CSS 故障文本
在 CodePen 上。
聪明!
非常棒的剪辑用法。谢谢。
很酷的效果,但人们想知道这是否越过了 WCAG 2.0 的“指南 2.3 癫痫发作:不要以已知会导致癫痫发作的方式设计内容”的界限。
它肯定越过了这条线,但无论如何,没有人真正遵守这些规则。
这是一个演示,突出显示了很酷的技术,而不是建议放在活动网站上的内容。WCAG 在这里并不适用。
虽然仔细想想,针对某些可访问性问题的媒体查询实际上可以安全地允许此类内容。
请注意,我并没有说它不是一个很酷的演示或没有启发性,或者这种效果永远不能使用。我只是指出它可能会违反 WCAG 2.0 的可访问性指南之一。因此,我的原始评论。让我们不要对我的评论进行过度解读。
@Chao – 用于可访问性的媒体查询 – 这听起来像是一个有趣的想法。您如何设想它的工作原理?
我现在头晕了。
@Ben 并不是什么经过深思熟虑的东西,只是想到了一些东西,然后考虑了某些可访问性指南和设计之间的界限。基本上,用户会让他们的浏览器知道某些可访问性问题,并可以在媒体查询中解决这些问题。当然,精确的粒度和功能将成为广泛讨论的主题。
例如,如果我偶然发现了一个设计精美的页面,其中包含一个带有阴影的蓝色标题,背景是浅蓝色,那么这显然在对比度方面违反了 WCAG。我可以在浏览器可访问性选项中选择对高对比度的偏好(例如 Firefox 已经为此提供了一个选项)。值得庆幸的是,此网站已为我提供了服务,并且 CSS 包含以下内容
对于具有内置高对比度模式的浏览器,显式声明要么关闭它,要么告诉它在其内置主题中不那么激进。
Ben,答案在这里:http://www.w3.org/TR/UNDERSTANDING-WCAG20/seizure-does-not-violate.html由于此效果不会闪烁或闪烁,我认为故障技术在可访问性方面是安全的。也就是说,我想对于认知能力有问题的人来说,解析文本内容可能很困难。
哦,嘿,非常棒的写法,mixin 也很好!
以这种形式不太实用,但仍然很棒:D
选择文本以获得美好的时光。
很棒的效果。非常棒的动画;)
很巧妙,但看上一秒钟以上就眼睛疼。
你知道什么会是一个很酷的补充吗?一些甜美的文字,用文字阴影发光和模糊,形成环状效果。也许还可以有一些随机的缩放跳跃?
现在我要去浪费一些时间来实现这个……
http://codepen.io/jcutrell/pen/zgJfn – 欢乐时光。
的确是欢乐时光,是的,我会在期待你的书的同时偷走你的想法 :)
哇,很酷的效果
Chris 你可以写一篇关于使用 CSS 样式化外部引用的 SVG 以及支持的浏览器方面的文章吗?我在 SVG Sprite Maps 的这两个方面遇到了很大的麻烦。
等等……问题是,如何使用 compass 为动画添加前缀?出于某种原因,autoprefixer 对我无效,我需要为此添加前缀 :(
你能解释得更详细一些吗?
要始终拥有所有前缀,请使用此规则
最近 44 个版本
非常棒的特效。我们将在Kamera Sistemleri 网站上使用它
令人惊叹!代码很棒!这是一种在视频中经常出现的视觉效果。
我相信你只需要使用 HTML 和 CSS 就可以制作一部电影!:P
如果添加一些静态噪声,会更像故障效果……
……抱歉,但总得有人来做;)
http://codepen.io/chuckneely/full/ronfx/
好文章!
Chris,如果你想在图像上制作故障效果或减少 HTML 代码,你也可以使用
background-image: inherit
或background: inherit
来复制元素。编辑:@Chuck Neely,你可以使用这个小技巧来简化你的代码。
很好的提示,Malik,谢谢!我已经更新了我的 CodePen,只需为伪元素背景图像使用
background: inherit
,效果很好。哇,伙计,这真是一个巧妙的裁剪方法!
我将 Sass 转换为 CSS 并尝试在 WordPress 上使用,但它不起作用。有什么想法吗?
我尝试让它工作……使用 HTML 和 CSS 代码,但我得到的只是 GLITCH,没有动画,只是一个静态的大写单词……我错过了什么?我还不熟悉 Sass……
谢谢!
是啊……不知道为什么这个不起作用?我一定是笨蛋?太棒了,其他人可以阅读/理解并提供一些帮助……很棒的地方,所有人干得都很棒……继续努力!!
同样的问题,无法让动画工作……伪元素都已正确到位,混合也已完成,但没有动画……
这很酷。将其转换为悬停效果的最简单方法是什么?
Chris 我很喜欢!再次感谢!我不得不添加到我的网站goo.gl/Nwby5Y
Jonathan,谢谢,我使用了你的一些额外内容。
我仍然需要对我的 CSS 进行一些微调。现在只进行 webkit 更改,出于某种原因,它仅适用于 Chrome。Safari 无法启动。因此,Firefox 版本是 Jonathan 的版本,针对我的网站略作更改。
Mike
太棒了!!!一个很棒的功能,可以继续学习和成长,开发 CSS。谢谢!!
将在我的网站上使用
太棒了,也很有启发性,Chris。现在我知道当一些地下电子音乐乐队找我设计他们的网站时该做什么了。
哇。
只使用一个元素,这对我来说是一个技巧,我认为应用到网站标题上会很棒。
天才!
从未想过要为剪辑属性制作动画!
http://dexvision.com/test/Glitch/