Como forçar uma quebra de linha em uma palavra longa em um DIV?

417

Ok, isso está realmente me confundindo. Eu tenho algum conteúdo dentro de uma div assim:

<div style="background-color: green; width: 200px; height: 300px;">

Thisisatest.Thisisatest.Thisisatest.Thisisatest.Thisisatest.Thisisatest.

</div>

No entanto, o conteúdo excede o DIV (conforme o esperado) porque a 'palavra' é muito longa.

Como forçar o navegador a 'quebrar' a palavra, quando necessário, para caber todo o conteúdo interno?

Nathan Osman
fonte
Dê uma olhada nesta pergunta: stackoverflow.com/questions/2046530/…
nickf

Respostas:

610

Usar word-wrap:break-word;

Até funciona no IE6, o que é uma surpresa agradável.


word-wrap: break-wordfoi substituído pelo overflow-wrap: break-word;que funciona em todos os navegadores modernos. O IE, sendo um navegador inoperante, sempre confiará no obsoleto e fora do padrão word-wrap.

Os usos existentes de word-wraphoje ainda funcionam, pois são um alias para overflow-wrapa especificação.

Chi
fonte
75
Na verdade, quebra de linha é uma invenção do IE. Portanto, não é surpresa que ele funciona no IE :)
Savas Vedova
1
Para que isso funcione em uma tabela, você pode precisar aplicar o table-layout: fixed;para a mesa
Serj Sagan
28
word-wrap: break-wordnão funcionou para mim, mas word-break: break-wordcomo @rahul sugeriu abaixo, funcionou.
Yves
1
Nota: Isso funcionará apenas se você o especificar na div pai no IE (não no intervalo interno dentro da div).
sms
125

Não tenho certeza sobre a compatibilidade do navegador

word-break: break-all;

Além disso, você pode usar a <wbr>tag

<wbr>(quebra de palavra) significa: "O navegador pode inserir uma quebra de linha aqui, se desejar". O navegador não acha que uma quebra de linha é necessária e nada acontece.

rahul
fonte
23
Esteja ciente dessa quebra de palavra: quebra de tudo; quebra as palavras no meio, se ainda puder caber qualquer caractere em uma linha com outras palavras anteriores, o que pode não ser o resultado desejado, enquanto quebra de linha: quebra de palavra; move as palavras para uma nova linha e somente quebra a palavra se for muito longa para caber em sua própria linha no contêiner. Exemplo: jsfiddle.net/4AKhn/1
alexteg 25/09
tudo quebra tudo. Ok para uso com classe específica, que tem longa URL etc apenas, mas não com o corpo ou P
Upendra
Definitivamente, isso é perfeitamente aceitável (e desejado) quando você está tentando exibir algo como um URI de solicitação em uma célula da tabela de log e precisa parar de quebrar a tabela inteira com uma célula longa gigante. Quebra no meio de uma 'palavra'; é desejável;) Embora a resposta aceita não se agache nesse sentido.
IncredibleHat
@ Skelly1983 não há tal coisa como IE12
TylerH
@TylerH Estou ciente disso, obrigado por apontar isso para mim depois de 3 anos. Isso está listado no gráfico de suporte do navegador w3schools para a tag wbr, que lista o suporte como "Internet Explorer / Edge" e tem o número da versão listado como 12.0, que é de fato a primeira versão do Edge.
Skelly1983
98

Isso pode ser adicionado à resposta aceita para uma solução 'entre navegadores'.

Fontes:

.your_element{
    -ms-word-break: break-all;
    word-break: break-all;

 /* Non standard for webkit */
     word-break: break-word;

    -webkit-hyphens: auto;
       -moz-hyphens: auto;
        -ms-hyphens: auto;
            hyphens: auto;
}
Milche Patern
fonte
Comprei-o no Chrome / Opera e Safari, mas ainda não o adquiri no Firefox e IE. Com isso, resolvi o Firefox, mas o IE ainda está passando por cima do contêiner (tenho um nome de arquivo longo com apenas caracteres alfanuméricos).
Kamafeather #
1
Olá Kamafeather, não tenho certeza, mas, se você está tentando romper o nome do arquivo, todo o contexto (navegador, código html-css) pode ser útil para ajudá-lo ainda mais. Talvez você possa criar outra pergunta com sua situação.
Milche Patern
Observe que isso quebra as palavras em locais não gramaticais.
@ user1322720 o que é um local "não gramatical"?
TylerH 29/10/19
31

Eu estava pesquisando o mesmo problema no Google e postei minha solução final AQUI . Também é relevante para esta questão.

Você pode fazer isso facilmente com uma div, fornecendo o estilo word-wrap: break-word(e também pode ser necessário definir sua largura).

div {
    word-wrap: break-word;         /* All browsers since IE 5.5+ */
    overflow-wrap: break-word;     /* Renamed property in CSS3 draft spec */
    width: 100%;
}

No entanto, para as tabelas , você também precisará aplicar: table-layout: fixed. Isso significa que as larguras das colunas não são mais fluidas, mas são definidas com base nas larguras das colunas apenas na primeira linha (ou através das larguras especificadas). Leia mais aqui .

Código de amostra:

table {
    table-layout: fixed;
    width: 100%;
}

