首页 web前端 css教程 使用现代 CSS 设计 HTML 和

使用现代 CSS 设计 HTML 和

Jan 03, 2025 am 05:54 AM

作者:罗布·奥利里✏️

和<摘要> HTML 元素(统称为公开小部件)不容易设置样式。由于限制,人们经常使用自定义组件制作自己的版本。然而,随着 CSS 的发展,这些元素变得更容易定制。在本文中,我将介绍如何自定义披露小部件的外观和行为。

如何和<摘要>一起工作吗?

<详情>是一个 HTML 元素,用于创建隐藏附加信息的公开小部件。公开小部件通常呈现为带有一些文本的三角形标记。

当用户单击小部件或聚焦于它并按空格键时,它会打开并显示其他信息。三角形标记指向下方表示处于打开状态:

Styling HTML <details> 和 <summary> 使用现代 CSS

Styling HTML <details> 和 <summary> 使用现代 CSS

披露小部件有一个始终显示的标签,由

提供。元素。这是第一个孩子。如果省略,则浏览器提供默认标签。通常,它会说“详细信息”:

Styling HTML <details> 和 <summary> 使用现代 CSS

您还可以在

之后提供多个元素表示附加信息的元素:

<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>
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制
登录后复制

造型和<摘要>

在设置

样式时应考虑一些互操作性问题。和<摘要>元素。在讨论一些常见用例之前,让我们先介绍一下基础知识。

