O CSS pode forçar uma quebra de linha após cada palavra em um elemento?

159

Estou construindo um site multilíngue, com o proprietário me ajudando com algumas traduções. Algumas das frases exibidas precisam de quebras de linha para manter o estilo do site.

Infelizmente, o proprietário não é um cara de computador; portanto, se ele vir foo<br />bara chance de modificar os dados de alguma forma, enquanto estiver traduzindo.

Existe uma solução CSS (além de alterar a largura) a ser aplicada a um elemento que seria interrompido após cada palavra?

(Eu sei que posso fazer isso em PHP, mas estou me perguntando se há um truque bacana que eu não conheça em CSS para realizar a mesma coisa, talvez nos recursos do CJK.)

EDITAR

Vou tentar diagramar o que está acontecendo:

----------------          ----------------
| Short Word   |          | Gargantuan   |
|              |          | Word         |
----------------          ----------------

A palavra longa quebra automaticamente, a palavra curta não. Eu quero que fique assim:

----------------          ----------------
| Short        |          | Gargantuan   |
| Word         |          | Word         |
----------------          ----------------
Ben
fonte
2
No HTML, os elementos quebram após cada palavra, quando a largura de um determinado elemento exige isso. Você quer dizer com palavras?
Paul D. Waite
@ Paul - Não, eu preciso de uma solução que não seja baseada na fixação da largura. O problema é que algumas frases são mais longas e quebram automaticamente (como você descreve) e outras são mais curtas e não quebram, fazendo uma apresentação inconsistente.
Ben
@ Paul - Sim, é como você descreve exatamente. Não está prejudicando realmente o layout, mas poderia parecer melhor.
Ben
você poderia usar o espaçamento entre palavras, mas isso afetaria todas as palavras.
meo
@meo - parece que que, graças para o pensamento
Ben

Respostas:

261

Usar

.one-word-per-line {
    word-spacing: <parent-width>; 
}

.your-classname{
    width: min-intrinsic;
    width: -webkit-min-content;
    width: -moz-min-content;
    width: min-content;
    display: table-caption;
    display: -ms-grid;
    -ms-grid-columns: min-content;
}

onde <parent-width>é a largura do elemento pai (ou um valor alto arbitrário que não cabe em uma linha). Dessa forma, você pode ter certeza de que há até uma quebra de linha após uma única letra. Funciona com Chrome / FF / Opera / IE7 + (e provavelmente até o IE6, pois também suporta espaçamento de palavras).

Hurs van Bloob
fonte
Esta é definitivamente a melhor resposta imho
Hezad
31
@ToniMichelCaubet A resposta é realmente difícil de interpretar, mas ele quer dizer: .parent { word-spacing: 100px; }onde 100pxestá a largura do elemento pai. O problema é que esta solução não funciona se você tiver um pai fluido.
John Kurlak
5
Basta definir um valor muito alto para o espaçamento das palavras, como word-spacing: 100000pxe você não precisará se preocupar com a fluidez dos pais em termos de largura. Definir um espaçamento de palavras de 100% faria sentido (teria sido 100% da largura pai), mas os valores expressos em porcentagem não são suportados para essa propriedade css.
sboisse
1
Isso foi muito útil. Usei-o em uma situação responsiva, em que com uma largura quero que o texto em guias seja agrupado para que tenham a mesma altura: word-spacing: 2em; e na largura móvel, quero que sejam de linha única:word-spacing: unset;
Será
1
Isso é incrível. A partir dos anos no futuro, agradece a um grupo :)
Lucas Medina
124

A resposta dada por @HursVanBloob funciona apenas com contêiner pai de largura fixa, mas falha no caso de contêineres de largura de fluido .

Eu tentei muitas propriedades, mas nada funcionou como esperado. Finalmente, cheguei à conclusão de que atribuir word-spacingum valor muito alto funciona perfeitamente bem.

p { word-spacing: 9999999px; }

ou, para os navegadores modernos, você pode usar a vwunidade CSS (largura visual em% do tamanho da tela).

p { word-spacing: 100vw; }
Deepak Yadav
fonte
é isso que vou tentar!
vaskort
Esta é uma otima soluçao!
21815 Joe Conlin
Rompe completamente com o & nbsp; Apesar.
Matt Fletcher
2
Bem, isso não funciona para mim, o que faz com que a largura do fluido do recipiente fique muito, muito alta.
Onza
@Onza, você pode compartilhar um link de violino, mostrando seu problema?
Deepak Yadav
37

Uma solução alternativa é descrita na frase separada para uma palavra por linha , aplicando display:table-caption;ao elemento

malcomio
fonte
Na verdade, isso apenas agrupa palavras com base na largura da palavra mais longa.
James South
1
Embora isso possa agrupar palavras em uma linha, ele funciona muito bem em muitas situações e não parece tão invasivo quanto a opção massiva de espaçamento de palavras.
Dale
1
Este é o que funcionou perfeitamente para mim, bom!
Matt Fletcher
1
Não dá nenhum resultado #
jafarbtech
32

Tente usar white-space: pre-line;. Ele cria uma quebra de linha sempre que uma quebra de linha aparece no código, mas ignora o espaço em branco extra (guias e espaços etc.).

Primeiro, escreva suas palavras em linhas separadas no seu código:

<div>Short
Word</div>