table td {
    word-wrap: break-word;         /* All browsers since IE 5.5+ */
    overflow-wrap: break-word;     /* Renamed property in CSS3 draft spec */
}
Simon East
fonte
1
Obrigado pela solução das tabelas;) No entanto, não entendo por que a quebra de palavras não pode ser usada com o layout automático. Alguma sugestão?
OndObno
@ondObno Sim, não tenho certeza do motivo técnico, mas vários navegadores parecem se comportar dessa maneira. Talvez seja porque palavras super longas mexam com todos os cálculos necessários para determinar as larguras de cada coluna.
Simon East
A configuração width: 100%;era a única maneira de fazer isso funcionar para mim no FF e no Chrome!
68568 Putzi San
27

&#8203;é a entidade HTML de um caractere unicode chamado espaço de largura zero (ZWSP), que é um caractere invisível que especifica uma oportunidade de quebra de linha. Da mesma forma, o objetivo do hífen é especificar uma oportunidade de quebra de linha dentro de um limite de palavras.

davidcondrey
fonte
1
Dica muito legal! Apenas para complementar: &#8203;tem prioridade mais baixa que um espaço em branco (ou seja, se houver um por perto, a linha será quebrada em um espaço em branco).
CPHPython
Parece ser o <wbr/>unicode equivalente eu estava procurando
Xenos
20

Verificou que o uso do seguinte funcionava na maioria dos principais navegadores (Chrome, IE, Safari iOS / OSX), exceto no Firefox (v50.0.2), ao usar o flexbox e confiar width: auto.

.your_element {
    word-wrap: break-word;   
    overflow-wrap: break-word;
    word-break: break-word;
}

Nota: pode ser necessário adicionar prefixos de fornecedor do navegador se você não estiver usando um autoprefixer.

Outra coisa a observar é o uso de texto &nbsp;para espaçamento, que pode causar quebras de linha no meio da palavra.

Andrew
fonte
5
Isso é exatamente o que eu precisava. As outras soluções não funcionaram com largura: 100%. Uma coisa a observar : quebra de palavra: quebra de palavra; deve ser quebra de palavra: quebra de tudo;
jscul
7

CSS word-wrap:break-word; , testado no FireFox 3.6.3

Babiker
fonte
5

Resolvi meu problema com o código abaixo.

display: table-caption;
Thadeu Esteves Jr.
fonte
5

Retirar white-space: nowrap , se houver.

Implemento:

white-space: inherit;
word-break: break-word;
Vineet Kumar Singh
fonte
3

O espaço em branco é preservado pelo navegador. O texto será quebrado quando necessário e nas quebras de linha

.pre-wrap {
    white-space: pre-wrap;
    word-break: break-word;
}

DEMO

td {
   word-break: break-word;
   white-space: pre-wrap;
   -moz-white-space: pre-wrap;      
}

table {
    width: 100px;
    border: 1px solid black;
    display: block;
}
<table>
<tr><th>list</th>
<td>
1.longtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtextlongtext
2.breaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreaklinebreakline
</td>
</tr>
</table>

Tính Ngô Quang
fonte
2

Do MDN :

o overflow-wrap propriedade CSS especifica se o navegador deve ou não inserir quebras de linha em palavras para impedir que o texto ultrapasse sua caixa de conteúdo.

Ao contrário de word-break, overflow-wrapsó criará uma quebra se uma palavra inteira não puder ser colocada em sua própria linha sem transbordar.

Então você pode usar:

overflow-wrap: break-word;

Posso usar ?

Shiva127
fonte
2

Primeiro você deve identificar a largura do seu elemento. Por exemplo:

#sampleDiv{
  width: 80%;
  word-wrap:break-word;
}
<div id="sampleDiv">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>

de modo que quando o texto atingir a largura do elemento, ele será dividido em linhas.

Tran Nam Hung
fonte
2

Como mencionado na resposta de @ davidcondrey, não há apenas o ZWSP, mas também o SHY &#173; &shy;que pode ser usado em palavras muito longas e construídas (pense alemão ou holandês) que precisam ser quebradas no local que você deseja. Invisível, mas fornece um hífen no momento necessário, mantendo assim a palavra conectada e a linha preenchida ao máximo.

Dessa forma, a palavra luchthavenpolitieagent pode ser notada como a lucht&shy;haven&shy;politie&shy;agentque fornece partes mais longas do que as sílabas da palavra.
Embora eu nunca tenha lido nada oficial sobre o assunto, esses hífens suaves conseguem obter prioridade mais alta nos navegadores do que os hífens oficiais nas únicas palavras da construção ( se houver alguma extensão para isso).
Na prática, nenhum navegador é capaz de quebrar uma palavra tão longa e construída por si só; em telas menores, resultando em uma nova linha para ela ou, em alguns casos, até em uma linha de uma palavra (como quando duas dessas palavras construídas são seguidas).

FYI: é holandês para policial do aeroporto

David de Beer
fonte
0

quebra de palavra: normal parece melhor usar do que quebra de palavra: quebra de palavra porque quebra de quebra de palavras inicial como EN

word-break: normal
Matoeil
fonte
-3

Faça isso:

<div id="sampleDiv">aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</div>

#sampleDiv{
   overflow-wrap: break-word;
}
amit bende
fonte
-4

apenas tente isso no nosso estilo

white-space: normal;
Benjamin Fuentes
fonte
1
A duplicação de respostas em várias perguntas é desaprovada na maioria dos casos. Nesse caso, parece ser uma resposta incorreta para ambas as perguntas. normalé o white-spacevalor padrão . Eu acho que adicioná-lo não teria efeito no exemplo da questão. Por favor, me corrija se eu estiver enganado.
Jeremy Banks
Depende da substituição feita pelo CSS. No meu caso, tive que redeclará-lo em "style" no meu componente JSF para substituir o estilo CSS padrão que não era "espaço em branco: normal;"
Benjamin Fuentes