和是语义化修订标签,必须严格闭合、正确包裹、设置cite/datetime属性,并用专业diff解析器生成,否则破坏dom结构、可访问性与审计追溯。

<ins></ins> 和 <del></del> 不是装饰性标签,它们的语义和 DOM 行为直接影响样式渲染、可访问性读取与 JS 操作结果。用错就等于告诉浏览器“这段修改不存在”,而不是“这段改得不对”。
ins/del 必须成对闭合,否则后续 DOM 会错乱
常见错误是只写 <ins>新内容</ins> 不写 ,或在富文本编辑器粘贴时被自动过滤掉闭合标签。后果远不止下划线不显示:
- JS 执行
document.querySelectorAll('ins')会漏掉未闭合节点 -
innerHTML = '...'替换后,父容器的childNodes顺序可能塌陷或错位 - React/Vue 的 diff 算法依赖完整标签结构,缺失闭合会导致组件重渲染异常
务必在浏览器开发者工具的 Elements 面板里逐行检查——尤其注意含换行符、空格或跨行文本的场景。
包裹块级元素时 display 样式必须显式设置
<ins></ins> 和 <del></del> 默认是 inline 元素,但 HTML5 允许它包裹 <p></p>、<ul></ul> 甚至 <table>。直接这么写:
<pre class="brush:php;toolbar:false;"><ins>
<p>这是新增段落</p><div class="aritcle_card flexRow artxards">
<div class="artcardd flexRow">
<a class="aritcle_card_img" rel="nofollow" href="/xiazai/skill5806" title="html-deploy"><img
src="https://img.php.cn/upload/skill/000/000/081/179066538882434.jpg" alt="html-deploy" onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
<div class="aritcle_card_info flexColumn">
<a rel="nofollow" href="/xiazai/skill5806" title="html-deploy" class="overflowclass">html-deploy</a>
<p class="overflowclass">使用 htmlcode.fun 将 HTML 内容或文件部署到网页,适用于用户要求“部署到网页”“托管此 HTML”“生成此前端...的实时链接”等场景。</p>
</div>
<a rel="nofollow" href="/xiazai/skill5806" title="html-deploy" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span>
</a>
</div>
</div>
<ul><li>新增列表项</li></ul></ins></pre>
<p>会导致段落间距塌陷、列表缩进丢失等渲染异常。解决方式只有两种:</p>
<ul>
<li>给 <code><ins></ins> 或 <del></del> 加 CSS:display: inline-block(比 block 更安全,避免意外触发 BFC)
<ins></ins> 分别包每段文字或每个 <li>
cite 和 datetime 属性不是可选修饰,而是语义刚需
cite 和 datetime 不是“锦上添花”的附加信息,它们是支撑可访问性和修订追溯的关键属性:
-
cite应指向解释修改原因的文档 URL,比如cite="https://example.com/changelog#v2.1",不能填中文说明或空字符串 -
datetime必须是 ISO 8601 格式,如2026-04-18T03:39:00+08:00;只写日期(2026-04-18)或错误格式(2026/04/18)会让屏幕阅读器忽略该时间 - 服务端返回的 diff 数据(如 Git 输出)若含时间戳,需前端做格式校验再注入
datetime,不能直接拼接
从纯文本 diff 转 HTML 不能靠简单正则替换
看到 + console.log("hello") 就想用 str.replace(/^\+/, '<ins>')</ins>?这会踩三个坑:
- 没处理转义:原始文本里的
、<code>>、&会破坏 HTML 结构 - 没识别多行变更:
+开头的连续多行应合并进一个<ins></ins>,而非每行一个 - 没隔离上下文:
+和-行常成对出现,需按 diff 块(hunk)解析,否则插入/删除逻辑错位
真正可用的做法是用成熟库(如 diff2html)或手写 parser 按行扫描 + 状态机判断,先提取完整变更块,再分别包裹 <ins></ins> 和 <del></del>。
最易被忽略的一点:这些标签一旦嵌入,就构成文档语义历史的一部分。删掉 <del></del> 不等于“恢复原状”,而是“抹除修改记录”——如果业务需要审计或回滚,DOM 里留下的 datetime 和 cite 可能比后端日志还及时。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










