diff --git a/files/ja/web/css/css_anchor_positioning/using/index.md b/files/ja/web/css/css_anchor_positioning/using/index.md new file mode 100644 index 00000000000000..4c6e418f508c86 --- /dev/null +++ b/files/ja/web/css/css_anchor_positioning/using/index.md @@ -0,0 +1,700 @@ +--- +title: CSS アンカー位置指定の使用 +slug: Web/CSS/CSS_anchor_positioning/Using +l10n: + sourceCommit: f430d277573ba0b06b1ac33ae8017fd90f170bef +--- + +{{CSSRef}} + +**CSS アンカー位置指定**モジュールは、要素を結びつけるための機能を定義します。要素は、**アンカー要素**と**アンカー位置指定要素**として定義できます。アンカー位置指定要素は、アンカー要素に束縛することができます。アンカー位置決めされた要素は、そのサイズと位置を、結合されたアンカー要素のサイズと位置に相対的に設定することができます。 + +CSS のアンカーポジショニングは、アンカーポジショニングされた要素の複数の代替位置を指定するための CSS だけのメカニズムも提供します。例えば、ツールチップがフォームフィールドにアンカーされているが、既定の位置設定では画面外にレンダリングされる場合、ブラウザは別の提案された位置でレンダリングし、画面上に配置することができます。 + +この記事では、基本的なアンカー位置決めの概念と、モジュールの関連付け、位置決め、サイズ調整機能の基本的な使い方を説明します。以下で説明する各概念について、追加の例や構文の詳細が記載されている参照ページへのリンクが含まれています。代替位置の指定とアンカー位置の要素の非表示については、[オーバーフローの処理: フォールバックと条件付き非表示](/ja/docs/Web/CSS/CSS_anchor_positioning/Try_options_hiding)をお試しください。 + +## 基本概念 + +ある要素を別の要素に接続したり、結び付けたりしたいと思うことはよくあります。 + +- フォームコントロールの横に表示されるエラーメッセージ。 +- UI 要素の隣にポップアップ表示され、その要素に関する詳細情報を提供するツールチップや情報ボックス。 +- UI 要素をすばやく設定できるようにアクセスできる設定やオプションのダイアログ。 +- 関連付けられたナビゲーションバーやボタンの横に表示されるドロップダウンメニューやポップオーバーメニュー。 + +現行のインターフェイスでは、再利用可能な動的に生成されたコンテンツをアンカー要素に関連して配置することがよく求められます。(**アンカー要素**と呼ばれる)結びつける要素が常に UI の同じ場所にあり、結びつけられる要素(**アンカー位置指定要素**、または単に**位置指定要素**と呼ばれる)がソース順で常にその直前にまたは直後に配置できるのであれば、このような使用事例を作成するのは比較的簡単です。しかし、実際にはそう単純なことはほとんどありません。 + +アンカー要素が移動したり、その他の構成の変更(スクロール、ビューポートサイズの変更、ドラッグ&ドロップなど)が行われたりした場合、位置指定要素のアンカー要素に対する位置を維持し、調整する必要があります。例えば、フォームフィールドなどの要素がビューポートの端に近づくと、そのツールチップが画面外に表示されてしまう可能性があります。一般的には、ツールチップをあるフォームコントロールに結びつけ、フォームフィールドが可視状態である限り、ツールチップが画面に完全に表示された状態を維持し、必要に応じて自動的に移動するようにしたいでしょう。これは、デスクトップやラップトップでコンテキストメニューを右クリック(Ctrl キーを押しながらクリック)した際に、オペレーティングシステムの既定の動作となっていることに気づいたかもしれません。 + +過去には、ある要素を別の要素に関連付け、アンカーの位置に基づいて位置指定要素の位置やサイズを動的に変更するには、JavaScript が必要でした。すると、複雑さが増し、パフォーマンスの問題も発生しました。また、すべての状況で動作する保証もありませんでした。[CSS アンカー位置指定](/ja/docs/Web/CSS/CSS_anchor_positioning)モジュールで定義された機能により、JavaScript ではなく CSS(と HTML)を使用して、このような使用事例をパフォーマンス良く、かつ宣言的に実装することが可能になりました。 + +## アンカー要素と位置指定要素の関連付け + +要素をアンカーに関連付けるには、まず最初の宣言でどの要素がアンカーであるかを指定し、次に、そのアンカーに関連付ける位置指定要素を指定します。これは、CSS で行うか、HTML の [`anchor`](/ja/docs/Web/HTML/Global_attributes/anchor) 属性を介して行うことができます。 + +### CSS のみによる方法 + +CSS で要素をアンカーとして宣言するには、{{cssxref("anchor-name")}} プロパティを使用してアンカー名を設定する必要があります。アンカー名は、{{cssxref("dashed-ident")}} である必要がります。この例では、アンカーの {{cssxref("width")}} を `fit-content` に設定して小さな正方形のアンカーを作成し、アンカー効果をよりわかりやすく示しています。 + +```css hidden +.anchor { + font-size: 1.8rem; + color: white; + text-shadow: 1px 1px 1px black; + background-color: hsl(240 100% 75%); + border-radius: 10px; + border: 1px solid black; + padding: 3px; +} +``` + +```css +.anchor { + anchor-name: --myAnchor; + width: fit-content; +} +``` + +要素をアンカー位置指定要素に変換するには、2 段階のプロセスが必要です。まず、{{cssxref("position")}} プロパティを使用して、絶対[位置指定](/ja/docs/Learn/CSS/CSS_layout/Positioning)または固定位置指定にする必要があります。次に、位置指定された要素の {{cssxref("position-anchor")}} プロパティに、アンカー要素の `anchor-name` プロパティの値を設定して、2 つの要素を関連付けます。 + +```css hidden +.infobox { + color: darkblue; + background-color: azure; + border: 1px solid #ddd; + padding: 10px; + border-radius: 10px; + font-size: 1rem; +} +``` + +```css +.infobox { + position: fixed; + position-anchor: --myAnchor; +} +``` + +上記の CSS を以下の HTML に適用します。 + +```html +
これは情報ボックスです。
+これは情報ボックスです。
++ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. Dui nunc mattis enim ut tellus + elementum sagittis vitae et. +
+ +これは情報ボックスです。
++ Nisi quis eleifend quam adipiscing vitae proin sagittis nisl rhoncus. In arcu + cursus euismod quis viverra nibh cras pulvinar. Vulputate ut pharetra sit amet + aliquam. +
+ ++ Malesuada nunc vel risus commodo viverra maecenas accumsan lacus. Vel elit + scelerisque mauris pellentesque pulvinar pellentesque habitant morbi + tristique. Porta lorem mollis aliquam ut porttitor. Turpis cursus in hac + habitasse platea dictumst quisque. Dolor sit amet consectetur adipiscing elit. + Ornare lectus sit amet est placerat. Nulla aliquet porttitor lacus luctus + accumsan. +
+``` + +```css hidden +.anchor { + font-size: 1.8rem; + color: white; + text-shadow: 1px 1px 1px black; + background-color: hsl(240 100% 75%); + width: fit-content; + border-radius: 10px; + border: 1px solid black; + padding: 3px; +} + +body { + width: 50%; + margin: 0 auto; +} +``` + +```css +.anchor { + anchor-name: --myAnchor; +} +``` + +情報ボックスはアンカー名によってアンカーに関連付けられ、固定位置指定が指定されています。{{cssxref("inset-block-start")}} と {{cssxref("inset-inline-start")}} プロパティ(横書きの左書きモードでは {{cssxref("top")}} と {{cssxref("left")}} に相当)を記載することで、アンカーに固定されています。位置指定要素とアンカーとの間に空間を追加するために、情報ボックスにマージンを追加します。 + +```css hidden +.infobox { + color: darkblue; + background-color: azure; + border: 1px solid #ddd; + padding: 10px; + border-radius: 10px; + font-size: 1rem; +} +``` + +```css +.infobox { + position-anchor: --myAnchor; + position: fixed; + inset-block-start: anchor(end); + inset-inline-start: anchor(self-end); + margin: 5px 0 0 5px; +} +``` + +インセットプロパティの位置指定宣言について、さらに詳しく見ていきましょう。 + +- `inset-block-start: anchor(end)`: これは、位置指定された要素のブロック開始位置を、`anchor(end)` 関数を使用して計算したアンカーのブロック終了位置に設定します。 +- `inset-inline-start: anchor(self-end)`: これは、位置指定された要素のインライン開始位置を、`anchor(self-end)` 関数を使用して計算したアンカーのインライン終了位置に設定します。 + +これにより、次の結果が得られます。 + +{{ EmbedLiveSample("`anchor()` example", "100%", "250") }} + +位置指定された要素は、アンカー要素の `5px` 下、`5px` 右に配置されます。文書内の位置を上下にスクロールしても、位置指定された要素はアンカー要素に対する相対的な位置を維持します。つまり、位置指定された要素はビューポートではなくアンカー要素に固定された状態になります。 + +### `position-area` の設定 + +{{cssxref("position-area")}} プロパティは、アンカーに対する要素の位置指定を行うための、`anchor()` 関数の代替として指定されたものです。`position-area` プロパティは、アンカー要素を中心タイルとする 3x3 のタイルグリッドの概念に基づいて動作します。`position-area` プロパティを使用して、アンカー要素の位置指定された要素を 9 つのタイルのいずれかに配置したり、2 つまたは 3 つのタイルにまたがって配置したりすることができます。 + +![position-area grid グリッドは下記のとおりです](position-area.png) + +グリッドのタイルは行と列の数に分割されます。 + +- 3 つの行は、物理的な値では `top`、`center`、`bottom` で表します。 また、`start`、`center`、`end` といった論理的な値や、`y-start`、`center`、`y-end` といった座標の値もあります。 +- 3 つの列は、物理的な値では `left`、`center`、`right` で表します。また、`start`、`center`、`end` といった論理的な値や、`x-start`、`center`、`x-end` といった座標の値もあります。 + +中央のタイルの寸法は、アンカー要素の[包含ブロック](/ja/docs/Web/CSS/Containing_block)によって定義され、中央のタイルとグリッドの外縁との間の距離は、位置指定要素の包含ブロックによって定義されます。 + +`position-area` プロパティの値は、上記の行と列の値に基づいて 1 つまたは 2 つの値で構成され、要素が配置されるべきグリッドの領域を定義するためのスパニングオプションが利用可能です。 + +例えば、 + +2 つの値を指定することで、特定のグリッドマスに配置することができます。例えば、 + +- `top left`(等価な論理値は `start start`)は、位置指定要素を左上の位置に配置します。 +- `bottom center`(等価な論理値は `end center`)は、位置指定要素を下中央の位置に配置します。 + +行または列の値と `span-*` の値を指定することができます。最初の値は、位置指定要素を配置する行または列を指定し、初期状態ではその中央に配置しますが、もう 1 つの値で、その列をまたがる量を指定します。例えば、 + +- `top span-left` は、位置指定要素を一番上の行に配置し、その行の中央と左のタイルにまたがるようにします。 +- `y-end span-x-end` は、位置指定要素を y 方向の列の末尾に配置し、その列の中央と x 方向の末尾のタイルにまたがるようにします。 +- `block-end span-all` は、配置された要素をブロック方向の末尾の行に配置し、その行のinline-start、center、inline-endタイルにまたがるようにします。 + +値を 1 つだけ指定した場合、どの値が設定されているかによって効果が異なります。 + +- 物理的な端の値 (`top`, `bottom`, `left`, `right`) または軸の値 (`y-start`, `y-end`, `x-start`, `x-end`) は、もう一方の値が `span-all` であるかのように動作します。例えば、`top` は `top span-all` と同じ効果です。 +- 論理的な端の値(`start` または `end`)は、もう一方の値が同じ値に設定されているかのように動作します。例えば、`start` は `start start` と同じ効果があります。 +- `center` の値は、両方の値が `center` に設定されている場合と同じように動作します(つまり、`center center`)。 + +> [!NOTE] +> 利用可能なすべての値の詳細については、[`+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor + incididunt ut labore et dolore magna aliqua. Dui nunc mattis enim ut tellus + elementum sagittis vitae et. +
+ +これは情報ボックスです。
++ Nisi quis eleifend quam adipiscing vitae proin sagittis nisl rhoncus. In arcu + cursus euismod quis viverra nibh cras pulvinar. Vulputate ut pharetra sit amet + aliquam. +
+ ++ Malesuada nunc vel risus commodo viverra maecenas accumsan lacus. Vel elit + scelerisque mauris pellentesque pulvinar pellentesque habitant morbi + tristique. Porta lorem mollis aliquam ut porttitor. Turpis cursus in hac + habitasse platea dictumst quisque. Dolor sit amet consectetur adipiscing elit. + Ornare lectus sit amet est placerat. Nulla aliquet porttitor lacus luctus + accumsan. +
+ + +``` + +```css hidden +.anchor { + font-size: 1.8rem; + color: white; + text-shadow: 1px 1px 1px black; + background-color: hsl(240 100% 75%); + width: fit-content; + border-radius: 10px; + border: 1px solid black; + padding: 3px; +} + +.anchor { + anchor-name: --myAnchor; +} + +body { + width: 50%; + margin: 0 auto; +} + +form { + background: white; + border: 1px solid black; + padding: 5px; +} + +select { + display: block; + margin-top: 5px; +} + +form { + position: fixed; + top: 0; + right: 2px; +} +``` + +情報ボックスは CSS を適用して固定位置を設定しており、アンカーに関連付けられています。読み込み時には、`position-area: top;` でアンカーに固定されるように設定され、 position-area のグリッドの最上部に配置されます。これは、`