アバターに追従する通知バッジ
ラッパー div に position: relative を付けることなく、アバター画像の右上角に小さな通知カウントバッジを固定する。
UI Patterns
詳細な説明
旧来のアプローチ
アンカーポジショニング以前は、アバターを position: relative のコンテナでラップして、絶対配置のバッジを角に置く必要がありました:
<div style="position: relative; display: inline-block;">
<img src="avatar.png" />
<span style="position: absolute; top: -4px; right: -4px;">3</span>
</div>
これは動きますが、マークアップが汚れます。アンカーポジショニングならラッパーをスキップできます:
<img class="avatar" id="avatar-1" src="avatar.png" />
<span class="badge" id="badge-1">3</span>
.avatar {
anchor-name: --av-1;
}
.badge {
position: absolute;
position-anchor: --av-1;
position-area: top-end;
transform: translate(40%, -40%); /* 角に微調整 */
background: var(--error);
color: white;
border-radius: 999px;
padding: 0 6px;
font-size: 11px;
line-height: 18px;
min-width: 18px;
text-align: center;
}
角の微調整
position-area: top-end でバッジの左下角がアバターの右上角に合います。transform: translate(40%, -40%) はバッジの幅の40%右、高さの40%上に微移動します — これでバッジがアバターの角にまたがる形になります。お好みで調整:
translate(50%, -50%)— 角に正確に中央translate(30%, -30%)— アバター内側寄りtranslate(80%, -80%)— アバター外側寄り(「ぶら下がる」バッジ風)
なぜ flip フォールバックを使わない?
アバターバッジは反転すべきではありません — アバターの上にあるバッジが時々下にあるのは視覚的に一貫性を欠きます。ここでは position-try-fallbacks をスキップしてください。祖先の overflow をクリップしてもバッジは角に留まりますが、ほとんどのレイアウトではアバターラッパーに余裕があるため問題ありません。
複数のバッジ
プレゼンスインジケーター(オンラインドット)と通知カウント(未読数)を両方表示する場合、それぞれ異なる position-area を割り当てます:ドットには bottom-end、カウントには top-end。両方とも同じアンカーをターゲットにできます。
ユースケース
チャットアバター上の未読メッセージ数、アプリバーアイコン上の通知ドット、ユーザープロフィール画像のステータスインジケーター(オンライン/オフライン/離席)、アップデートボタンのバージョン更新マーカー、フォームタブラベルのエラー数。