CSS锚点定位

W3C 工作草案,

关于本文档的更多信息
该版本:
https://www.w3.org/TR/2025/WD-css-anchor-position-1-20250509/
最新发布版本:
https://www.w3.org/TR/css-anchor-position-1/
编辑者草案:
https://drafts.csswg.org/css-anchor-position-1/
历史记录:
https://www.w3.org/standards/history/css-anchor-position-1/
反馈:
CSSWG 问题库
规范内反馈
编辑者:
Tab Atkins-Bittner (Google)
Elika J. Etemad / fantasai (Apple)
Ian Kilpatrick (Google)
前编辑者:
Jhey Tompkins (Google)
建议对本规范进行编辑:
GitHub 编辑器

摘要

本规范定义了锚点定位, 即定位元素可以根据页面上一个或多个“锚点元素”进行尺寸和位置的调整。

CSS是一种用于描述结构化文档(如HTML和XML)在屏幕、纸张等媒介上渲染方式的语言。

本文档状态

本部分描述了本文档在发布时的状态。 当前W3C出版物列表及本技术报告的最新修订版, 可在W3C标准与草案索引 https://www.w3.org/TR/中找到。

本文档由CSS工作组作为工作草案, 按照推荐流程发布。 发布为工作草案并不意味着W3C及其成员对其认可。

这是一个草案文档, 可能随时被更新、替换或废止。 除非作为正在进行的工作,否则不应引用本文档。

请通过在GitHub提交问题(推荐)反馈, 标题中包含规范代码“css-anchor-position”,例如: “[css-anchor-position] …评论摘要…”。 所有问题和评论都会被存档。 或者,也可以发送反馈至(有存档)公共邮件列表www-style@w3.org

本文件受2023年11月3日W3C流程文件约束。

本文件由遵守W3C专利政策的工作组制作。 W3C维护了与工作组交付物相关的专利公开名单; 该页面还包含专利披露说明。 如果个人知晓某项专利且认为其包含必要声明, 则必须按照W3C专利政策第6节披露相关信息。

1. 引言

CSS 绝对定位允许作者将盒子放置在页面的任意位置, 而无需考虑除其包含块之外其他盒子的布局。 这种灵活性非常有用,但也很有限——很多时候你希望相对于某个其它盒子进行定位。锚点定位 (通过position-anchorposition-area属性 以及/或锚点函数 anchor()anchor-size()) 允许作者实现这一点, 即将绝对定位的盒子“锚定”到页面上的一个或多个其他盒子 (其锚点引用), 同时还允许尝试多个可能的位置, 以找到可以避免重叠/溢出的“最佳”位置。

例如,作者可能希望将工具提示定位在目标元素的上方并居中, 除非这样会导致工具提示超出屏幕, 此时应该将其放在目标元素下方。 可以通过以下CSS实现:
.anchor {
  anchor-name: --tooltip;
}
.tooltip {
  /* Fixpos 表示我们无需担心包含块关系;
     工具提示可以存在于DOM的任何地方。 */
  position: fixed;

  /* 所有锚定行为都将默认为引用 --tooltip 锚点。 */
  position-anchor: --tooltip;

  /* 将工具提示的底部对齐到锚点的顶部;
     同时默认为水平居中对齐工具提示与锚点(在水平书写模式下)。 */
  position-area: block-start;

  /* 若工具提示溢出窗口则自动切换,
     使工具提示顶部对齐到锚点底部。 */
  position-try: flip-block;

  /* 防止工具提示过宽 */
  max-inline-size: 20em;
}

1.1. 值定义

本规范遵循CSS属性定义约定, 并采用[CSS2]中的值定义语法, 参考[CSS-VALUES-3]。 未在本规范中定义的值类型将在 CSS 值与单位 [CSS-VALUES-3]中定义。 与其他CSS模块组合可能会扩展这些值类型的定义。

除了各属性定义中列出的特定属性值外, 本规范定义的所有属性也接受CSS全局关键字作为属性值。 为了易读性未显式重复列出。

与CSS中大多数选择器匹配之外的操作类似, 本规范中的特性作用于扁平化元素树

2. 锚点的确定

2.1. 创建锚点:anchor-name 属性

名称: anchor-name
值: none | <dashed-ident>#
初始值: none
适用于: 所有生成principal box的元素
是否继承: no
百分比: n/a
计算值: 按指定
规范顺序: 按语法
动画类型: 离散型

anchor-name 属性声明 元素是一个锚点元素, 其principal box是一个锚点盒, 并为其指定可被引用的一组锚点名称。 值定义如下:

none

该属性无任何效果。

<dashed-ident>#

如果元素生成了principal box, 则该元素为锚点元素, 并包含一组指定的锚点名称。 每个 锚点名称 都是树作用域名

否则,该属性无任何效果。

锚点名称不需要唯一。 并不是所有元素都能成为 某个盒子的目标锚点元素。 因此如果使用范围合适,名称可以在多个地方复用。

注意: 如果多个元素共享同一个锚点名称且都对某个定位盒可见, 目标锚点元素将是 DOM 顺序最后的那个。 可以使用 anchor-scope 属性进一步限制对某个引用盒可见的名称。

锚点名称默认包裹性的作用域限制; 即使某个元素具有样式布局包裹(或类似包裹), 其子元素的锚点名称对页面其他元素依然可见。

注意: 当一个元素位于另一个元素的跳过内容区域 (比如由于content-visibility: hidden), 它不会是一个可用锚点元素, 实际效果等同于没有名称。

2.1.1. 隐式锚点元素

某些规范可以定义,在特定情况下, 某个元素是另一个元素的隐式锚点元素

TODO: 待补充新弹窗相关示例 (等HTML规范正式发布后)。

隐式锚点元素可以通过 auto 关键字在position-anchor中引用, 或在锚点函数中省略锚点引用进行引用。

伪元素隐式锚点元素是其源元素,除非另有规定。

2.1.2. 锚点的位置

本规范的若干特性会引用锚点盒的位置和尺寸。 锚点盒的位置和尺寸在布局后确定, 并且在这些场景下会包含position相关的调整 (如 position: relativeposition: sticky)。

布局后的效果(如transform) 不会影响锚点盒的位置。

注意: 允许锚点选择是否包含 transform 或类似属性的影响 未来可能会被允许。

2.2. 锚点名称作用域:anchor-scope 属性

名称: anchor-scope
值: none | all | <dashed-ident>#
初始值: none
适用于: 所有元素
是否继承: no
百分比: n/a
计算值: 按指定
规范顺序: 按语法
动画类型: 离散型

该属性将指定的锚点名称以及对这些锚点名称的查找, 限定在此元素的子树范围内。 详见§ 2 锚点的确定

各值含义如下:

none
锚点名称作用域无变化。
all
指定该元素及其后代定义的所有锚点名称(未被后代通过anchor-scope限定作用域的),仅对该元素的后代可见; 并限制后代仅能匹配本子树内的锚点名称锚点元素

该值仅影响同一树作用域下的锚点名称, 就像它是一个树作用域名一样。 (即 anchor-scope: allanchor-scope: --foo, --bar, ... 列出所有相关锚点名称时效果一致。)

<dashed-ident>
指定该元素及其后代定义的匹配锚点名称(未被后代通过anchor-scope限定作用域),仅对该元素的后代可见; 并限制后代仅能匹配这些锚点名称至本子树内的锚点元素<dashed-ident> 是一个树作用域名

注意: 根据 [css-scoping-1], 当比较两个树作用域名时, 只有它们来自同一树时才匹配。

该属性对隐式锚点元素无效。

