アンカーポジショニング vs position: fixed — どちらを使うか
CSS Anchor Positioning と従来の position: fixed / absolute を比較し、よくあるシナリオでどちらを使うべきかを学ぶ。
Advanced
詳細な説明
早見表
| シナリオ | 使うもの |
|---|---|
| 要素が他の要素に追従 | アンカーポジショニング |
| 要素をビューポートに固定(ヘッダー、FAB) | position: fixed |
| 親内に絶対配置(追従なし) | position: absolute |
| ツールチップ / ドロップダウン / ポップオーバー | アンカーポジショニング |
| モーダルダイアログ(中央) | position: fixed + inset: 0 |
| モーダルダイアログ(トリガーにアンカー) | アンカーポジショニング |
| スティッキーテーブルヘッダー | position: sticky |
| フローティングアクションボタン | position: fixed |
ツールチップにアンカーポジショニングが position: absolute に勝る理由
アンカーポジショニング以前のツールチップパターンは:
<span style="position: relative;">
<button>トリガー</button>
<div class="tooltip" style="position: absolute; bottom: 100%; left: 50%;">...</div>
</span>
これは動きますが問題があります:
- ラッパー必須:すべてのトリガーに
position: relative親が必要。 - オーバーフロークリッピング:祖先に
overflow: hiddenがある場合(カード、モーダル、<details>要素では非常によくある)、ツールチップがクリップされる。 - 自動反転なし:トリガーがビューポート端付近だとツールチップがはみ出す。
- 兄弟限定:ツールチップはトリガーの兄弟、または同じラッパーの子孫である必要がある。
アンカーポジショニングは4つすべてを修正します。ターゲットはドキュメント内のどこにでも置け、anchor-name と position-anchor がDOMをまたいで両者を接続します。
position: fixed が依然として有用な理由
position: fixed は他の要素には追従せず、ビューポート内の所定位置に留まります。ヘッダー、サイドバー、FAB、トースト通知にはまさにこれが必要です。
両者を 組み合わせる こともできます:position: fixed; position-anchor: --x; position-area: bottom のターゲットはビューポート座標で固定されつつ、スクロールコンテナ内のアンカーを追跡します。これは overflow: hidden 祖先から脱出すべきツールチップに最適なパターンです。
移行戦略
既存の position: absolute ツールチップコードはそのままで動きます — 移行の必要はありません。アンカーポジショニングは段階的に採用してください:新しいコンポーネントは新方式、古いコンポーネントは別の理由で触るときまで現状維持。
ユースケース
新コンポーネントライブラリのデザインで配置戦略を選ぶ、レガシーツールチップコードのリファクタリング、Floating UI を残すか削除するかの判断、新アプリのCSSアーキテクチャ計画。