目錄
使用多個
元素創建手風琴式組件
添加JavaScript功能
創建可訪問的
元素
首頁 web前端 css教學 切換內容的不同(現代)方式

切換內容的不同(現代)方式

Mar 07, 2025 pm 05:09 PM

掌握現代網頁內容切換技巧:告別display: none

The Different (and Modern) Ways to Toggle Content

工欲善其事,必先利其器。

——亞伯拉罕·馬斯洛

習慣使用熟悉的工具很容易。對於內容切換,你可能習慣使用display: noneopacity: 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中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

帶有粘性定位的堆疊卡和一點點的雜物 帶有粘性定位的堆疊卡和一點點的雜物 Apr 03, 2025 am 10:30 AM

前幾天,我發現了科里·金尼文(Corey Ginnivan)網站上的這一點,當您滾動時,彼此之間的卡片堆放集。

Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

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

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? 為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? Apr 05, 2025 pm 05:51 PM

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

如何通過CSS選擇第一個類名為item的子元素? 如何通過CSS選擇第一個類名為item的子元素? Apr 05, 2025 pm 11:24 PM

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

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? 在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? Apr 05, 2025 pm 10:21 PM

在前端開發中如何實現類似Windows...

See all articles