Em seguida, aplique o estilo ao elemento que contém as palavras.

div { white-space: pre-line; }

Tenha cuidado , porém, toda quebra de linha no código dentro do elemento criará uma quebra de linha. Assim, escrever o seguinte resultará em uma quebra de linha extra antes da primeira palavra e depois da última:

<div>
    Short
    Word
</div>

Há um ótimo artigo sobre truques de CSS que explica os outros atributos de espaço em branco.

Nass
fonte
Você deve explicar como white-spacepode ser usado para responder à pergunta. Desculpe, mas não vejo como.
Jlgrall
2
Bem, o artigo sobre CSS Tricks explica tudo, então pensei que um link seria suficiente, em vez de tentar regurgitar a resposta aqui.
Nass
Ok, então você sugere colocar quebras de linha reais na fonte e usar o CSS " white-space: pre;" para exibir essas quebras de linha como uma <pre>tag faria? Isso pode funcionar, e uma quebra de linha deve parecer mais natural para os tradutores do que a <br />. Vou tentar editar a sua resposta para adicioná-lo :)
jlgrall
Exatamente. Bem, na verdade, white-space: pre-line;provavelmente seria mais apropriado, pois ignora espaço em branco extra no seu código. Vou atualizar a resposta.
Nass
Bom, talvez apenas acrescentar white-space: pre;para o IE 7.
jlgrall
12

Se você quiser escolher entre diferentes soluções, além das respostas fornecidas ...

Um método alternativo é fornecer ao contêiner uma largura de 0 e garantir que o estouro seja visível. Então cada palavra transbordará e estará em sua própria linha.

div {
  width: 0;
  overflow: visible;
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

Ou você pode usar um desses widthvalores recém-propostos , desde que eles ainda existam quando você ler isso.

div {
  width: min-intrinsic;       /* old Chrome, Safari */
  width: -webkit-min-content; /* less old Chrome, Safari */
  width: -moz-min-content;    /* current Firefox */
  width: min-content;         /* current Chrome, Safari; not IE or Edge */
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

Mr Lister
fonte
4

Você não pode segmentar cada palavra em CSS. No entanto, com um pouco de jQuery você provavelmente poderia.

Com o jQuery, você pode agrupar cada palavra em um <span>período de CSS definido e display:blockcolocá-lo em sua própria linha.

Em teoria, é claro: P

Marca
fonte
Sim, eu tinha medo disso. Poderia fazê-lo também em PHP, mas parece uma solução feia. Eu estava pensando que poderia haver algum :first-childtruque ou algo lá fora ...
Ben
@ Steve: não, atualmente, os seletores de CSS permitem apenas selecionar elementos HTML, não nós de texto. Eu dei uma olhada no módulo CSS 3 Text , mas não parece haver nada lá que force uma quebra após cada palavra em um elemento. A solução de Mark é sua melhor aposta.
Paul D. Waite
@Paul, @Mark - Se um de vocês quer o representante, você pode responder e eu aceito. Vou marcar isso como não respondível (por enquanto) por meta.stackoverflow.com/questions/48013/… .
Ben
Eu acho que Mark já deu uma resposta, todo o representante é dele, tanto quanto eu estou preocupado.
Paul D. Waite
@ Paulo - um jogador da equipe dar a cara um crachá ou algo :)
Ben
2

https://jsfiddle.net/bm3Lfcod/1/

Para quem procura uma solução que funcione dentro de um contêiner pai flexível com filhos flexíveis nas duas dimensões. por exemplo. botões da barra de navegação.

//the parent (example of what it may be)
div {
  display:flex;
  width: 100%;
}

//The children
a {
  display: inline-block;
}

//text wrapper
span {
  display: table-caption;
}
Onza
fonte
Tente dar a esse período qualquer outra CSSpropriedade que você possa oferecer. Digamos que uma propriedade que poderia causarbrowser reflow
Deepak Yadav
1
refluxo do navegador?
Onza
2

Eu enfrentei o mesmo problema e nenhuma das opções aqui me ajudou. Alguns serviços de email não oferecem suporte a estilos especificados. Aqui está a minha versão, que resolveu o problema e funciona em todos os lugares que verifiquei:

<table>
    <tr>
        <td width="1">Gargantuan Word</td>
    </tr>
</table>

OU usando CSS:

<table>
    <tr>
        <td style="width:1px">Gargantuan Word</td>
    </tr>
</table>
eep
fonte
2

A melhor solução é a word-spacingpropriedade.

Adicione o <p>em um contêiner com um tamanho específico (exemplo 300px) e depois você precisará adicionar esse tamanho como o valor no espaçamento entre palavras.

HTML

<div>
 <p>Sentence Here</p>
</div>

CSS

div {
 width: 300px;
}

p {
 width: auto;
 text-align: center;
 word-spacing: 300px;
}

Dessa forma, sua sentença será sempre quebrada e definida em uma coluna, mas a parte do parágrafo será dinâmica.

Aqui um exemplo Codepen

Cosimo wiSe
fonte
-1

No meu caso,

    word-break: break-all;

funcionou perfeitamente, espero que ajude qualquer outro iniciante como eu.

Emanuel Hiroshi
fonte
Um -1 de mim porque esta é uma resposta incorreta. Isso quebra a linha em todos os caracteres, se necessário.
Emobe 23/02