当某个设计模式被复用时,anchor-scope可以防止相同组件之间命名冲突。 例如,如果一个列表中每个列表项都包含定位元素, 并且这些定位元素希望相对于其所在的列表项进行定位,
li {
  anchor-name: --list-item;
  anchor-scope: --list-item;
}
li .positioned {
  position: absolute;
  position-anchor: --list-item;
  position-area: inline-start;
}

如果没有 anchor-scope, 所有 li 元素都会对所有定位元素可见, 所以它们都会相对于最后一个 li 进行定位,最终堆叠在一起。

2.3. 查找锚点

本规范中的若干内容 会根据一个锚点说明符 查找目标锚点元素, 该说明符可以是一个<dashed-ident>(也是一个树作用域引用), 应匹配页面其他地方的anchor-name属性值, 或关键字auto, 或不指定(说明符缺失)。

注意: 这些条件所体现的一般规则是, 一个元素只有在自身盒已完全布局于欲引用它的定位盒之前, 才能作为该定位盒的目标锚点元素。 CSS 的布局规则对此提供了一些有用的保证, 具体取决于锚点与定位盒之间及其包含块的关系。 下列条件列表 就是将堆叠上下文规则 精确转述为本用途相关的内容, 可确保锚点定位没有循环依赖的可能。

要确定查询元素 query el 和可选锚点说明符 anchor spec对应的目标锚点元素
  1. 如果未传递anchor spec, 则返回默认锚点元素(如存在),否则返回空。

  2. 如果anchor specauto

    1. 如果弹窗API为query el定义了一个隐式锚点元素,且该元素对query el可用锚点元素, 则返回该元素。

    2. 否则,返回空。

    注意: 未来的API也可能定义隐式锚点元素。 届时会在该算法中显式处理,以确保协调。

  3. 否则,anchor spec<dashed-ident>。 返回树顺序中最后一个满足如下条件的元素el

    如果没有元素满足上述条件,则返回空。

    注意: anchor-scope可以限制某些锚点名称的可见性, 从而影响哪些元素可以作为某次查找的锚点元素

注意: 不同anchor-name样式在不同影子树下不会被其它锚点函数样式看到, 保证封装性。 但不同影子树下的元素仍可以相互锚定, 只要anchor-name锚点函数来自同一树的样式, 比如使用::part()对影子内部元素进行样式设置。 (隐式锚点元素也不一定受限于单一树, 但具体细节取决于分配它们的API。)

若元素possible anchor对一个绝对定位元素positioned el同时满足以下条件,则为可用锚点元素

2.4. 默认锚点:position-anchor 属性

名称: position-anchor
值: auto | <anchor-name>
初始值: auto
适用于: 绝对定位盒
是否继承: no
百分比: n/a
计算值: 按指定
规范顺序: 按语法
动画类型: 离散型

position-anchor 属性指定默认锚点元素, 它被 position-areaposition-try, 以及(默认情况下)应用于该元素的所有锚点函数所使用。 position-anchor仅重置子属性, 属于 position 属性的一部分。

auto

如果存在,则使用隐式锚点元素; 否则该盒没有默认锚点元素

<anchor-name>

由指定的目标锚点元素(选中的<anchor-name>)作为该盒的默认锚点元素

默认锚点元素principal box 即该盒的默认锚点盒

例如,下面的代码中 .foo.bar 元素 都可以使用相同的定位属性, 只是更改了它们引用的锚点元素:
.anchored {
  position: absolute;
  top: calc(.5em + anchor(outside));
  /* 未指定锚点名称,
     将自动引用默认锚点盒。 */
}

.foo.anchored {
  position-anchor: --foo;
}
.bar.anchored {
  position-anchor: --bar;
}

2.5. 锚点相关性

在判断元素 el 是否对用户相关时, 如果 el 的某个后代是一个目标锚点元素,用于某个定位盒 (该定位盒本身没有被跳过,且其包含块不是 el 或其后代), 那么 el 必须被视为对用户相关

注意: 这意味着例如, 在一个content-visibility: auto 子树中的锚点, 只要有定位盒依赖它且该定位盒未被跳过, 就会阻止其子树跳过内容。 (除非锚点和定位盒都在同一个 content-visibility: auto 元素下; 它们不能循环地让彼此保持可见。)

3. 基于锚点的定位

一个绝对定位盒可以相对于页面上的一个或多个锚点盒进行定位。

position-area 属性提供了一种基于网格的便捷定位方式, 可以相对于默认锚点盒定位; 若需要更复杂或相对于多个盒子的定位, 可以在内边距属性中使用 anchor() 函数,显式引用某个锚点盒的边。

3.1. position-area 属性

名称: position-area
值: none | <position-area>
初始值: none
适用于: 具有默认锚点盒的定位盒
是否继承: no
百分比: n/a
计算值: 关键字none或一对关键字,详见 § 3.1.3 <position-area> 的计算值与序列化
规范顺序: 按语法
动画类型: 待定

锚点定位的多数常见用例只关注定位盒的包含块边缘和默认锚点盒的边缘。 可以把这些线看作定义了一个3×3网格;position-area让你可以方便地指定 将定位盒布局在该position-area 网格的哪个区域。

position-area: top lefthorizontal-tb ltr 书写模式中的定位示例。
none

该属性无效果。

<position-area>

如果该盒没有默认锚点盒, 或不是绝对定位盒, 该值无效果。

否则,选择position-area 网格的一个区域, 并将其作为该盒的包含块

注意: 这意味着内边距属性定义的是相对于 position-area 的偏移, 某些属性值, 如 max-height: 100%, 也会相对于 position-area。

除了none以外的值还有如下附加效果:

3.1.1. 解析定位区域网格

定位区域网格 是一个3×3网格, 每个轴由四条网格线组成。 顺序如下(使用包含块的书写模式):

注意:默认锚点盒部分或全部在修改前包含块之外时, 定位区域网格的某些行或列可能为零尺寸。

3.1.2. <position-area>值的语法

位置由一对值指定, 可用流向相关物理术语表达。 <position-area>值的允许语法为:

<position-area> = [
  [ left | center | right | span-left | span-right
  | x-start | x-end | span-x-start | span-x-end
  | x-self-start | x-self-end | span-x-self-start | span-x-self-end
  | span-all ]
  ||
  [ top | center | bottom | span-top | span-bottom
  | y-start | y-end | span-y-start | span-y-end
  | y-self-start | y-self-end | span-y-self-start | span-y-self-end
  | span-all ]
|
  [ block-start | center | block-end | span-block-start | span-block-end | span-all ]
  ||
  [ inline-start | center | inline-end | span-inline-start | span-inline-end
  | span-all ]
|
  [ self-block-start | center | self-block-end | span-self-block-start
  | span-self-block-end | span-all ]
  ||
  [ self-inline-start | center | self-inline-end | span-self-inline-start
  | span-self-inline-end | span-all ]
|
  [ start | center | end | span-start | span-end | span-all ]{1,2}
|
  [ self-start | center | self-end | span-self-start | span-self-end | span-all ]{1,2}
]

<position-area>值通过如下方式指定所占的行和列,来选择定位区域网格的区域:

start, end, self-start, self-end
top, bottom, left, right
y-start, y-end, y-self-start, y-self-end
x-start, x-end, x-self-start, x-self-end
block-start, block-end, self-block-start, self-block-end
inline-start, inline-end, self-inline-start, self-inline-end
center

对应的单行或单列, 取决于该关键字指定的是哪个轴。

anchor()函数, 纯逻辑关键字 (startend等) 指的是盒子的包含块的书写模式。 x-start等则按照指定的物理轴确定方向。

