CSS文字故障生成器 - 创建故障文字效果 在线工具
通过实时预览生成纯CSS故障文字动画。自定义色彩分离、噪声、变形效果并调节强度 — 100%客户端处理,无数据发送至服务器。
常见问题
什么是CSS文字故障效果?
CSS文字故障效果是一种纯视觉动画,使文字看起来像在故障或出错,模拟数字信号损坏或VHS磁带伪影。它通过CSS技术实现,如clip-path切片、使用::before/::after伪元素进行颜色通道分离、以及transform: skew()变形,全部通过@keyframes动画实现。生成的输出不需要JavaScript。
如何使用这个CSS文字故障生成器?
输入要应用故障效果的文字。选择故障效果类型。使用滑块调整故障强度和动画速度。自定义文本颜色、背景颜色和两个故障颜色。在预览区域实时查看效果。将生成的HTML和CSS代码复制到您的项目中。或者浏览预设选项卡,一键应用预配置效果。
使用此工具时我的数据安全吗?
是的。此工具完全在您的浏览器中使用客户端JavaScript运行。没有文本内容、颜色值或生成的CSS代码被发送到任何服务器。所有处理都在您的设备上本地完成。
clip-path故障技术是如何工作的?
clip-path噪声技术通过快速更改文本的哪些水平切片可见来创建数字损坏外观。使用@keyframes,clip-path: inset()值通过多个随机位置进行动画,使文本的不同水平带出现和消失,模拟数据损坏。强度控制调整这些裁剪区域的宽度。
如何创建赛博朋克/霓虹故障效果?
在深色背景上使用色彩分离(RGB)效果类型,将青色(#00ffff)和品红色(#ff00ff)作为两个故障颜色。将强度设置为5-7。预设选项卡中的赛博朋克霓虹预设可一键自动应用。
我可以让故障效果具有无障碍性吗?
可以。您可以将生成的CSS动画包装在@media (prefers-reduced-motion: reduce)块中,为偏好减少动态效果的用户禁用它。此外,确保底层文本在没有动画的情况下对屏幕阅读器仍然可读。
色彩分离、噪声和变形效果有什么区别?
色彩分离(RGB)通过水平偏移彩色伪元素副本来创建色差效果。噪声(Clip-path)使用动画clip-path: inset()随机切片和显示不同的水平带。变形(Skew)应用动画transform: skew()和translate()创建抖动变形效果。组合将三种技术合并以获得最大视觉冲击。
代码示例
// Generate CSS glitch effect - Color Split technique
function generateColorSplitGlitch(config) {
const { text, fontSize, textColor, bgColor, color1, color2, duration } = config;
const html = `<div class="glitch-wrapper">
<div class="glitch" data-text="${text}">${text}</div>
</div>`;
const css = `.glitch-wrapper {
display: flex;
align-items: center;
justify-content: center;
background: ${bgColor};
padding: 2rem;
}
.glitch {
position: relative;
font-size: ${fontSize}px;
font-weight: 700;
color: ${textColor};
letter-spacing: 0.05em;
}
.glitch::before,
.glitch::after {
content: attr(data-text);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
}
.glitch::before {
color: ${color1};
animation: glitch-before ${duration}s infinite linear alternate-reverse;
clip-path: inset(0 0 0 0);
}
.glitch::after {
color: ${color2};
animation: glitch-after ${duration}s infinite linear alternate-reverse;
clip-path: inset(0 0 0 0);
}
@keyframes glitch-before {
0% { clip-path: inset(40% 0 61% 0); transform: translate(-2px, -1px); }
20% { clip-path: inset(92% 0 1% 0); transform: translate(1px, 2px); }
40% { clip-path: inset(43% 0 1% 0); transform: translate(-1px, 3px); }
60% { clip-path: inset(25% 0 58% 0); transform: translate(3px, 1px); }
80% { clip-path: inset(54% 0 7% 0); transform: translate(-3px, -2px); }
100% { clip-path: inset(58% 0 43% 0); transform: translate(2px, -3px); }
}
@keyframes glitch-after {
0% { clip-path: inset(65% 0 13% 0); transform: translate(2px, 1px); }
20% { clip-path: inset(79% 0 2% 0); transform: translate(-2px, -1px); }
40% { clip-path: inset(48% 0 38% 0); transform: translate(1px, -2px); }
60% { clip-path: inset(3% 0 83% 0); transform: translate(-1px, 3px); }
80% { clip-path: inset(22% 0 64% 0); transform: translate(3px, 2px); }
100% { clip-path: inset(10% 0 74% 0); transform: translate(-2px, 1px); }
}`;
return { html, css };
}
// Generate noise/clip-path keyframes with controllable intensity
function generateNoiseKeyframes(name, intensity, steps = 20) {
let keyframes = `@keyframes ${name} {\n`;
for (let i = 0; i <= steps; i++) {
const percent = Math.round((i / steps) * 100);
const maxClip = intensity * 10;
const top = Math.floor(Math.random() * maxClip);
const bottom = Math.floor(Math.random() * maxClip);
keyframes += ` ${percent}% { clip-path: inset(${top}% 0 ${bottom}% 0); }\n`;
}
keyframes += '}';
return keyframes;
}
// Usage
const result = generateColorSplitGlitch({
text: 'GLITCH',
fontSize: 80,
textColor: '#ffffff',
bgColor: '#0a0a0a',
color1: '#00ffff',
color2: '#ff00ff',
duration: 2,
});
console.log(result.html);
console.log(result.css);