使用 CSS 锚点定位

使用 CSS 锚点定位

设置 position-area

position-area 属性提供了一种替代 anchor() 函数来相对于锚点定位元素的方法。position-area 属性基于一个 3x3 的网格概念,其中锚点元素是中心单元格。position-area 属性可用于将锚点定位元素放置在九个单元格中的任何一个,或者使其跨越两个或三个单元格。

网格瓷砖被分为行和列。

三行由物理值 top、center 和 bottom 表示。它们也有逻辑等效值,如 start、center 和 end,以及坐标等效值,如 y-start、center 和 y-end。

三列由物理值 left、center 和 right 表示。它们也有逻辑等效值,如 start、center 和 end,以及坐标等效值,如 x-start、center 和 x-end。

中心单元格的尺寸由锚点元素的包含块定义,而中心单元格与网格外边缘之间的距离由定位元素的包含块定义。

position-area 属性值由一到两个基于上述行和列的值组成,并提供跨越选项来定义元素应定位的网格区域。

例如

你可以指定两个值,将定位元素放置在特定的网格单元中。例如:

top left(逻辑等效为 start start)会将定位元素放置在左上角的单元格中。

bottom center(逻辑等效为 end center)会将定位元素放置在底部中央的单元格中。

你可以指定一个行或列的值,加上一个 span-* 值。第一个值指定了放置定位元素的行或列,初始时将其放置在中心,另一个值指定了要跨越的列的数量。例如:

top span-left 会使定位元素被放置在顶行,并跨越该行的中心和左侧单元格。

y-end span-x-end 会使定位元素被放置在 y 轴的末端,并跨越该列的中心和 x 轴末端的单元格。

block-end span-all 会使定位元素被放置在块结束行,并跨越该行的内联起始、中心和内联结束单元格。

如果你只指定一个值,效果会因设置的值而异:

物理侧边值(top、bottom、left 或 right)或坐标值(y-start、y-end、x-start、x-end)的作用如同另一个值是 span-all。例如,top 的效果与 top span-all 相同。

逻辑侧边值(start 或 end)的作用如同另一个值被设置为相同的值;例如,start 的效果与 start start 相同。

center 值的作用如同两个值都设置为 center(即 center center)。

注意: 有关所有可用值的详细描述,请参阅 值参考页面。将逻辑值与物理值混合使用将使声明无效。

让我们来演示一些这样的值;这个例子使用了与前一个例子相同的 HTML 和基础 CSS 样式,只是我们增加了一个

.anchor {

font-size: 1.8rem;

color: white;

text-shadow: 1px 1px 1px black;

background-color: hsl(240 100% 75%);

width: fit-content;

border-radius: 10px;

border: 1px solid black;

padding: 3px;

}

.anchor {

anchor-name: --my-anchor;

}

body {

width: 50%;

margin: 0 auto;

}

form {

background: white;

border: 1px solid black;

padding: 5px;

}

select {

display: block;

margin-top: 5px;

}

form {

position: fixed;

top: 0;

right: 2px;

}

信息框被赋予固定定位,并使用 CSS 与锚点关联。加载时,它被设置为通过 position-area: top; 绑定到锚点,这使其位于位置区域网格的顶部。一旦你从 菜单中选择的新 position-area 值应用到信息框:

jsconst infobox = document.querySelector(".infobox");

const selectElem = document.querySelector("select");

selectElem.addEventListener("change", () => {

const area = selectElem.value;

// Set the position-area to the value chosen in the select box

infobox.style.positionArea = area;

});

尝试从