self-*逻辑关键字 (self-startx-self-end等) 与前者一致, 但指盒子自身的书写模式

span-start, span-end, span-self-start, span-self-end
span-top, span-bottom
span-y-start, span-y-end, span-y-self-start, span-y-self-end
span-x-start, span-x-end, span-x-self-start, span-x-self-end
span-block-start, span-block-end, span-self-block-start, span-self-block-end
span-inline-start, span-inline-end, span-self-inline-start, span-self-inline-end

两个相邻的行或列, 取决于该关键字指定的是哪个轴: 包含中心行/列, 以及与此关键字另一半对应的行/列(参照单轨关键字)。

(例如,span-top跨越前两行——中心行和顶部行。)

span-all

三行或三列全部, 取决于该关键字指定的是哪个轴。

某些关键字在指代轴向时存在歧义:centerspan-all, 以及未明确指定块或内联轴的start等关键字。 如果另一个关键字对其轴向没有歧义, 则含糊关键字指代相反轴向。 (例如,block-start center中的center指代内联轴。) 如果两个关键字都含糊, 第一个指盒子的包含块的块轴, 第二个指内联轴。 (例如,span-all start等价于span-all inline-start。)

若只提供一个关键字, 如果该关键字对其轴向没有歧义,则其行为等同于第二个关键字为span-all; 否则,行为等同于该关键字重复一次。 (例如,top等价于top span-all, 而center等价于center center。)

3.1.3. <position-area> 的计算值与序列化

计算值<position-area>值中指示每个轴所选轨道的两个关键字, 长逻辑关键字(如 block-start)与短逻辑关键字(如 start)视为等价。 序列化时按语法顺序(见上文),逻辑关键字以短形式序列化 (例如 start start 而不是 block-start inline-start)。

3.1.4. 区域默认对齐方式

每个<position-area>也隐含一个默认自对齐方式, 当盒子的自对齐属性normal时会被采用:

例如, 假设为英文等效书写模式(horizontal-tb,ltr), span-x-start top 的值会解析为 垂直轴的 start 区域, 以及水平轴的 startcenter 区域, 因此默认对齐方式会是 align-self: end(使盒子的底部外边距边缘top 区域底部齐平) 和 justify-self: end(使盒子的结束侧外边距边缘span-start 区域结束侧齐平)。
如果盒子溢出了其内边距修饰包含块, 但仍能适应其原始包含块, 默认会“移动”以保持在原始包含块内, 即使这违背了正常对齐方式。 详见 CSS Box Alignment 3 § 4.4 溢出对齐:安全与不安全关键字及滚动安全限制

此行为提高了定位盒子可见性和在预期范围内的可能性, 即使其包含块最终比预期小。

例如,position-area: bottom span-right值 可让定位盒从锚点的左边到包含块的右边拉伸, 并默认左对齐。 但如果定位盒比该空间还大 (如锚点非常靠近屏幕右侧), 它会向左移动以保持可见。

3.2. 锚点居中:anchor-center 对齐值

名称: justify-self, align-self, justify-items, align-items
新值: anchor-center

自对齐属性允许绝对定位盒内边距修饰包含块内对齐自身。 现有值结合精心选择的内边距属性, 通常已足够实现常见对齐需求, 但对于锚点定位中的常见场景——居中于锚点盒——往往需要复杂的设置。

anchor-center值 让此场景极其简单: 如果定位盒拥有默认锚点盒, 则会在相关轴上(尽可能)居中于默认锚点盒

此外, 任何auto 内边距属性 会解析为 0

若盒子不是绝对定位, 或没有默认锚点盒, 则该值行为如center,对内边距属性无额外影响。

注意: 使用anchor-center时,默认情况下 如果锚点太靠近盒子的原始包含块边缘, 会“移动”以保持在原始包含块内, 详见 CSS Box Alignment 3 § 4.4 溢出对齐:安全与不安全关键字及滚动安全限制

3.3. 锚点相对内边距:anchor() 函数

绝对定位盒可以在其内边距属性中使用anchor()函数, 用来引用一个或多个锚点盒的位置。 anchor()函数会解析为<length>。 只能用于内边距属性(其他地方无效)。

名称: top, left, right, bottom
新增值: <anchor()>
<anchor()> = anchor( <anchor-name>? && <anchor-side>, <length-percentage>? )
<anchor-name> = <dashed-ident>
<anchor-side> = inside | outside
       | top | left | right | bottom
       | start | end | self-start | self-end
       | <percentage> | center

anchor()函数有三个参数:

anchor()函数表示可解析锚点函数时,会在计算值阶段 (使用样式与布局交错), 解析为使定位盒的内边距修饰包含块边缘 与目标锚点元素指定边界线对齐的<length>, 假定所有滚动容器目标锚点元素与定位盒的包含块之间都处于初始滚动位置 (详见 § 3.4 考虑滚动)。

注意: 这意味着使用transition动画的属性,只要用到锚点函数,各种变化都能“按预期”工作: 锚点盒移动、锚点元素被添加或移除、 anchor-name属性变化等。

如果目标锚点元素分片, 则使用分片边框盒的轴对齐包围矩形。

例如, .bar { inset-block-start: anchor(--foo block-start); } 中, anchor() 会解析为使 .bar 元素的 block-start 边 与 --foo 锚点的 block-start 边对齐的长度。

另一方面, .bar { inset-block-end: anchor(--foo block-start); } 中, 会解析为使 .bar 元素的 block-end 边 与 --foo 锚点的 block-start 边对齐的长度。

由于inset-block-startinset-block-end值分别指定从元素包含块的 block-start 和 block-end 边的内边距, 同一个anchor()通常在每个属性中解析为不同的长度。

由于anchor()函数解析为<length>, 它可以像其他长度一样用于数学函数

例如,以下代码会让元素的内边距修饰包含块锚点盒上居中,并且最大宽度不会溢出包含块

.centered-message {
  position: fixed;
  max-width: max-content;
  justify-self: center;

  --center: anchor(--x 50%);
  --half-distance: min(
    abs(0% - var(--center)),
    abs(100% - var(--center))
  );
  left: calc(var(--center) - var(--half-distance));
  right: calc(var(--center) - var(--half-distance));
  bottom: anchor(--x top);
}

这对于一个错误信息, 比如用于 input 元素时, 是比较合适的, 因为居中会更容易让用户发现对应的输入框。

3.3.1. anchor() 的解析

只有以下所有条件均成立时,anchor() 函数才是一个可解析锚点函数

如果以上任一条件不成立, anchor() 函数会取其回退值作为计算值。 如果未指定回退值, 则引用它的声明在计算值阶段无效

3.4. 考虑滚动

出于性能考虑, 实现通常会在单独的滚动/合成线程上执行滚动, 该线程能力有限 (仅支持简单的移动、变换等,无布局等高耗操作), 因此可以保证对滚动的响应足够快,被认为是“瞬时”的。

如果滚动只会让锚点定位元素移动, 理论上没有问题; 移动可以在滚动线程上完成, 定位元素会随滚动内容平滑移动。 但锚点定位允许元素 让自身相对边缘的位置依赖于不同滚动上下文中的内容, 这意味着滚动可能只会移动某一个边缘并导致尺寸变化, 从而触发布局。 这无法在滚动线程上完成!

为兼顾锚定灵活性, 锚点定位采用了 记忆滚动偏移滚动补偿 的结合方案。

具体细节较为技术化,关键是:

最终效果是锚点定位一般能“正常工作”, 不管锚定到什么元素, 但对于滚动的响应能力可能有限。

对于绝对定位元素,每当该元素开始生成盒子 (即从 display:nonedisplay:contents 切换到其他 display值), 就会发生一个锚点重算点, 与开始运行 CSS 动画的时机相同。

