作者:羅布·奧利裡✏️
和 HTML 元素(統稱為公開小工具)不容易設定樣式。由於限制,人們經常使用自訂元件製作自己的版本。然而,隨著 CSS 的發展,這些元素變得更容易自訂。在本文中,我將介紹如何自訂揭露小工具的外觀和行為。
是一個 HTML 元素,用於建立隱藏附加資訊的公開小工具。公開小部件通常呈現為帶有一些文字的三角形標記。
當使用者點擊小工具或聚焦於它並按空白鍵時,它會開啟並顯示其他資訊。三角形標記指向下方表示為開啟狀態:
揭露小工具有一個始終顯示的標籤,由
您也可以在
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
在設定
元素與[
揭露小工具有兩個偽元素來設定其組成部分的樣式:
在下面的部分中,我將示範一些更新的、鮮為人知的自訂揭露小部件的方法。
當您開啟公開小工具時,它會立即開啟。一眨眼,你就會錯過它!
最好以更漸進的方式從一種狀態轉換到另一種狀態,以向使用者展示其操作的影響。我們可以為顯示小部件的開啟和關閉操作添加過渡動畫嗎?簡而言之,是的!
為了實現動畫效果,我們希望隱藏內容的高度從零過渡到其最終高度。 height 屬性的預設值為 auto,這讓瀏覽器根據內容計算高度。在新增 [interpolate-size](https://nerdy.dev/interpolate-size) 屬性之前,在 CSS 中無法將動畫設為 auto 值。雖然瀏覽器對我們需要使用的新 CSS 功能的支援有點有限(主要是 interpolate-size 和 ::details-content),但這是漸進增強的一個很好的例子。目前它可以在 Chrome 中運作!
這是動畫的 CodePen 範例。
首先,我們加入 interpolate-size,以便我們可以過渡到 auto 高度:
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
接下來,我們要描述封閉式風格。我們希望「附加資訊」內容的高度為零,並確保沒有內容可見,即我們希望防止溢出。
我們使用 ::details-content 偽元素來定位隱藏內容。我使用區塊大小屬性而不是高度,因為使用邏輯屬性是一個好習慣。我們需要在過渡中包含內容可見性,因為瀏覽器在內容處於關閉狀態時設定內容可見性:隱藏 - 如果不包含它,關閉動畫將無法運作:
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
動畫仍然無法如預期般運作,因為內容可見性屬性是離散的動畫屬性。這意味著沒有插值;瀏覽器將在兩個值之間翻轉,以便在整個動畫持續時間內顯示過渡內容。我們不要這個。
如果我們包含transition-behavior:allow-discrete;,值會在動畫的最後翻轉,這樣我們就得到了漸變過渡。
此外,當公開小部件處於中間狀態時,我們透過將區塊大小設為 0 來獲得內容溢出。我們會在開啟時顯示大部分內容。為了防止這種情況發生,我們添加了overflow:hidden。
最後,我們新增開啟狀態的樣式。我們希望最終狀態的大小為 auto:
details { interpolate-size: allow-keywords; }
這些是大致的思路。如果您想要更詳細的影片說明,請查看 Kevin Powell 的演練,以了解如何為
如果「附加資訊」內容比寬,則揭露小部件可能會水平增長。內容。這可能會導致不必要的佈局變更。在這種情況下,您可能需要在
與任何動畫一樣,您應該考慮對運動敏感的使用者。您可以使用prefers-reduced-motion 媒體查詢來滿足該場景:
/* closed state */ details::details-content { block-size: 0; transition: content-visibility, block-size; transition-duration: 750ms; transition-behavior: allow-discrete; overflow: hidden; }
常見的 UI 模式是手風琴組件。它由一堆公開小部件組成,可以擴展這些小部件以顯示其內容。要實現此模式,您只需要多個連續的
/* open state */ details[open]::details-content { block-size: auto; }
預設樣式相當簡單:
每個佔據自己的陣線。它們的位置靠近(沒有邊距或填充),並且由於鄰近而被視為一個群組。如果您想強調它們是組合在一起的,您可以添加邊框並為它們提供相同的背景樣式,如下例所示:
此模式的變體是使手風琴獨佔,以便一次只能打開一個披露小部件。一旦打開一個,瀏覽器就會關閉另一個。您可以透過
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
在使用專屬手風琴之前,請考慮它是否對使用者有幫助。如果用戶可能想要消耗更多信息,這將要求他們經常打開項目,這可能會令人沮喪。
目前所有現代瀏覽器都支援此功能,因此您可以立即使用它。
揭露小部件通常在其旁邊顯示一個小三角形標記。在本節中,我們將介紹設定此標記樣式的過程。
標記與
如前所述,類似[
在進入範例之前,先簡單介紹一下瀏覽器支援。在撰寫本文時,Safari 是唯一不完全支援標記樣式的主要瀏覽器:
假設我們想將三角形標記的顏色變更為紅色,並將其放大 50%。我們可以做以下事情:
details { interpolate-size: allow-keywords; }
這應該適用於所有瀏覽器。這是 CodePen 範例。
預設情況下,標記位於
如果我們將 list-style-position 設為 Outside,則標記位於
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
您可以在上面螢幕截圖的第二個實例中看到這一點。
這是此範例的 CodePen:
如果要更改標記的內容,可以使用 ::marker 偽元素的 content 屬性。根據您的喜好,您可以將其設定為文字。對於我的範例,我使用拉鍊嘴表情符號表示閉合狀態,使用張口表情符號表示開啟狀態:
details { interpolate-size: allow-keywords; }
要使用圖像作為標記,可以使用 ::marker 偽元素的 content 屬性,或
的 list-style-image 屬性
/* closed state */ details::details-content { block-size: 0; transition: content-visibility, block-size; transition-duration: 750ms; transition-behavior: allow-discrete; overflow: hidden; }
在下面的範例中,我們使用材質符號中的兩個箭頭圖示作為標記。向右的箭頭為關閉狀態,向下的箭頭為開啟狀態:
這些範例將在 Chrome 和 Firefox 中按預期工作,但 Safari 將忽略樣式。您可以將其視為漸進式增強,然後就到此為止了。但如果您希望在所有瀏覽器中具有相同的外觀,則可以隱藏標記,然後添加您自己的圖像作為替身。這給你更多的自由:
/* open state */ details[open]::details-content { block-size: auto; }
您可以使用新的標記圖示(例如內嵌影像或透過偽元素)直觀地指示狀態。 已經(大部分)指示展開/折疊狀態。因此,如果您使用內嵌圖形,則應將其視為裝飾性的。空的 alt 屬性可以執行以下操作:
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
如果您願意,您也可以選擇將標記放置在
details { interpolate-size: allow-keywords; }
但是,需要注意的是,隱藏標記會導致螢幕閱讀器出現可訪問性問題。 Firefox、VoiceOver、JAWS 和 NVDA 都存在一個問題,即如果刪除標記,則始終會宣佈公開小部件的切換狀態。不幸的是,這種風格與國家息息相關。最好避免這樣做。
您可能想要設定揭露小工具的「附加資訊」部分的樣式,而不會將樣式洩漏到。因為
/* closed state */ details::details-content { block-size: 0; transition: content-visibility, block-size; transition-duration: 750ms; transition-behavior: allow-discrete; overflow: hidden; }
我的做法是排除
/* open state */ details[open]::details-content { block-size: auto; }
或者,您可以使用 ::details-content 偽元素,它針對整個部分。這就是為什麼你想用它來動畫開啟和關閉狀態轉換:
>@media (prefers-reduced-motion) { /* styles to apply if a user's device settings are set to reduced motion */ details::details-content { transition-duration: 0.8s; /* slower speed */ } }
注意到差別了嗎?該節的開頭只有一個邊距。
和
<details> <summary>Payment Options</summary> <p>...</p> </details> <details> <summary>Personalise your PIN</summary> <p>...</p> </details> <details> <summary>How can I add an additional cardholder to my Platinum Mastercard</summary> <p>...</p> </details>
因為元素具有按鈕的預設 ARIA 角色,它會從子元素中刪除所有角色。因此,如果您想要一個像
<details> <summary>Do you want to know more?</summary> <h3>Additional info</h3> <p>The average human head weighs around 10 to 11 pounds (approximately 4.5 to 5 kg).</p> </details>
隱藏標記會導致某些螢幕閱讀器出現輔助使用問題。 Firefox、VoiceOver、JAWS 和 NVDA 都存在一個問題,即如果刪除標記,則始終會宣佈公開小部件的切換狀態
最近有個大提案,幫忙把做成了。瀏覽器之間更具可自訂性和互通性。第一階段包括我在本文中介紹的一些內容:
令人興奮的消息是上面列表中的第 1 項和第 3 項已在 Chrome 131 中發布(截至 2024 年 11 月)。下一階段應該可以解決改進標記的樣式問題。此外,還有一組相關的變更將有助於提高這些元素的動畫能力。
在 CSS 中自訂 HTML 元素變得更加容易。現在,您可以建立具有完整瀏覽器支援的專用群組,將開啟/關閉狀態的轉換動畫化為漸進增強,並執行標記的簡單樣式。
的致命弱點是標記的樣式。好消息是,有一個積極的提案可以解決這個問題和其他一些痛點。這應該可以消除使用
隨著 Web 前端變得越來越複雜,資源貪婪的功能對瀏覽器的要求越來越高。如果您有興趣監控和追蹤生產中所有使用者的客戶端 CPU 使用情況、記憶體使用情況等,請嘗試 LogRocket。
LogRocket 就像是網路和行動應用程式的 DVR,記錄網路應用程式、行動應用程式或網站中發生的所有情況。您無需猜測問題發生的原因,而是可以匯總和報告關鍵前端效能指標、重播用戶會話以及應用程式狀態、記錄網路請求並自動顯示所有錯誤。
現代化偵錯 Web 和行動應用程式的方式 - 開始免費監控。
以上是使用現代 CSS 設計 HTML 的詳細內容。更多資訊請關注PHP中文網其他相關文章!