찾다
웹 프론트엔드H5 튜토리얼HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

本篇文章给大家带来的内容是关于利用HTML5的details, summary实现各种交互效果,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。

本文利用的是HTML5 details, summary

首先

一、了解HTML5 details, summary默认交互行为

标签在Chrome,Firefox等浏览器下默认是有展开收起行为的,例如下面HTML:

<details>

    <summary>这是摘要1</summary>

    <p>这里具体描述,标签相对随意,例如这里使用的</p>
<p>标签。</p>

</details>

结果UI表现为:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

具体描述为:

1、只显示了

标签内容,而

默认隐藏了;

2、

标签前面出现了一个小三角;

小三角图形的隐喻是:我是可点击的,点击我可能会出现宝箱。

OK,我们不妨就点击一下,结果如下图:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

具体描述为:

  1. 原本隐藏的

    标签显示出来了;

  2. 标签前面的小三角方向朝下了;

此时我们再一次点击,

标签内容又会隐藏收起,箭头方向还原,如下图:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현


活脱脱一个天然的展开收起效果。

展开与收起是通过open属性控制的

通过在

标签上添加布尔类型的open属性,可以让我们的详情信息默认就是展开状态,如下HTML示意:

<details>
    <summary>这是摘要2</summary>
    <content>这里<details>标签设置了HTML布尔属性open,因此,默认是展开状态。</details></content>
</details>

结果如下截图:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

如果我们使用JS脚本手动移除这个open属性,即使没有点击行为的发生,我们内容也会收起。

如果缺省

<summary></summary>标签如果缺省,则<details></details>元素会在内部自动创建一个<summary></summary>内容,默认的文案是“详细信息”。如下HTML代码:

<details>
    <p>如果<summary>缺省,则会自动补上,文案是“详细信息”。</summary></p>
</details>

结果如下截图所示:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

二、details浏览器内置UI可以自定义

标签默认的小三角样式有些简陋,在实际应用的时候,往往不是我们希望的样子,不要担心,我们是可以对其进行自定义的。在Chrome等浏览器下使用::-webkit-details-marker,在Firefox浏览器下使用::-moz-list-bullet可以对小三角进行UI控制,例如改变颜色,改变大小,使用自定义的图形代替,或者直接隐藏等,我们来看几个简单的案例。

案例1:小三角右侧显示同时颜色变淡

HTML代码如下:

<details>
    <summary>这是示例1</summary>
    <content>本案例展示对小三角UI重定义:包括显示在右侧,颜色减淡等。</content>
</details>

CSS如下:

.details-1 summary {
    width: -moz-fit-content;
    width: fit-content;
    direction: rtl;
}
.details-1 ::-webkit-details-marker {
    direction: ltr;
    color: gray;
    margin-left: .5ch;
}
.details-1 ::-moz-list-bullet {
    direction: ltr;
    color: gray;
    margin-left: .5ch;
}

结果如下图所示:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

当我们点击摘要标题升起的时候,表现为下图(截自Firefox):

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

而实际上实际开发的时候,对小三角UI更便捷的定制方法是:隐藏浏览器原生的小三角,然后借助::before或::after伪元素重新生成我们想要的UI效果,下面这个案例就将展示相关的处理。

案例2:隐藏浏览器原生的小三角并使用自定义三角替换

HTML结构还是类似的:

<details>
    <summary>这是示例2</summary>
    <content>本案例隐藏原生小三角,使用自定义小三角。</content>
</details>

CSS主要分为2部分,一部分是隐藏浏览器原生的小三角,另外一部分是使用伪元素生成自定义的三角效果。

首先看一下隐藏

标签默认的小三角的CSS:

/* 隐藏默认三角 */
.details-2 ::-webkit-details-marker {
    display: none;
}
.details-2 ::-moz-list-bullet {
    font-size: 0;
}

可以看到Chrome浏览器和Firefox浏览器的小三角隐藏采用的是不同的策略。在Chrome浏览器下,我们可以直接设置display:none进行隐藏,但是这一招在Firefox浏览器下确实没有效果的,即使设置display:none!important也是如此,根据我的测试,只有font-size:0能够比较完美的隐藏。类似position:absolute;visibility:hidden这种常见的隐藏也是不行的,因为position:absolute无法生效。

