Como evitar quebras de linha em hífens em todos os navegadores

104

Temos um ckeditor em nosso CMS. Nossos usuários finais irão inserir alguns artigos longos por meio desse ckeditor. Precisamos de uma maneira de evitar quebras de linha em hífens nesses artigos.

Existe alguma maneira de evitar quebra de linha em hífens em todos os navegadores?

ou o ckeditor tem uma opção para evitar isso?

Alan
fonte
Você pode considerar alterar a resposta aceita, pois a resposta aceita atual tem uma solução obsoleta
inorganik

Respostas:

50

Receio que não haja maneira mais simples de fazer isso de forma confiável do que dividir o texto em “palavras” (sequências de caracteres não-espaços em branco separados por espaços em branco) e envolver cada “palavra” que contém um hífen dentro da nobrmarcação. Portanto, dados de entrada como bla bla foo-bar bla blaseriam transformados bla bla <nobr>foo-bar</nobr> bla bla.

Você pode até considerar a inserção de nobrmarcação sempre que a “palavra” contiver qualquer coisa, exceto letras e dígitos. A razão é que alguns navegadores podem até quebrar strings como “2/3” ou “f (0)” (veja minha página sobre estranhezas de quebra de linha em navegadores ).

Jukka K. Korpela
fonte
35
A nobrtag não é padrão e fortemente desencorajada pelo W3C. Consulte w3.org/TR/html5/obsolete.html#non-conforming-features
derekerdmann
18
Ao contrário de qualquer outra abordagem, a nobrmarcação funciona em todos os navegadores, funciona mesmo quando as folhas de estilo estão desabilitadas e funciona independentemente do suporte a caracteres especiais. Existe um problema real com isso?
Jukka K. Korpela
18
Por que não <span style = "white-space: nowrap"> </span>?
Brendan Byrd
6
@ JukkaK.Korpela, o problema com ele é que os navegadores modernos podem decidir descartar o suporte para ele, e podem fazer isso sem violar a especificação HTML. É um recurso "deveria", que é apenas uma sugestão de implementação. Em relação às folhas de estilo, se um usuário desativou as folhas de estilo, ele espera não ter nenhum estilo
mirhagk
3
Desenvolvo sites há 10 anos e nem sabia que você PODERIA desativar as folhas de estilo em seu navegador. Quem realmente faz isso (além de pessoas que, da mesma forma, optariam pela autoflagelação de desativar o JavaScript por padrão nos dias de hoje)? Se precisamos ser tão pedantes, onde está a solução alternativa em oferta?
John Rix
274

Você pode usar o qual é um Unicode NON-BREAKING HYPHEN (U + 2011).

HTML: &#x2011;ou&#8209;

Consulte também: http://en.wikipedia.org/wiki/Hyphen#In_computing

deceze
fonte
4
Muito obrigado pela sua resposta. Mas o que precisamos fazer é evitar a quebra de linha no ckeditor onde todo o conteúdo será inserido pelos usuários finais. não podemos dizer a todos para inserir um hífen ininterrupto Unicode. Existe alguma outra maneira de evitar quebra de linha? ou o ckeditor tem a opção de converter o hífen automaticamente? Obrigado novamente
Alan
9
Você pode fazer uma simples substituição de string, substituindo -por .
deceze
14
Cuidado com o suporte de fonte limitado para U + 2011, consulte fileformat.info/info/unicode/char/2011/fontsupport.htm
Jukka K. Korpela
7
Embora isso seja certamente mais elegante em teoria nobrdo que colocar etiquetas em todos os lugares, não funciona muito bem na prática. O IE o exibe como um traço, o Safari adiciona mais espaço ao redor do que um traço normal e a maioria dos editores de texto o exibe como um ponto de interrogação ou caixa ou outro caractere sem sentido.
Tgr de
4
Eu usaria @jakev white-space: nowrapcomo sugerido por derekerdmann. Btw no FF / Win7 o traço tímido parece ser convertido em um traço regular quando copiado e colado fora do Firefox, mesmo se o aplicativo de destino for compatível com Unicode.
Tgr
86

Uma solução poderia ser usar uma spantag extra e a white-spacepropriedade CSS. Basta definir uma classe como esta:

.nowrap {
    white-space: nowrap;
}

Em seguida, adicione um intervalo com essa classe ao redor do texto hifenizado.

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

Essa abordagem deve funcionar bem em todos os navegadores - as implementações com erros listadas aqui são para outros valores da white-spacepropriedade: http://reference.sitepoint.com/css/white-space#compatibilitysection

Derekerdmann
fonte
1
Muito obrigado pela sua resposta. Mas nosso conteúdo de texto será inserido pelos usuários finais por meio de um ckeditor. não podemos dizer a todos para adicionar <span> ao redor da palavra. Existe alguma outra forma de o conseguir? Obrigado de qualquer maneira
Alan
1
@Alan - Que tipo de conteúdo eles estão adicionando que não pode quebrar em hypens? Se for um título ou algum outro elemento que sempre estará em uma linha, aplique white-space: nowrapa todo o contêiner. Caso contrário, deixe para lá; primeiro, não há razão para evitar quebras de linha com hífens para conteúdo geral e, segundo, não há como fazer com que o que você está procurando aconteça automaticamente, a menos que esteja disposto a hackear o CKEditor.
derekerdmann
10
Existem muitas situações em que uma quebra de linha após um hífen é ruim ou simplesmente muito errada, como em "F-1" ou quando um hífen é usado como menos unário, como em "-42 °" (e as pessoas o usam dessa forma, já que eles não sabem sobre o sinal de menos).
Jukka K. Korpela
Isso funciona, mas o fato de funcionar não é intuitivo, porque os hífens não são espaços em branco. <nobr>é muito mais claro.
Dave Burton
2

Você não consegue fazer isso sem editar cada instância HTML. Consequentemente, escrevi alguns JS para substituí-los:

jQuery:

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

Vanilla JS:

function nonBrHypens(id) {
    var str = document.getElementById(id).innerHTML; 
    var txt = str.replace(/-/g, '‑');
    document.getElementById(id).innerHTML = txt;
}
Chris Happy
fonte
1
Eu gosto da ideia aqui, pois não envolve a edição de cada bit de HTML que pode conter um hífen. No entanto, suspeito que você possa ter problemas de desempenho ao processar cada pedaço de texto em uma página inteira como esta, especialmente se houver muitos elementos.
Sean the Bean
0

Use o caractere de junção de palavra ( &#8288;) ao redor do hífen. Também funciona no IE.

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

consertar hifens específicos ...

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

ou tudo ...

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

Experimente este CSS:

word-break: break-all; 
-webkit-hyphens:none;
-moz-hyphens: none; 
hyphens: none;
Ma Yubo
fonte
7
Embora este snippet de código possa resolver a questão, incluir uma explicação realmente ajuda a melhorar a qualidade de sua postagem. Lembre-se de que você está respondendo à pergunta para leitores no futuro e essas pessoas podem não saber os motivos de sua sugestão de código. Tente também não sobrecarregar seu código com comentários explicativos, isso reduz a legibilidade do código e das explicações!
Ashish Ahuja