当为某元素确定回退样式时也会发生一次 锚点重算点; 如果因此更改了回退样式, 则与所选回退样式相关的 锚点重算点 结果会被采用。

当某元素 abspos 发生 锚点重算点时, 那么对于 abspos 的每个 anchor(即其锚点引用的元素), 会关联一个记忆滚动偏移, 等于该属性当前的所有滚动偏移 (即所有 滚动容器 祖先, 直到但不包括 abspos包含块)。 记忆滚动偏移还会考虑其它依赖滚动的位置变化, 如 position: sticky。 如果 abspos默认锚点元素, 即使 abspos 实际上没有对其进行 锚点引用, 也总会为其计算一次 记忆滚动偏移

所有锚点引用都按假定所有滚动容器处于初始滚动位置的方式计算, 然后加上对应的记忆滚动偏移

变换(transform)与滚动有同样问题, 因此锚点定位通常也不考虑它们。 是否可以在此直接加入变换影响?

上述机制允许定位元素对其锚点引用的滚动位置响应一次, 但如有滚动发生, 定位元素不再表现为锚定于它们 (但仍会响应非滚动的移动)。 此问题无法普遍解决, 但可以对一个锚点引用的滚动做出响应; 具体来说,是默认锚点元素

绝对定位盒 abspos 满足以下两个条件,则在水平或垂直轴上滚动补偿

注意: 如果 abspos定位选项列表, 则其是否在某轴上进行滚动补偿也受应用的回退样式影响。

abspos默认滚动偏移是水平和垂直轴的一对长度。 每个长度计算如下:

在对 abspos 完成布局后, 还会根据 默认滚动偏移进行额外移动, 效果类似于 transform(早于其它变换)。

明确快照的精确时机: 每帧更新,在样式重算前。

类似 记忆滚动偏移, 是否可以关注 默认锚点元素上的变换?

注意: 记忆滚动偏移影响 anchor() 函数的值,而 默认滚动偏移直接在元素已确定其内边距属性、对齐等后额外移动。 通常效果等同, 但如 round(anchor(outside), 50px) 这样的非线性变换, 会暴露行为差异。

3.5. 条件隐藏:position-visibility 属性

名称: position-visibility
值: always | [ anchors-valid || anchors-visible || no-overflow ]
初始值: anchors-visible
适用于: 绝对定位盒
是否继承: no
百分比: n/a
计算值: 按指定
规范顺序: 按语法
动画类型: 离散型

某些情况下,显示一个绝对定位盒可能没有意义。 本属性允许根据一些常见布局条件对这些盒子进行条件显示。

always

该属性无效果。 (盒子无论锚点或溢出状态如何都显示。)

anchors-valid

如果该盒子的任一必需锚点引用未能解析为目标锚点元素, 则盒子的visibility属性解析为force-hidden

什么是必需锚点引用? anchor() 函数无回退值的情况;默认锚点有时也算? 这里需要更详细的说明。

任一锚点缺失, 还是全部锚点缺失? 两种情况都有用例, 是否要做决定或允许可控?

anchors-visible

如果盒子有默认锚点盒但该锚点盒不可见被中间盒裁剪, 则盒子的visibility属性解析为force-hidden

no-overflow

如果盒子在应用内边距修饰包含块position-try后仍溢出, 则盒子的visibility属性解析为force-hidden

当锚点盒 anchor墨水溢出矩形被某盒子完全裁剪,该盒子是 anchor 的祖先但也是 abspos(依赖该锚点的定位盒)包含块的后代时, 则 anchor 被认为是被中间盒裁剪。 裁剪仅指因overflow或其他效果(如绘制包裹)导致的溢出裁剪边缘裁剪。

注意: 这意味着如果 abspos 与其锚点在 DOM 相邻, 即使默认锚点被滚动出视口,也会保持可见,因为它们共同被同一个滚动容器裁剪。

需要确保裁剪定义与 View Transitions 一致, 后者也需要类似概念。

注意: 这样保证了在“链式锚点”场景下, 如果第一个 abspos 因本属性隐藏(锚点被滚动出视口), 则用它作锚点的另一个 abspos 也被隐藏, 而不是漂浮在不合理的位置。

4. 基于锚点的尺寸

绝对定位盒可以在其尺寸属性中使用anchor-size()函数, 用以引用一个或多个锚点盒的尺寸。 anchor-size()函数会解析为<length>。 仅允许用于允许的 @position-try 属性(其他场景无效)。

4.1. anchor-size() 函数

名称: width, height, min-width, min-height, max-width, max-height, top, left, right, bottom, margin-top, margin-left, margin-right, margin-bottom
新增值: <anchor-size()>
anchor-size() = anchor-size( [ <anchor-name> || <anchor-size> ]? , <length-percentage>? )
<anchor-size> = width | height | block | inline | self-block | self-inline

anchor-size()函数类似于anchor(), 参数一致, 只是 <anchor-side> 关键字被 <anchor-size> 取代, 表示两侧之间的距离。

物理 <anchor-size> 关键字 (widthheight) 分别表示目标锚点元素的宽度和高度。 不同于anchor(),不限制轴向对应关系; 例如 width: anchor-size(--foo height); 是合法的。

逻辑 <anchor-size> 关键字 (blockinlineself-blockself-inline) 会根据盒子的 书写模式 (对于 self-blockself-inline), 或盒子的包含块 书写模式 (对于 blockinline)来映射到物理关键字。

如果省略了 <anchor-size> 关键字, 则默认与 anchor-size() 所用的属性轴向匹配的关键字行为一致。 (如 width: anchor-size() 等价于 width: anchor-size(width)。)

anchor-size()函数表示可解析锚点尺寸函数时,会在计算值阶段 (通过样式与布局交错), 解析为 <length> 即目标锚点元素在指定轴上的相关边界之间的距离 (或左右,或上下,依据指定轴)。

4.1.1. anchor-size() 的解析

只有以下所有条件均成立时,anchor-size() 函数才是一个可解析锚点尺寸函数

如果以上任一条件不成立, anchor-size() 函数会取其回退值作为解析结果。 如果未指定回退值, 则引用它的声明在计算值阶段无效

5. 溢出处理

锚点定位虽然强大,但也可能不可预测。 锚点盒可能出现在页面任意位置, 所以以任何特定方式定位盒子 (例如在锚点上方或右侧) 都可能导致定位盒溢出其包含块 或部分出现在屏幕外。

为缓解此问题,绝对定位盒 可以使用 position-try-fallbacks 属性, 引用多个定位/对齐属性的备选集合 (可来自盒子的现有样式, 也可在 @position-try 规则中指定), 用户代理可在盒子初始位置溢出时依次尝试这些备选方案。 每个方案依次应用, 第一个不会导致盒子溢出其包含块的方案即为最终选用方案。

position-try-order 允许根据定义的可用空间对这些选项进一步排序, 如果更重要的是让盒子拥有尽可能多的空间, 可优先考虑空间而非声明顺序。

5.1. 提供回退选项:position-try-fallbacks 属性

名称: position-try-fallbacks
值: none | [ [<dashed-ident> || <try-tactic>] | <'position-area'> ]#
初始值: none
适用于: 绝对定位盒
是否继承: no
百分比: n/a
计算值: 按指定
规范顺序: 按语法
动画类型: 离散型

该属性提供一组备用定位样式, 当绝对定位盒溢出其内边距修饰包含块时尝试使用。 此定位选项列表初始为空。

列表里每个逗号分隔的项是一个独立选项: 可以是@position-try块的名称, 或一个<try-tactic>,代表对盒子现有计算样式的自动变换。

