【HTML并不简单】笔记4-你不知道的details、dialog和popover元素

文章目录

    • 自带交互的details元素
      • 自定义样式
      • 案例
      • 全新name属性
    • dialog元素
      • form元素与对话框自动关闭
      • 关闭来源的判断
      • 自动聚焦特性
      • showModal()方法与真正的对话框
      • 焦点隔离特性
      • 顶层特性
      • 自动层级特性
    • 原生弹层与popover属性

《HTML并不简单:Web前端开发精进秘籍》张鑫旭 笔记

自带交互的details元素

可以实现几乎任意的通过点击行为触发的展开和收起效果。

<details>元素通常和<summary>元素同时使用。

<details open>
	<summary>这是摘要</summary>
	<p>这里具体描述</p>
</details>

在这里插入图片描述
点击summary标签可以展开或收起下面的内容。

对于这段代码:

  • <details>元素是整个交互的核心,即使没有设置<summary>元素,也可以通过切换open属性决定里面内容的显示与隐藏
  • <summary>元素表示摘要,是点击行为的触发源,也就是在默认情况下,我们通过点击<summary>元素来影响交互行为的发生
  • 若设置open属性,则默认展开;未设置默认隐藏
  • 如果没有设置summary,浏览器会自动补上:Chrome自动生成“详情”,Edge自动生成“详细信息”
  • 自动创建的<summary>元素是写在Shadow DOM中的,外部CSS无法改变样式
  • 在实际开发中,若不想出现summary,可以手动写一个隐藏的
<summary hidden></summary>

作者示例:https://www.htmlapi.cn/3/1-1.html

自定义样式

改变颜色:

summary::marker {
    color: pink;
}

改变位置,比如小三角改到右边:

summary {
    width: fit-content;
    direction: rtl;
}

自定义小三角图标:隐藏浏览器原生的标记符,再使用::before或::after伪元素模拟

在这里插入图片描述

案例

details/summary元素实际使用案例 (htmlapi.cn)

  • 悬浮菜单,自定义下拉框
  • 多项菜单折叠
  • 多级嵌套的树形菜单

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

全新name属性

目前仅Chrome和Safari浏览器支持。

如果多个<details>元素设置了相同的name属性值,则这些<details>元素之间会形成互斥关系,即同一时间只有一个<details>元素可以展开,其他的元素会自动收起。

在这里插入图片描述

dialog元素

对话框元素 - HTML(超文本标记语言) | MDN (mozilla.org)

只要没有兼容性方面的顾虑,对话框效果,使用dialog元素实现一定是最佳解决方案

<dialog>对话框的主体内容可以是任何HTML元素。

<dialog open>
	<p>aaaaa</p>
</dialog>

在这里插入图片描述
如果我们使用open属性或者使用dialog.open()方法打开对话框,则对话框默认并不是在屏幕的垂直中心位置,而是在<dialog>元素所在的DOM树位置附近

dialog还有一些无可替代的使用特性。

form元素与对话框自动关闭

对话框元素中往往都会有一两个按钮不参与任何业务逻辑处理,其作用仅仅是关闭对话框,例如Alert类型对话框的确认按钮,或者是对话框右上角的图标字样的关闭按钮。

可以直接使用HTML实现这种功能,不需要借助JS。

dialog元素表单提交自动关闭 (htmlapi.cn)

 <dialog open>
     <p>hello world</p>
     <form method="dialog">
         <button>我知道了</button>
     </form>
 </dialog>

点击【我知道了】,对话框会关闭。

关键:在form元素上设置了method='dialog',一个表单新特性。声明此属性后,提交表单元素时,不会刷新页面或打开新窗口,而是关闭当前dialog对话框元素。

表单提交的按钮只能是submit性质的按钮。因此,【我知道了】按钮不能设置为type="button"或者type="reset"

button的type只有submit、button和reset。
只有type='submit'会关闭对话框。

type="submit"上的button设置属性formmethod="dialog",也可以实现关闭对话框功能。

<dialog open>
	<p>hello world</p>
	<form>
		<button formmethod="dialog">我知道了</button>
	</form>
</dialog>

关闭来源的判断

<dialog>元素的DOM对象上支持一个名为returnValue的属性,可以自动或手动设置对话框关闭行为的来源

