目录
使用多个
元素创建手风琴式组件
添加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)

VUE 3 VUE 3 Apr 02, 2025 pm 06:32 PM

它的出局!恭喜Vue团队完成了完成,我知道这是一项巨大的努力,而且很长时间。所有新文档也是如此。

您可以从浏览器获得有效的CSS属性值吗? 您可以从浏览器获得有效的CSS属性值吗? Apr 02, 2025 pm 06:17 PM

我有人写了这个非常合法的问题。 Lea只是在博客上介绍了如何从浏览器中获得有效的CSS属性。那样的是这样。

在CI/CD上有点 在CI/CD上有点 Apr 02, 2025 pm 06:21 PM

我说的“网站”比“移动应用程序”更合适,但我喜欢Max Lynch的框架:

带有粘性定位的堆叠卡和一点点的杂物 带有粘性定位的堆叠卡和一点点的杂物 Apr 03, 2025 am 10:30 AM

前几天,我发现了科里·金尼文(Corey Ginnivan)网站上的这一点,当您滚动时,彼此之间的卡片堆放集。

在WordPress块编辑器中使用Markdown和本地化 在WordPress块编辑器中使用Markdown和本地化 Apr 02, 2025 am 04:27 AM

如果我们需要直接在WordPress编辑器中向用户显示文档,那么最佳方法是什么?

比较浏览器的响应式设计 比较浏览器的响应式设计 Apr 02, 2025 pm 06:25 PM

这些桌面应用程序中有许多目标是同时在不同的维度上显示您的网站。因此,例如,您可以写作

如何将CSS网格用于粘头和页脚 如何将CSS网格用于粘头和页脚 Apr 02, 2025 pm 06:29 PM

CSS网格是一系列属性的集合,旨在使布局比以往任何时候都容易。像任何东西一样,那里有一点学习曲线,但是网格是

Google字体可变字体 Google字体可变字体 Apr 09, 2025 am 10:42 AM

我看到Google字体推出了新设计(Tweet)。与上一次大型重新设计相比,这感觉更加迭代。我几乎无法分辨出区别

See all articles