然后是自定义小三角显示的CSS,这里采用的是::after伪元素模拟的:

/* 自定义的三角 */
.details-2 summary::after {
    content: '';
    position: absolute;
    width: 1em; height: 1em;
    margin: .2em 0 0 .5ch;
    background: url(./arrow-on.svg) no-repeat;
    background-size: 100% 100%;
    transition: transform .2s;
}
.details-2:not([open]) summary::after {
    margin-top: .25em;
    transform: rotate(90deg);    
}

最终效果如下图所示:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

收起时候:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

最后有一点需要注意一下,就是如果

标签内并没有元素,则我们的对三角的自定义代码都是无效的,可以使用一个空的元素占位,类似这样:

<details>
    <summary></summary>
    <content>内容。</content>
</details>

三、Chrome浏览器下点击时候outline轮廓等体验处理

UI可以定制了,但是还有个不容忽视的体验问题,那就是在Chrome浏览器下点击时候会出现outline轮廓,如下图所示:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

在实际项目开发的时候,产品和设计一定会让你把这个效果去掉的。以及,当我们

元素点击较快的时候,文本会被选中,也不是我们想看到的。

阻止文本选中,我们可以:

summary {
  -webkit-user-select: none;
  -moz-user-select: none;
  -ms-user-select: none;
  user-select: none;
}

对于outline轮廓,比较直接的做法是:

summary {
  outline: 0;
}

但是这样处理对无障碍访问而是非常不友好的,那有没有什么办法兼顾视觉体验和无障碍访问体验呢?

我的做法是这样子的:

  1. 利用标签的outline交互体验

浏览器对标签元素的outline轮廓进行了专门的体验优化处理,鼠标点击的时候不显示轮廓,键盘访问时候显示轮廓。于是我们可采用李代桃僵策略,让

元素的outline交给元素,方法就是在中再内嵌一个,同时通过tabindex属性remove掉原本的可访问性。HTML代码示意如下:

<details>
    <summary><a>这是示例</a></summary>
    <content>点击无外框,键盘focus有。</content>
</details>

CSS如下:

summary {
    user-select: none;
    outline: 0;
}
summary a {
    color: inherit;
}

此时,在Chrome浏览器下,我们点击摘要信息,没有任何outline轮廓出现;但是当我们使用Tab键索引时候,可以看到下图所示的轮廓效果:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

轮廓区域比原生的

要小,但这无伤大雅,而且实际项目开发的时候,我们会去掉小箭头,此时只要设置标签display:block,则轮廓就可以和保持一致了。

接下来,我们按下Space空格键,就会发现

元素内的内容信息不断的展开与收起:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

然后上面实现并不完美,相比原生的

元素,Enter回车键展开收起效果丢失了。这是因为HTML元素中如果多个focusable同时带click浏览器行为元素嵌套的时候,点击里面的元素,外部元素的浏览器行为是不会触发的。类似的有

对于<a></a>标签,其浏览器行为只能通过回车键触发,空格键是无效的;但是对于<summary></summary>,回车键和空格键都能触发展开收起行为,这就是为什么上面代码空格键有效,回车键无效的原因。

如果想要同时支持回车键展开与收起,可以对HTML如下处理:

<details>
    <summary><a>这是示例</a></summary>
    <content>点击无外框,键盘focus有。</content>
</details>

需要注意的是上面处理在

自己额外绑定click事件时候可能会有double触发的问题,此时,阻止元素的冒泡即可。

  1. JS捕获键盘行为手动设置outline

这个方法不需要对HTML进行任何的改动,是通过CSS和JS配合对全局的

元素进行outline优化。

CSS如下:

summary {
    user-select: none;
    outline: 0;
}
summary[focus] {
    outline: 1px dotted;
    outline: 5px auto -webkit-focus-ring-color;
}

JS如下:

window.addEventListener('keydown', function () {    
    window.isKeyEvent = true;
    setTimeout(function () {
        window.isKeyEvent = false;
    }, 100);    
});

