dir属性才是触发Bidi重排的语义入口,direction仅控制视觉对齐;dir="rtl"触发完整UBA重排,影响光标、选区、数字分组等,而direction: rtl不参与双向算法解析。

dir属性才是触发Bidi重排的语义入口,direction只是视觉对齐
单独用 direction: rtl 无法让浏览器真正按RTL逻辑解析混合文本——它只改块级对齐和行内盒排列,不参与Unicode双向算法(UBA)。你看到的“阿拉伯语后跟英文点号跑偏”或“مجلد.txt变成乱序”,本质是浏览器仍以LTR为基方向解析,中性标点(如.、/)被错误包裹进RTL上下文。
真正起效的是HTML的 dir 属性:dir="rtl" 会触发完整Bidi重排,影响光标行为、选区方向、数字分组(如阿拉伯数字١٢٣)、括号配对。表单控件尤其明显:<input style="direction: rtl"> 完全无效,必须写成 <input dir="rtl">。
-
dir="rtl"可继承,子元素默认获得RTL基方向;direction: rtl不继承Bidi环境,只作用于当前元素的视觉层 - 父容器设了
direction: rtl,但子元素含英文引文时,dir="ltr"才能可靠重置,unicode-bidi: embed效果不稳定 - 服务端渲染或SSR场景下,优先在根
上声明,避免CSS注入延迟导致FOUT
unicode-bidi: isolate 是处理不可信文本最安全的选择
当你展示用户输入、API返回的文件名、日志片段(比如مجلد/file.txt),又不能给整个容器加dir(怕破坏布局),unicode-bidi: isolate 就是唯一靠谱方案。它告诉浏览器:“这段内容独立成一个Bidi段落,别让它和前后文本互相干扰”,等价于手动插入(RLI)和
(PDI),但无编码污染、可动态控制。
别用 unicode-bidi: bidi-override——它强制按内存顺序翻转所有字符,Hello 123 会变成 321 olleH,纯属自毁。
立即学习“前端免费学习笔记(深入)”;
-
unicode-bidi: isolate必须配合direction使用才有意义,单独写无效 - 比
<bdi></bdi>更可控:支持伪类(如bdi:hover)、可JS动态切换、能嵌套在Flex/Grid容器内不破布局 - 若需自动探测方向(阿拉伯首字→RTL,拉丁首字→LTR),应直接用
<bdi></bdi>,而不是dir="auto"+unicode-bidi: isolate的组合——后者冗余且无额外收益
混合文本中嵌套LTR内容必须显式重置,不能依赖继承
外层 dir="rtl" 下,一段英文URL或错误信息(如 Error: file not found)极易被拉偏:冒号:、空格、括号可能错位。这不是bug,而是UBA在RTL基方向下对中性字符的自然推导结果。
正确做法是给这段内容加 dir="ltr",而非仅靠CSS。因为dir属性是语义层入口,能确保从解析阶段就建立独立LTR上下文;而direction: ltr只是呈现层覆盖,不保证光标、选区、复制粘贴行为一致。
- 避免在
dir="rtl"容器里用style="direction: ltr"包裹英文——textarea中光标仍从右开始,复制出来仍是RTL顺序 - 对动态内容,JS设置
el.setAttribute('dir', 'ltr')比el.style.direction = 'ltr'更可靠 - 图标+文字组合(如
? مسار الملف)中,图标用<span dir="ltr">?</span>隔离,防止Emoji被当成强RTL字符拖拽整行
纯文本场景(title、alt、CSV)只能靠Unicode控制字符
HTML标记无法进入<title></title>、title属性、alt、WebVTT或CSV字段——这些地方必须用Unicode控制字符。核心就两个:(RLI, U+2067)开头,
(PDI, U+2069)结尾,形成隔离段。
例如:<title>مجلد/file.txt
— ملفاتك</title>。注意:这些字符不可见,某些编辑器可能显示为方框或占位符,但浏览器解析无误。
- 不要用
(LRI)或(FSI)替代RLI——它们不保证RTL方向,FSI依赖首字符类型,风险更高 - 避免在源码中手敲十六进制转义(如
\u2067),部分构建工具会解码失败;坚持用十进制HTML实体或UTF-8原生字符 - 服务器端生成这类文本时,确保HTTP响应头带
Content-Type: text/html; charset=utf-8,否则控制字符可能被截断
direction当成万能开关——它连光标行为都管不了,更别说数字分组和括号配对。真正的控制权在dir属性和unicode-bidi: isolate手里,其他都是补救手段。


















