CSS Houdini(フーディーニ)は、「ブラウザの描画エンジンに開発者が直接アクセスできる」新しい仕組みです。これまでCSSで表現できなかった高度な装飾やレイアウトを、JavaScriptで“ネイティブに”拡張できます。本記事では、Houdiniの基本的な考え方と、実際に動作する簡単なサンプルを通じて、その魅力をわかりやすく解説します。

CSS Houdiniとは?

CSS Houdiniは、ブラウザの「描画パイプライン(Rendering Pipeline)」の一部を開発者が操作できるようにするための 一連のAPI群 です。従来のCSSは「宣言的」なスタイル定義しかできず、ブラウザ内部の処理(パース・レイアウト・ペイントなど)は“ブラックボックス”でした。Houdiniはそのブラックボックスの一部を開放し、次のようなAPIを通じてCSSをプログラム的に拡張できるようにします。

API名機能概要
Paint APIJavaScriptで背景などのペイント処理を自作できる
Properties & Values APIカスタムプロパティ(変数)を型付きで定義可能
Typed OM (Object Model)CSS値をオブジェクトとして操作できる
Layout API(開発中)カスタムレイアウトエンジンを作れる
Animation Worklet APIより柔軟なアニメーション制御が可能

つまり、CSS Houdini = “CSSのJavaScript拡張キット” なのです。


CSSが描画されるまでの流れとHoudiniの位置づけ

ブラウザはHTML/CSSを次の手順で描画します。

  1. パース(Parse):CSSを読み込み、スタイルルールを解釈
  2. スタイル計算(Style):各要素に適用されるスタイルを決定
  3. レイアウト(Layout):要素の位置やサイズを決定
  4. ペイント(Paint):背景や線を描画
  5. コンポジット(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はこの処理をブラウザのペイントエンジンに組み込むため、パフォーマンスを保ちながら再利用可能なスタイルを作れます。

実際にデモで確認する(最新版のChrome又はEdgeにてご確認ください)

SASSやPostCSSとの違い

比較項目SASS / PostCSSCSS Houdini
実行タイミングビルド時(開発時)実行時(ブラウザ側)
拡張の方法コンパイル時にCSSを生成JavaScriptでCSSを直接拡張
対応範囲構文糖衣(変数・ネストなど)ブラウザの描画処理(Paint・Layoutなど)
実行環境Node.jsなどの開発環境ブラウザエンジン(Chromiumなど)
主な用途コーディング効率化表現力・描画機能の拡張

SASSやPostCSSはCSSを生成するためのプリプロセッサ/トランスパイラであり、「コードの保守性・再利用性」を高めるツールです。一方、Houdiniはブラウザ内部で動くAPIであり、「CSSそのものの能力」を拡張します。つまり、SASSが“書きやすくする”技術なら、Houdiniは“描けることを増やす”技術です。


現状の対応ブラウザと注意点

2025年現在、主要ブラウザでの対応状況は次の通りです(Can I Use: CSS Houdini APIs を参照)。

APIChromeEdgeSafariFirefox
Paint API⚠️ 一部対応⚠️ 実験的
Properties & Values API⚠️ 一部対応
Typed OM⚠️ 一部対応⚠️ 一部対応

さらに詳細なサポート状況は、MDN Web Docs: CSS Houdini にもまとめられています。

Houdiniはまだ発展途上であり、すべてのAPIが安定しているわけではありません。しかしChromeでは既に多くの機能が実用レベルで使えるため、今から学んでおく価値は大きいです。


まとめ:CSS Houdiniは“ブラウザ標準の拡張ポイント”

Houdiniは、これまでブラックボックスだったCSS描画の仕組みに開発者が直接アクセスできる画期的な技術です。SASSやPostCSSが「書き方」を変えたのに対し、Houdiniは「描かれ方」そのものを変えます。対応状況はまだ限定的ですが、モダンブラウザ中心の開発ではすでに実験可能です。近い将来、Houdiniが標準機能として広く使われるようになれば、CSSの表現力は飛躍的に高まるでしょう。