各值含义如下:

none

该属性无效果; 盒子的定位选项列表为空。

<dashed-ident>

如果存在同名的@position-try规则, 则将其关联的定位选项加入定位选项列表

否则, 该值无效果。

<try-tactic>

会根据指定关键字交换策略, 自动从盒子的计算样式创建一个定位选项, 并将构造出的定位选项加入盒子的定位选项列表。 并添加到定位选项列表

<try-tactic> = flip-block || flip-inline || flip-start
flip-block

交换块轴上的值(比如 margin-block-startmargin-block-end), 实质上是在内联轴线上镜像。

flip-inline

交换内联轴上的值, 实质上是在块轴线上镜像。

flip-start

交换start 属性的值, 以及end属性的值 (比如 margin-block-startmargin-inline-start), 实质上是沿对角线镜像 (从start-start角到end-end角)。

如给出多个关键字, 则依次组合变换, 生成一个 定位选项

<dashed-ident> || <try-tactic>

结合前两种选项的效果: 如果有同名的@position-try规则, 先将其定位选项应用到基础样式, 再按指定的<try-tactic>变换并加入盒子的定位选项列表

否则不做任何处理。

<'position-area'>

自动创建一个只包含指定position-area属性的定位选项

根据交换策略交换盒子元素el在两个方向directions之间的样式,返回一组样式:
  1. 如果directions在同一轴上为相反方向,则称为“对立”; 否则(指定不同轴时)为“垂直”。

  2. 确定 el允许的 @position-try 属性的指定值, 记为 styles

  3. styles 进行变量替换env()函数, 以及类似的任意替换函数

    对于 env()函数, 若引用的环境变量与方向或轴相关 (如 safe-area-inset-top), 则切换引用的 环境变量对应directions

    例如,若写有 top: env(safe-area-inset-top);,且 directions 为上和左, 则 env() 会按 env(safe-area-inset-left) 解析。 (接下来,会交换到 left 属性。)
  4. 交换 styles 中对应 directions 的相关属性值。

    例如,“top”和“left”交换时, margin-topmargin-left 的值会交换,widthheight 也会交换,等等。

    注意: 如果方向在同一轴上为对立, 某些属性(如 widthalign-self) 不会交换, 因为它们在两个方向上自身关联, 但它们的值可能在下一步被修改。

  5. 交换后按如下方式调整属性值以匹配新方向:

  6. 返回 styles

5.2. 确定回退顺序:position-try-order 属性

名称: position-try-order
值: normal | <try-size>
初始值: normal
适用于: 绝对定位盒
是否继承: no
百分比: n/a
计算值: 按指定
规范顺序: 按语法
动画类型: 离散型

该属性指定定位选项列表将被尝试的顺序。

<try-size> = most-width | most-height | most-block-size | most-inline-size
normal

定位选项position-try-fallbacks中指定的顺序依次尝试。

most-width
most-height
most-block-size
most-inline-size

定位选项列表中的每个条目,应用该定位选项到盒子, 并找出由这些样式产生的内边距修饰包含块的指定尺寸。 按此尺寸稳定排序定位选项列表, 最大的排在前面。

例如,以下样式会先将弹出列表定位在锚定按钮下方, 如果溢出, 会决定是保持弹出列表在锚点下方还是移到上方, 取决于哪个选项能获得最大空间。
.anchor { anchor-name: --foo; }
.list {
  position: fixed;
  position-anchor: --foo;
  position-area: block-end span-inline-end;
  align-self: start;
  position-try-fallbacks: --bottom-scrollable, flip-block, --top-scrollable;
  position-try-order: most-height;
}
@position-try --bottom-scrollable {
  align-self: stretch;
}
@position-try --top-scrollable {
  position-area: block-start span-inline-end;
  align-self: stretch;
}

flip-block 自动生成的选项和 --top-scrollable选项总会获得相同的可用高度, 因为二者都在垂直方向上从包含块顶部拉伸到锚点顶部, 所以会保留它们的指定顺序。 这使盒子首先尝试按自然高度与锚点对齐 (使用align-self: end,自动翻转自基础样式), 若仍然溢出, 则会退到填满空间并可滚动的形式。

5.3. position-try 速记属性

名称: position-try
值: <'position-try-order'>? <'position-try-fallbacks'>
初始值: 见各属性
适用于: 见各属性
是否继承: 见各属性
百分比: 见各属性
计算值: 见各属性
动画类型: 见各属性
规范顺序: 按语法

该速记属性同时设置position-try-fallbacksposition-try-order。 如果省略<'position-try-order'>, 则取属性的初始值。

5.4. @position-try 规则

@position-try 规则 定义一个具有指定名称的定位选项, 可包含一组定位属性, 可通过position-try-fallbacks应用到盒子上,

@position-try规则的语法为:

@position-try <dashed-ident> {
  <declaration-list>
}

前导中的<dashed-ident>为规则名称。 如声明多个同名@position-try规则, 以文档顺序最后一个为准。

@position-try规则仅接受以下属性

<declaration-list>中的属性使用!important是无效的。 这样做只会使该属性无效,不会使整个@property-try规则无效。

所有@position-try中的属性会作为定位回退来源应用到盒子上, 该来源是新级联来源, 介于作者来源动画来源之间。

类似动画来源, 使用revert 值时, 效果如同该属性属于作者来源, 因此会回退到用户来源。 (和动画来源一样,revert-layer没有特殊行为,按指定处理。)

注意: 允许的 @position-try 属性是仅影响盒子自身尺寸和位置的最小属性集合, 不会改变内容或其它样式。 这样大大简化了定位回退的实现, 同时满足响应可用空间移动锚点定位盒的基本需求。 由于这些规则会覆盖作者来源的普通声明, 也限制了@position-try声明与其他属性级联和继承的负面交互。 预计未来扩展容器查询 后可根据所用回退定位查询元素, 实现目前受限属性列表下无法实现的条件样式。

注意: 若多个盒子使用不同锚点但希望使用相同回退定位, 只需在anchor()中省略<anchor-name>,分别在每个盒子的position-anchor中指定锚点即可。

注意: 最常见的回退定位场景(如定位盒默认在锚点一侧,必要时翻到另一侧) 可以直接在position-try-fallbacks属性中用关键字自动实现, 完全无需@position-try规则。

5.5. 应用定位回退

当一个定位盒 (应用了其默认滚动偏移后) 溢出了其内边距修饰包含块, 且具有非空定位选项列表时, 会确定定位回退样式,以寻找能避免溢出的选项。

这些修改后的样式通过交错应用到元素, 因此会影响计算值(并可触发过渡等), 即使它们依赖布局和已用值

应用定位选项到盒子元素el, 给定一个定位选项 new styles
  1. new styles插入级联中的定位回退来源, 解析级联, 并执行足够的布局以确定 el已用样式

    为计算这些样式, 会计算一个假设的锚点重算点, 并用相应的假设记忆滚动偏移来决定 el 的样式。

  2. 返回el已用样式

确定定位回退样式,针对元素abspos
  1. current stylesabspos当前的已用样式(可能是之前回退的结果)。

  2. 遍历定位选项列表中的每个option

    1. 如果option是当前abspos最后成功定位选项跳过

    2. adjusted styles应用定位选项optionabspos的结果。

    3. el rectabspos的边距盒大小和位置, cb rectabspos内边距修饰包含块的大小和位置, 按adjusted styles布局时计算。

    4. 如果cb rect在任一轴为负尺寸并被修正为零尺寸,跳过

      注意: 这防止零尺寸el rect被认为“在”负尺寸cb rect内,从而被选为成功选项。

    5. 如果el rect没有完全包含于cb rect内,跳过

    6. 返回adjusted styles,以及为其假设计算的记忆滚动偏移集合。

  3. 断言:前一步未找到能避免溢出的定位选项

  4. 返回current styles