document.addEventListener('focusin', function (event) {
    var target = event.target;
    if (target && target.tagName.toLowerCase() == 'summary' && window.isKeyEvent == true) {
        target.setAttribute('focus', '');
    }
});
document.addEventListener('focusout', function (event) {
    var eleFocusAll = document.querySelectorAll('summary[focus]');
    [].slice.call(eleFocusAll).forEach(function (summary) {
        summary.removeAttribute('focus');
    });
});

只要把上面的CSS和JS复制到页面中,视觉体验和交互体验完美支持的

元素outline效果就有了。

表现为,点击

没有任何outline,键盘focus时候出现,且和浏览器原生outline效果一模一样,Space键和Enter键展开与收起访问完全保留。

例如下图就是键盘Tab键focus后回车后的效果:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

每每看到如此极致的用户体验处理,心情都大好。

原理:
关键是全局监听keydown事件,如果有发生,则认为此100毫秒内的页面focus行为均是键盘产生,从而有效区分是点击触发的focus行为还是键盘触发的focus行为,如果是键盘触发,给

元素手动增加outline效果。

四、基于details元素行为的各种交互效果案例

了解了

元素的点击交互行为;解决了UI定制难题;解决了outline的体验问题,下面我们就可以付诸实践,不借助任何JS来实现各种我们平常见到的交互效果。

案例1:“更多”展开与收起效果

实现最终效果如下gif:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

因为“更多”元素是在底部,因此效果实现的要点的所有的内容信息都放在

元素内部,然后通过
元素的open属性控制UI的变化。

HTML和CSS代码如下,其中,最核心部分已经红色高亮:

<details>
    <summary>
        <p>据台媒报道,大...青睐。</p>
        <p>
            </p>
<p>其他几首歌曲...</p>
        </summary></details>

        更多       ::-webkit-details-marker {     display: none; } ::-moz-list-bullet {     font-size: 0;     float: left; } .more {     display: none; } [open] .more {     display: block; } [open] summary a {     font-size: 0; } [open] summary a::before {     content: '收起';     font-size: 14px; }

把“更多”对应的信息放在.more元素内,然后通过[open]属性选择器控制器显示,效果即达成。

案例2:无JS实现点击显示悬浮菜单,自定义下拉框等效果

效果如下gif:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

没有任何JS参与。HTML结构如下:

<details>
    <summary>我的消息</summary> 
    <div>
        <a>我的回答<sup>12</sup></a>
        <a>我的私信</a>
        <a>未评价订单<sup>2</sup></a>
        <a>我的关注</a>
    </div>
</details>

然后CSS让.box元素绝对定位即可,显示和隐藏

元素内置行为就搞定了。

案例3:accordion多项折叠效果

此效果常见于条目比较多的垂直导航栏,新闻条目等。

例如下面实现的效果:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

这个更加简单了,就是一堆

元素并排放置就可以了,如下HTML:

<details>
    <summary><dt>订单中心</dt></summary> 
    <dd><a>我的订单</a></dd>
    <dd><a>我的活动</a></dd>
    <dd><a>评价晒单</a></dd>
    <dd><a>购物助手</a></dd>
</details>
<details>
    <summary><dt>关注中心</dt></summary> 
    <dd><a>关注的商品</a></dd>
    ...
</details>
<details>
    ...
</details>

计算CSS没有任何设置,效果也天然达成。

案例3中的展开项显示的时候是非常生硬的突然显示,实际上我们可以借助一些选择器技巧以及CSS3 transition属性让菜单展开收起的时候是有动画效果的,效果如下gif截图:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

此效果实现原理核心是[open]属性选择器,和加号+相邻兄弟选择器。

首先看下HTML,展开列表结构发生了变化,不是作为<details></details>的子元素,而是作为其相邻兄弟元素存在,HTML示意:

<details><summary>订单中心</summary></details>
    
我的订单
    
我的活动
    
评价晒单
    
购物助手
...

上面

定义列表就是展开收起的内容,其作为兄弟元素和
元素平起平坐,于是,我们就可以利用点击元素
元素的open属性会变化的特性实现我们想要的动画效果,CSS如下:
details + dl {
    max-height: 0;
    transition: max-height .25s;
    overflow: hidden;
}
[open] + dl {
    max-height: 100px;
}

