溢出回退:position-try-fallbacks / @position-try
浮层默认贴在锚上方;当锚已经贴着屏幕顶时,浮层会被挤出可视区。position-try-fallbacks 让你声明一串「首选位置不行就换这个」的候选位置,浏览器自动挑第一个放得下的。本页的首选位置写法用到 position-area 页的九宫格关键字。
1 · 拖锚到取景框边缘,看浮层自己翻面
浮层首选 position-area: top center(正上方)。把锚拖到顶边——上方放不下,它按候选列表翻到下方;拖到侧边——横向也会翻。下拉切换不同回退策略,对比差异:
内置翻转关键字:flip-block(沿块轴/通常是上下镜像)、flip-inline(沿行内轴/通常是左右镜像)、flip-start(沿主对角线交换两轴,做「右下↔左上」很顺)。逗号分隔 = 多个候选依次尝试;空格连写 = 一个候选里同时翻两个方向。
2 · @position-try:完全自定义一套位置
内置翻转只是镜像。要在回退时改尺寸、改对齐、用完全不同的摆法,就用 @position-try 定义具名候选,再写进 position-try-fallbacks(上面下拉里那个 --compact-below 就是它):
3 · position-try-order:不止「第一个能放下的」
默认浏览器从首选开始、挑第一个不溢出的。若你更想要「哪个候选能给浮层最多空间就用哪个」,设 position-try-order: most-height(或 most-width / most-block-size /
most-inline-size)。适合内容多、希望尽量展开的长菜单。上面的下拉也能调它。
4 · position-visibility:锚滚出视口时隐藏浮层
锚滚出可视区后,浮层若仍停在原地会造成误导。position-visibility: anchors-visible 让浮层跟着锚一起消失;no-overflow 则在浮层自身溢出时隐藏。滚动下面的小框,把绿标签的锚滚出去看效果:
组合用法:首选 position-area 摆一个理想位 → position-try-fallbacks 给两三个翻转候选 → 需要时 position-try-order 选空间最大的 → 加 position-visibility: anchors-visible 处理锚不可见的情况。这一套下来,几乎不需要再写 JS
去处理「贴边自适应」。