注意: 后代溢出el不会影响本计算, 只看el自身边距盒

注意: 因为我们故意跳过当前有效的定位选项, 它不会更新其记忆滚动偏移; 如果没有其他回退可用,只保留当前样式, 所有记忆滚动偏移保持不变。

在一次完整布局过程中, 一旦盒子确定了其回退样式(或确定未使用), 后续盒子的布局不会改变该决定。

例如,有两个定位盒, A 和 B, A先布局,B后布局。 如果 B 溢出导致 A 的包含块出现滚动条, 这不会让 A 回头重新确定回退样式以避免溢出。 (否则可能导致指数级布局开销,甚至循环永不收敛。)

换句话说,布局不会“回溯”。

ResizeObserver 事件被确定和分发时:

注意: 该记录/移除时机与最后记忆尺寸的处理方式完全一致。

实现可以选择对定位选项列表长度施加实现定义限制, 以限制可能产生的多余布局工作量。 该限制必须至少为五个。

例如, 下列CSS会优先尝试将“popover”定位在元素下方, 若屏幕放不下则切换到上方; 默认左对齐,若不合适则切换到右对齐。
#myPopover {
  position: fixed;
  top: anchor(--button bottom);
  left: anchor(--button left);
  position-try-fallbacks: flip-inline, flip-block, flip-block flip-inline;

  /* 弹窗宽度至少与按钮一致 */
  min-width: anchor-size(--button width);

  /* 弹窗高度至少为2个菜单项 */
  min-height: 6em;
}

6. 无障碍影响

需要注意的是,锚点定位并不会自动建立定位盒与其锚点之间的语义关系, 因为这种定位方式用途非常广泛。 作者不能仅依靠定位方式带来的视觉连接来实现元素之间的语义关联; 如果没有额外处理,这些元素在DOM中通常没有有意义的关系, 这会让诸如屏幕阅读器等非视觉用户代理难以甚至无法使用。

Web平台上已有及将来的许多特性, 都可以显式建立这种关系, 使非视觉用户代理也能受益。

例如,HTML中的Popover API 会自动将触发按钮与弹出元素关联起来, 包括自动调整Tab顺序; 它会将触发按钮作为弹出层的隐式锚点元素, 这也便于使用锚点定位。

在更一般的场景下, ARIA 特性如 aria-detailsaria-describedby 属性 可在锚点元素上手动建立这种信息; 配合定位元素上的 role 属性, 非视觉用户代理就可以告知用户元素之间的关系, 并让用户自动在它们之间导航。

7. DOM 接口

7.1. CSSPositionTryRule 接口

CSSPositionTryRule 接口表示 @position-try 规则:

[Exposed=Window]
interface CSSPositionTryRule : CSSRule {
  readonly attribute CSSOMString name;
  [SameObject, PutForwards=cssText] readonly attribute CSSPositionTryDescriptors style;
};

[Exposed=Window]
interface CSSPositionTryDescriptors : CSSStyleDeclaration {
  attribute CSSOMString margin;
  attribute CSSOMString marginTop;
  attribute CSSOMString marginRight;
  attribute CSSOMString marginBottom;
  attribute CSSOMString marginLeft;
  attribute CSSOMString marginBlock;
  attribute CSSOMString marginBlockStart;
  attribute CSSOMString marginBlockEnd;
  attribute CSSOMString marginInline;
  attribute CSSOMString marginInlineStart;
  attribute CSSOMString marginInlineEnd;
  attribute CSSOMString margin-top;
  attribute CSSOMString margin-right;
  attribute CSSOMString margin-bottom;
  attribute CSSOMString margin-left;
  attribute CSSOMString margin-block;
  attribute CSSOMString margin-block-start;
  attribute CSSOMString margin-block-end;
  attribute CSSOMString margin-inline;
  attribute CSSOMString margin-inline-start;
  attribute CSSOMString margin-inline-end;
  attribute CSSOMString inset;
  attribute CSSOMString insetBlock;
  attribute CSSOMString insetBlockStart;
  attribute CSSOMString insetBlockEnd;
  attribute CSSOMString insetInline;
  attribute CSSOMString insetInlineStart;
  attribute CSSOMString insetInlineEnd;
  attribute CSSOMString top;
  attribute CSSOMString left;
  attribute CSSOMString right;
  attribute CSSOMString bottom;
  attribute CSSOMString inset-block;
  attribute CSSOMString inset-block-start;
  attribute CSSOMString inset-block-end;
  attribute CSSOMString inset-inline;
  attribute CSSOMString inset-inline-start;
  attribute CSSOMString inset-inline-end;
  attribute CSSOMString width;
  attribute CSSOMString minWidth;
  attribute CSSOMString maxWidth;
  attribute CSSOMString height;
  attribute CSSOMString minHeight;
  attribute CSSOMString maxHeight;
  attribute CSSOMString blockSize;
  attribute CSSOMString minBlockSize;
  attribute CSSOMString maxBlockSize;
  attribute CSSOMString inlineSize;
  attribute CSSOMString minInlineSize;
  attribute CSSOMString maxInlineSize;
  attribute CSSOMString min-width;
  attribute CSSOMString max-width;
  attribute CSSOMString min-height;
  attribute CSSOMString max-height;
  attribute CSSOMString block-size;
  attribute CSSOMString min-block-size;
  attribute CSSOMString max-block-size;
  attribute CSSOMString inline-size;
  attribute CSSOMString min-inline-size;
  attribute CSSOMString max-inline-size;
  attribute CSSOMString placeSelf;
  attribute CSSOMString alignSelf;
  attribute CSSOMString justifySelf;
  attribute CSSOMString place-self;
  attribute CSSOMString align-self;
  attribute CSSOMString justify-self;
  attribute CSSOMString positionAnchor;
  attribute CSSOMString position-anchor;
  attribute CSSOMString positionArea;
  attribute CSSOMString position-area;
};

它的 name 属性代表规则前导中声明的名称。

它的 style 属性代表规则主体中声明的属性, 按指定顺序排列。 读取时,必须返回 CSSPositionTryDescriptors 对象, 代表 @position-try at-rule, 具有以下属性:

computed flag

未设置

readonly flag

未设置

declarations

规则中声明的描述符,按指定顺序排列。

parent CSS rule

上下文对象

owner node

Null

8. 附录:样式与布局交错

样式与布局交错是一种技术, 允许在布局过程中对子树进行样式更新, 从而可对元素的计算样式进行追溯更新。

这个概念不应出现在本规范, 可能应放到 Cascade, 但我需要一个草稿来引用。

注意: 样式与布局交错已用于容器查询容器查询长度。 如 10cqw 这样的长度会根据查询容器的大小布局信息解析为计算长度, 当容器在布局间变化尺寸时也能触发 过渡

允许的 @position-try 属性在解析回退时也会交错 (见 position-try)。

显然这里还需要补充很多细节, 但目前“按容器查询的做法处理”即可。 虽然那部分行为也没明确定义, 但至少在一定程度上是可互操作的。

9. 安全性考量

本文件未发现安全性问题。

10. 隐私考量

本文件未发现隐私问题。

11. 变更记录

2024年10月4日工作草案 以来的重要变更:

另见更早的变更记录

一致性要求

文档约定

