如何在所有浏览器上防止连字符出现换行


104

我们在CMS上有一个ckeditor。我们的最终用户将通过该ckeditor输入一些长文章。我们需要一种方法来防止这些文章的连字符出现换行。

无论如何,是否可以防止所有浏览器上的连字符断行?

还是ckeditor可以选择防止这种情况发生?


您可能会考虑更改接受的答案,因为当前接受的答案已弃用
inorganik

Answers:


50

恐怕没有比将文本分割成“单词”(由空格分隔的非空白字符序列)并包装每个在nobr标记内包含连字符的“单词”更可靠的方法了。因此,输入数据bla bla foo-bar bla bla将变为bla bla <nobr>foo-bar</nobr> bla bla

您甚至可以考虑nobr在“单词”包含字母和数字以外的任何内容时插入标记。原因是某些浏览器甚至可能破坏诸如“ 2/3”或“ f(0)”之类的字符串(请参阅我的页面有关浏览器中的换行奇数)。


35
nobr标签不是标准的,W3C强烈建议不要使用。参见w3.org/TR/html5/obsolete.html#non-conforming-features
derekerdmann 2012年

18
与任何其他方法不同,该nobr标记可在所有浏览器上使用,即使禁用样式表也可使用,并且独立于特殊字符的支持而工作。是否有一个真正与它的问题?
Jukka K. Korpela 2012年

18
为什么不<span style =“ white-space:nowrap”> </ span>?
布伦丹·伯德

6
@ JukkaK.Korpela的问题是现代浏览器可能会决定放弃对其的支持,并且可以在不违反HTML规范的情况下这样做。这是“应该”功能,仅是建议实施的功能。关于样式表,如果用户禁用了样式表,则他们希望没有任何样式
mirhagk 2014年

3
我开发网站已有10年了,甚至不知道您是否可以在浏览器中禁用样式表。它的真正作用是谁(除了在当今时代,类似地选择默认禁用JavaScript的自我鞭flag的人之外)?如果我们需要这么学究,哪里可以提供替代解决方案?
约翰·里克斯

274

您可以使用 Unicode不间断连字符(U + 2011)。

HTML:&#x2011;&#8209;

另请参阅:http : //en.wikipedia.org/wiki/连字符#In_computing


4
非常感谢您的回复。但是,我们需要做的是防止ckeditor上的换行,最终用户将输入所有内容。我们不能告诉所有人输入unicode不间断连字符。还有其他防止断线的方法吗?还是ckeditor可以选择自动转换连字符?再次感谢
Alan

9
你可以做一个简单的字符串替换,替换-
deceze

14
当心对U + 2011的字体支持受到限制,请参阅fileformat.info/info/unicode/char/2011/fontsupport.htm
Jukka K. Korpela

7
虽然从理论上讲nobr,这比在各处贴上标签更优雅,但在实践中效果并不理想。IE将其显示为破折号,Safari在其周围添加的空间比普通破折号更多,并且大多数文本编辑器将其显示为问号或方框或其他无意义的字符。
Tgr 2012年

4
@jakev我会white-space: nowrap按照derekerdmann的建议去。顺便说一句,在FF / Win7上,即使在目标应用程序支持Unicode的情况下,在Firefox外部复制粘贴时,害羞的破折号也似乎会转换为常规破折号。
Tgr

86

一种解决方案是使用额外的span标记和white-spaceCSS属性。只需定义一个这样的类:

.nowrap {
    white-space: nowrap;
}

然后在带连字符的文本周围添加带有该类的跨度。

<p>This is the <span class="nowrap">anti-inflammable</span> model</p>

这种方法在所有浏览器中都应该可以正常工作-此处列出的错误实现是针对该white-space属性的其他值的:http : //reference.sitepoint.com/css/white-space#compatibilitysection


1
非常感谢您的回复。但是我们的文本内容将由最终用户通过ckeditor输入。我们不能告诉所有人在单词周围加上<span>。还有其他方法可以实现吗?无论如何
Alan

1
@Alan-他们添加了什么样的内容,这些内容不会引起混乱?如果是标题或其他元素始终在一行上,则将其应用于white-space: nowrap整个容器。否则,随它去吧;首先,没有理由防止在常规内容中使用带连字符的换行符,其次,除非您愿意在CKEditor上使用,否则您将无法自动获得所需的内容。
derekerdmann

10
在许多情况下,连字符后的换行符不好或非常错误,例如在“ F-1”中,或者在连字符被用作一元负号时,例如在“ -42°”中(并且人们以这种方式使用,因为他们不知道减号)。
Jukka K. Korpela 2012年

这行得通,但是行之有效是不直观的,因为连字符不是空格。<nobr>更清晰。
戴夫·伯顿

2

如果不编辑每个HTML实例,就无法做到这一点。因此,我写了一些JS替换它们:

jQuery的:

//replace hypens with no-breaking ones
$txt = $("#block-views-video-block h2");
$txt.text( $txt.text().replace(/-/g, '‑') );

香草JS:

function nonBrHypens(id) {
    var str = document.getElementById(id).innerHTML; 
    var txt = str.replace(/-/g, '‑');
    document.getElementById(id).innerHTML = txt;
}

1
我喜欢这里的想法,因为它不涉及编辑可能包含连字符的HTML的每一行。但是,我怀疑您可能会像这样处理整个页面上的每一位文本时遇到性能问题,尤其是在有很多元素的情况下。
肖恩·比恩

0

在连字符周围使用单词joiner character(&#8288;)。它也可以在IE中使用。

https://zh.wikipedia.org/wiki/Word_joiner

修复特定的连字符...

function fixicecream(text) {
    return text.replace(/ice-cream/g,'ice&#8288;-&#8288;cream'));
}

或一切...

function fixhyphens(text) {
    return text.replace(/(\S+)-(\S+)/g,'$1&#8288;-&#8288;$2'));
}

-1

试试这个CSS:

word-break: break-all; 
-webkit-hyphens:none;
-moz-hyphens: none; 
hyphens: none;

7
尽管此代码段可以解决问题,但提供说明确实有助于提高您的帖子质量。请记住,您将来会为读者回答这个问题,而这些人可能不知道您提出代码建议的原因。也请尽量不要在代码中加入解释性注释,这会降低代码和解释的可读性!
Ashish Ahuja
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.