掌握現代網頁內容切換技巧:告別display: none
!
工欲善其事,必先利其器。
——亞伯拉罕·馬斯洛
習慣使用熟悉的工具很容易。對於內容切換,你可能習慣使用display: none
或opacity: 0
,並輔以一些JavaScript代碼。但如今的網頁技術更加現代化,是時候全面了解各種內容切換方法了:哪些原生API得到支持,它們的優缺點是什麼,以及你可能不知道的一些細節(例如偽元素和其他不明顯的內容)。
讓我們一起探討一下<details></details>
和<summary></summary>
元素、Dialog API、Popover API等等。我們將根據你的需求,探討何時使用每種方法。模態還是非模態? JavaScript還是純HTML/CSS?別擔心,我們將一一講解。
<details></details>
和<summary></summary>
元素
應用場景:以易於訪問的方式總結內容,同時允許獨立或作為手風琴式組件切換內容細節。
2024年12月12日更新:Chrome博客上的一篇新文章展示了使用<details></details>
的幾種更有趣的方法,包括動畫圖庫和部分打開的<details></details>
(可以選擇使用calc-size
進行動畫處理)。
按照發布順序,<details></details>
和<summary></summary>
元素標誌著我們第一次能夠在不使用JavaScript或奇特的複選框技巧的情況下切換內容。但缺乏瀏覽器支持顯然會阻礙新功能的普及,特別是這個功能最初缺乏鍵盤可訪問性。如果你從2011年Chrome 12版本發布以來就沒有使用過它,我能夠理解。眼不見心不煩,對吧?
以下是重點:
- 無需JavaScript即可正常工作(沒有任何妥協)。
- 無需
appearance: none
等屬性即可完全進行樣式設置。 - 你可以隱藏標記而無需使用非標準偽選擇器。
- 你可以連接多個
<details></details>
元素來創建一個手風琴式組件。 - 而且……從2024年開始,它完全可以進行動畫處理。
<details></details>
元素的標記
你需要的是:
<details><summary>内容摘要(始终可见)</summary> 内容(单击摘要时切换可见性) </details>
在後台,內容被包裝在一個偽元素中,從2024年開始,我們可以使用::details-content
選擇它。此外,還有一個::marker
偽元素指示<details></details>
是打開還是關閉,我們可以自定義它。
考慮到這一點,<details></details>
在後台實際上是這樣的:
<details><summary>内容摘要(始终可见)</summary> 内容(单击摘要时切换可见性) </details>
要使<details></details>
默認打開,請為<details></details>
添加open
屬性,這與<details></details>
打開時後台發生的情況相同。
<details><summary><::marker></::marker>内容摘要(始终可见)</summary><::details-content> 内容(单击摘要时切换可见性) </::details-content></details>
<details></details>
元素的樣式設置
說實話:你可能只想去掉那個煩人的標記。你可以通過將<summary></summary>
的display
屬性設置為除list-item
以外的任何值來實現:
<details open=""> ... </details>
或者,你可以修改標記。事實上,下面的示例使用了Font Awesome將其替換為另一個圖標,但請記住::marker
不支持許多屬性。最靈活的解決方法是用一個元素包裝<summary></summary>
的內容,然後在CSS中選擇它。
summary { display: block; /* 或任何其他非 list-item 的值 */ }
<details><summary>内容摘要</summary> 内容 </details>
使用多個<details></details>
元素創建手風琴式組件
要創建手風琴式組件,請使用name
屬性為多個<details></details>
元素命名,並使用匹配的值(類似於實現單選按鈕的方式):
details { /* 标记 */ summary::marker { content: "\f150"; font-family: "Font Awesome 6 Free"; } /* <details>打开时的标记 */ &[open] summary::marker { content: "\f151"; } /* 因为 ::marker 不支持许多属性 */ summary span { margin-left: 1ch; display: inline-block; } }</details>
使用一個包裝器,我們甚至可以將它們變成水平選項卡:
<details name="starWars" open=""><summary>前传</summary><ul> <li>第一集:幽灵的威胁</li> <li>第二集:克隆人的进攻</li> <li>第三集:西斯的复仇</li> </ul></details><details name="starWars"><summary>原版</summary><ul> <li>第四集:新希望</li> <li>第五集:帝国反击战</li> <li>第六集:绝地归来</li> </ul></details><details name="starWars"><summary>续集</summary><ul> <li>第七集:原力觉醒</li> <li>第八集:最后的绝地武士</li> <li>第九集:天行者的崛起</li> </ul></details>
<div> <details name="starWars" open=""> ... </details><details name="starWars"> ... </details><details name="starWars"> ... </details> </div>
……或者,使用2024年的Anchor Positioning API,創建垂直選項卡(相同的HTML):
div { gap: 1ch; display: flex; position: relative; details { min-height: 106px; /* 防止内容偏移 */ &[open] summary, &[open]::details-content { background: #eee; } &[open]::details-content { left: 0; position: absolute; } } }
如果你想了解一下我們如何使用CSS中的Popover API,可以查看John Rhea的文章,他在文章中僅僅使用<details></details>
元素就製作了一個互動遊戲!
添加JavaScript功能
想要添加一些JavaScript功能?
div { display: inline-grid; anchor-name: --wrapper; details[open] { summary, &::details-content { background: #eee; } &::details-content { position: absolute; position-anchor: --wrapper; top: anchor(top); left: anchor(right); } } }
創建可訪問的<details></details>
元素
只要遵循一些規則,<details></details>
元素就是可訪問的。例如,<summary></summary>
基本上是一個<label></label>
,這意味著當它獲得焦點時,屏幕閱讀器會宣布其內容。如果沒有<summary></summary>
或<summary></summary>
不是<details></details>
的直接子元素,則用戶代理會為你創建一個標籤,通常在視覺上和輔助技術中都顯示為“Details”。較舊的瀏覽器可能堅持要求它是第一個子元素,因此最好將其設置為第一個子元素。
此外,<summary></summary>
具有按鈕的角色,因此在<button></button>
中無效的內容在<summary></summary>
中也是無效的。這包括標題,因此你可以將<summary></summary>
的樣式設置為標題,但你不能實際將標題插入<summary></summary>
中。
剩餘內容因篇幅限制,無法全部翻譯。請提供其他部分,我將盡力翻譯。
以上是切換內容的不同(現代)方式的詳細內容。更多資訊請關注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
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

SublimeText3 Linux新版
SublimeText3 Linux最新版

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

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

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

SAP NetWeaver Server Adapter for Eclipse
將Eclipse與SAP NetWeaver應用伺服器整合。