CSS 锚点定位模块级别 1

W3C 工作草案

关于此文档的更多细节
此版本
https://w3org.cn/TR/2026/WD-css-anchor-position-1-20260327/
最新发布版本
https://w3org.cn/TR/css-anchor-position-1/
编辑草案
https://drafts.csswg.org/css-anchor-position-1/
历史
https://w3org.cn/standards/history/css-anchor-position-1/
反馈
CSS 工作组问题仓库
文档内联
编辑
Tab Atkins-Bittner (Google)
Elika J. Etemad / fantasai (Apple)
Ian Kilpatrick (Google)
前任编辑
Jhey Tompkins (Google)
建议编辑此规范
GitHub 编辑器

摘要

本规范定义了锚点定位(anchor positioning),定位元素可以相对于页面上的一个或多个“锚点元素”调整自身大小并进行定位。

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

关于本文档

本节描述了本文件发布时的状态。当前 W3C 出版物列表及本技术报告的最新修订版可在 W3C 标准和草案索引中找到。

本文件由 CSS 工作组推荐标准轨道发布为工作草案。发布为工作草案并不意味着 W3C 及其成员的认可。

这是一个草案文档,可能随时会被其他文档更新、替换或废弃。将其作为进展中的工作之外的任何内容进行引用是不恰当的。

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

本文件受 2025 年 8 月 18 日 W3C 流程文件的管辖。

本文档由在一个受 W3C 专利政策约束下运作的组织制作。W3C 维护着一份与该组织交付成果相关的专利披露公开列表;该页面还包含了披露专利的说明。任何个人如果确实获知其认为包含必要权利要求 (Essential Claim) 的专利,必须根据 W3C 专利政策第 6 节披露该信息。

1. 引言

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

例如,作者可能希望将工具提示居中定位在目标元素上方,除非这会导致工具提示移出屏幕,在这种情况下,它应该位于目标元素下方。这可以通过以下 CSS 实现:
.anchor {
  anchor-name: --tooltip;
}
.tooltip {
  /* Fixpos means we don't need to worry about
     containing block relationships;
     the tooltip can live anywhere in the DOM. */
  position: fixed;

  /* All the anchoring behavior will default to
     referring to the --tooltip anchor. */
  position-anchor: --tooltip;

  /* Align the tooltip's bottom to the top of the anchor;
     this also defaults to horizontally center-aligning
     the tooltip and the anchor (in horizontal writing modes). */
  position-area: block-start;

  /* Automatically swap if this overflows the window
     so the tooltip's top aligns to the anchor's bottom
     instead. */
  position-try: flip-block;

  /* Prevent getting too wide */
  max-inline-size: 20em;
}

请注意,使用 Popover API 将自动设置 position 并创建锚定关系,而无需设置 anchor-nameposition-anchor 值(通过定义隐式锚点元素),因此无需再次显式设置这些属性。因此,使用正确的标记,此示例可以简化为:

.tooltip {
  /* Using the popover + popovertarget attributes sets 'position: fixed'
     and creates the necessary position-anchor relationship already. */
  position-area: block-start;
  position-try: flip-block;
  max-inline-size: 20em;
}

1.1. 值定义

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

除了定义中列出的属性特定值外,本规范中定义的所有属性也都接受 CSS 全局关键字 作为其属性值。为了可读性,未明确重复列出。

像 CSS 中除选择器匹配之外的大多数操作一样,本规范中的功能作用于扁平元素树

2. 确定锚点

本规范的几个功能引用了锚点框的位置和大小。除非另有说明,否则这指的是相关锚点元素边框框边缘。在大多数情况下,相关的锚点元素被指定为默认锚点元素,使用 position-anchor 属性,该属性可以引用宿主语言定义的隐式锚点元素,或通过 CSS anchor-nameanchor-scope 属性命名的锚点。(anchor() 函数也可以直接引用已命名的锚点。)

锚点框的位置和大小是在布局完成后确定的。此位置和大小包括缩放和基于定位的调整(例如 position: relativeposition: sticky)以及变换(例如 transformoffset-path)。在这些情况下,改用绝对定位元素包含块坐标空间中的锚点框轴对齐包围矩形。变换通常在不同的线程上进行优化,因此基于变换的锚点框位置更新可能会延迟几帧。作者可以通过在可行的情况下使用绝对或相对定位来避免这种延迟。

如果锚点框分片,且引用该锚点框绝对定位框的包含块位于相关的分片上下文之外,则改用其框分片的轴对齐包围矩形。(如果绝对定位框位于分片上下文内部,它将锚点框视为未分片——并且其自身可以被分片上下文分片。)

出于性能原因,滚动处理比较特殊,请参见 § 3.3 考虑滚动。其他布局后效果(如滤镜)不会影响锚点框的位置。

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

名称anchor-name
none | <anchor-name>#
初始值 none(无)
应用于 所有生成主框的元素
可继承
百分比 不可用
计算值 按指定值
规范顺序 按语法
动画类型 离散 (discrete)
<anchor-name> = <dashed-ident>

anchor-name 属性声明一个元素为锚点元素,其主框锚点框,并为其提供一个可供定位的锚点名称列表。值定义如下:

none(无)

该属性无效。

<anchor-name>#

如果元素生成主框,则该元素为锚点元素,具有指定的锚点名称列表。每个锚点名称都是一个松散匹配树作用域名称

否则,该属性无效。

锚点名称不需要是唯一的。并非所有元素都能成为给定框的目标锚点元素。因此,如果使用范围得当,可以在多个地方重复使用一个名称。

注意:如果多个元素共享一个锚点名称并且对于给定的定位框都是可见的,则目标锚点元素将是最近的祖先(如果存在),否则将是 DOM 顺序中的最后一个。anchor-scope 属性可用于进一步限制哪些名称对于给定的引用框是可见的。

锚点名称默认情况下包含(containment)约束;即使元素具有样式布局包含(或任何类似的包含形式),其后代的锚点名称对于页面其他地方的元素也是可见的。

注意:当元素处于另一个元素的跳过内容中时(例如由于 content-visibility: hidden),它不是一个可接受的锚点元素,实际上表现得好像它没有名称一样。

注意:影子树中的定位元素可以引用在“更高层”树中定义的锚点名称。不过,目前它们不能引用在“更低层”影子树中定义的锚点名称

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

名称anchor-scope
none | all | <anchor-name>#
初始值 none(无)
应用于 所有元素
可继承
百分比 不可用
计算值 按指定值
规范顺序 按语法
动画类型 离散 (discrete)

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

值的含义如下:

none(无)
锚点名称作用域无变化。
all
指定由该元素或其后代定义的所有锚点名称——其作用域尚未被使用 anchor-scope 的后代限制——仅在此元素的后代作用域内;并限制后代仅将锚点名称匹配到此子树内的锚点元素

此值仅影响同一树作用域内的锚点名称,就像它是严格匹配树作用域名称一样。(即 anchor-scope: all 的作用与 anchor-scope: --foo, --bar, ... 相同,列出所有相关的锚点名称。)

<anchor-name>
指定由该元素或其后代定义且匹配的锚点名称——其作用域尚未被使用 anchor-scope 的后代限制——仅在此元素的后代作用域内;并限制后代仅将这些锚点名称匹配到此子树内的锚点元素

<anchor-name> 表示一个严格匹配树作用域名称,即它只能匹配同一影子树内的锚点名称[CSS-SCOPING-1]

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

注意:由于首先检查定位元素的祖先,如果所需的锚点是祖先,通常不需要使用 anchor-scope。仅在所需锚点不是祖先,或者您明确希望“隐藏”一个锚点以防被页面其他地方引用时,才需要使用它。

当重用设计模式时,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. 如果 query el 具有一个作为可接受锚点元素隐式锚点元素,则返回该元素。

    2. 否则,返回空。

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

  3. 否则,anchor spec<dashed-ident>

    如果 query el 的祖先满足以下条件,则返回距离 query el 最近的此类元素。否则,返回树顺序中满足该条件的最后一个元素 el

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

    注意:anchor-scope 可以限制某些锚点名称的可见性,这可能会影响哪些元素可以成为给定查找的锚点元素

注意:由一个影子树中的样式定义的 anchor-name 将不会被另一个影子树中的样式内的锚点函数所看到,从而保持封装。然而,不同影子树中的元素仍然可以彼此锚定,只要anchor-name锚点函数都来自同一树中的样式,例如通过使用 ::part() 来设置影子内部元素的样式。(隐式锚点元素本身也不会被限制在单一树中,但其细节取决于分配它们的 API。)

如果满足以下所有条件,则元素 possible anchor绝对定位元素 positioned el可接受锚点元素

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

名称position-anchor
normal | none | auto | <anchor-name> | match-parent
初始值 normal
应用于 绝对定位的框
可继承
百分比 不可用
计算值 按指定值
规范顺序 按语法
动画类型 离散 (discrete)

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

normal

如果 position-areanone,表现为 none。否则,表现为 auto

none(无)

该框没有默认锚点元素

auto

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

<anchor-name>

由指定的 <anchor-name> 选择的目标锚点元素是该框的默认锚点元素

match-parent

使用与父元素(如果是伪元素,则为原始元素)相同的默认锚点元素(如果存在且为可接受锚点元素)。否则,该框没有默认锚点元素

默认锚点元素主框是该框的默认锚点框

例如,在下面的代码中,.foo.bar 元素都可以使用相同的定位属性,只需更改它们引用的锚点元素即可:
.anchored {
  position: absolute;
  top: calc(.5em + anchor(outside));
  /* Since no anchor name was specified,
     this automatically refers to the
     default anchor box. */
}

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

2.4.1. 隐式锚点元素

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

TODO:填入一个新的 Popover 相关细节示例(一旦该内容最终被 HTML 规范采纳)。

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

伪元素隐式锚点元素是其原始元素,除非另有说明。

2.5. 锚点相关性

在确定元素 el 是否与用户相关时,如果 el 的后代是一个定位框的目标锚点元素(该框本身未被跳过,且其包含块不是 elel 的后代),则 el 必须被视为与用户相关

注意:这意味着,例如,content-visibility: auto 子树中的锚点将阻止其子树跳过其内容,只要依赖它的定位框也未被跳过。(除非锚点和定位框都位于同一个 content-visibility: auto 元素下;它们不能循环地保持对方可见。)

3. 基于锚点的定位

绝对定位框可以相对于页面上的一个或多个锚点框定位自身。

position-area 属性提供了一个方便的基于网格的概念,用于相对于默认锚点框进行定位;对于更复杂的定位或相对于多个框的定位,可以在插值属性中使用 anchor() 函数来显式引用锚点框的边缘。

3.1. position-area 属性

名称position-area
none | <position-area>
初始值 none(无)
应用于 具有默认锚点框的定位框
可继承
百分比 不可用
计算值 关键字 none 或一对关键字,参见 § 3.1.3 <position-area> 的计算值与序列化
规范顺序 按语法
动画类型 离散 (discrete)

锚点定位最常见的用例仅涉及定位框的包含块边缘和默认锚点框的边缘。这些线条可以被视为定义了一个 3×3 的网格;position-area 让您可以轻松指定在此定位区域网格的哪个区域中布局定位框。

horizontal-tb ltr 书写模式position-area: top left 定位的示例。
none(无)

该属性无效。

<position-area>

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

否则,选择定位区域网格的一个区域,并将其作为框的包含块