一致性要求以描述性断言和 RFC 2119 术语组合表达。规范性部分中的关键词 “MUST”(必须)、“MUST NOT”(不得)、“REQUIRED”(要求)、“SHALL”(应)、“SHALL NOT”(不应)、“SHOULD”(应该)、“SHOULD NOT”(不应该)、“RECOMMENDED”(推荐)、“MAY”(可以)、“OPTIONAL”(可选),均按照 RFC 2119 的定义解释。 但为可读性考虑,本规范未将这些词全部使用大写字母。

除明确标记为非规范性部分、示例和备注外,规范文本均为规范性内容。[RFC2119]

规范中的示例以 “例如” 开头,或用 class="example" 与规范文本区分,如下:

这是一个信息性示例。

信息性备注以 “注意” 开头,并通过 class="note" 与规范文本区分,如下:

注意,这是一个信息性备注。

建议事项为规范性章节,样式突出显示,通过 <strong class="advisement"> 区分,例如: UA 必须提供可访问的替代方案。

一致性类别

本规范的符合性分为三类:

样式表
一个 CSS 样式表
渲染器
一个 UA,解释样式表语义并渲染使用这些样式表的文档。
创作工具
一个 UA,用于编写样式表。

如果样式表中所有使用本模块语法的声明均符合通用CSS语法以及本模块定义的每个特性语法,则该样式表符合本规范。

渲染器符合本规范的条件是,除按相关规范解释样式表外,还能正确解析本规范定义的所有特性,并按要求渲染文档。但由于设备限制导致 UA 无法正确渲染文档,不应认为 UA 不符合规范。(例如,UA 不要求在单色显示器上渲染颜色。)

创作工具符合本规范的条件是:编写的样式表语法正确,符合通用CSS语法和本模块每个特性的语法,并满足本模块描述的样式表所有其它符合性要求。

部分实现

为使作者能够利用向前兼容的解析规则分配回退值,CSS 渲染器必须将任何不支持的 at-规则、属性、属性值、关键字和其它语法结构视为无效(并按需忽略,见此)。特别是,用户代理不得在单个多值属性声明中选择性忽略不支持的组件值而只采纳支持的值:如果任一值被视为无效(不支持的值必须无效),则整个声明必须被忽略。

非稳定和专有特性的实现

为避免与未来稳定的 CSS 特性冲突, CSS 工作组建议遵循最佳实践来实现 非稳定特性和 专有扩展

非实验性实现

一旦规范进入候选推荐阶段(Candidate Recommendation), 就可以进行非实验性实现,实现者应发布任何 CR 级特性的无前缀实现, 只要能证明其实现符合规范。

为建立和保持 CSS 在各实现间的互操作性, CSS 工作组要求非实验性 CSS 渲染器在发布任何 CSS 特性的无前缀实现前, 向 W3C 提交一个实现报告(如有需要还应提交用于实现报告的测试用例)。 提交到 W3C 的测试用例将由 CSS 工作组进行审查和修正。

关于提交测试用例和实现报告的更多信息, 可在 CSS 工作组网站 https://www.w3.org/Style/CSS/Test/ 获取。 有疑问请联系 public-css-testsuite@w3.org 邮件列表。

索引

本规范定义的术语

引用定义的术语

参考文献

规范性引用

[CSS-ALIGN-3]
Elika Etemad;Tab Atkins Jr.。CSS 盒子对齐模块 3 级。2025年3月11日。WD。URL:https://www.w3.org/TR/css-align-3/
[CSS-BOX-4]
Elika Etemad。CSS 盒模型模块 4 级。2024年8月4日。WD。URL:https://www.w3.org/TR/css-box-4/
[CSS-BREAK-4]
Rossen Atanassov;Elika Etemad。CSS 分片模块 4 级。2018年12月18日。FPWD。URL:https://www.w3.org/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad;Miriam Suzanne;Tab Atkins Jr.。CSS 级联与继承 5 级。2022年1月13日。CR。URL:https://www.w3.org/TR/css-cascade-5/
[CSS-CASCADE-6]
Elika Etemad;Miriam Suzanne;Tab Atkins Jr.。CSS 级联与继承 6 级。2024年9月6日。WD。URL:https://www.w3.org/TR/css-cascade-6/
[CSS-CONTAIN-2]
Tab Atkins Jr.;Florian Rivoal;Vladimir Levin。CSS 包含性模块 2 级。2022年9月17日。WD。URL:https://www.w3.org/TR/css-contain-2/
[CSS-DISPLAY-3]
Elika Etemad;Tab Atkins Jr.。CSS 显示模块 3 级。2023年3月30日。CR。URL:https://www.w3.org/TR/css-display-3/
[CSS-DISPLAY-4]
Elika Etemad;Tab Atkins Jr.。CSS 显示模块 4 级。2024年12月19日。FPWD。URL:https://www.w3.org/TR/css-display-4/
[CSS-ENV-1]
CSS 环境变量模块 1 级。编辑草案。URL:https://drafts.csswg.org/css-env-1/
[CSS-LOGICAL-1]
Rossen Atanassov;Elika Etemad。CSS 逻辑属性与值 1 级。2018年8月27日。WD。URL:https://www.w3.org/TR/css-logical-1/
[CSS-OVERFLOW-3]
Elika Etemad;Florian Rivoal。CSS 溢出模块 3 级。2023年3月29日。WD。URL:https://www.w3.org/TR/css-overflow-3/
[CSS-OVERFLOW-4]
David Baron;Florian Rivoal;Elika Etemad。CSS 溢出模块 4 级。2023年3月21日。WD。URL:https://www.w3.org/TR/css-overflow-4/
[CSS-POSITION-3]
Elika Etemad;Tab Atkins Jr.。CSS 定位布局模块 3 级。2025年3月11日。WD。URL:https://www.w3.org/TR/css-position-3/
[CSS-POSITION-4]
CSS 定位布局模块 4 级。编辑草案。URL:https://drafts.csswg.org/css-position-4/
[CSS-PSEUDO-4]
Daniel Glazman;Elika Etemad;Alan Stearns。CSS 伪元素模块 4 级。2022年12月30日。WD。URL:https://www.w3.org/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.;Elika Etemad。CSS 作用域模块 1 级。2014年4月3日。FPWD。URL:https://www.w3.org/TR/css-scoping-1/
[CSS-SIZING-3]
Tab Atkins Jr.;Elika Etemad。CSS 盒尺寸模块 3 级。2021年12月17日。WD。URL:https://www.w3.org/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.;Simon Sapin。CSS 语法模块 3 级。2021年12月24日。CRD。URL:https://www.w3.org/TR/css-syntax-3/
[CSS-TRANSFORMS-1]
Simon Fraser 等。CSS 变换模块 1 级。2019年2月14日。CR。URL:https://www.w3.org/TR/css-transforms-1/
[CSS-VALUES-3]
Tab Atkins Jr.;Elika Etemad。CSS 值与单位模块 3 级。2024年3月22日。CRD。URL:https://www.w3.org/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.;Elika Etemad。CSS 值与单位模块 4 级。2024年3月12日。WD。URL:https://www.w3.org/TR/css-values-4/
[CSS-VALUES-5]
Tab Atkins Jr.;Elika Etemad;Miriam Suzanne。CSS 值与单位模块 5 级。2024年11月11日。WD。URL:https://www.w3.org/TR/css-values-5/
[CSS-VARIABLES-1]
Tab Atkins Jr.。CSS 级联变量自定义属性模块 1 级。2022年6月16日。CR。URL:https://www.w3.org/TR/css-variables-1/
[CSS-WRITING-MODES-4]
Elika Etemad;Koji Ishii。CSS 书写模式 4 级。2019年7月30日。CR。URL:https://www.w3.org/TR/css-writing-modes-4/
[CSS2]
Bert Bos 等。层叠样式表 2.1 (CSS 2.1) 规范。2011年6月7日。REC。URL:https://www.w3.org/TR/CSS2/
[CSSOM-1]
Daniel Glazman;Emilio Cobos Álvarez。CSS 对象模型 (CSSOM)。2021年8月26日。WD。URL:https://www.w3.org/TR/cssom-1/
[DOM]
Anne van Kesteren。DOM 标准。Living Standard。URL:https://dom.spec.whatwg.org/
[INFRA]
Anne van Kesteren;Domenic Denicola。Infra 标准。Living Standard。URL:https://infra.spec.whatwg.org/
[RESIZE-OBSERVER-1]
Aleks Totic;Greg Whitworth。Resize Observer。2020年2月11日。FPWD。URL:https://www.w3.org/TR/resize-observer-1/
[RFC2119]
S. Bradner。用于指示需求级别的关键词。1997年3月。最佳当前实践。URL:https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad;Tab Atkins Jr.。选择器 4 级。2022年11月11日。WD。URL:https://www.w3.org/TR/selectors-4/
[STREAMS]
Adam Rice 等。Streams 标准。Living Standard。URL:https://streams.spec.whatwg.org/
[WEBIDL]
Edgar Chen;Timothy Gu。Web IDL 标准。Living Standard。URL:https://webidl.spec.whatwg.org/

