HTML 内置的 UI 交互

写了这么久的 HTML 竟然都不知道内置能力已经非常不错了,结合 htmlx 完全可以将绝大部分简单交互覆盖到;几乎不用写 JS 了,👍👍

现代 Web 标准(HTML5 / CSS3 及最新规范)已经大幅增强了声明式交互(Declarative Interaction)的能力。其核心哲学是:通过 HTML 属性定义行为,通过 CSS 伪类控制样式,彻底摆脱或极度压榨掉 JavaScript。


一、 弹出层与模态框类(Popover & Dialog)

现代浏览器近期标准中最强悍的声明式交互能力,直接干掉了过去几百行的弹窗 JS 库。

1. HTML5 Popover API(最像 show_modal 的原生能力)

  • 交互机制:通过 popovertarget 属性直接绑定目标元素的 id
  • 特性:点击自动显隐、点击空白处自动关闭(Light Dismiss)、自动管理最高层级(Top Layer,不会被 z-index 遮挡)。
  • 核心代码:
<button popovertarget="my-menu">打开菜单</button>
<div id="my-menu" popover>这是下拉菜单/悬浮层内容</div>

2. 标签(原生模态框)

  • 交互机制:虽然完全免 JS 的标准还在演进,但目前通过极其简单的声明式表单即可实现免 JS 关闭。
  • 特性:自带底层遮罩(::backdrop)、阻止页面背景滚动、ESC 键自动关闭。
  • 核心代码:
<dialog id="favDialog">
  <form method="dialog">
    <p>这是一个模态弹窗</p>
    <button>确定/关闭</button> <!-- 点击直接关闭弹窗,无需 JS -->
  </form>
</dialog>

二、 表单控制与校验类(Form Controls)

表单是 HTML 声明式能力的集大成者,内置了大量用户输入时的交互反馈。

3. datalist 自动完成/搜索建议

  • 交互机制:将 <input>list 属性指向 <datalist>id
  • 特性:无需任何 JS 输入监听,自动实现“边打字边过滤”的下拉搜索推荐。
  • 核心代码:
<input list="browsers">
<datalist id="browsers">
  <option value="Edge"><option value="Chrome"><option value="Safari">
</datalist>

4. 声明式表单校验(Constraints Validation)

  • 交互机制:通过 requiredpattern(正则)、min/maxstep 等属性限制输入。
  • 特性:点击提交时,浏览器会自动弹出气泡提示、阻止提交,并激活 CSS 伪类。
  • CSS 配合::valid / :invalid:user-valid / :user-invalid(用户操作后才触发校验样式)。

三、 经典 CSS 伪类“黑魔法”类(状态驱动)

在 Popover 普及前,工程师们利用 HTML 的标签状态和 CSS 选择器,实现了完全不依赖 JS 的高频 UI 交互。

5. Checkbox / Radio Hack(复选框/单选框魔术)

  • 交互机制:利用 <label for="id"> 点击能触发隐蔽 <input type="checkbox"> 勾选的特性,配合 CSS 的 :checked 伪类和加号 +(相邻兄弟选择器)或波浪号 ~(通用兄弟选择器)。
  • 应用场景:纯 CSS 实现的侧边栏抽屉、标签页(Tabs)、开关切换器(Switch)。
  • 核心代码:
<input type="checkbox" id="sidebar-toggle" hidden>
<label for="sidebar-toggle">切换侧边栏</label>
<div class="sidebar">内容</div>
/* CSS 控制显隐 */
#sidebar-toggle:checked ~ .sidebar { transform: translateX(0); }

6. :target 锚点驱动机制

  • 交互机制:利用 URL 的哈希值(如 #section1)与 HTML 元素的 id 匹配。
  • 应用场景:纯 CSS 实现的多页签(Tabs)、图片轮播图(Carousel)、轻量级无 JS 路由切换。
  • 核心代码:
<a href="#tab1">标签 1</a>
<div id="tab1" class="tab-content">内容 1</div>
.tab-content { display: none; }
.tab-content:target { display: block; } /* 当前锚点激活时显示 */

7. :focus-within 父级焦点感知

  • 交互机制:只要子元素(如输入框)获得焦点(Focus),父级元素就能感知并改变样式。
  • 应用场景:输入框激活时,整个表单卡片变色、高亮,或者展开复杂的搜索建议面板。

四、 滚动与多媒体交互类(Scrolling & Media)

8. scroll-snap 声明式滚动吸附

  • 交互机制:无需 JS 监听滚动距离和计算坐标,通过 CSS 属性强制滚动停止在特定位置。
  • 应用场景:纯 CSS 实现首屏全屏滚动切换(Fullpage 单页翻页)、移动端横向滑动的全屏 Banner 轮播。
  • 核心代码:
.container { scroll-snap-type: y mandatory; overflow-y: scroll; }
.section { scroll-snap-align: start; }

9. loading=“lazy” 声明式懒加载

  • 交互机制:给 <img><iframe> 加上该属性。
  • 特性:浏览器自动计算视口距离,在用户即将滚动到该元素时才发起网络请求,彻底停用原生的 IntersectionObserver JS 代码。

💡 核心总结清单

交互类型HTML 关键属性/标签对应 CSS 伪类/状态典型平替的旧 JS 库
浮层/下拉菜单popover, popovertarget:popover-openPopper.js, Bootstrap Dropdown
模态弹窗<dialog>::backdropLayer.js, SweetAlert
折叠面板/手风琴<details>, <summary>details[open]jQuery slideToggle
标签页/侧边栏type="radio/checkbox":checkedTabs 组件、Drawer 组件
单页路由/相册href="#id":targetJS Router, Lightbox
表单智能提示<datalist>Select2, Typeahead.js