@position-try

可用性有限

此特性不是基線特性,因為它在一些最廣泛使用的瀏覽器中不起作用。

@position-try CSS @規則用於定義自定義位置嘗試回退選項,該選項可用於定義錨點定位元素的定位和對齊方式。一個或多個位置嘗試回退選項集可以透過 position-try-fallbacks 屬性或 position-try 簡寫應用於錨定元素。當定位元素移動到開始溢位其包含塊或視口的位置時,瀏覽器將選擇它找到的第一個位置嘗試回退選項,該選項將定位元素完全放回螢幕上。

每個位置選項都用 <dashed-ident> 命名,幷包含一個描述符列表,指定定義諸如內嵌位置、外邊距、大小和自對齊等資訊的宣告。<dashed-ident> 用於在 position-try-fallbacks 屬性和 position-try 簡寫中引用自定義位置選項。

有關錨點功能和位置嘗試回退用法的詳細資訊,請參閱 CSS 錨點定位模組著陸頁和 溢位時的回退選項和條件隱藏指南。

語法

css
@position-try --try-option-name {
  descriptor-list
}

注意:--try-option-name 是一個 <dashed-ident>,用於指定自定義位置選項的標識名稱,然後可以使用該名稱將回退選項新增到 position-try-fallbacks 列表中。

描述符

描述符指定屬性值,這些屬性值定義自定義位置選項的行為,即它將導致定位元素放置的位置。

position-anchor

指定 position-anchor 屬性值,該值透過指定與錨點元素的 anchor-name 屬性值相等的 <dashed-ident> 值,來定義定位元素所錨定的錨點元素。

position-area

指定 position-area 屬性值,該值定義錨點定位元素相對於錨點的位置。

內嵌屬性描述符

指定 anchor() 函式值,該值定義錨點定位元素的邊緣相對於錨點元素邊緣的位置。可以設定表示以下屬性的內嵌屬性描述符

外邊距屬性描述符

指定在錨點定位元素上設定的外邊距。可以設定表示以下屬性的外邊距屬性描述符

尺寸屬性描述符

指定 anchor-size() 函式值,該值定義錨點定位元素相對於錨點元素的大小。可以設定表示以下屬性的尺寸屬性描述符

自對齊屬性描述符

指定 anchor-center 值,以在塊或行內方向上將錨點定位元素相對於錨點元素的中心對齊。align-selfjustify-self 屬性描述符可以採用 anchor-center 值。

注意:當自定義位置選項應用於元素時,@position-try @規則描述符中定義的屬性值優先於透過標準 CSS 屬性在元素上設定的值。

正式語法

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

示例

自定義位置選項用法

在此示例中,我們定義了一個錨點元素和一個錨點定位元素,然後建立了四個命名自定義位置嘗試回退選項。這些選項應用於定位元素,以確保無論錨點元素在視口中的哪個位置,其內容始終可見。

HTML

我們包含兩個 <div> 元素,它們將成為錨點和錨點定位元素。

html
<div class="anchor">⚓︎</div>

<div class="infobox">
  <p>This is an information box.</p>
</div>

CSS

我們首先將 <body> 元素樣式設定得非常大,以便我們可以在視口中水平和垂直滾動錨點和定位元素。

css
body {
  width: 1500px;
  height: 500px;
}

錨點被賦予一個 anchor-name,並且其 position 值設定為 absolute。然後,我們使用 topleft 值將其定位在初始 <body> 渲染的中心附近。

css
.anchor {
  anchor-name: --my-anchor;
  position: absolute;
  top: 100px;
  left: 350px;
}

接下來,我們使用 @position-try @規則定義了四個自定義位置選項,並使用描述性的 <dashed-ident> 名稱來識別它們並描述其目的。每個選項都將定位元素放置在錨點元素周圍的特定位置,並在定位元素及其錨點之間提供適當的 10px 外邊距。定位以各種方式處理,以演示可用的不同技術。

最後,左右位置選項被賦予更窄的 width

css
@position-try --custom-left {
  position-area: left;
  width: 100px;
  margin-right: 10px;
}

@position-try --custom-bottom {
  top: anchor(bottom);
  justify-self: anchor-center;
  margin-top: 10px;
  position-area: none;
}

@position-try --custom-right {
  left: calc(anchor(right) + 10px);
  align-self: anchor-center;
  width: 100px;
  position-area: none;
}

@position-try --custom-bottom-right {
  position-area: bottom right;
  margin: 10px 0 0 10px;
}

資訊框被賦予固定定位,一個引用錨點 anchor-nameposition-anchor 屬性以將兩者關聯起來,並且它使用 position-area 錨定到錨點的頂部邊緣。我們還給它一個固定的 width 和一些底部 margin。然後,自定義位置選項在 position-try-fallbacks 屬性中引用,以防止當錨點靠近視口邊緣時,定位元素溢位或被滾動出檢視。

css
.infobox {
  position: fixed;
  position-anchor: --my-anchor;
  position-area: top;
  width: 200px;
  margin-bottom: 10px;
  position-try-fallbacks:
    --custom-left, --custom-bottom, --custom-right, --custom-bottom-right;
}

結果

滾動頁面,注意隨著錨點靠近視口的不同邊緣,定位元素的放置位置會發生變化。這是由於應用了不同的回退位置選項。

讓我們來討論一下這些位置選項是如何工作的

  • 首先,請注意我們的預設位置由 position-area: top 定義。當資訊框在任何方向上都沒有溢位頁面時,資訊框位於錨點上方,並且 position-try-fallbacks 屬性中設定的位置嘗試回退選項將被忽略。另請注意,資訊框具有固定的寬度和底部外邊距。這些值將隨著應用不同的位置嘗試回退選項而改變。
  • 如果資訊框開始溢位,瀏覽器首先嚐試 --custom-left 位置。這使用 position-area: left 將資訊框移動到錨點左側,調整外邊距以適應,併為資訊框設定不同的寬度。
  • 接下來,瀏覽器嘗試 --custom-bottom 位置。這使用 topjustify-self 而不是 position-area 將資訊框移動到錨點底部,並設定適當的外邊距。它不包含 width 描述符,因此資訊框返回到由 width 屬性設定的預設寬度 200px
  • 瀏覽器接下來嘗試 --custom-right 位置。這與 --custom-left 位置的工作方式非常相似,應用了相同的 width 描述符值。但是,我們使用 leftalign-self 來放置定位元素,而不是 position-area。我們將 left 值包裝在 calc() 函式中,並在其中新增 10px 以建立間距,而不是使用 margin
  • 如果沒有其他嘗試回退選項能夠阻止定位元素溢位,瀏覽器會作為最後手段嘗試 --custom-bottom-right 位置。這使用 position-area: bottom right 將定位元素放置在錨點的右下方。

當應用位置選項時,其值會覆蓋在定位元素上設定的初始值。例如,最初在定位元素上設定的 width200px,但當應用 --custom-right 位置選項時,其寬度設定為 100px

在某些情況下,我們需要在自定義位置選項中設定值以關閉初始值。--custom-bottom--custom-right 選項使用內嵌屬性和 *-self: anchor-center 值來放置定位元素,因此我們透過設定 position-area: none 來移除每個情況下先前設定的 position-area 值。如果我們不這樣做,最初設定的 position-area: top 值仍然會生效並干擾其他定位資訊。

規範

規範
CSS 錨點定位
# at-ruledef-position-try

瀏覽器相容性

另見