CSSアンカーポジショニング:驚くべき機能ですが、いくつかの難しい問題があります。 FlexBoxやグリッドのようなゲームチェンジャーではありませんが、何十年もの間、CSSのポジショニングのギャップを埋めます。ただし、不可解な振る舞いにつながるいくつかのユニークな特性もあります。この記事では、長い間私を悩ませてきたアンカーの位置決めの問題を探ります。
私は1か月前にこの問題を発見しました。他の誰かのアンカーポジショニングのケース、特に「アンカーポジショニングとスクロール駆動型アニメーション」に関するTemani Afifの記事を読みました。この記事を読んで、何が私の注意を引いたかを見ることを強くお勧めします。彼は、アンカーポジショニングとスクロール駆動型アニメーションを巧みに組み合わせて、進行状況が変わるにつれて色を変えるレンジスライダーを作成します。
さらに驚くべきことは、彼が同じアンカー名を持つ2つのターゲット要素を使用していることです。各要素は、魔法のような対応するアンカーポイントに取り付けられています。これがそれほど面白くないように見える場合は、アンカーポジショニングがどのように機能するかを簡単に確認する必要があります。CSSアンカーポジショニングとアンカースコープ属性
アンカーポジショニングは、CSSに2つの新しい概念をもたらします:
アンカーポイント要素とターゲット要素。アンカーは、他の要素を見つけるために使用される参照要素です。ターゲット要素は、1つ以上のアンカーポイントに対して絶対に配置される要素です。
アンカーとターゲットはほぼすべての要素になる可能性があります。それらを並べて2つのdivを配置すると考えることができます。最初に、
<code><div>anchor</div> <div>target</div></code>
anchor-name
次に、絶対に配置された要素の
<code>.anchor { anchor-name: --my-anchor; }</code>
position-anchor
position-area
これはうまく機能しますが、より多くのアンカーとターゲットを含むようにマーカーを変更すると、状況は複雑になります。
<code>.target { position: absolute; position-anchor: --my-anchor; position-area: top right; }</code>
<code></code>
ターゲット要素は、その最も近いアンカーポイントには取り付けられていませんが、すべてがDOMの最後の登録アンカーポイントに積み上げられています。
この問題を解決するために、anchor-scope
属性がChrome 131に導入されました。各ターゲットが適切に取り付けられるように、アンカーポイントの範囲をサブツリーに制限します。しかし、私はこのプロパティに注意を払いたくありません。なぜなら、最初に私の注意を引いたのは、Temaniがそれを使用していないということだったからです。何らかの理由で、すべてのターゲットは魔法のように正しく添付されています。
とそれに対応する追加のターゲットを持つ2つのアンカーが表示されます。これらはすべて、anchor-name
属性を使用しません。どうしたの? anchor-scope
ブロックが含まれています。
アンカーの位置については、要素がブロックを構築する方法に大きく依存することに注意する必要があります。これは、アンカーポジショニング自体の固有の特性ではなく、絶対的な位置決め特性です。絶対に配置された要素は、その封じ込めブロックに対して位置付けられますが、、top: 0px
、left: 30px
のようなマージン属性は、含有ブロックの境界の周りに要素を移動して、いわゆるinset: 1rem
変更されたインクルージョンブロックを作成します。
position-area
通常、絶対的な位置決め要素の含まれるブロックはビューポート全体ですが、
)によって変更できます。 Temaniは、この事実を利用して、各スライダーの新しいインクルードブロックを作成して、対応するアンカーポイントにのみ接続できるようにします。コードを見ると、最初にそれを見つけることができます:static
relative
<code><div>anchor</div> <div>target</div></code>
別の質問
属性を使用して各アンカーをそれぞれのターゲットに添付する代わりに、絶対要素の含有ブロックを計算する方法を活用します。ただし、追加のコードは必要ありません。
anchor-scope
ドライブのアニメーションとアンカーポジショニングのスクロールを同時に実験したときにこれを発見し、テキストバブルの脚注を投稿の側面に添付しようとしました。
を持つ複数のアンカーがあることを意味します。結果:すべてのターゲットが最後のアンカーに積み重ねられます:
これは、コメントごとに新しいコンテンツブロックを作成する以前の方法で解決できます。ただし、別のアプローチをとることができます。これを還元主義的アプローチと呼んでいます。問題は、同じanchor-name
を持つ複数のアンカーがある場合に発生するため、すべてのターゲットに共通のアンカーになる可能性のある要素を使用して、アンカーの数を1つに減らします。
元の投稿がどのように行われたかをよりよく確認できます!
結論
以上がさらに別のアンカーポジショニング癖の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。