借助相邻兄弟选择器以及max-height任意元素slideUp/slideDown技术就可以效果达成。

案例5:多级嵌套的树形菜单交互效果

这里的树形菜单效果实现也很简单,多个<details></details>元素相互嵌套就可以,效果Gif如下:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

HTML结构大致如下:

<details>
    <summary>我的视频</summary>
    <details>
        <summary>爆肝工程师的异世界狂想曲</summary>
        <div>tv1-720p.mp4</div>
        <div>tv2-720p.mp4</div>
        ...
        <div>tv10-720p.mp4</div>
    </details>
    <details>
        <summary>七大罪</summary>
        <div>七大罪B站00合集.mp4</div>
    </details>
    <div>珍藏动漫网盘地址.txt</div>
    <div>我们的小美好.mp4</div>
</details>

CSS的主要工作就是绘制菜单前面的加号和减号图形,例如我们可以借助background线性渐变,相关CSS如下:

details {
    padding-left: 20px;
}
summary::before {
    content: '';
    display: inline-block;
    width: 12px; height: 12px;
    border: 1px solid #999;
    background: linear-gradient(to right, #999, #999) no-repeat center, linear-gradient(to top, #999, #999) no-repeat center;
    background-size: 2px 10px, 10px 2px;
    vertical-align: -2px;
    margin-right: 6px;
    margin-left: -20px;
}
[open] > summary::before {
    background: linear-gradient(to right, #999, #999) no-repeat center;
    background-size: 10px 2px;
}

效果即达成!

五、如果只想要details/summary的语义不要行为

如果只想要

元素,元素的语义,但是并不需要点击展开收起的行为,该怎么处理呢?

例如,某评论,或者某帖子有标题和正文,非常符合详情-概要-内容的语义,但是希望是纯展示的,点击时候不收起,可以这么处理:

1.

标签设置tabindex="-1"让键盘无法访问;
2.设置CSS:

summary {
  outline: 0;
  pointer-events: none;
}

这样就不能点,也不会有outline轮廓。

六、兼容性以及Polyfill

兼容性如下图:

HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현

除了IE和Edge浏览器,大好河山一片绿,至少移动端可以用得比较开心。

如果想要在桌面web网页使用

元素的棒棒哒特性,我们可以对其进行Polyfill

对键盘访问,事件toggle都做了兼容。

如果开发策略是对不支持的IE进行特异处理,则下面的JS判断是否支持

元素的脚本可能对你有用:

var isSupportDetails = 'open' in document.createElement('details');

最后,无JS实现的好处有:

省了代码,加载快了;
实现更简单了,开发快了;
JS还没加载交互也能进行,体验好了;
键盘无障碍和aria阅读设备无障碍天然支持,体验档次高了。

위 내용은 HTML5 세부정보 및 요약을 사용하여 다양한 대화형 효과 구현의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명
이 기사는 segmentfault思否에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제
H5 : 도구, 프레임 워크 및 모범 사례H5 : 도구, 프레임 워크 및 모범 사례Apr 11, 2025 am 12:11 AM

H5 개발에서 마스터 해야하는 도구 및 프레임 워크에는 vue.js, React 및 Webpack이 포함됩니다. 1.vue.js는 사용자 인터페이스를 구축하고 구성 요소 개발을 지원하는 데 적합합니다. 2. 복잡한 응용 프로그램에 적합한 가상 DOM을 통해 페이지 렌더링을 최적화합니다. 3. Webpack은 모듈 포장에 사용되며 리소스로드를 최적화합니다.

HTML5의 유산 : 현재 H5 이해HTML5의 유산 : 현재 H5 이해Apr 10, 2025 am 09:28 AM

html5hassignificallytransformedwebdevelopmentbyintranticalticlementements, 향상 Multimediasupport 및 Improvingperformance.1) itmadewebsitessmoreaccessibleadseo 친환경적 인 요소, 및 .2) Html5intagnatee

H5 코드 : 접근성 및 시맨틱 HTMLH5 코드 : 접근성 및 시맨틱 HTMLApr 09, 2025 am 12:05 AM

