CSS 与布局 / CSS Anchor Positioning · 把元素钉在另一个元素旁 / 溢出回退与 @position-try 待审核 4 / 7
position-try · 自动翻转

溢出回退与 @position-try

浮层默认贴在锚的上方;锚已经贴着视口顶边时,浮层会被挤出可视区。position-try-fallbacks 用于声明一串「首选位置不行就换这个」的候选,浏览器自动挑第一个放得下的。本页的首选位置沿用 position-area 页的九宫格关键字。

当前浏览器对 anchor positioning 的实测支持情况,由 CSS.supports() 探测。

1 · 内置翻转关键字

浮层首选 position-area: top center。锚贴到顶边时上方放不下,浮层按候选列表翻到下方;贴到侧边时横向同样会翻。

图 1-1 · 锚移到取景框各条边缘时浮层的翻面行为。可拖动锚并切换回退策略,对照不同候选列表的差异。

注 · 内置关键字有三个:flip-block 沿块轴镜像,通常表现为上下翻;flip-inline 沿行内轴镜像,通常表现为左右翻;flip-start 沿主对角线交换两轴,适合「右下与左上」之间的切换。逗号分隔表示多个候选依次尝试,空格连写表示同一个候选里同时翻两个方向。

2 · @position-try 的具名候选

内置翻转只做镜像。回退时若要改尺寸、改对齐或换一套完全不同的摆法,用 @position-try 定义具名候选,再写进 position-try-fallbacks,图 1-1 下拉里的 --compact-below 即出自此。

图 2-1 · 一条 @position-try 具名候选的定义及其生效后的浮层形态。可对照候选内改写的属性与浮层的实际变化。

3 · position-try-order 的选取策略

默认从首选开始,取第一个不溢出的候选。若更希望「哪个候选给浮层的空间最多就用哪个」,设 position-try-order: most-height,另有 most-width / most-block-size / most-inline-size。内容较多、希望尽量展开的长菜单适用这一档。图 1-1 的下拉也可调这个属性。

4 · position-visibility 与锚的可见性

锚滚出可视区后,浮层若仍停在原地会造成误导。position-visibility: anchors-visible 让浮层随锚一起隐藏,no-overflow 则在浮层自身溢出时隐藏。

图 4-1 · 锚滚出可视区时浮层的两种处置。可滚动小框把绿标签的锚移出视野,观察浮层的隐藏时机。

建议 · 一套完整的组合是:先用 position-area 摆一个理想位,再用 position-try-fallbacks 给两三个翻转候选,需要时用 position-try-order 选空间最大的,最后加 position-visibility: anchors-visible 处理锚不可见的情形。贴边自适应到此不必再写 JS。position-try 简写可以把顺序与候选写在一起:position-try: <order> <fallbacks>