CSS
アニメーション
2026/01/22
2026/1/18
グリッチ表現は一瞬でデジタル感や未来的な印象を与えられる一方、使い方を間違えると読みにくくなりがちです。
このサンプルでは、CSSだけで疑似要素を重ね、テキストが断片的にズレて表示される繰り返しグリッチアニメーションを実装しています。
一定間隔で短く発生するため、見出しやキービジュアルに取り入れても邪魔になりにくい演出です。
<div class="kumonosu-container">
<div class="kumonosu-title-main" data-text="Glitch">Glitch</div>
<div class="kumonosu-title-sub" data-text="グリッチ">グリッチ</div>
</div>
/*===========================================
変数定義
===========================================*/
:root {
--kumonosu-bg-color: #151118;
--kumonosu-accent-cyan: #00F0FF;
--kumonosu-accent-pink: #FF0055;
--kumonosu-main-gradient: linear-gradient(100deg, #3624ff, #ff3c3c);
--kumonosu-sub-color: #5e50ff;
--kumonosu-glitch-interval: 4s;
}
/*===========================================
レイアウト設定
===========================================*/
html, body {
height: 100%;
margin: 0;
padding: 0;
}
body {
background: var(--kumonosu-bg-color);
display: grid;
place-items: center;
/* 上下左右中央配置 */
overflow: hidden;
}
.kumonosu-container {
text-align: center;
padding: 20px;
}
/*===========================================
メインタイトル
===========================================*/
.kumonosu-title-main {
position: relative;
display: inline-block;
font-size: clamp(40px, 10vw, 80px);
font-weight: bold;
/* フォント指定なしのため太めに設定 */
line-height: 1.2;
letter-spacing: 0.05em;
background: var(--kumonosu-main-gradient);
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
animation: kumonosu-flicker var(--kumonosu-glitch-interval) infinite step-end;
}
/*===========================================
サブタイトル
===========================================*/
.kumonosu-title-sub {
position: relative;
display: block;
margin-top: 0.5em;
font-size: clamp(14px, 3vw, 20px);
color: var(--kumonosu-sub-color);
letter-spacing: 0.2em;
animation: kumonosu-flicker var(--kumonosu-glitch-interval) infinite step-end;
}
/*===========================================
グリッチ共通設定 (疑似要素)
===========================================*/
.kumonosu-title-main::before,
.kumonosu-title-main::after,
.kumonosu-title-sub::before,
.kumonosu-title-sub::after {
content: attr(data-text);
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
opacity: 0;
pointer-events: none;
}
/* シアン:左ズレ */
.kumonosu-title-main::before,
.kumonosu-title-sub::before {
left: -3px;
text-shadow: 2px 0 var(--kumonosu-accent-cyan);
-webkit-text-fill-color: var(--kumonosu-accent-cyan);
animation: kumonosu-slice-cyan var(--kumonosu-glitch-interval) infinite step-end;
z-index: -1;
}
/* ピンク:右ズレ */
.kumonosu-title-main::after,
.kumonosu-title-sub::after {
left: 3px;
text-shadow: -2px 0 var(--kumonosu-accent-pink);
-webkit-text-fill-color: var(--kumonosu-accent-pink);
animation: kumonosu-slice-pink var(--kumonosu-glitch-interval) infinite step-end;
z-index: -2;
}
/*===========================================
アニメーションキーフレーム (kumonosu-)
===========================================*/
/* 全体のチラつき */
@keyframes kumonosu-flicker {
0% {
opacity: 0;
transform: translateX(4px);
}
2% {
opacity: 1;
transform: translateX(-4px);
}
4% {
opacity: 0.5;
}
6% {
opacity: 1;
transform: translateX(0);
}
100% {
opacity: 1;
}
}
/* シアンの断片化 */
@keyframes kumonosu-slice-cyan {
0% {
opacity: 1;
clip-path: inset(80% 0 0 0);
transform: translateX(-10px);
}
2% {
clip-path: inset(10% 0 60% 0);
transform: translateX(10px);
}
4% {
clip-path: inset(40% 0 30% 0);
transform: translateX(-5px);
}
6% {
clip-path: inset(0 0 90% 0);
transform: translateX(5px);
}
8% {
opacity: 0;
}
100% {
opacity: 0;
}
}
/* ピンクの断片化 */
@keyframes kumonosu-slice-pink {
0% {
opacity: 1;
clip-path: inset(0 0 70% 0);
transform: translateX(10px);
}
3% {
clip-path: inset(50% 0 10% 0);
transform: translateX(-10px);
}
5% {
clip-path: inset(20% 0 50% 0);
transform: translateX(5px);
}
7% {
clip-path: inset(80% 0 0 0);
transform: translateX(-5px);
}
9% {
opacity: 0;
}
100% {
opacity: 0;
}
}
::before と ::after に 同じ文字を複製して重ねるclip-path: inset() をアニメーションさせ、表示される帯を瞬間的に切り替えるanimation を step-end で制御し、カクッとしたグリッチ特有の動きを再現--kumonosu-glitch-interval: 4s;
2s〜3s6s〜10s--kumonosu-accent-cyan: #00F0FF;
--kumonosu-accent-pink: #FF0055;
サイトのテーマカラーに合わせて変更できます。
left: -3px; /* シアン */
left: 3px; /* ピンク */
±5px±1pxclip-path: inset(80% 0 0 0);
@keyframes kumonosu-slice-cyan / pink 内の数値を調整すると、
data-text="Glitch Title"
clip-path を使っているため、古いブラウザでは表現が簡略化される場合があります