使用CSS錨定位和視圖驅動的動畫彈出評論
2024 年 CSS 現狀調查結果已出爐,一如既往地引人入勝。雖然每個部分都值得深入分析,但我們通常最關注的是最常用 CSS 功能的部分。如果您有興趣撰寫關於 Web 開發的文章(也許可以和我們一起開始寫作?),您會特別想查看該功能的“閱讀清單”部分。它包含調查受訪者在完成調查後希望閱讀的功能,通常由社區認知度較低的最新功能組成。
令我興奮的一個功能是我 2024 年的首選:CSS 錨點定位,在調查中排名第四。您可以在下面找到滾動驅動動畫,這是另一個今年獲得廣泛瀏覽器支持的出色功能。兩者都優雅且提供良好的開發者體驗,但將它們結合起來會打開新的可能性,這些可能性在去年大多數人看來都屬於 JavaScript 的領域。
我想展示其中一種可能性,同時進一步了解這兩個功能。具體來說,我們將創建一個博客文章,其中腳註會作為評論彈出在每段文本的旁邊。
對於此演示,我們的要求如下:
- 腳註進入屏幕時彈出。
- 將它們附加到相應的文本。
- 腳註位於屏幕兩側,因此我們需要一個移動端備用方案。
基礎
首先,我們將使用以下常見的博客文章佈局示例:標題、封面圖片和正文:
需要注意的唯一一點是,我們偶爾會有一段帶有腳註的段落:
<code><main><p> 非常有趣的信息! 关于它的脚注 </p> </main></code>
定位腳註
在此演示中,腳註位於文章正文中,緊跟在我們想要註釋的文本之後。但是,我們希望它們作為浮動氣泡附加在文本旁邊。過去,我們可能需要結合使用絕對定位和相對定位,並為每個腳註找到正確的內邊距屬性。
但是,我們現在可以使用錨點定位來完成這項工作,這項功能允許我們將絕對定位的元素相對於其他元素進行定位——而不僅僅是相對於其所在的容器上下文。我們將討論“錨點”和“目標”一段時間,因此在開始時需要一些術語:
- 錨點:這是用作定位其他元素的參考的元素,因此得名錨點。
- 目標:這是相對於一個或多個錨點定位的絕對定位元素。目標是我們從現在開始使用的名稱,但在其他資源中,您經常會發現它只是“絕對定位元素”。
我不會詳細介紹每個細節,但如果您想了解更多信息,我強烈推薦我們的錨點定位指南,其中包含完整的信息和示例。
錨點和目標
很容易知道每個 .footnote
都是目標元素。然而,選擇我們的錨點需要更多的細微差別。雖然看起來每個 .note
元素都應該是錨點元素,但最好選擇整個 .post
作為錨點。如果我們將 .footnote
的位置設置為絕對定位,我來解釋一下:
<code><main><p> 非常有趣的信息! 关于它的脚注 </p> </main></code>
您會注意到,文章中的 .footnote
元素已從正常的文檔流中移除,並且它們在視覺上懸停在它們的 .note
元素上方。這是個好消息!由於它們已經在垂直軸上對齊,我們只需使用文章作為錨點,在水平軸上將它們移動到側面即可。
這時,我們需要找到正確的內邊距屬性才能將它們放在兩側。雖然這是可行的,但這卻是一個痛苦的選擇,因為:
- 您必須依賴一個神奇數字。
- 它取決於視口。
- 它取決於腳註的內容,因為它會改變其寬度。
元素默認情況下不是錨點,因此要將文章註冊為錨點,我們必須使用 anchor-name
屬性並為其提供一個短橫線標識符(以兩個短橫線開頭的自定義名稱)作為名稱。
<code>.footnote { position: absolute; }</code>
在這種情況下,我們的目標元素將是 .footnote
。要使用目標元素,我們可以保留絕對定位並使用 position-anchor
屬性選擇錨點元素,該屬性採用錨點的短橫線標識符。這將使 .post
成為下一步中目標的默認錨點。
<code>.post { anchor-name: --post; }</code>
移動目標
與其為 .footnote
的 left
或 right
屬性選擇任意內邊距值,我們可以使用 anchor()
函數。它返回一個表示錨點一側位置的 <length></length>
值,允許我們始終正確設置目標的內邊距屬性。因此,我們可以將目標的左側連接到錨點的右側,反之亦然:
<code>.footnote { position: absolute; position-anchor: --post; }</code>
但是,您會注意到它卡在文章的一側,中間沒有空間。幸運的是,margin
屬性的工作方式與您希望的針對目標元素的方式一樣,並在腳註目標和文章錨點之間留出一些空間。我們還可以添加更多樣式以使外觀更漂亮:
<code>.footnote { position: absolute; position-anchor: --post; /* 将它们放在右侧 */ left: anchor(right); /* 或将它们放在左侧 */ right: anchor(left); /* 每次只使用其中一个! */ }</code>
最後,所有 .footnote
元素都在文章的同一側,如果我們想將它們安排在每一側,我們可以使用 nth-of-type()
選擇器來選擇奇數和偶數註釋並將它們設置在相對的側邊。
<code>.footnote { /* ... */ background-color: #fff; border-radius: 20px; margin: 0px 20px; padding: 20px; }</code>
我們使用 nth-of-type()
而不是 nth-child
,因為我們只想迭代 .note
元素而不是所有同級元素。
請記住從 .footnote
中刪除最後一個內邊距聲明,然後瞧!我們的腳註位於每一側。您會注意到我還為每個腳註添加了一個小三角形,但這超出了本文的範圍:
視圖驅動動畫
讓我們開始創建彈出動畫。我發現這是最簡單的一部分,因為視圖和滾動驅動動畫都盡可能直觀。我們將首先使用常見的 @keyframes
註冊動畫。我們想要的是讓我們的腳註從不可見開始,然後慢慢變大並可見:
<code><main><p> 非常有趣的信息! 关于它的脚注 </p> </main></code>
這就是我們的動畫,現在我們只需要將其添加到每個 .footnote
:
<code>.footnote { position: absolute; }</code>
這本身不會做任何事情。我們通常會為它設置一個 animation-duration
以使其開始。但是,視圖驅動動畫不會通過設定的時間運行,而是動畫進度將取決於元素在屏幕上的位置。為此,我們將 animation-timeline
設置為 view()
。
<code>.post { anchor-name: --post; }</code>
這使得動畫在元素離開屏幕時結束。我們希望它在更易讀的位置結束。最後的潤色是將 animation-range
設置為 cover 0% cover 40%
。這意味著,“我希望元素在視圖中為 0% 時開始動畫,並在視圖中為 40% 時結束。”
<code>.footnote { position: absolute; position-anchor: --post; }</code>
Bramus 的這個令人驚嘆的工具更側重於滾動和視圖驅動動畫,它更好地展示了 animation-range
屬性的工作原理。
移動端怎麼辦?
您可能已經註意到,這種腳註方法在較小的屏幕上不起作用,因為文章兩側沒有空間。修復很簡單。我們希望腳註在小屏幕上顯示為普通腳註,在大屏幕上顯示為註釋,我們可以通過僅在屏幕大於某個閾值(約 1000 像素)時才顯示我們的註釋來做到這一點。如果不是,則註釋將像您在 Web 上找到的任何其他註釋一樣顯示在文章正文中。
<code>.footnote { position: absolute; position-anchor: --post; /* 将它们放在右侧 */ left: anchor(right); /* 或将它们放在左侧 */ right: anchor(left); /* 每次只使用其中一个! */ }</code>
現在,只有當有足夠的空間時,我們的註釋才會顯示在兩側:
總結
如果您也喜歡撰寫自己熱衷的內容,您會經常發現自己會進入隨機的切線,或者想要為每段添加評論以提供額外的上下文。至少,這就是我的情況,因此能夠動態顯示評論是一個很好的補充。特別是當我們僅使用 CSS 就能實現這一點時——這是我們一年前無法做到的!
以上是使用CSS錨定位和視圖驅動的動畫彈出評論的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

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

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

在元素個數不固定的情況下如何通過CSS選擇第一個指定類名的子元素在處理HTML結構時,常常會遇到元素個數不�...
