
CSS Houdini(フーディーニ)は、「ブラウザの描画エンジンに開発者が直接アクセスできる」新しい仕組みです。これまでCSSで表現できなかった高度な装飾やレイアウトを、JavaScriptで“ネイティブに”拡張できます。本記事では、Houdiniの基本的な考え方と、実際に動作する簡単なサンプルを通じて、その魅力をわかりやすく解説します。
目次
目次
CSS Houdiniとは?
CSS Houdiniは、ブラウザの「描画パイプライン(Rendering Pipeline)」の一部を開発者が操作できるようにするための 一連のAPI群 です。従来のCSSは「宣言的」なスタイル定義しかできず、ブラウザ内部の処理(パース・レイアウト・ペイントなど)は“ブラックボックス”でした。Houdiniはそのブラックボックスの一部を開放し、次のようなAPIを通じてCSSをプログラム的に拡張できるようにします。
| API名 | 機能概要 |
|---|---|
| Paint API | JavaScriptで背景などのペイント処理を自作できる |
| Properties & Values API | カスタムプロパティ(変数)を型付きで定義可能 |
| Typed OM (Object Model) | CSS値をオブジェクトとして操作できる |
| Layout API(開発中) | カスタムレイアウトエンジンを作れる |
| Animation Worklet API | より柔軟なアニメーション制御が可能 |
つまり、CSS Houdini = “CSSのJavaScript拡張キット” なのです。
CSSが描画されるまでの流れとHoudiniの位置づけ
ブラウザはHTML/CSSを次の手順で描画します。
- パース(Parse):CSSを読み込み、スタイルルールを解釈
- スタイル計算(Style):各要素に適用されるスタイルを決定
- レイアウト(Layout):要素の位置やサイズを決定
- ペイント(Paint):背景や線を描画
- コンポジット(Composite):全体を合成して画面に表示
Houdiniはこのうち、「Style」〜「Paint」 の段階に入り込んで独自処理を挿入できます。たとえば、CSSでは通常 background: linear-gradient(...) のような限られたパターンしか指定できませんが、Houdiniを使えば「自分で定義した背景パターン」をJavaScriptで描画できます。
実際に動かしてみよう:Paint APIの簡単な例
1. HTML
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CSS Houdini Demo</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="card">Houdiniデモ</div>
<script src="main.js"></script>
</body>
</html>
2. registerPaint.js
// registerPaint.js
registerPaint('dots-pattern', class {
paint(ctx, geom, properties) {
const size = 10;
const dotSize = 2;
ctx.fillStyle = '#ddd';
for (let y = 0; y < geom.height; y += size) {
for (let x = 0; x < geom.width; x += size) {
ctx.beginPath();
ctx.arc(x, y, dotSize, 0, 2 * Math.PI);
ctx.fill();
}
}
}
});
3. main.js
// main.js
if ('paintWorklet' in CSS) {
CSS.paintWorklet.addModule('/registerPaint.js');
}
4. style.css
.card {
width: 200px;
height: 120px;
background: paint(dots-pattern);
border-radius: 8px;
border: 1px solid #ccc;
margin: 40px auto;
}
上記のように設定すると、.card の背景に「水玉模様(dots)」が描かれます。JavaScriptでパターンの描画ロジックを定義し、paint() 関数でCanvasのように描くのがポイントです。Houdiniはこの処理をブラウザのペイントエンジンに組み込むため、パフォーマンスを保ちながら再利用可能なスタイルを作れます。
SASSやPostCSSとの違い
| 比較項目 | SASS / PostCSS | CSS Houdini |
|---|---|---|
| 実行タイミング | ビルド時(開発時) | 実行時(ブラウザ側) |
| 拡張の方法 | コンパイル時にCSSを生成 | JavaScriptでCSSを直接拡張 |
| 対応範囲 | 構文糖衣(変数・ネストなど) | ブラウザの描画処理(Paint・Layoutなど) |
| 実行環境 | Node.jsなどの開発環境 | ブラウザエンジン(Chromiumなど) |
| 主な用途 | コーディング効率化 | 表現力・描画機能の拡張 |
SASSやPostCSSはCSSを生成するためのプリプロセッサ/トランスパイラであり、「コードの保守性・再利用性」を高めるツールです。一方、Houdiniはブラウザ内部で動くAPIであり、「CSSそのものの能力」を拡張します。つまり、SASSが“書きやすくする”技術なら、Houdiniは“描けることを増やす”技術です。
現状の対応ブラウザと注意点
2025年現在、主要ブラウザでの対応状況は次の通りです(Can I Use: CSS Houdini APIs を参照)。
| API | Chrome | Edge | Safari | Firefox |
| Paint API | ✅ | ✅ | ⚠️ 一部対応 | ⚠️ 実験的 |
| Properties & Values API | ✅ | ✅ | ✅ | ⚠️ 一部対応 |
| Typed OM | ✅ | ✅ | ⚠️ 一部対応 | ⚠️ 一部対応 |
さらに詳細なサポート状況は、MDN Web Docs: CSS Houdini にもまとめられています。
Houdiniはまだ発展途上であり、すべてのAPIが安定しているわけではありません。しかしChromeでは既に多くの機能が実用レベルで使えるため、今から学んでおく価値は大きいです。
まとめ:CSS Houdiniは“ブラウザ標準の拡張ポイント”
Houdiniは、これまでブラックボックスだったCSS描画の仕組みに開発者が直接アクセスできる画期的な技術です。SASSやPostCSSが「書き方」を変えたのに対し、Houdiniは「描かれ方」そのものを変えます。対応状況はまだ限定的ですが、モダンブラウザ中心の開発ではすでに実験可能です。近い将来、Houdiniが標準機能として広く使われるようになれば、CSSの表現力は飛躍的に高まるでしょう。










