细节与边界:规范角落里的 fine print
主线能力见本系列其他各页。这一页收集容易出错、容易记混的细节——多数来自规范与 MDN 的边角,其中几条还实测过(浏览器真实行为有时和「常听说的」不一样)。
1 · ⚠️ 最重要的限制:锚要「先于」浮层(siblings, anchor first)
本系列(和很多教程)常说「浮层放哪都行、跨 DOM 层级都能对齐」——这一说法并不严谨。Chris Coyier 专门写过这条限制:浏览器布局偏向单遍完成,轮到浮层时它引用的锚最好已经布局好。规范与早期实现据此要求两条:
- DOM 顺序:锚排在浮层前面;把浮层写在锚之前,旧实现里
anchor()会解析不到而静默失败(不报错,只是不贴)。 - 包含块:浮层的包含块要能"包住"那个锚,否则也连不上。
下面这对是兄弟。点按钮调换它俩的 DOM 顺序,看你这个浏览器怎么处理(读数会实测当前是否还锚得住):
最稳妥的写法(James Stuckey Weber):让锚和浮层做兄弟、锚放前面(锚 position: static、浮层 position: absolute)。本系列「画连接线」页就是特意把连接线放在两个气泡之后,正合这条。新版 Chromium 已放宽这个限制(乱序也能锚)——但不应依赖:为跨浏览器 / 旧版稳妥,始终按 siblings-first 写。Chris 也希望 CSS 之后能加「第二遍解析」彻底消解它。
2 · 一个元素可以挂多个 anchor-name
anchor-name 语法很像 CSS 自定义属性(以 -- 开头),但它不是变量——别套 var()。一个元素可以同时起多个名字,逗号分隔,于是它能被不同浮层用不同身份引用:
3 · 隐式 vs 显式:两种绑定锚的写法
引用锚有两条路,经常混着用:
4 · 实测:锚被「隐藏」时,浮层会怎样?
常听说「锚一隐藏,浮层就跟着没」。实测发现要分情况——三种「隐藏」效果并不一样。点按钮给锚施加不同隐藏方式,看浮层的反应:
实测结论(Chromium):display:none 与 content-visibility:hidden 会让锚不再生成盒子,于是 anchor() 失效——浮层不是消失,而是退回默认(未锚定)位置;visibility:hidden
的锚仍占布局,浮层照常贴着它(看不见的锚也能当锚)。
若希望「锚消失时浮层也一起隐藏」:不靠隐藏锚,而是显式声明联动:用 position-visibility: anchors-visible(「溢出回退」页)让浮层随锚一起隐藏;或给 anchor() 加 fallback 值,让它在锚失效时退回指定位置。
5 · 实测:inset 和 position-area 同时写,谁优先?
浮层上既写了 top/left(inset),又写了 position-area,两者如何取舍?勾一下,看那个一直挂着 top:8px; left:8px 的浮层,被 position-area 接管后跳到哪:
结论:position-area 一旦生效,就盖过 inset。换句话说——同时存在时 position-area 优先,inset 被忽略。想用 inset 精调,就别同时写 position-area(或改用 anchor() 写进 inset 里)。
6 · anchor() / anchor-size() 能用在哪、维度有哪些
anchor() 返回锚某条边的位置,只能用在 inset 属性里;anchor-size() 返回锚的尺寸,可用在 size / inset / margin 上,适用面更广,甚至能用在非定位元素。
两个易忘点:其一,anchor-size() 的浮层若没显式设尺寸,默认按 max-content 撑开;其二,inset 全集都能放 anchor():inset / inset-block / inset-inline / inset-*-start|end。
7 · 辨析:它「改变了包含块」吗?
常见说法:「anchor positioning 改变了被定位元素的包含块,让它相对锚而非最近定位祖先布局。」——这句话容易让人误会。更准确地说:浮层仍在它原本的包含块里布局(absolute 看最近定位祖先,fixed 看视口),只是 anchor() / position-area
把锚的几何当作计算 inset 的参照。所以本系列各页才反复强调:浮层放哪(DOM/包含块) 与 它看起来贴着谁(锚) 是两回事。
8 · position-area 取值速查
把可用取值梳理成一张速查(部分反直觉,尤其 span-*):
- 单关键字简写:
top≡top span-all(贴上、横向铺满);center≡center center(盖在锚上)。 -
两关键字:
top left/center/right、、left/right + center/span-top/span-bottom。 -
span- 是「向哪个方向横跨」,结果常和直觉相反*:
top span-left= 向左铺 → 浮层右对齐到锚;top span-right= 向右铺 → 左对齐;span-all= 该轴铺满。 - 逻辑关键字(随书写方向):
block-start/block-end/inline-start/inline-end;start/end(= block/inline 的 start/end);span-start/span-end;span-inline-start|end/span-block-start|end。 - 物理轴:
x-start/x-end、y-start/y-end。 - 对齐微调:
align-self/justify-self(及place-self/place-items)取anchor-center,可用在 absolute / fixed 上让浮层在锚上居中。
旧名提醒:position-area 早期叫 inset-area;position-try-fallbacks 也有简写 position-try: <order> <fallbacks>。旧文 / 旧 Chromium 里都可能见到。
这一页的价值:主线能力在系列各页;这里补的是「真上手才会遇到」的边角——隐藏锚的真实行为、inset/position-area 的优先级、anchor-size 的默认尺寸、span-* 的反直觉对齐。掌握它们能避免不少排查成本。