信息性引用

[CSS-CONDITIONAL-5]
Chris Lilley 等。CSS 条件规则模块 5 级。2024年11月5日。WD。URL:https://www.w3.org/TR/css-conditional-5/
[CSS-SHADOW-PARTS-1]
Tab Atkins Jr.;Fergal Daly。CSS Shadow Parts。2018年11月15日。FPWD。URL:https://www.w3.org/TR/css-shadow-parts-1/
[CSS-SIZING-4]
Tab Atkins Jr.;Elika Etemad;Jen Simmons。CSS 盒尺寸模块 4 级。2021年5月20日。WD。URL:https://www.w3.org/TR/css-sizing-4/
[HTML]
Anne van Kesteren 等。HTML 标准。Living Standard。URL:https://html.spec.whatwg.org/multipage/
[WEB-ANIMATIONS-1]
Brian Birtles 等。Web Animations。2023年6月5日。WD。URL:https://www.w3.org/TR/web-animations-1/

属性索引

名称 初始值 适用对象 继承 百分比 动画类型 规范顺序 计算值
anchor-name none | <dashed-ident># none 所有生成主盒的元素 no n/a 离散型 按语法 按指定
anchor-scope none | all | <dashed-ident># none 所有元素 no n/a 离散型 按语法 按指定
position-anchor auto | <anchor-name> auto 绝对定位盒 no n/a 离散型 按语法 按指定
position-area none | <position-area> none 具有默认锚点盒的定位盒 no n/a TBD 按语法 关键字 none 或一对关键字,详见
position-try <'position-try-order'>? <'position-try-fallbacks'> 见各属性 见各属性 见各属性 见各属性 见各属性 按语法 见各属性
position-try-fallbacks none | [ [<dashed-ident> || <try-tactic>] | <'position-area'> ]# none 绝对定位盒 no n/a 离散型 按语法 按指定
position-try-order normal | <try-size> normal 绝对定位盒 no n/a 离散型 按语法 按指定
position-visibility always | [ anchors-valid || anchors-visible || no-overflow ] anchors-visible 绝对定位盒 no n/a 离散型 按语法 按指定

IDL 索引

[Exposed=Window]
interface CSSPositionTryRule : CSSRule {
  readonly attribute CSSOMString name;
  [SameObject, PutForwards=cssText] readonly attribute CSSPositionTryDescriptors style;
};

[Exposed=Window]
interface CSSPositionTryDescriptors : CSSStyleDeclaration {
  attribute CSSOMString margin;
  attribute CSSOMString marginTop;
  attribute CSSOMString marginRight;
  attribute CSSOMString marginBottom;
  attribute CSSOMString marginLeft;
  attribute CSSOMString marginBlock;
  attribute CSSOMString marginBlockStart;
  attribute CSSOMString marginBlockEnd;
  attribute CSSOMString marginInline;
  attribute CSSOMString marginInlineStart;
  attribute CSSOMString marginInlineEnd;
  attribute CSSOMString margin-top;
  attribute CSSOMString margin-right;
  attribute CSSOMString margin-bottom;
  attribute CSSOMString margin-left;
  attribute CSSOMString margin-block;
  attribute CSSOMString margin-block-start;
  attribute CSSOMString margin-block-end;
  attribute CSSOMString margin-inline;
  attribute CSSOMString margin-inline-start;
  attribute CSSOMString margin-inline-end;
  attribute CSSOMString inset;
  attribute CSSOMString insetBlock;
  attribute CSSOMString insetBlockStart;
  attribute CSSOMString insetBlockEnd;
  attribute CSSOMString insetInline;
  attribute CSSOMString insetInlineStart;
  attribute CSSOMString insetInlineEnd;
  attribute CSSOMString top;
  attribute CSSOMString left;
  attribute CSSOMString right;
  attribute CSSOMString bottom;
  attribute CSSOMString inset-block;
  attribute CSSOMString inset-block-start;
  attribute CSSOMString inset-block-end;
  attribute CSSOMString inset-inline;
  attribute CSSOMString inset-inline-start;
  attribute CSSOMString inset-inline-end;
  attribute CSSOMString width;
  attribute CSSOMString minWidth;
  attribute CSSOMString maxWidth;
  attribute CSSOMString height;
  attribute CSSOMString minHeight;
  attribute CSSOMString maxHeight;
  attribute CSSOMString blockSize;
  attribute CSSOMString minBlockSize;
  attribute CSSOMString maxBlockSize;
  attribute CSSOMString inlineSize;
  attribute CSSOMString minInlineSize;
  attribute CSSOMString maxInlineSize;
  attribute CSSOMString min-width;
  attribute CSSOMString max-width;
  attribute CSSOMString min-height;
  attribute CSSOMString max-height;
  attribute CSSOMString block-size;
  attribute CSSOMString min-block-size;
  attribute CSSOMString max-block-size;
  attribute CSSOMString inline-size;
  attribute CSSOMString min-inline-size;
  attribute CSSOMString max-inline-size;
  attribute CSSOMString placeSelf;
  attribute CSSOMString alignSelf;
  attribute CSSOMString justifySelf;
  attribute CSSOMString place-self;
  attribute CSSOMString align-self;
  attribute CSSOMString justify-self;
  attribute CSSOMString positionAnchor;
  attribute CSSOMString position-anchor;
  attribute CSSOMString positionArea;
  attribute CSSOMString position-area;
};

问题索引

变换和滚动有同样的问题, 所以锚点定位通常也不会关注变换。 我们能否直接在这里纳入变换的影响?
定义快照的精确时机: 每帧更新, 在样式重计算之前。
类似于 记忆滚动偏移, 我们能否关注 默认锚点元素上的变换?
什么是 必需锚点引用anchor()函数没有回退值时; 默认锚点有时也算? 这里需要更详细的说明。
任一锚点缺失, 还是全部锚点缺失? 两种情况都有用例, 是否要做决定或允许可控?
要确保这个被裁剪的定义 与视图过渡保持一致, 因为后者也需要类似的概念。
这个概念不适合放在本规范, 可能应归到 Cascade, 但我需要一个草稿以供引用。
显然这里还需要补充更多细节, 但目前“按容器查询的做法处理”即可。 虽然那部分行为也未明确定义, 但至少在一定程度上可互操作。