注意:这意味着插值属性指定相对于定位区域的偏移量,且某些属性值(如 max-height: 100%)也将相对于定位区域。

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
  | self-x-start | self-x-end | span-self-x-start | span-self-x-end
  | span-all ]
  ||
  [ top | center | bottom | span-top | span-bottom
  | y-start | y-end | span-y-start | span-y-end
  | self-y-start | self-y-end | span-self-y-start | span-self-y-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, self-y-start, self-y-end
x-start, x-end, self-x-start, self-x-end
block-start, block-end, self-block-start, self-block-end
inline-start, inline-end, self-inline-start, self-inline-end
center

对应于此关键字正在指定轴的单一相关行或列。

anchor() 一样,纯逻辑关键字(start, end 等)是指框的书写模式包含块x-start 等也以同样的方式确定方向,但在指定的物理轴上。

self-* 逻辑关键字(self-start, self-x-end 等)是相同的,但指的是框自身的书写模式

span-start, span-end, span-self-start, span-self-end
span-top, span-bottom, span-left, span-right
span-y-start, span-y-end, span-self-y-start, span-self-y-end
span-x-start, span-x-end, span-self-x-start, span-self-x-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.2. 锚点相关插值:anchor() 函数

绝对定位框可以在其插值属性中使用 anchor() 函数作为值,以引用一个或多个锚点框的位置。anchor() 函数解析为 <length>。它仅允许在插值属性中使用(否则无效)。

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

anchor() 函数有三个参数:

一个表示可解析锚点函数anchor() 函数,在计算值时间(使用样式与布局交错)会解析为一个 <length>,该长度会将定位框的内边距修改后的包含块(与函数所在属性对应的边界)与目标锚点元素锚点盒的指定边界对齐。

注意:这意味着使用 锚点函数 的属性的过渡动画对于各种可能的变化都将“如预期般”工作:锚点盒移动、锚点元素被添加或从文档中移除、锚点上的 anchor-name 属性被更改等。

例如,在 .bar { inset-block-start: anchor(--foo block-start); } 中,anchor() 将解析为一个长度,使 .bar 元素的块起始边界与 --foo 锚点的块起始边界对齐。

另一方面,在 .bar { inset-block-end: anchor(--foo block-start); } 中,它反而会解析为一个长度,使 .bar 元素的块结束边界与 --foo 锚点的块起始边界对齐。

由于 inset-block-startinset-block-end 的值分别指定了来自不同边界(分别为元素包含块的块起始和块结束)的内边距,同一个 anchor() 通常会在每个属性中解析为不同的长度。

因为 anchor() 函数解析为一个 <length>,所以它可以在数学函数中像其他任何长度一样使用。

例如,在下方的图表中,三个条形被设置为可能的锚点,最小值/最大值线条和工具提示使用 min()max() 来结合引用所有三个锚点的 anchor() 函数,以找到它们自身的位置。你可以使用每列下方的范围输入来调整高度,并看到锚定的线条和工具提示会动态调整到最高的/最低的条形。

完整示例

实现这一点的核心代码片段是

#bar-1 { anchor-name: --anchor-1; }
#bar-2 { anchor-name: --anchor-2; }
#bar-3 { anchor-name: --anchor-3; }
.line {
  position: absolute;
  left: anchor(--chart left);
  right: anchor(--chart right);
  &.max {
    bottom: max(
      anchor(--anchor-1 top),
      anchor(--anchor-2 top),
      anchor(--anchor-3 top)
    );
  }
  &.min {
    bottom: min(
      anchor(--anchor-1 top),
      anchor(--anchor-2 top),
      anchor(--anchor-3 top)
    );
  }
}

3.2.1. anchor() 的解析

anchor() 函数仅在满足以下所有条件时,才是一个 可解析锚点函数

如果这些条件中有任何一个为假,则 anchor() 函数计算为其指定的 fallback 值。如果没有指定 fallback 值,则引用它的声明在计算值时间无效

3.3. 考虑滚动

出于性能原因,实现通常在单独的滚动/"合成"线程上执行滚动,该线程具有非常有限的能力(简单的移动/转换等,但没有布局或类似的昂贵操作),因此可以信赖其对滚动的响应速度足够快,以至于在人类感知中被视为“瞬间”。

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

为了补偿这一点,同时尽可能多地允许锚定到各种元素,锚点定位使用了记住的滚动偏移量滚动补偿的组合。

这里的细节很技术化,但要点是

最终结果是,锚点定位通常应该“直接生效”,无论元素锚定到什么位置,但它对滚动的响应能力可能会受到限制。

绝对定位元素开始生成盒(即从 display:nonedisplay:contents 切换到任何其他 display 值)时,会产生一个锚点重新计算点,这与它开始运行 CSS 动画时相同。

当元素确定位置 fallback 样式时,也会产生一个锚点重新计算点;如果它因此改变了 fallback 样式,它会使用与所选 fallback 样式集关联的锚点重新计算点的结果。

当元素 abspos 发生锚点重新计算点时,对于 abspos锚点引用所引用的每个元素 anchor,它都会关联一个记住的滚动偏移量,等于 anchor 的所有滚动容器祖先的当前滚动偏移量总和,向上追溯但不包括 abspos包含块记住的滚动偏移量还考虑了其他依赖滚动的定位变化,如 position: sticky。如果 abspos 有一个默认锚点元素,它总是为其计算记住的滚动偏移量,即使 abspos 实际上没有对它的锚点引用

所有锚点引用的计算就好像所有滚动容器都处于其初始滚动位置一样,然后将它们关联的记住的滚动偏移量添加到其中。

变换具有与滚动相同的问题,因此锚点定位同样通常不关注它们。我们可以继续在此处整合变换的影响吗?

以上允许定位元素一次性响应其锚点引用的滚动位置,但如果其中任何一个被滚动,定位元素将不再看起来被锚定到它们(尽管它将继续响应它们的非滚动移动)。虽然这个问题通常无法解决,但我们可以响应一个锚点引用的滚动;具体来说,即默认锚点元素

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

注意:如果 abspos 具有位置选项列表,则它在该轴上是否补偿滚动也受应用的影响 fallback 样式影响。

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

在执行 abspos 的布局后,它会被默认滚动位移额外位移,就像受到变换影响一样(在任何其他变换之前)。

定义快照的精确时间:每帧更新,在样式重新计算之前。

记住的滚动偏移量类似,我们可以关注默认锚点元素上的变换吗?

注意:虽然记住的滚动偏移量会影响 anchor() 函数的值,但默认滚动位移直接位移元素,是在确定其内边距属性的值、应用对齐等之后。这通常是不可区分的,但像 round(anchor(outside), 50px) 这样以非线性方式变换默认锚点元素位置的情况,将揭示行为上的差异。

4. 基于锚点的对齐

4.1. 区域特定的默认对齐

position-area 不为 none 时,normal 自对齐已使用值会根据 <position-area> 值发生变化,以使盒向锚点对齐。

然而,如果相关轴上只有一个内边距属性auto,则默认对齐方式反而朝向具有非 auto 内边距的边界;并且这是一种 unsafe 对齐。

注意:这种单 auto 行为保留了单个指定内边距控制绝对定位盒位置的方式。

例如,假设使用等效于英语的书写模式(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 值使定位盒可以从其锚点的左侧边缘延伸到其包含块的右侧边缘,并默认在该空间内左对齐。但如果定位盒比该空间更大(例如锚点非常靠近屏幕右边缘),它将向左位移以保持可见。

4.2. 在锚点上居中:anchor-center 对齐值

名称justify-selfalign-self
新值 anchor-center

自对齐属性允许绝对定位盒内边距修改后的包含块内进行对齐。现有的值,加上精心选择的内边距属性,通常足以实现有用的对齐,但锚点定位的一个常见情况——在锚点盒上方居中——需要小心且有些复杂的设置才能实现。

新的 anchor-center 值使这种情况变得极其简单:如果定位盒具有默认锚点盒,那么它会在相关轴上(尽可能地)在默认锚点盒上方居中。此外,

如果盒不是绝对定位的,或者没有默认锚点盒,则此值表现为 center,并且对内边距属性的解析方式没有额外影响。

注意:使用 anchor-center 时,默认情况下,如果锚点太靠近盒的原始包含块边界,它将“位移”以偏离纯粹的居中状态,从而保持在原始包含块内。详见 CSS Box Alignment 3 § 4.4 溢出对齐:安全与不安全关键词及滚动安全限制

5. 基于锚点的尺寸调整

绝对定位盒可以在其尺寸调整属性中使用 anchor-size() 函数来引用一个或多个锚点盒的尺寸。anchor-size() 函数解析为一个 <length>。它仅允许在接受的 @position-try 属性中使用(否则无效)。

5.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> 关键词(block, inline, self-block, 和 self-inline)根据盒的书写模式(对于 self-blockself-inline)或盒的包含块书写模式(对于 blockinline)映射到物理关键词之一。

如果省略了 <anchor-size> 关键词,它默认为匹配 anchor-size() 所使用的属性轴的关键词。(例如,width: anchor-size() 等同于 width: anchor-size(width)。)

一个表示可解析锚点尺寸函数anchor-size() 函数,在计算值时间(通过样式与布局交错)解析为分隔目标锚点元素锚点盒的相关边缘(左和右,或上和下,取决于指定轴)的 <length>

5.1.1. anchor-size() 的解析

anchor-size() 函数仅在满足以下所有条件时,才是一个 可解析锚点尺寸函数

如果这些条件中有任何一个为假,则 anchor-size() 函数解析为其指定的 fallback 值。如果没有指定 fallback 值,则引用它的声明在计算值时间无效

6. 溢出管理

锚点定位虽然功能强大,但也可能不可预测。锚点盒可能位于页面的任何位置,因此以任何特定方式定位盒(例如在锚点上方,或锚点右侧)可能导致定位盒溢出其包含块或部分被定位到屏幕之外。

为了改善这一点,绝对定位盒可以使用 position-try-fallbacks 属性指定额外的位置选项(从盒的现有样式生成,或在 @position-try 规则中指定的定位/对齐属性的变体集),UA 可以尝试这些选项,如果盒溢出了其初始位置。每个选项按照 position-try-order 指定的顺序一个接一个地应用于盒,第一个不导致盒溢出其包含块的选项被视为获胜者。

一旦选择了一个选项,元素将保持这些样式直到再次溢出,即使之前(可能更理想的)选项再次变得可用而不导致溢出。(参见记录最后一次成功的位置选项。)

例如,以下 CSS 将首先尝试将“弹出框”定位在元素下方,但如果它在屏幕上放不下,将切换到上方。它默认与锚点起始对齐,但如果放不下,将切换到结束对齐。如果它在任何一侧都放不下,它将占据整个水平空间,同时尽可能在锚点上居中(得益于§ 4.1 区域特定的默认对齐)。
#myPopover {
  position: fixed;
  position-anchor: --button;
  position-area: bottom span-x-end;
  position-try-fallbacks: flip-x, flip-y, flip-x flip-y, bottom, top;

  /* The popover is at least as wide as the button */
  min-width: anchor-size(width);

  /* The popover is at least as tall as 2 menu items */
  min-height: 6em;
}

添加一张图片!

6.1. 提供 Fallback 选项:position-try-fallbacks 属性

名称position-try-fallbacks
none | [ [<dashed-ident> || <try-tactic>] | <position-area> ]#
初始值 none(无)
应用于 绝对定位的框
可继承
百分比 不可用
计算值 按指定值
规范顺序 按语法
动画类型 离散 (discrete)

此属性提供了一组可选的定位样式,用于在绝对定位盒溢出其内边距修改后的包含块时尝试。此位置选项列表最初包含从元素的基本 fallback 样式生成的单个位置选项,即未应用 position-try-fallbacks计算样式

列表中每个逗号分隔的条目都是一个单独的选项:要么是 @position-try 块的名称,要么是一个代表盒现有计算样式自动转换的 <try-tactic>

值的含义如下:

none(无)

该属性没有影响;盒的位置选项列表为空。

<dashed-ident>

如果存在具有给定名称的 @position-try 规则,则其关联的位置选项被添加到位置选项列表中。

否则,该值没有影响。

<try-tactic>

通过对盒的基本样式执行指定的尝试策略,自动创建一个位置选项,然后将构造的位置选项添加到盒的位置选项列表中。

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

交换块轴中的值(例如在 margin-block-startmargin-block-end 之间),本质上是围绕行内轴线进行镜像。

flip-inline

交换行内轴中的值,本质上是围绕块轴线进行镜像。

flip-x

交换水平轴中的值(例如在 margin-leftmargin-right 之间),本质上是围绕垂直轴线进行镜像。

flip-y

交换垂直轴中的值,本质上是围绕水平轴线进行镜像。

flip-start

交换start 属性的值彼此交换,以及end 属性的值彼此交换(例如在 margin-block-startmargin-inline-start 之间),本质上是围绕从块起始-行内起始角到块结束-行内结束角绘制的对角线进行镜像。

如果给出了多个关键词,则按顺序组合变换以产生单个位置选项。逻辑方向根据包含块书写模式进行解析。

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

结合前两个选项的影响:如果存在具有给定名称的 @position-try 规则,则将其位置选项应用于基本样式,然后根据指定的 <try-tactic> 对其进行变换,并将结果添加到盒的位置选项列表中。

否则,不执行任何操作。

<position-area>

自动创建一个仅由具有给定值的 position-area 属性组成的位置选项

6.2. 确定 Fallback 顺序:position-try-order 属性

名称position-try-order
normal | <try-size>
初始值 normal
应用于 绝对定位的框
可继承
百分比 不可用
计算值 按指定值
规范顺序 按语法
动画类型 离散 (discrete)

此属性允许元素根据它们定义的可用空间对位置选项进行排序,如果盒拥有尽可能多的空间比严格遵循 position-try-fallbacks 中声明的顺序更重要。

<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

对于位置选项列表中的每个条目,将该位置选项应用于盒,并找到这些样式产生的内边距修改后的包含块尺寸(将 auto inset 值视为零)。根据此尺寸稳定排序位置选项列表,最大的放在最前面。

逻辑方向根据包含块书写模式进行解析。

例如,以下样式最初会将弹出列表放置在其锚定按钮的上方或下方,具体取决于哪个选项能为其提供最多的空间。
.anchor { anchor-name: --foo; }
.list {
  position: fixed;
  position-anchor: --foo;
  position-area: block-end span-inline-end;
  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;
}

基本样式--bottom-scrollable 选项具有相同的可用高度,因为在这两种情况下,内边距修改后的包含块都从锚点延伸到包含块的边缘。同样,flip-block 选项和 --top-scrollable 选项具有相同的可用高度。由于 position-try-order 使用稳定排序,这些对将各自保留在列表中的相对位置,而 *-scrollable 选项位于后面;且拥有最多可用空间的那一对将排在第一位。

这导致盒首先尝试以其自然高度在较大的一侧对齐锚点(使用基本样式flip-block 样式),但如果这导致溢出,它将 fallback 到仅仅填充相同的空间并变为可滚动(使用匹配的 *-scrollable 样式),从而永远不会溢出并尝试移动到较小的空间。

6.3. position-try 缩写属性

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

此缩写属性同时设置 position-try-fallbacksposition-try-order。如果省略了 <'position-try-order'>,则设置为属性的初始值。

6.4. @position-try 规则

@position-try 规则定义了一个具有给定名称的位置选项,指定了一组或多组可通过 position-try-fallbacks 应用于盒的定位属性。

@position-try 规则的语法为

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

序言中指定的 <dashed-ident> 是规则的名称。如果声明了多个同名 @position-try 规则,它们的层叠方式与 @keyframe 规则相同。

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

<declaration-list> 中对属性使用 !important 是无效的。这样做会导致使用它的属性失效,但不会使整个 @property-try 规则失效。

@position-try 中的所有属性都作为位置 Fallback 起点应用于盒,这是一个位于作者起点动画起点之间的新层叠起点

动画起点类似,使用 revert 值就像该属性是作者起点的一部分一样,从而使其回退到用户起点。(然而,与动画起点一样,revert-layer 没有特殊行为,按规定执行。)

注意:接受的 @position-try 属性是仅影响盒自身尺寸和位置,而不更改其内容或样式的最小属性组。这极大地简化了位置 fallback 的实现,同时解决了响应可用空间移动锚点定位盒的基本需求。由于这些规则覆盖了作者起点中的正常声明,这也限制了 @position-try 声明与正常层叠及其他属性继承之间的不良交互。预期容器查询的未来扩展将允许根据元素使用的位置 fallback 来查询元素,从而实现该受限列表所不允许的那种条件样式。

注意:如果多个元素想要使用相同的 @position-try 规则,但相对于它们自己的锚点元素,请省略 anchor() 中的 <anchor-name>,并改在 position-anchor 中指定每个盒的锚点。

注意:最常见的 fallback 定位类型(通常将定位盒放在锚点的一侧,但在需要时翻转到相对的一侧)可以通过 position-try-fallbacks 中的关键词自动完成,完全无需使用 @position-try

6.5. 应用位置 Fallback

当定位盒(在应用任何默认滚动位移之后)溢出其内边距修改后的包含块,并且在其位置选项列表中具有不止一个位置选项时,它会确定位置 fallback 样式以尝试找到避免溢出的选项。最终样式通过交错应用于元素,因此它们会影响计算值(并可能触发过渡等),即使它们依赖于布局和已使用值

实现可以选择对位置选项列表的长度施加实现定义的限制,以限制可能需要的过量布局工作量。此限制必须至少为 5。

要为元素 abspos 确定位置 fallback 样式
  1. 当前样式abspos 当前使用的样式,源自基本计算样式(这可能是更早前 fallback 的结果)。

  2. 对于位置选项列表中的每个 选项

    1. 如果 选项 当前是 abspos最后一次成功的位置选项继续

    2. 调整后的样式 为将位置选项 选项 应用于 abspos 的结果。

    3. 元素矩形 为使用 调整后的样式 布局时 abspos 外边距盒的尺寸和位置,并令 cb 矩形 为其内边距修改后的包含块的尺寸和位置。

    4. 如果 cb 矩形 在任一轴上尺寸为负且被修正为零尺寸,继续

      注意:这防止了零尺寸的 元素矩形 仍被视为在负尺寸的 cb 矩形 “内”并被选为成功选项。

    5. 如果 元素矩形 没有完全包含在 cb 矩形 内,继续

    6. 返回 调整后的样式,以及为它们假想计算的相关记住的滚动偏移量集。

  3. 断言:上一步完成时未找到避免溢出的位置选项

  4. 返回 当前样式

注意:溢出 el 的后代不会影响此计算,仅 el 自身外边距盒受影响。

注意:因为我们特意跳过了当前生效的位置选项,所以它的记住的滚动偏移量不会被更新;如果其他所有 fallback 都不起作用,且我们坚持使用当前样式,所有的记住的滚动偏移量都将保持不变。

在完整的布局过程中,一旦盒确定了其 fallback 样式(或确定它不使用任何样式),布局后续盒的操作就不能更改此决定。

例如,假设有两个定位盒 A 和 B,A 的布局先于 B。如果 B 溢出并导致 A 的包含块获得了滚动条,这不会导致 A 回过头来重新确定其 fallback 样式以尝试避免溢出。(最多,这会导致指数级的布局成本;最坏的情况是循环,永远无法稳定。)

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

6.5.1. 维护和清除 Fallback 选择

盒的一些变化对确定位置 fallback 样式有非常直接的影响,因此会触发特殊行为。这些 fallback 敏感变化包括:

为此目的,仅考虑对基本计算样式的变化,即忽略来自过渡或动画层叠起点的任何声明的计算样式。

6.5.1.1. 记录上次成功的定位选项

为了尽可能维持布局稳定性,确定定位回退样式时会优先考虑上次成功的定位选项,其确定方式如下

在确定并分发 ResizeObserver 事件时,盒子必须按下述方式记录上次成功的定位选项

注意:此记录/移除的时机与最后记住的尺寸的处理时机完全相同。

6.5.2. 应用定位选项

要为盒子的元素 el 应用定位选项,给定一个定位选项 new styles
  1. 定位回退源 (position fallback origin) 中将 new styles 插入层叠 (cascade),解析层叠,并执行足够的布局以确定 el使用样式 (used styles)

    为了计算这些样式,会计算一个假设的锚点重新计算点 (anchor recalculation point),并使用由此产生的假设的记住的滚动偏移量 (remembered scroll offsets) 来确定 el 的样式。

  2. 返回 el使用样式

要对盒子的元素 el 的一套 styles 执行尝试策略 (try-tactic),在两个方向 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

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

名称position-visibility
always | [ anchors-valid || anchors-visible || no-overflow ]
初始值 anchors-visible
应用于 绝对定位的框
可继承
百分比 不可用
计算值 按指定值
规范顺序 按语法
动画类型 离散 (discrete)

在某些情况下,显示绝对定位的盒子可能没有意义。此属性允许此类盒子根据某些通常需要的布局条件,有条件地显示。

always

此属性无效。(盒子显示时无需顾及其锚点或溢出状态。)

anchors-valid

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

什么是所需的锚点引用?没有回退值的 anchor() 函数;默认锚点*有时*是吗?此处需要更多细节。

任何锚点缺失,还是所有锚点缺失?我可以看到这两种情况的用例。我们想在这里做出决定,还是以某种方式让它可控?

anchors-visible

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

no-overflow

如果盒子即使在应用了 position-try 之后,仍然超出了其嵌入修改后的包含块 (inset-modified containing block),则盒子的 visibility 属性计算为 force-hidden

对于一个依赖于锚点 anchor 的定位盒子 abspos,如果 anchor墨迹溢出矩形 (ink overflow rectangle) 被某个盒子(该盒子是 anchor 的祖先,同时是 abspos 包含块的后代)完全剪裁,则称 anchor 被中间盒子剪裁。在此情况下的“剪裁”仅指 IntersectionObserver(默认)检查的相同剪裁效果,即由于 clip-pathoverflow 或其他效果(如绘制包含 (paint containment))剪裁至溢出剪裁边缘 (overflow clip edge) 而导致的剪裁。如果 anchor 的面积非零,它还必须拥有非零的交叉面积才被视为未完全剪裁。

anchor 是否被中间盒子剪裁必须在更新文档内容相关性(参见 [css-contain-2] 中的 content-visibility)并运行任何 ResizeObserver 之后、在运行任何 IntersectionObserver 之前进行检查。为了提高响应性,也可以在其他时间进行检查。

注意:这意味着,例如如果一个绝对定位盒子在 DOM 中紧邻其锚点,即使其默认锚点被滚动出视图,它也将保持可见,因为它反正也是被同一个滚动容器剪裁的。

请确保此剪裁定义与“视图转换 (View Transitions)”保持一致,后者也需要类似的概念。

注意:这确保了在“链式锚点”情况下,如果第一个绝对定位盒子由于此属性而被隐藏(由于其锚点被滚动出视图),那么使用它作为锚点的另一个绝对定位盒子也会被隐藏,而不是同时漂浮在一个无意义的位置。

7. 可访问性影响

CSS 锚点定位不会创建、删除或改变元素之间的任何可访问性绑定。作者必须使用适当的标记功能来控制此类绑定。

由于其在许多不同场景中可以以多种方式使用,CSS 锚点定位不会自动在定位盒子与其任何锚点之间建立任何语义关系。例如,设计中的视觉锚定关系可能存在于一个元素与其语义锚点之间,也可能将该元素与语义锚点的祖先、兄弟或后代连接起来,具体取决于期望的视觉效果。同样,设计可能会选择不使用视觉锚定关系,即使存在语义关系,反之亦然。

作者不得依赖 CSS 定位所暗示的视觉连接来从语义上链接元素。如果没有适当的标记,视觉上链接的元素在 DOM 上没有任何有意义的关系——如果它们确实存在有意义的关系,这可能会使它们在非视觉用户代理(如屏幕阅读器)中,或在非图形导航模式(如标签导航)中变得难以使用或无法使用。

Web 平台上的许多现有及即将推出的功能允许显式建立语义连接,以便非视觉用户代理也能从中受益。例如,HTML 中的弹出层 API (Popover API) 会自动将触发按钮与弹出层元素链接,包括自动调整 Tab 键顺序;它将触发按钮确立为弹出层的隐含锚点元素,从而也使得使用锚点定位变得容易。

添加一个弹出层示例。

在更通用的情况下,锚点元素上的 aria-detailsaria-describedby 属性等 ARIA 功能可以以稍微手动的方式创建连接。配合定位元素上的 role 属性,它允许非视觉用户代理向用户告知元素之间的关系,并让他们自动在元素之间导航。

然而,作者也不应该过度使用此类功能,因为用额外、不必要的语义连接使页面过载也可能使页面难以理解。

欢迎提出改善本节的方法建议,特别是作者指南和常见用例的最佳实践示例。[Issue #10311]

8. DOM 接口

8.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 属性代表在规则主体中声明的属性,按指定顺序。获取时,它必须返回一个用于 @position-try @规则的 CSSPositionTryDescriptors 对象,具有以下属性:

计算标志

未设定

只读标志

未设定

declarations

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

父 CSS 规则

上下文对象。

所有者节点

Null

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

样式与布局交错 (Style & layout interleaving) 是一种技术,其中样式更新可以在布局过程中发生在子树上,从而导致元素计算样式的回溯更新。

这不是此概念的正确规范,它可能应该放在层叠 (Cascade) 中,但我需要一个草图来参考。

注意:样式与布局交错已用于容器查询 (container queries)容器查询长度。像 10cqw 这样的长度使用关于查询容器尺寸的布局信息解析为计算长度,因此当容器在布局之间改变大小时,可以触发过渡

已接受的 @position-try 属性在解析回退(参见 position-try)时也是交错的

显然这需要填充更多的细节,但目前“表现得像你在容器查询中已经做的那样”就足够了。这种行为也是未定义的,但至少它是(在某种程度上)可互操作的。

10. 安全考虑

针对本文档尚未提出任何安全问题。

11. 隐私考虑

针对本文档尚未提出任何隐私问题。

12. 变更

2026 年 1 月 30 日工作草案以来的重大变更

2025 年 12 月 22 日工作草案以来的重大变更

2025 年 10 月 7 日工作草案以来的重大变更

另请参阅 以前的变更

一致性

文档约定

一致性要求通过描述性断言和 RFC 2119 术语相结合来表达。本文档规范性部分中的关键词“MUST”(必须)、“MUST NOT”(不得)、“REQUIRED”(必需)、“SHALL”(应)、“SHALL NOT”(不应)、“SHOULD”(推荐)、“SHOULD NOT”(不推荐)、“RECOMMENDED”(建议)、“MAY”(可以)和“OPTIONAL”(可选)应按照 RFC 2119 中的描述进行解释。然而,为了可读性,这些词在本文档中不以全大写形式出现。

本规范的所有文本均为规范性文本,明确标记为非规范性的部分、示例和注释除外。 [RFC2119]

本规范中的示例均以“例如”一词引入,或者通过 class="example" 与规范性文本隔开,如下所示

这是一个说明性示例。

说明性注释以“Note”一词开头,并使用 class="note" 与规范性文本隔开,如下所示

注意,这是一个说明性注释。

建议(Advisements)是规范性章节,旨在引起特别注意,并使用 <strong class="advisement"> 与其他规范性文本区分开来,如下所示: 用户代理必须提供可访问的替代方案。

一致性类别

本规范为三类一致性定义了一致性要求。

样式表
一份 CSS 样式表
渲染器
一种 用户代理 (UA),它解释样式表的语义并渲染使用它们的文档。
创作工具
一种 用户代理 (UA),用于编写样式表。

如果样式表包含的所有使用本模块定义语法的语句,根据通用 CSS 语法及本模块定义的各功能语法均有效,则该样式表符合本规范。

如果渲染器除了按相应规范解释样式表外,还通过正确解析本规范定义的所有功能并相应地渲染文档来支持这些功能,则该渲染器符合本规范。然而,由于设备限制导致 UA 无法正确渲染文档,并不意味着该 UA 不符合规范。(例如,UA 无需在单色显示器上渲染颜色。)

如果创作工具编写的样式表根据通用 CSS 语法及本模块中各功能的语法是句法正确的,并符合本模块中描述的所有其他样式表一致性要求,则该创作工具符合本规范。

部分实现

为了使作者能够利用前向兼容的解析规则来指定后备值,CSS 渲染器 **必须** 将其无法使用支持级别的任何 @规则、属性、属性值、关键字和其他语法结构视为无效(并 适当忽略)。特别地,用户代理 **不得** 在单一多值属性声明中选择性地忽略不支持的组件值而保留支持的值:如果任何值被视为无效(因为不支持的值必须如此),CSS 要求忽略整个声明。

不稳定和专有特性的实现

为了避免与未来稳定的 CSS 功能发生冲突,CSS 工作组建议在实施不稳定功能和私有扩展遵循最佳实践

非实验性实现

一旦规范达到候选推荐阶段,非实验性实现即可成为可能,实现者应发布他们能够证明根据规范正确实现的任何 CR 级别特性的无前缀实现。

为建立并保持 CSS 在不同实现间的互操作性,CSS 工作组请求非实验性的 CSS 渲染器在发布任何 CSS 功能的无前缀实现之前,向 W3C 提交一份实现报告(并在必要时提交用于该实现报告的测试用例)。提交给 W3C 的测试用例需经 CSS 工作组审阅和修正。

有关提交测试用例和实现报告的详细信息,请访问 CSS 工作组网站 https://w3org.cn/Style/CSS/Test/。问题可发送至 public-css-testsuite@w3.org 邮件列表。

索引

本规范定义的术语

通过引用定义的术语

引用

规范性引用

[CSS-ALIGN-3]
Elika Etemad; Tab Atkins Jr.. CSS 盒子对齐模块 3 级. 2026 年 1 月 30 日. WD. URL: https://w3org.cn/TR/css-align-3/
[CSS-BOX-4]
Elika Etemad. CSS 盒模型模块 Level 4. 2024 年 8 月 4 日. WD. URL: https://w3org.cn/TR/css-box-4/
[CSS-BREAK-4]
Rossen Atanassov; Elika Etemad. CSS 分片模块 Level 4. 2018 年 12 月 18 日. FPWD. URL: https://w3org.cn/TR/css-break-4/
[CSS-CASCADE-5]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS Cascading and Inheritance Level 5. 2022年1月13日. CR. URL: https://w3org.cn/TR/css-cascade-5/
[CSS-CASCADE-6]
Elika Etemad; Miriam Suzanne; Tab Atkins Jr.. CSS 级联与继承 Level 6. 2024 年 9 月 6 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-cascade-6/
[CSS-CONTAIN-2]
Tab Atkins Jr.; Florian Rivoal; Vladimir Levin. CSS Containment Module Level 2. 2022年9月17日. WD. URL: https://w3org.cn/TR/css-contain-2/
[CSS-DISPLAY-3]
Elika Etemad; Tab Atkins Jr.. CSS Display Module Level 3. 2023年3月30日. CR. URL: https://w3org.cn/TR/css-display-3/
[CSS-DISPLAY-4]
Elika Etemad; Tab Atkins Jr.. CSS 显示模块 Level 4. 2025 年 11 月 6 日. WD. URL: https://w3org.cn/TR/css-display-4/
[CSS-ENV-1]
CSS 环境变量模块 1 级. 2025 年 9 月 23 日. FPWD. URL: https://w3org.cn/TR/css-env-1/
[CSS-LOGICAL-1]
Elika Etemad; Rossen Atanassov. CSS 逻辑属性和值模块 1 级. 2025 年 12 月 4 日. WD. URL: https://w3org.cn/TR/css-logical-1/
[CSS-MASKING-1]
Dirk Schulze; Brian Birtles; Tab Atkins Jr.. CSS 遮罩模块 Level 1. 2021 年 8 月 5 日. CRD. URL: https://w3org.cn/TR/css-masking-1/
[CSS-OVERFLOW-3]
Elika Etemad; Florian Rivoal. CSS 溢出模块 Level 3. 2025 年 10 月 7 日. WD. URL: https://w3org.cn/TR/css-overflow-3/
[CSS-OVERFLOW-4]
David Baron; Florian Rivoal; Elika Etemad. CSS Overflow Module Level 4. 2023年3月21日. WD. URL: https://w3org.cn/TR/css-overflow-4/
[CSS-POSITION-3]
Elika Etemad; Tab Atkins Jr.. CSS 定位布局模块 Level 3. 2025 年 10 月 7 日. 工作草案 (WD). URL: https://w3org.cn/TR/css-position-3/
[CSS-POSITION-4]
Elika Etemad; Tab Atkins Jr.. CSS 定位布局模块 Level 4。2025 年 10 月 7 日。WD。URL: https://w3org.cn/TR/css-position-4/
[CSS-PSEUDO-4]
Elika Etemad; Alan Stearns. CSS 伪元素模块 Level 4. 2025 年 6 月 27 日. WD. URL: https://w3org.cn/TR/css-pseudo-4/
[CSS-SCOPING-1]
Tab Atkins Jr.; Elika Etemad. CSS 作用域模块 Level 1. 2014 年 4 月 3 日. FPWD. URL: https://w3org.cn/TR/css-scoping-1/
[CSS-SHADOW-1]
CSS 阴影模块 Level 1。编辑草案。URL: https://drafts.csswg.org/css-shadow-1/
[CSS-SIZING-3]
Tab Atkins Jr.; Elika Etemad. CSS Box Sizing Module Level 3. 2021年12月17日. WD. URL: https://w3org.cn/TR/css-sizing-3/
[CSS-SYNTAX-3]
Tab Atkins Jr.; Simon Sapin. CSS 语法模块 3 级 (CSS Syntax Module Level 3). 2021年12月24日. CRD. URL: https://w3org.cn/TR/css-syntax-3/
[CSS-TRANSFORMS-1]
Simon Fraser; et al. CSS Transforms Module Level 1. 2019年2月14日. CR. URL: https://w3org.cn/TR/css-transforms-1/
[CSS-VALUES-3]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块 3 级 (CSS Values and Units Module Level 3). 2024年3月22日. CRD. URL: https://w3org.cn/TR/css-values-3/
[CSS-VALUES-4]
Tab Atkins Jr.; Elika Etemad. CSS 值与单位模块 4 级 (CSS Values and Units Module Level 4). 2024年3月12日. WD. URL: https://w3org.cn/TR/css-values-4/
[CSS-VALUES-5]
Tab Atkins Jr.; Elika Etemad; Miriam Suzanne. CSS Values and Units Module Level 5. 2024年11月11日. WD. URL: https://w3org.cn/TR/css-values-5/
[CSS-VARIABLES-1]
Tab Atkins Jr.. CSS Custom Properties for Cascading Variables Module Level 1. 2022年6月16日. CR. URL: https://w3org.cn/TR/css-variables-1/
[CSS-VIEWPORT-1]
Florian Rivoal; Emilio Cobos Álvarez. CSS 视口模块第 1 级. 2024 年 1 月 25 日. FPWD. URL: https://w3org.cn/TR/css-viewport-1/
[CSS-WRITING-MODES-4]
Elika Etemad; Koji Ishii. CSS Writing Modes Level 4. 2019年7月30日. CR. URL: https://w3org.cn/TR/css-writing-modes-4/
[CSS2]
Bert Bos; et al. 层叠样式表 2 级修订版 1 (CSS 2.1) 规范 (Cascading Style Sheets Level 2 Revision 1 (CSS 2.1) Specification). 2011年6月7日. REC. URL: https://w3org.cn/TR/CSS2/
[CSSOM-1]
Daniel Glazman; Emilio Cobos Álvarez. CSS Object Model (CSSOM). 2021年8月26日. WD. URL: https://w3org.cn/TR/cssom-1/
[HTML]
Anne van Kesteren; et al. HTML 标准. Living Standard. URL: https://html.whatwg.cn/multipage/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra 标准. Living Standard. URL: https://infra.spec.whatwg.org/
[INTERSECTION-OBSERVER]
Stefan Zager; Emilio Cobos Álvarez; Traian Captan. 交叉观察器 (Intersection Observer). 2023 年 10 月 18 日. WD. URL: https://w3org.cn/TR/intersection-observer/
[MOTION-1]
Tab Atkins Jr.; Dirk Schulze; Jihye Hong. 运动路径模块 1 级. 2024 年 11 月 5 日. WD. URL: https://w3org.cn/TR/motion-1/
[RESIZE-OBSERVER-1]
Aleks Totic; Greg Whitworth. 调整大小观察者. 2020 年 2 月 11 日. FPWD. URL: https://w3org.cn/TR/resize-observer-1/
[RFC2119]
S. Bradner. RFC 中用于指示要求级别的关键词. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[SELECTORS-4]
Elika Etemad; Tab Atkins Jr.. 选择器 4 级. 2026 年 1 月 22 日. WD. URL: https://w3org.cn/TR/selectors-4/
[STREAMS]
Adam Rice; 等人. 流标准. 活标准. 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; et al. CSS 条件规则模块 5 级 (CSS Conditional Rules Module Level 5). 2025年10月30日. WD. URL: https://w3org.cn/TR/css-conditional-5/
[CSS-SIZING-4]
Tab Atkins Jr.; Elika Etemad; Jen Simmons. CSS 盒模型尺寸模块第 4 级. 2021年5月20日. WD. URL: https://w3org.cn/TR/css-sizing-4/
[CSS-TRANSITIONS-1]
Chris Marrin; et al. CSS 过渡模块 1 级 (CSS Transitions Module Level 1). 2026年1月8日. WD. URL: https://w3org.cn/TR/css-transitions-1/
[DOM]
Anne van Kesteren. DOM 标准. Living Standard. URL: https://dom.spec.whatwg.org/
[WEB-ANIMATIONS-1]
Brian Birtles; 等人. Web Animations. 2023年6月5日. WD. URL: https://w3org.cn/TR/web-animations-1/

属性索引

名称初始值应用于继承百分比动画类型 (Animation type)规范顺序计算值新值
align-self anchor-center
anchor-name none | <anchor-name>#none(无)所有生成主盒子的元素不可用离散 (discrete)按语法按指定值
anchor-scope none | all | <anchor-name>#none(无)所有元素不可用离散 (discrete)按语法按指定值
justify-self anchor-center
position-anchor normal | none | auto | <anchor-name> | match-parentnormal绝对定位的框不可用离散 (discrete)按语法按指定值
position-area none | <position-area>none(无)拥有默认锚点盒子的定位盒子不可用离散 (discrete)按语法关键字 none 或一对关键字,参见
position-try <'position-try-order'>? <'position-try-fallbacks'>见各个属性见各个属性见各个属性见各个属性见各个属性按语法见各个属性
position-try-fallbacks none | [ [<dashed-ident> || <try-tactic>] | <position-area> ]#none(无)绝对定位的框不可用离散 (discrete)按语法按指定值
position-try-order normal | <try-size>normal绝对定位的框不可用离散 (discrete)按语法按指定值
position-visibility always | [ anchors-valid || anchors-visible || no-overflow ]anchors-visible绝对定位的框不可用离散 (discrete)按语法按指定值

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() 函数;默认锚点*有时*是吗?此处需要更多细节。
任何锚点缺失,还是所有锚点缺失?我可以看到这两种情况的用例。我们想在这里做出决定,还是以某种方式让它可控?
请确保此剪裁定义与“视图转换”保持一致,后者也需要类似的概念。
添加一个弹出层示例。
欢迎提出改善本节的方法建议,特别是作者指南和常见用例的最佳实践示例。[Issue #10311]
这不是此概念的正确规范,它可能应该放在层叠 (Cascade) 中,但我需要一个草图来参考。
显然这需要填充更多的细节,但目前“表现得像你在容器查询中已经做的那样”就足够了。这种行为也是未定义的,但至少它是(在某种程度上)可互操作的。