H5는 시맨틱 요소 및 ARIA 속성을 통해 웹 페이지 접근성 및 SEO 효과를 향상시킵니다. 1. 컨텐츠 구조를 구성하고 SEO를 개선하기 위해 사용합니다. 2. Aria-Label과 같은 ARIA 속성은 접근성을 향상시키고 보조 기술 사용자는 웹 페이지를 원활하게 사용할 수 있습니다.

H5는 html5와 동일합니까?H5는 html5와 동일합니까?Apr 08, 2025 am 12:16 AM

"H5"와 "HTML5"는 대부분의 경우 동일하지만 특정 시나리오에서는 다른 의미를 가질 수 있습니다. "HTML5"는 새로운 태그와 API를 포함하는 W3C 정의 표준입니다. "H5"는 일반적으로 HTML5의 약어이지만 모바일 개발에서는 HTML5를 기반으로 한 프레임 워크를 참조 할 수 있습니다. 이러한 차이를 이해하면 프로젝트 에서이 용어를 정확하게 사용하는 데 도움이됩니다.

H5의 기능은 무엇입니까?H5의 기능은 무엇입니까?Apr 07, 2025 am 12:10 AM

H5 또는 HTML5는 HTML의 다섯 번째 버전입니다. 개발자에게 더 강력한 도구 세트를 제공하여 복잡한 웹 애플리케이션을보다 쉽게 ​​만들 수 있습니다. H5의 핵심 기능에는 다음이 포함됩니다. 1) 웹 페이지에 그래픽 및 애니메이션을 그리는 요소; 2) 웹 페이지 구조를 SEO 최적화에 명확하고 도움이되는 시맨틱 태그 등; 3) GeolocationApi 지원 위치 기반 서비스와 같은 새로운 API; 4) 호환성 테스트 및 폴리 필 라이브러리를 통해 크로스 브라우저 호환성을 보장해야합니다.

H5 링크를 수행하는 방법H5 링크를 수행하는 방법Apr 06, 2025 pm 12:39 PM

H5 링크를 만드는 방법? 링크 대상 결정 : H5 페이지 또는 응용 프로그램의 URL을 가져옵니다. HTML 앵커 작성 : & lt; a & gt; 태그 앵커를 만들고 링크 대상 URL을 지정합니다. 링크 속성 설정 (선택 사항) : 필요에 따라 대상, 제목 및 on 클릭 속성을 설정하십시오. 웹 페이지에 추가 : 링크가 나타나려는 웹 페이지에 HTML 앵커 코드를 추가하십시오.

H5 호환성 문제를 해결하는 방법H5 호환성 문제를 해결하는 방법Apr 06, 2025 pm 12:36 PM

H5 호환성 문제에 대한 솔루션에는 다음이 포함됩니다. 웹 페이지가 화면 크기에 따라 레이아웃을 조정할 수있는 반응 형 디자인을 사용합니다. 릴리스 전에 호환성을 테스트하기 위해 브라우저 크로스 브라우저 테스트 도구를 사용하십시오. PolyFill을 사용하여 이전 브라우저의 새로운 API를 지원합니다. 웹 표준을 따르고 효과적인 코드 및 모범 사례를 사용하십시오. CSS 프리 프로세서를 사용하여 CSS 코드를 단순화하고 가독성을 향상시킵니다. 이미지를 최적화하고 웹 페이지 크기를 줄이며로드 속도를 높이십시오. HTTPS를 통해 웹 사이트의 보안을 보장하십시오.

H5와 링크를 생성하는 방법H5와 링크를 생성하는 방법Apr 06, 2025 pm 12:33 PM

H5 페이지는 링크를 수동으로 만들거나 짧은 링크 서비스를 사용하는 두 가지 방식으로 링크를 생성 할 수 있습니다. 수동으로 생성하면 H5 페이지의 URL을 복사하면됩니다. 짧은 링크 서비스를 통해 URL을 서비스에 붙여 넣은 다음 단축 된 URL을 가져와야합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

ZendStudio 13.5.1 맥

ZendStudio 13.5.1 맥

강력한 PHP 통합 개발 환경

Atom Editor Mac 버전 다운로드

Atom Editor Mac 버전 다운로드

가장 인기 있는 오픈 소스 편집기

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.