元素与 [

  • ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li) 元素类似,因为它的默认样式包括 display: list-item。因此,它支持 [list-style](https://developer.mozilla.org/docs/Web/CSS/list-style) 简写属性及其普通属性。浏览器对列表样式属性的支持相当好,但 Safari 仍然落后。

    披露小部件有两个伪元素来设置其组成部分的样式:

    1. ::marker 伪元素:表示位于 开头的三角形标记。这个造型的故事有点复杂。我们仅限于一小组 CSS 属性。浏览器对 ::marker 的支持很好,但 Safari 目前不支持完整的属性集。我将在本文的“设置摘要标记样式”部分中更详细地讨论这一点
    2. ::details-content 伪元素:表示
      的“附加信息”。这是最近添加的,因此浏览器支持目前仅限于 Chrome

    Styling HTML <details> 和 <summary> 使用现代 CSS

    在下面的部分中,我将演示一些更新的、鲜为人知的自定义披露小部件的方法。

    动画打开和关闭动作

    当您打开公开小部件时,它会立即打开。一眨眼,你就会错过它!

    最好以更渐进的方式从一种状态转换到另一种状态,以向用户展示其操作的影响。我们可以为显示小部件的打开和关闭操作添加过渡动画吗?简而言之,是的!

    为了实现动画效果,我们希望隐藏内容的高度从零过渡到其最终高度。 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;
    }
    
    登录后复制
    登录后复制
    登录后复制

    默认样式相当简单:

    Styling HTML <details> 和 <summary> 使用现代 CSS

    每个占据自己的阵线。它们的位置靠近(没有边距或填充),并且由于邻近而被视为一个组。如果您想强调它们是组合在一起的,您可以添加边框并为它们提供相同的背景样式,如下例所示:

    此模式的一种变体是使手风琴独占,以便一次只能打开一个披露小部件。一旦打开一个,浏览器就会关闭另一个。您可以通过

    的name属性创建独占组。具有相同的名称形成一个语义组:

    <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>
    
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    在使用专属手风琴之前,请考虑它是否对用户有帮助。如果用户可能想要消耗更多信息,这将要求他们经常打开项目,这可能会令人沮丧。

    目前所有现代浏览器都支持此功能,因此您可以立即使用它。

    设置摘要标记的样式

    披露小部件通常在其旁边显示一个小三角形标记。在本节中,我们将介绍设置此标记样式的过程。

    标记与

    相关联。元素。添加 [::marker](https://developer.mozilla.org/docs/Web/CSS/::marker) 伪元素意味着我们可以直接设置标记框的样式。但是,我们仅限于一小组 CSS 属性:

    • 所有字体属性
    • 颜色
    • 空白
    • text-combine-upright、[unicode-bidi](https://developer.mozilla.org/en-US/docs/Web/CSS/unicode-bidi) 和方向属性
    • 内容
    • 所有动画和过渡属性

    如前所述,<总结>类似于 [

  • ](https://developer.mozilla.org/en-US/docs/Web/HTML/Element/li);它支持列表样式的简写属性及其普通属性。虽然这听起来有点大杂烩,但通过一些示例会更容易理解样式选项。

    在进入示例之前,先简单介绍一下浏览器支持。在撰写本文时,Safari 是唯一不完全支持标记样式的主要浏览器:

    • Safari 支持当前仅限于对 ::marker 伪元素的颜色和字体大小属性进行样式设置。 Safari 支持非标准伪元素 ::-webkit-details-marker
    • Safari 根本不支持设置列表样式属性的样式。参考CanIUse

    更改标记的颜色和大小

    假设我们想将三角形​​标记的颜色更改为红色,并将其放大 50%。我们可以做以下事情:

    details {
        interpolate-size: allow-keywords;
    }
    
    登录后复制
    登录后复制
    登录后复制
    登录后复制

    Styling HTML <details> 和 <summary> 使用现代 CSS

    这应该适用于所有浏览器。这是 CodePen 示例。

    调整标记的间距

    默认情况下,标记位于

    文本内容的一侧。并且它们位于同一个边界框中。列表样式位置设置为内部。当它处于打开状态时,“附加信息”位于标记的正下方。也许您想更改其间距和对齐方式:

    Styling HTML <details> 和 <summary> 使用现代 CSS

    如果我们将 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;
    }
    
    登录后复制
    登录后复制
    登录后复制

    我的做法是排除

    使用 :not() 函数的元素。请记住,这针对的是每个元素,而不是作为单个部分的内容!

    /* open state */
    details[open]::details-content {
      block-size: auto;
    }
    
    登录后复制
    登录后复制
    登录后复制

    Styling HTML <details> 和 <summary> 使用现代 CSS

    或者,您可以使用 ::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 */
       }
    }
    
    登录后复制

    Styling HTML <details> 和 <summary> 使用现代 CSS

    注意到区别了吗?该节的开头只有一个边距。

    没有边距。使用 ::details-content 伪元素的缺点是浏览器支持目前仅限于 Chrome。

    设计披露小部件时的常见错误

    • 历史上,无法更改
      的显示类型。元素。 Chrome 中放宽了此限制
    • 请小心更改 的显示类型。默认为display:list-item;;如果将其更改为 display: block;,可能会导致标记在某些浏览器中被隐藏。这是 Firefox 中的一个问题:
    <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. 删除CSS显示属性限制,以便您可以使用其他显示类型,例如flex和grid
    2. 更清晰地指定影子树的结构。这应该有助于与 Flexbox 和 CSS Grid 的互操作性
    3. 添加 ::details-content 伪元素来寻址第二个槽,以便在
      中添加“附加信息”的容器。元素可以设置样式

    令人兴奋的消息是上面列表中的第 1 项和第 3 项已在 Chrome 131 中发布(截至 2024 年 11 月)。下一阶段应该解决改进标记的样式问题。此外,还有一组相关的更改将有助于提高这些元素的动画能力。

    结论

    在 CSS 中自定义 HTML 元素变得更加容易。现在,您可以创建具有完整浏览器支持的专用组,将打开/关闭状态的转换动画化为渐进增强,并执行标记的简单样式。

    的致命弱点是标记的样式。好消息是,有一个积极的提案可以解决这个问题和其他一些痛点。这应该可以消除使用

    时的所有障碍。在不久的将来,您将不需要编写自己的披露小部件或使用第三方 Web 组件! ?


    您的前端是否占用了用户的 CPU?

    随着 Web 前端变得越来越复杂,资源贪婪的功能对浏览器的要求越来越高。如果您有兴趣监控和跟踪生产中所有用户的客户端 CPU 使用情况、内存使用情况等,请尝试 LogRocket。

    Styling HTML <details> 和 <summary> 使用现代 CSS

    LogRocket 就像网络和移动应用程序的 DVR,记录网络应用程序、移动应用程序或网站中发生的所有情况。您无需猜测问题发生的原因,而是可以汇总和报告关键前端性能指标、重放用户会话以及应用程序状态、记录网络请求并自动显示所有错误。

    现代化调试 Web 和移动应用程序的方式 - 开始免费监控。

  • 以上是使用现代 CSS 设计 HTML 和 的详细内容。更多信息请关注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

    使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

    热门文章

    <🎜>:泡泡胶模拟器无穷大 - 如何获取和使用皇家钥匙
    3 周前 By 尊渡假赌尊渡假赌尊渡假赌
    Mandragora:巫婆树的耳语 - 如何解锁抓钩
    3 周前 By 尊渡假赌尊渡假赌尊渡假赌
    北端:融合系统,解释
    3 周前 By 尊渡假赌尊渡假赌尊渡假赌

    热工具

    记事本++7.3.1

    记事本++7.3.1

    好用且免费的代码编辑器

    SublimeText3汉化版

    SublimeText3汉化版

    中文版,非常好用

    禅工作室 13.0.1

    禅工作室 13.0.1

    功能强大的PHP集成开发环境

    Dreamweaver CS6

    Dreamweaver CS6

    视觉化网页开发工具

    SublimeText3 Mac版

    SublimeText3 Mac版

    神级代码编辑软件(SublimeText3)

    热门话题

    Java教程
    1668
    14
    CakePHP 教程
    1426
    52
    Laravel 教程
    1328
    25
    PHP教程
    1273
    29
    C# 教程
    1255
    24
    静态表单提供商的比较 静态表单提供商的比较 Apr 16, 2025 am 11:20 AM

    让我们尝试在这里造成一个术语:“静态表单提供商”。你带上html

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

    在一个新项目开始时,Sass汇编发生在眼睛的眨眼中。感觉很棒,尤其是当它与browsersync配对时,它重新加载

    每周平台新闻:HTML加载属性,主要的ARIA规格以及从iframe转移到Shadow dom 每周平台新闻:HTML加载属性,主要的ARIA规格以及从iframe转移到Shadow dom Apr 17, 2025 am 10:55 AM

    在本周的平台新闻综述中,Chrome引入了一个用于加载的新属性,Web开发人员的可访问性规范以及BBC Move

    带有HTML对话框元素的一些动手 带有HTML对话框元素的一些动手 Apr 16, 2025 am 11:33 AM

    这是我第一次查看HTML元素。我已经意识到了一段时间,但是尚未将其旋转。它很酷,

    纸张形式 纸张形式 Apr 16, 2025 am 11:24 AM

    购买或建造是技术的经典辩论。自己构建东西可能会感觉更便宜,因为您的信用卡账单上没有订单项,但是

    '订阅播客”链接应在哪里? '订阅播客”链接应在哪里? Apr 16, 2025 pm 12:04 PM

    有一段时间,iTunes是播客中的大狗,因此,如果您将“订阅播客”链接到喜欢:

    托管您自己的非JavaScript分析的选项 托管您自己的非JavaScript分析的选项 Apr 15, 2025 am 11:09 AM

    有很多分析平台可帮助您跟踪网站上的访问者和使用数据。也许最著名的是Google Analytics(广泛使用)

    See all articles