只有方向不可预知、又混排 rtl/ltr 的原子级短文本才需要 ,它是防止 unicode 双向算法溢出的隔离机制,而非装饰;用于用户名、文件路径、邮箱、带括号或连字符的 id 等动态用户内容。

哪些用户生成内容必须套 <bdi></bdi>
只有方向不可预知、又混排 RTL/LTR 的原子级短文本才需要 <bdi></bdi>。它不是装饰,是防止 Unicode 双向算法(UBA)溢出的隔离机制。
- API 返回的用户名:
<bdi>أحمد123</bdi>——避免数字被拉到左边或倒序 - 文件路径:
<bdi>مجلد/file.txt</bdi>——防止点号.被当成 RTL 上下文的一部分而错位 - 邮箱地址:
<bdi>user@مثال.com</bdi>——让浏览器识别首字符م为 RTL,标点归右且复制粘贴顺序不变 - 带括号或连字符的 ID:
<bdi>(ahmed-2024)</bdi>——解决括号反向、连字符位置错乱问题
这些场景的共同点是:内容来自用户输入或后端动态返回,你无法提前判断语言方向,且嵌在已有 RTL 或 LTR 容器中(比如父元素设了 dir="rtl")。
<bdi></bdi> 和 dir="auto" 到底怎么选
关键区别不在“能不能推断方向”,而在“会不会被父容器拖偏”。dir="auto" 会继承父级 dir 属性;<bdi></bdi> 强制启用 Unicode Bidi Isolation,完全切断父子方向污染。
- 父容器是
dir="rtl",里面要显示英文昵称?→ 必须用<bdi>Ahmad</bdi>,dir="auto"在这种情况下大概率失效 - 需要兼容 Safari 13.0 及更早版本?→
dir="auto"不生效,<bdi></bdi>从 Safari 13.1+ 开始稳定支持,更鲁棒 - 静态结构已知、内容来源可控(如模板里写死的 “English Name”)?→
dir="auto"足够,不用额外 DOM 节点
别在整段评论或新闻正文上套 <bdi></bdi>——这会让内部混合语言相互干扰,加剧错乱。只包独立子串。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
哪些地方绝对不能用 <bdi></bdi>
滥用 <bdi></bdi> 不是修 bug,是造 bug。它只解决双向算法溢出,不负责对齐、字体、盒模型。
- 纯中文页面里给「张三」加
<bdi>张三</bdi>——中文无强方向字符,<bdi></bdi>完全冗余,还多一个 DOM 节点 - 已明确设了
dir="ltr"的容器内再套<bdi></bdi>——方向已确定,隔离无意义 -
<input>或<textarea></textarea>内部——表单控件自身管理光标与方向,<bdi></bdi>无效;应改用dir="auto"属性 -
<bdi></bdi>嵌套:<bdi><bdi>أحمد</bdi></bdi>可能导致隔离边界重叠,RTL 内再包 RTL 时标点归位失败
特别注意:<bdi></bdi> 默认等价于 dir="auto" + unicode-bidi: isolate,显式写 <bdi dir="rtl"></bdi> 是多余且误导的——浏览器直接忽略这个 dir。
和 <bdo></bdo> 别混,尤其别拿它包用户昵称
<bdo></bdo> 是字符级硬翻转,不是方向隔离。二者语义和行为完全不同,混用会导致可访问性断裂。
-
<bdo dir="rtl">أحمد123</bdo>视觉上变成321أحمد,但屏幕阅读器仍按源码读أحمد123,视障用户听到的和看到的完全不一致 -
<bdi>أحمد123</bdi>尊重原始逻辑顺序:复制粘贴出来仍是أحمد123,读屏器也按此朗读,只是显示时右对齐、括号归右
真正容易被忽略的点是:方向隔离不是样式问题,而是可访问性基础设施。一旦漏掉 <bdi></bdi>,错位可能只在特定 RTL 环境下暴露,但对屏幕阅读器用户来说,问题从一开始就是存在的。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










