按钮必须用 ,因其自带焦点管理、键盘支持和触控热区保障;role="button" 不可靠,禁用;需设 min-width/height: 44px、显式 type="button"、JS 控制 disabled 和 aria-busy,并精简 DOM 深度。

按钮必须用 原生 只加 光加 生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力:
- 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面;
- 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”;
- 提及位于 `apps/console/src/featur 最易被忽略的是 DOM 深度:如果按钮嵌在 ,不能用 模拟,否则在 iOS VoiceOver、Android TalkBack 下大概率被跳过,点不动也读不出。为什么
是唯一安全起点 自带焦点管理、:active 响应、键盘支持(Enter/Space)、最小触控热区保障;换成 touchstart 要靠 JS 手动绑定,Safari 还可能跳过 :active 渲染。实测中,role="button" 在微信 X5 内核和部分低端安卓 WebView 中完全无效,且不自动获得 tabindex 或触发空格/回车。
type="button" 必须显式声明——浏览器默认是 submit,哪怕没套 也会误提交role="button":它不响应 keydown、不进焦点流、不触发 :active,纯属埋坑button { all: unset; },再写自己的样式,别绕开语义
data-product-id 和触控尺寸必须同时达标data-product-id 不够,按钮本身 clientWidth × clientHeight 必须 ≥ 44×44px(WCAG 强制要求),否则 iPhone 上手指点不准,不是“体验差”,是合规风险。
data-product-id 是 JS 识别商品的唯一可靠依据,别拼在 href 里或塞进 class,那会让结构一改就失效min-width: 44px; min-height: 44px;,仅靠 padding 不可靠——inline 元素的换行符会产生空白间隙,实际尺寸缩水display: inline-block + 换行 HTML,改用 display: block 或 flex 并加 align-items: center 防止内容错位点击后状态控制不能只靠 CSS 类
.loading 类或改 opacity 不行,用户连点、网络慢、接口失败时,按钮仍可能重复提交。真实状态必须由 JS 控制 DOM 属性。
button.disabled = true 和 button.setAttribute('aria-busy', 'true')
button.disabled = false 和 aria-busy="false",别只删 classpointer-events: none 替代 disabled——它会切断屏幕阅读器焦点和键盘支持div > section > article > div > div > button 这种 6 层以上结构里,touchstart 到 handler 的延迟会翻倍(实测达 42ms),而人对“即时”的容忍阈值是 100ms。用 Chrome DevTools 右键按钮 → “Show DOM properties” 查 depth,超 6 就得砍掉无意义包裹层。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










