CSS錨點定位:一個令人驚喜的功能,但也存在一些棘手的問題。雖然不像Flexbox或Grid那樣徹底改變遊戲規則,但它填補了數十年來CSS定位中的空白。然而,它也有一些獨特的特性,導致了一些令人費解的行為。本文將探討一個困擾我已久的錨點定位問題。
起源
一個月前,我在閱讀他人使用錨點定位的案例時發現了這個問題,特別是Temani Afif關於“錨點定位和滾動驅動動畫”的文章。強烈建議您閱讀這篇文章,看看是什麼引起了我的注意。他巧妙地結合了錨點定位和滾動驅動動畫,製作了一個在進度變化時顏色也會改變的範圍滑塊。
更令人驚奇的是,他使用了兩個具有相同錨點名稱的目標元素,每個元素都附加到其對應的錨點上,如同魔法一般。如果這看起來並不那麼有趣,那麼我們應該簡要回顧一下錨點定位的工作原理。
CSS錨點定位和anchor-scope屬性
請參閱我們的完整CSS錨點定位指南,以獲得更深入的了解。
錨點定位為CSS帶來了兩個新概念:錨點元素和目標元素。錨點是用於定位其他元素的參考元素。目標元素是相對於一個或多個錨點進行絕對定位的元素。
錨點和目標幾乎可以是任何元素,您可以將它們視為並排放置的兩個div:
<code><div>anchor</div> <div>target</div></code>
首先,我們必須使用anchor-name
屬性在CSS中註冊錨點元素:
<code>.anchor { anchor-name: --my-anchor; }</code>
然後,在絕對定位的元素上使用position-anchor
屬性將其附加到具有相同名稱的錨點。但是,要移動錨點周圍的目標,我們需要position-area
屬性。
<code>.target { position: absolute; position-anchor: --my-anchor; position-area: top right; }</code>
這很好用,但是如果我們更改標記以包含更多錨點和目標,情況就會變得複雜:
<code></code>
-
anchor 1target 1
-
anchor 2target 2
-
anchor 3target 3
目標元素不會附加到其最近的錨點,而是全部堆積在DOM中最後註冊的錨點上。
anchor-scope
屬性在Chrome 131中引入,用於解決此問題。它將錨點的範圍限製到子樹,以便每個目標正確附加。但是,我不想關注此屬性,因為最初引起我注意的是Temani沒有使用它。出於某種原因,所有目標都正確附加,再次像魔法一樣。
發生了什麼?
目標通常附加到DOM中的最後一個錨點,而不是其最近的錨點,但在我們的第一個示例中,我們看到了兩個具有相同anchor-name
的錨點及其對應的附加目標。所有這些都沒有使用anchor-scope
屬性。發生了什麼?
兩個詞:包含塊。
關於錨點定位需要注意的是,它很大程度上依賴於元素包含塊的構建方式。這並非錨點定位本身固有的特性,而是絕對定位的特性。絕對定位的元素相對於其包含塊進行定位,而像top: 0px
、left: 30px
或inset: 1rem
這樣的內邊距屬性只是在包含塊邊界周圍移動元素,創建所謂的內邊距修改後的包含塊。
附加到錨點的目標沒有什麼不同,position-area
屬性在底層所做的就是更改目標的內邊距修改後的包含塊,使其緊挨著錨點。
通常,絕對定位元素的包含塊是整個視口,但可以通過任何位置屬性非static
的祖先元素(通常是relative
)來更改。 Temani利用了這一事實,為每個滑塊創建了一個新的包含塊,因此它們只能附加到其對應的錨點。如果您查看代碼,您可以在開頭找到它:
<code><div>anchor</div> <div>target</div></code>
如果我們在之前的示例中使用此策略,它們就會突然正確附加!
另一個問題
我們不需要使用anchor-scope
屬性將每個錨點附加到其各自的目標,而是利用瞭如何計算絕對元素的包含塊。但是,還有另一種方法,不需要任何額外的代碼。
當我同時試驗滾動驅動動畫和錨點定位並嘗試將文本氣泡腳註附加到帖子的側面時,我發現了這一點,如下所示:
邏輯上,每個腳註都是一個目標,但錨點的選擇有點棘手。我最初認為每個段落都可以作為錨點,但這意味著將有多個具有相同anchor-name
的錨點。結果:所有目標都將堆積在最後一個錨點上:
這可以通過我們之前為每個註釋創建新包含塊的方法來解決。但是,我們還可以採取另一種方法,我稱之為還原論方法。當有多個具有相同anchor-name
的錨點時,問題就出現了,因此我們將錨點的數量減少到一個,使用一個可以作為所有目標的公共錨點的元素。
在這種情況下,我們只想將每個目標定位在帖子的兩側,因此我們可以使用帖子的整個主體作為錨點,並且由於每個目標自然地在垂直軸上對齊,剩下的就是沿著水平軸移動它們:
您可以更好地檢查原始帖子是如何完成的!
結論
anchor-scope
可能是最近發佈到瀏覽器(到目前為止,僅在Chrome 131 中)的CSS屬性,因此我們不能指望它的支持會超出預期。雖然我很想隨時隨地使用它,但在一段時間內它仍將局限於簡短的演示。這不是限制使用其他錨點定位屬性的理由,這些屬性在Chrome 125及更高版本中受支持(並希望在不久的將來在其他瀏覽器中受支持),因此我希望這些小問題可以幫助您毫無顧慮地繼續使用錨點定位。
以上是另一個錨定位怪癖的詳細內容。更多資訊請關注PHP中文網其他相關文章!

文章討論了CSS FlexBox,這是一種佈局方法,用於有效地對齊和分佈響應設計中的空間。它說明了FlexBox用法,將其與CSS網格進行了比較,並詳細瀏覽了瀏覽器支持。

本文討論了使用CSS創建響應網站的技術,包括視口元標籤,靈活的網格,流體媒體,媒體查詢和相對單元。它還涵蓋了使用CSS網格和Flexbox一起使用,並推薦CSS框架

本文討論了CSS盒裝屬性,該屬性控制了元素維度的計算方式。它解釋了諸如Content-Box,Border-Box和Padding-Box之類的值,以及它們對佈局設計和形式對齊的影響。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

mPDF
mPDF是一個PHP庫,可以從UTF-8編碼的HTML產生PDF檔案。原作者Ian Back編寫mPDF以從他的網站上「即時」輸出PDF文件,並處理不同的語言。與原始腳本如HTML2FPDF相比,它的速度較慢,並且在使用Unicode字體時產生的檔案較大,但支援CSS樣式等,並進行了大量增強。支援幾乎所有語言,包括RTL(阿拉伯語和希伯來語)和CJK(中日韓)。支援嵌套的區塊級元素(如P、DIV),

DVWA
Damn Vulnerable Web App (DVWA) 是一個PHP/MySQL的Web應用程序,非常容易受到攻擊。它的主要目標是成為安全專業人員在合法環境中測試自己的技能和工具的輔助工具,幫助Web開發人員更好地理解保護網路應用程式的過程,並幫助教師/學生在課堂環境中教授/學習Web應用程式安全性。 DVWA的目標是透過簡單直接的介面練習一些最常見的Web漏洞,難度各不相同。請注意,該軟體中

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具