CSSだけで作る、繰り返しグリッチアニメーション

アニメーション

CSSだけで作る、繰り返しグリッチアニメーション

投稿日2026/01/22

更新日2026/1/18

グリッチ表現は一瞬でデジタル感や未来的な印象を与えられる一方、使い方を間違えると読みにくくなりがちです。

このサンプルでは、CSSだけで疑似要素を重ね、テキストが断片的にズレて表示される繰り返しグリッチアニメーションを実装しています。

一定間隔で短く発生するため、見出しやキービジュアルに取り入れても邪魔になりにくい演出です。

Preview プレビュー

Code コード

<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;
	}
}

Explanation 詳しい説明

仕様(このグリッチがどう動いているか)

  • ベースとなるテキストは通常表示
  • ::before::after同じ文字を複製して重ねる
  • それぞれに 色(シアン/ピンク)と左右のズレを与える
  • clip-path: inset() をアニメーションさせ、表示される帯を瞬間的に切り替える
  • animationstep-end で制御し、カクッとしたグリッチ特有の動きを再現
  • 数秒おきに繰り返されることで、常時ではなく「一瞬だけ乱れる」見え方になる

カスタム時に修正する主なポイント

1) グリッチの発生間隔

--kumonosu-glitch-interval: 4s;
  • 頻繁にしたい → 2s〜3s
  • 控えめにしたい → 6s〜10s

2) グリッチの色

--kumonosu-accent-cyan: #00F0FF;
--kumonosu-accent-pink: #FF0055;

サイトのテーマカラーに合わせて変更できます。

3) ズレ量(グリッチの強さ)

left: -3px; /* シアン */
left: 3px;  /* ピンク */
  • 強め → ±5px
  • 弱め → ±1px

4) 断片の出方(質感調整)

clip-path: inset(80% 0 0 0);

@keyframes kumonosu-slice-cyan / pink 内の数値を調整すると、

  • 細かいノイズ感
  • 大きく割れるような断片感
    など、グリッチの表情を変えられます。

5) 表示テキストの変更

data-text="Glitch Title"
  • data-textと本文の文字は必ず同じにする
  • 違うと、グリッチ用の複製文字がズレて見えます

注意点

  • clip-path を使っているため、古いブラウザでは表現が簡略化される場合があります
  • グリッチの頻度を上げすぎると、可読性が大きく下がるため注意
  • 見出しやKVなど、短時間表示される要素に使うのがおすすめ