https://www.htmlapi.cn/3/2-2.html

自动聚焦特性

原生HTML元素:无障碍访问天然支持,无需额外的自定义。

所谓“自动聚焦”​,指的是对话框显示后,浏览器的焦点会自动聚焦到对话框内。

showModal()方法与真正的对话框

真正的对话框应该是足够聚焦的(用户只能专注于当前的任务)​,而不是像一个普通的绝对定位浮层。

https://www.htmlapi.cn/3/2-3.html

showshowModal方法显示对话框的区别:

show

  • 水平居中
  • 绝对定位
  • 没有背景层

showModal

  • 水平垂直居中
  • 固定定位
  • 有背景层

showModal方法显示对话框的背景层是用CSS伪元素::backdrop自定义实现的:

dialog::backdrop {
	background://可以修改背景
}

可以使用:modal伪类区分是普通对话框或模态对话框:

dialog:modal {
	// 模态对话框的样式
}

除此之外,showModal()方法还有现有对话框组件无法模拟的稀缺特性:焦点隔离特性自动顶层特性

焦点隔离特性

一旦模态对话框显示,Web页面的焦点只能出现在当前的对话框元素中,对话框之外的元素是不可能获取焦点的,哪怕使用JavaScript代码强制聚焦也不行。也就是说整个网页中只有所示三个元素可以获得焦点。

在这里插入图片描述
此特性极为稀缺 。如果想用JS模拟,仅存在理论上的可能性,如使用HTML inert属性让dialog外的所有元素全部禁用。这不优雅简洁。

顶层特性

使用show()方法让对话框显示,对话框元素的层级是由CSS样式决定的,如果我们希望对话框元素的层级是最高的,则往往需要设置一个数值较大的z-index属性值。

使用showModal()方法让对话框显示,对话框元素的层级自动最高,无需任何CSS样式设置,此特性被称为顶层特性,有个专门的名词描述此特性,叫作top-layer。它是脱离z-index的。

在这里插入图片描述
top-layer顶层特性实现的原理比较简单:直接在<html>窗体之外创建一个绘制图层​,自然可以覆盖页面主体中的所有元素,尽管页面元素z-index为无穷大。

在这里插入图片描述
但是,一个页面可能有多个dialog元素。若多个dialog元素同时显示,层级规则该如何呢?

自动层级特性

如果一个页面中有多个对话框通过showModal()方法显示,那么后显示的对话框层级一定最高

传统的固定定位元素,如果不专门设置层级,则一定是位于DOM树后面的元素的层级最高,而模态对话框的层级高低与DOM位置无关,与呈现的时机有关。

若是用show方法,后弹出的dialog可能被覆盖在下面。
是用showModal方法,后弹出的dialog会在上面。

https://www.htmlapi.cn/3/2-4.html

综上所述,dialog元素不是普通的div元素可以比的。它有非常好用稀缺的特性,可以优雅简洁的实现一些功能。

原生弹层与popover属性

dialog在一些场景也不适用。如:点击预览图片时。

目标:点击图片可以预览图片,点击其他空白地方收起。

若用dialog实现,则需要给按钮绑定点击事件,将图片元素放在dialog中,然后写一个弹窗关闭的方法。麻烦。

在移动端开发中,许多交互效果都是是用弹层 实现的,即点击空白区域隐藏弹层 ,而dialog的模态层(上述为背景层)是没有隐藏行为的。因此这种类似场景不适合是用dialog。

可以使用popover,一个新HTML属性,已经被各大现代浏览器支持。是一个全局HTML属性,即:所有元素都可以设置的属性,如id、class、elementtiming属性(性能监控相关)。

基本使用:

<button popovertarget="imgPopover">点击我</button>
<div popover id="imgPopover">
	<img src="/stone-art.jpg" alt="" />
</div>

https://www.htmlapi.cn/3/2-5.html

popover弹层元素是顶层元素,且它模态背景是透明可穿透的,可以使用::backdrop自定义:

[popover]::backdrop {
 background-color: #000;
}

popover弹层内容之外的区域点击后会自动关闭当前弹层,无须额外的DOM事件支持,此行为可以自定义。

popover - HTML(超文本标记语言) | MDN (mozilla.org)

