最稳妥结构是用语义化标签:包裹整个面板,每条待办用,标题与状态放,操作区放,内容放等语义元素。

审批面板用什么 HTML 结构最稳妥
不用复杂框架也能搭出可维护的审批待办区块,核心是语义化 + 层级清晰。避免用 <div> 堆砌,优先用 <code><section></section> 包裹整个面板,每条待办用 <article></article>,标题、状态、操作区用 <header></header> / <footer></footer> 分隔。
常见错误是把按钮和状态文字全塞进一个 <div class="item">,后续加筛选、批量操作或响应式断点时改起来极痛苦。正确结构示例:
<pre class="brush:php;toolbar:false;"><section aria-label="审批待办列表"><article><header><h3>请假申请(张三)</h3>
<span class="status status-pending">待审批</span>
</header><p>事由:年假 3 天|时间:2024-06-10 至 2024-06-12</p>
<footer><button type="button" data-action="approve">通过</button>
<button type="button" data-action="reject">驳回</button>
</footer></article></section></pre>
<h3>状态标签怎么写才不被误读</h3>
<p>“待审批”“已通过”这类状态不能只靠颜色区分,必须带明确文本和 ARIA 标签。否则色弱用户或屏幕阅读器无法识别,也容易在暗色模式下失效。</p>
<ul>
<li>用 <code>class 控制样式,但同时加 aria-label,例如:<span class="status status-pending" aria-label="状态:待审批">待审批</span>
<span class="visually-hidden">已通过</span><span aria-hidden="true">✅</span>
按钮交互为什么点了没反应
审批面板里按钮失效,80% 是因为没处理事件委托或重复绑定。尤其当待办列表动态加载(比如分页、搜索后刷新),直接写 document.querySelectorAll('button[data-action]').forEach(...) 会漏掉新插入的节点。
推荐用事件委托,监听父容器:
document.querySelector('section[aria-label="审批待办列表"]').addEventListener('click', function (e) {
if (e.target.matches('button[data-action]')) {
const action = e.target.dataset.action; // "approve" or "reject"
const item = e.target.closest('article');
const id = item?.dataset.id || null;
if (id && ['approve', 'reject'].includes(action)) {
handleApproval(id, action); // 你的提交逻辑
}
}
});
注意:data-id 必须提前写在 <article></article> 上,别等点击时再去 DOM 里扒文本——既慢又容易错。
CSS 响应式断点怎么设才不卡顿
审批面板在小屏上常出现横向滚动或按钮重叠,问题不在媒体查询本身,而在过度依赖 flex-wrap 或 grid-template-columns 的固定列数。移动端真正需要的是「操作优先级折叠」。
- 默认横排按钮(通过/驳回)在 ≥768px 显示;≤767px 改为垂直堆叠,用
flex-direction: column - 把次要信息(如申请人部门、附件数)用
@media (max-width: 576px)设为display: none,但保留aria-hidden="true",不破坏语义 - 禁止对
<article></article>设置固定高度或min-height,否则内容长度不一时,视觉节奏全乱
复杂点在于状态变更后的 UI 反馈——比如点击“通过”后按钮要置灰、加 loading 动画、并禁用交互。这个逻辑必须和网络请求解耦,先改本地 DOM,再发请求;失败时再 rollback,否则用户会以为点没生效。











