Safari & Testing

2026年・静的HTMLのCSS @layer と!important:Safari WebKit と Chrome の差をクラウド Mac mini で潰す

MacHTML Lab2026.05.12約32分

静的HTMLチームは @layer でデザイントークンとコンポーネント、マーケ上書きを整理したのに、Safari だけ見出し色が崩れ、Chrome は完璧——という事故が増えている。2026年のカスケードは特異性だけでは決まらず、レイヤー順・オリジン・importance・そもそもレイヤーに入っているかが勝敗を分ける。本稿では誰が明示レイヤーを必要とするか、!important が同オリジン内で順序を反転させる理由、WebKit 特有の落とし穴、そして日単位で借りられる Apple Silicon Mac mini 上で同一バンドルを Safari と Chrome に当てるリハーサル手順をまとめる。

隣接トピックとして mix-blend-mode と合成レイヤーの実機リハーサルSpeculation Rules による静的MPAの先読み も参照し、描画・先読み・カスケードの方針を揃えたい。

@layer が要るケース

gzip 40 KB 未満の単一スタイルで埋め込みもないならレイヤーはノイズになりがち。トークンCSS・コンポーネントライブラリ・マーケ上書き・チャットウィジェットのインライン <style> が混ざると、順序をコードで表現したくなる。@layer tokens, base, components, utilities, overrides; のように宣言順を読めば、口伝のコメント帯よりも安全に引き継げる。BEMユーティリティから移行するチームは、レイヤー内で再び特異性戦争をしないこと——レイヤーは関心横断のソース順を解決するもので、似た名前の2クラスの微差ではない。

レイヤー順と未レイヤー

同オリジンの通常宣言では、宣言済みレイヤー(宣言順)すべてが、未レイヤーより前に評価される。特異性が低い未レイヤーでもレイヤー内を上書きし得る。対策はルールを @layer overrides に移すか、「未レイヤーは最終砦」という運用を文書化すること。README に一行あるだけで、外注が末尾に裸のセレクタを足す事故は減る。

!important の反転

同オリジンでは !important が順序を反転させ、レイヤー内 important が未レイヤー important を抑えやすい。ダークモードの CSS 変数を @layer theme で important にし、レスポンシブ側をレイヤー外 important にすると、端末幅で色が消える。チーム指標として important 密度を 1000宣言あたり1回未満 に抑え、ビルド後CSSをスキャンして逸脱を検知したい。

フレームワークとトークン

Tailwind v4 系の preflight はレイヤー付きで出荷されることが多い。ベンダーCSSを二重バンドルすると匿名レイヤーが二つでき、チャンク分割で順序が揺れる。動的 import() でCSSを増やすマーケタグは禁止か、必ず名前付きレイヤーを宣言させる。Vite+素のHTMLでは先頭の layers.css に順序だけ書き、@import をレイヤーに紐づける。gzip 合計 120 KB を目安にモバイル Safari の初回解析を抑える。

@import とパフォーマンス

宣言的 @import はチェーン解決までレンダリングをブロックする。FCP 200 ms を狙う静的サイトでは、ビルドでインライン化し @layer ブロックを保持する方が安全。import するなら最初のファイルの最上部に限定する。Safari はファイル途中の import で静かに失敗することがあり、埋め込みWebViewでは気づきにくい。

コンテナクエリとレイヤー

@container で囲んだセレクタもレイヤー所属でファイル間の勝敗が決まる。誤って @layer utilities@layer components の内側へ貼り付けると、バンドラによってはフラット化の挙動が変わる。ビルド後CSSで @layer utilities の出現回数を数え、2回を超えたらマージ不具合を疑う。

WebKit と Chromium

2026年初頭時点で標準スタイルのレイヤー実装は揃いつつも、@scope との相互作用や拡張からの constructed stylesheet などに差が残る。Safari Technology Preview は安定版より 1〜2 リリース先行しがちだが、企業ユーザが N-1 に固定されているなら安定 Safari を主役に。Chrome Canary は modulepreload とCSS順序の組み合わせバグを拾うのに有効。

意思決定表

症状原因候補最初の手
Chrome OK / Safari 色ズレレイヤー後に未レイヤーのベンダCSS@layer components へ移動
ダーク変数が死ぬレイヤー外 important が勝つimportant を @layer theme に集約
遅延ロードで順不同匿名レイヤーの重複チャンクごとに明示名
utility が負けるレイヤー宣言順が逆順序を修正

macOS リハーサル

  1. 本番CSSをハッシュ付きでビルドし、SHA-256 の先頭 8 hex をチケットに記録。
  2. Safari安定版でキャッシュ無効化し、375/768/1280 px で全画面キャプチャ。
  3. Chrome でも同寸法。フォントラスタ差を許容する diff ツールで比較。
  4. ロード後 3 秒のタイムラインで遅延注入スタイルを確認。
  5. /docs/visual に CSS ハッシュをファイル名へ含めて保存。

専用 Mac mini なら睡眠・VPN・GPU差によるブレを避けられる。MacHTML のレンタルは約 $16.9/日 で、本番カスケード事故1件の損失より安い。

FAQ

未レイヤーは常に強い?

通常宣言ではレイヤー全体の後に来るため、多くの場合レイヤーを上書きできる。

!important は?

同オリジンでは順序が反転し、レイヤー内 important が優先されやすい。

マーケCSSは?

独立レイヤーに分け、触れる人を限定する。

Linux CI だけで足りる?

WebKit とシステムフォントの差を再現できない。

Apple Silicon Mac mini はファンが静かで、デザイナと並んで Web Inspector を開いても邪魔にならない。MacHTML 経由のレンタルなら SSH と必要なら VNC を組み合わせ、リリース週だけ立ち上げて検証後に停止——キャパシティを資産ではなくカレンダーに紐づけられる。

画面収録でステークホルダへ説明するときも、静音性は説得力になる。

WebKit 実機で @layer を検証

クラウド Mac mini を借りて同一CSSを Safari/Chrome で比較し、静的HTMLを安心リリース。

レイヤー検証をクラウド Mac で
$16.9/日から