dir属性是唯一能真正修改文本方向的HTML原生机制,、、等格式化标签不参与方向控制,因无方向语义,无法触发Unicode双向算法;必须在<html>设dir="rtl"确保全局生效,局部混排用<bdi>或显式dir隔离,表单元素需单独设dir而非仅靠CSS。

dir 属性是唯一能真正修改文本方向的 HTML 原生机制,<b>、<i>、<em> 这类格式化标签完全不参与文本方向控制——它们只影响字体样式或语义强调,对文字流向、光标行为、括号顺序、数字分组等零影响。
为什么不能用 <b> 或 <em> 改方向?
这些标签没有方向语义,浏览器不会因此触发 Unicode 双向算法(Bidi Algorithm)。哪怕你嵌套再深:<em><b>مرحبا 123 你好</b></em>,只要没设 dir,阿拉伯字母开头的混合文本仍会按 LTR 逻辑解析,导致 “123” 被错误包裹、“()” 翻转、“你好” 被挤到最右但顺序错乱。
常见误操作:
- 给
<p>加style="direction: rtl"却漏掉同级的<input>—— 用户一点击输入框,光标就跳回左边 - 用
<span>包英文再加style="float: right"—— 视觉右偏,但复制粘贴后顺序全乱,屏幕阅读器读成倒序 - 以为
<strong>在 RTL 页面里会自动“加强 RTL 效果” —— 实际毫无作用
dir 该加在哪儿才管用?
优先级和继承性决定效果范围:
立即学习“前端免费学习笔记(深入)”;
-
<html dir="rtl">:最稳妥。所有子元素(含 JS 动态插入的节点)默认继承,表单、<textarea>、getSelection()全部按 RTL 逻辑工作 -
<div dir="ltr">:局部覆盖,适合在 RTL 页面中嵌入一段英文说明。注意它不会“重置”父级的 Bidi 上下文,只是新建一个 LTR 嵌入块 - 避免只加在
<p>或<span>上却不处理其内部的<input>—— 输入框方向不随dir继承,必须显式设置或靠父级传导
混合中文/阿拉伯文时顺序乱了怎么办?
典型现象:<div dir="rtl">Hello ١٢٣ 你好</div> 渲染出 “你好 ١٢٣ olleH”,因为中文属于 Unicode “弱方向性字符”,被周围强 RTL 文本带偏。
可靠解法只有两个:
- 在中文前插入 Unicode RLM 字符:
<div dir="rtl">Hello ١٢٣ 你好</div>(是,Right-to-Left Mark) - 给中文单独包裹并声明方向:
<div dir="rtl">Hello ١٢٣ <span dir="ltr">你好</span></div> - 别依赖
unicode-bidi: embed替代dir—— Safari 旧版本不支持,且语义模糊,无法保证光标和选区行为
真正要让方向生效,不是“怎么加标签”,而是“在哪一层声明基线方向”。dir 必须出现在 HTML 结构层,而不是靠格式化标签或纯 CSS 补救。一旦漏掉表单控件或动态内容的 dir 继承链,后续所有样式调整都只是在掩盖逻辑缺陷。



