常用移动端弹出层实践:https://www.htmlapi.cn/3/2-6.html

<div class="ui-select">
    <button is="ui-select" popovertarget="selectPopover">点击我</button>
    <select is="ui-select" popup>
        <option>请选择</option>
        <option>选项1</option>
        <option>选项2</option>
    </select>
</div>

<ui-popup-container id="selectPopover" popover>
    <form id="form">
        <ui-list-item><input type="radio" name="n1" value="请选择" checked data-index="0">请选择</ui-list-item>
        <ui-list-item><input type="radio" name="n1" value="选项1" data-index="1">选项1</ui-list-item>
        <ui-list-item><input type="radio" name="n1" value="选项2" data-index="2">选项2</ui-list-item>
    </form>
</ui-popup-container>
form.onchange = function () {
    const input = form.querySelector('input:checked');
    const select = document.querySelector('select');
    select.selectedIndex = input.dataset.index;
    select.dispatchEvent(new Event('change'));
    // 关闭弹层
    selectPopover.hidePopover();
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/890733.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C语言 ——— oj题:搜索插入位置

目录 题目要求 代码实现 题目要求 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置 请必须使用时间复杂度为 O(long n) 的算法 示例 1: 输入: nums [1,3,5,6], t…

Nature 正刊丨生物分子冷凝物介导内体膜的弯曲和断裂

01摘要 多囊体是通过降解膜结合的货物蛋白1,2,3参与细胞质量控制的关键内体隔室。消耗ATP的ESCRT蛋白机制通过多泡体膜的内陷和断裂形成管腔内囊泡&#xff0c;介导膜结合货物蛋白的捕获和吞噬4,5。在这里&#xff0c;我们报告说&#xff0c;植物ESCRT组分FREE16形成与膜结合的…

遗传算法与深度学习实战(18)——使用网格搜索自动超参数优化

遗传算法与深度学习实战&#xff08;18&#xff09;——使用网格搜索自动超参数优化 0. 前言1. 网格搜索2. 使用网格搜索自动超参数优化小结系列链接 0. 前言 我们已经学习了如何使用随机搜索获得较好的超参数优化 (Hyperparameter Optimization, HPO) 结果&#xff0c;但它耗…

『Mysql进阶』Mysql explain详解(五)

目录 Explain 介绍 Explain分析示例 explain中的列 1. id 列 2. select_type 列 3. table 列 4. partitions 列 5. type 列 6. possible_keys 列 7. key 列 8. key_len 列 9. ref 列 10. rows 列 11. filtered 列 12. Extra 列 Explain 介绍 EXPLAIN 语句提供有…

【C++指南】C++中的浅拷贝与深拷贝:深入剖析

&#x1f493; 博客主页&#xff1a;倔强的石头的CSDN主页 &#x1f4dd;Gitee主页&#xff1a;倔强的石头的gitee主页 ⏩ 文章专栏&#xff1a;《C指南》 期待您的关注 目录 引言 &#x1f343;浅拷贝 基本概念 代码示例分析 &#x1f343;深拷贝 基本概念 代码示例分析…

数据中心物理安全的历史和演变

在当今的数字时代&#xff0c;数据中心托管已成为我们互联世界的支柱。这些设施在存储、管理和处理我们日常生活所需的大量信息方面发挥着至关重要的作用。从社交媒体平台和电子商务网站到流媒体服务和云计算&#xff0c;数据中心为我们依赖的数字服务提供支持。 随着企业越来…

2024.10.10计算机外部设备及调试培训

授课老师&#xff1a;杨戬 1.计算机组成 cpu&#xff0c;主板&#xff0c;内存&#xff0c;硬盘&#xff0c;电源&#xff0c;显示器&#xff0c;键盘和鼠标&#xff0c;光驱和显卡&#xff0c;其他外部设备。 2.虚拟机专业版转换 由于我们在2024.10.8的培训中已经安装了wi…

Spring Boot知识管理系统:安全与合规性

4系统概要设计 4.1概述 本系统采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式&#xff0c;是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示&#xff1a; 图4-1系统工作原理…

学习threejs,THREE.LineDashedMaterial 虚线材质,基于gosper高斯帕曲线生成雪花动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.LineDashedMaterial虚…

【ROS2实操四】参数服务

概念 在机器人系统中不同的功能模块可能会使用到一些相同的数据&#xff0c;比如&#xff1a; 导航实现时&#xff0c;会进行路径规划&#xff0c;路径规划主要包含&#xff0c; 全局路径规划和本地路径规划&#xff0c;所谓全局路径规划就是设计一个从出发点到目标点的大致路径…

iOS--NSURLSession Alamofire流程源码解析(万字详解版)

一、NSURLSession NSURLSession的主要功能是发起网络请求获取网络数据&#xff0c;是Apple的网络请求原生库之一。Alamofire就是对NSURLSession的封装&#xff0c;如果对NSURLSession不熟悉的话&#xff0c;那么Alamofire源码看起来会比较费劲的。因此我们先简单学习下NSURLSe…

Springboot整合抖音小程序获取access-token图片检测V3

抽取配置文件 appId以及secret需要自行在抖音开放平台获取 dy:appId: ttb0xxxxxsecret: 12a19a426xxxxxxxxxxxxx获取access-token 参照文档我们调用此接口需要先获取access-token 获取access-token官方文档地址 注意事项 client_token 的有效时间为 2 个小时&#xff0c;重复获…

力扣- 背包问题

关于背包问题,推荐卡哥的视频,结合代码随想录食用,效果绝佳!!! 传送门: 带你学透0-1背包问题&#xff01;| 关于背包问题&#xff0c;你不清楚的地方&#xff0c;这里都讲了&#xff01;| 动态规划经典问题 | 数据结构与算法_哔哩哔哩_bilibili 带你学透01背包问题&#xff…

HyperWorks汽车B-柱网格变形

在这一节&#xff0c;将练习如何使用变形域&#xff0c;实现汽车 B-柱有限元模型的网格变形。 图 7-13 网格变形前后的 B 柱模型 Step01&#xff1a;读取并查看模型。 打开模型文件 Exercise_7c.hm。 Step02&#xff1a;创建变形域。 (1) 通过路径 HyperMorph > Morph…

C++笔记之原子操作

C++笔记之原子操作 code review! 文章目录 C++笔记之原子操作1.初始化2.赋值3.取值4.赋给另一个原子类型5.`exchange`6.`compare_exchange_weak` 和 `compare_exchange_strong`使用场景7.注意事项在 C++ 中,原子类型提供了对共享变量的无锁操作,确保多线程环境下的安全。以下…

【Linux】为什么创建目录文件,硬链接数是2;创建普通文件时,硬链接数是1?(超详细图文解答)

前言 大家好吖&#xff0c;欢迎来到 YY 滴Linux系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的《Lin…

图示详解OpenEuler下Samba多用户身份验证配置、测试

前言 前文《图例详解OpenEuler下Samba安装、配置和测试》已对Samba服务的工作原理、安装、配置和测试&#xff0c;做了系统的介绍&#xff0c;并对匿名用户的访问samba服务器做了配置&#xff0c;相必读者已对samba服务的流程有了初步、系统的了解&#xff0c;本文在以上基础上…

DevExpress WinForms中文教程:Data Grid - 如何完成数据输入验证?

本教程介绍DevExpress WinForm的Data Grid控件是如何利用网格组件完成数据输入验证的。 P.S&#xff1a;DevExpress WinForms拥有180组件和UI库&#xff0c;能为Windows Forms平台创建具有影响力的业务解决方案。DevExpress WinForms能完美构建流畅、美观且易于使用的应用程序…

vim 操作

vim编辑器的有三种工作模式&#xff1a;命令模式、插入模式和底行命令模式 打开进入命令模式&#xff1a; 由命令模式到输入模式&#xff1a;i:在光标前插&#xff1b;a:在光标后插&#xff1b;o:在下一行插 由输入模式进入命令模式&#xff1a;esc 由命令模式进入底行命令…

LabVIEW技术难度最大的程序

在LabVIEW开发中&#xff0c;技术难度最大的程序通常涉及复杂的系统架构、高精度的控制要求、大量数据处理&#xff0c;以及跨平台或多硬件设备的集成。以下是几类具有高技术难度的LabVIEW程序&#xff1a; 1. 高精度实时控制系统 LabVIEW中涉及高精度实时控制的系统程序&…