如何让头发space又细space不断?
How to make a hair space and thin space non-breaking?
我们的项目中有辅助函数,用于将值格式化为人类可读且美观的字符串。
由于设计要求,函数 return 文本包含 各种 白色space 字符(例如 U+2009 «thin space» 或U+200A «头发 space»).
但同样的设计要求要求格式化的文本不间断。
我们到了。
- 我们不能使用 U+00A0 «no-break space»,因为它的宽度不合适。
- 我们使用设计要求的 spaces,但它们可以用作换行符。
我们可以 return 来自这些助手 HTML,而不是纯字符串(然后将 white-space: nowrap
CSS 应用于 HTML)。但这需要重构所有使用助手的代码,并使组件中使用格式化值变得复杂(我们使用 React)。
所以这就是问题:如何使任何 Unicode 白色space 字符不间断 没有 HTML/CSS?
Unicode 中有很多功能可以将字符组合成簇并控制文本的视觉属性:组合字符和标记、连接符、选择器、修饰符等。也许至少其中一种可以使任何白色 space 字符不间断? :)
谢谢。
U+2060 WORD JOINER 是一个不可见的 zero-width 字符,其唯一作用是防止在其位置换行。因此,将 WORD JOINER 放在任何空白字符之后将使它成为 non-breaking。 (在空格 之前放置一个 WJ 是没有必要的,因为 Unicode 中的所有空格都会自动禁止 line-breaking 在它们之前。)
UPD1 来自以下评论:
Unicode 标准绝对要求 WJ 保留其 break-blocking 属性。但是,在 Firefox 中有一个 7-years-old bug 实现了 Unicode line-breaking 算法,所以在 Firefox 中,空格+WJ 的组合可以正常工作就像没有WJ的空白
在 Chrome 和 Safari WJ 中按照标准工作。
UPD2 来自 discussion in Twitter (credit to CharlotteBuff and FakeUnicode):
可以使用 U+034F COMBINING GRAPHEME JOINER 代替 U+2060 WORD JOINER 作为 Firefox 的解决方法。它在 Firefox 中阻止 line-breaking,在 Chrome 和 Safari 中阻止 但不阻止 。 U+034F CGJ 的这种使用在语义上也是可疑的,因为 CGJ 有不同的预期目的。尽管如此,U+034F CGJ 极不可能导致任何类型的可访问性问题(使用屏幕阅读器和类似的东西)。
也可以使用U+200D ZERO WIDTH JOINER来防止line-breaking。 ZWJ 在“三巨头”(Chrome、Safari、Firefox)中运行良好。但是,ZWJ 会对周围文本的外观产生不良影响,因为它的目的是在不会自动发生的地方诱导草书连接(例如阿拉伯语:م + ث + ل = مثل)。如果带有 ZWJ 的文本字体中有花哨的连字,ZWJ 可以(并且可能会)触发它们并改变附近符号的形状。
注: Wiki denotes ZWJ as «May break: Yes», but it is mistaken.
因此,以下是您可以在浏览器中查看和检查的所有选项:
div {
outline: 1px solid red;
width: 20px;
margin: 10px;
}
<!-- U+00A0 NO-BREAK SPACE -->
<!-- just for example -->
<div>hello world1</div>
<!-- U+200A HAIR SPACE + U+2060 WORD JOINER -->
<!-- works fine, but does not work in FF -->
<div>hello ⁠world2</div>
<!-- U+200A HAIR SPACE + U+034F COMBINING GRAPHEME JOINER -->
<!-- works, but 1) semantically incorrect and 2) does not work in Chrome and Safari-->
<div>hello ͏world3</div>
<!-- U+200D ZERO WIDTH JOINER + U+200A HAIR SPACE + U+200D ZERO WIDTH JOINER -->
<!-- works, even in FF! -->
<div>hello‍ ‍world4</div>
<!-- U+200A HAIR SPACE + U+200D ZERO WIDTH JOINER -->
<!-- works, even in FF! -->
<div>hello ‍world5</div>
您也可以使用 U+202F 窄 no-break space.
我们的项目中有辅助函数,用于将值格式化为人类可读且美观的字符串。
由于设计要求,函数 return 文本包含 各种 白色space 字符(例如 U+2009 «thin space» 或U+200A «头发 space»).
但同样的设计要求要求格式化的文本不间断。
我们到了。
- 我们不能使用 U+00A0 «no-break space»,因为它的宽度不合适。
- 我们使用设计要求的 spaces,但它们可以用作换行符。
我们可以 return 来自这些助手 HTML,而不是纯字符串(然后将 white-space: nowrap
CSS 应用于 HTML)。但这需要重构所有使用助手的代码,并使组件中使用格式化值变得复杂(我们使用 React)。
所以这就是问题:如何使任何 Unicode 白色space 字符不间断 没有 HTML/CSS?
Unicode 中有很多功能可以将字符组合成簇并控制文本的视觉属性:组合字符和标记、连接符、选择器、修饰符等。也许至少其中一种可以使任何白色 space 字符不间断? :)
谢谢。
U+2060 WORD JOINER 是一个不可见的 zero-width 字符,其唯一作用是防止在其位置换行。因此,将 WORD JOINER 放在任何空白字符之后将使它成为 non-breaking。 (在空格 之前放置一个 WJ 是没有必要的,因为 Unicode 中的所有空格都会自动禁止 line-breaking 在它们之前。)
UPD1 来自以下评论:
Unicode 标准绝对要求 WJ 保留其 break-blocking 属性。但是,在 Firefox 中有一个 7-years-old bug 实现了 Unicode line-breaking 算法,所以在 Firefox 中,空格+WJ 的组合可以正常工作就像没有WJ的空白
在 Chrome 和 Safari WJ 中按照标准工作。
UPD2 来自 discussion in Twitter (credit to CharlotteBuff and FakeUnicode):
可以使用 U+034F COMBINING GRAPHEME JOINER 代替 U+2060 WORD JOINER 作为 Firefox 的解决方法。它在 Firefox 中阻止 line-breaking,在 Chrome 和 Safari 中阻止 但不阻止 。 U+034F CGJ 的这种使用在语义上也是可疑的,因为 CGJ 有不同的预期目的。尽管如此,U+034F CGJ 极不可能导致任何类型的可访问性问题(使用屏幕阅读器和类似的东西)。
也可以使用U+200D ZERO WIDTH JOINER来防止line-breaking。 ZWJ 在“三巨头”(Chrome、Safari、Firefox)中运行良好。但是,ZWJ 会对周围文本的外观产生不良影响,因为它的目的是在不会自动发生的地方诱导草书连接(例如阿拉伯语:م + ث + ل = مثل)。如果带有 ZWJ 的文本字体中有花哨的连字,ZWJ 可以(并且可能会)触发它们并改变附近符号的形状。
注: Wiki denotes ZWJ as «May break: Yes», but it is mistaken.
因此,以下是您可以在浏览器中查看和检查的所有选项:
div {
outline: 1px solid red;
width: 20px;
margin: 10px;
}
<!-- U+00A0 NO-BREAK SPACE -->
<!-- just for example -->
<div>hello world1</div>
<!-- U+200A HAIR SPACE + U+2060 WORD JOINER -->
<!-- works fine, but does not work in FF -->
<div>hello ⁠world2</div>
<!-- U+200A HAIR SPACE + U+034F COMBINING GRAPHEME JOINER -->
<!-- works, but 1) semantically incorrect and 2) does not work in Chrome and Safari-->
<div>hello ͏world3</div>
<!-- U+200D ZERO WIDTH JOINER + U+200A HAIR SPACE + U+200D ZERO WIDTH JOINER -->
<!-- works, even in FF! -->
<div>hello‍ ‍world4</div>
<!-- U+200A HAIR SPACE + U+200D ZERO WIDTH JOINER -->
<!-- works, even in FF! -->
<div>hello ‍world5</div>
您也可以使用 U+202F 窄 no-break space.