Desde a mudança do layout TABLE para o layout DIV, um problema comum permanece:
PROBLEMA : você preenche seu DIV com texto dinâmico e, inevitavelmente, há uma palavra muito longa que se estende pela borda da coluna div e faz com que seu site pareça não profissional.
RETRO-WHINING : Isso nunca aconteceu com layouts de tabelas. Uma célula da tabela sempre se expandirá bem para a largura da palavra mais longa.
GRAVIDADE : Eu vejo esse problema até nos sites mais importantes, especialmente nos sites alemães, onde mesmo palavras comuns como "limite de velocidade" são muito longas ("Geschwindigkeitsbegrenzung").
Alguém tem uma solução viável para isso?
Respostas:
Hífen suave
Você pode dizer aos navegadores onde dividir palavras longas, inserindo o hífen (
­
):pode ser renderizado como
ou
Uma boa expressão regular pode garantir que você não as insira, a menos que seja necessário:
Navegadores e mecanismos de pesquisa são inteligentes o suficiente para ignorar esse caractere ao pesquisar texto, e Chrome e Firefox (não testaram outros) o ignoram ao copiar texto para a área de transferência.
<wbr>
elementoOutra opção é injetar
<wbr>
, um antigo IE-ism , que agora está em HTML5 :Quebras sem hífen:
Você pode conseguir o mesmo com o caractere de espaço com largura zero
​
(ou​
).Para sua informação, também há CSS
hyphens: auto
suportado pelo IE, Firefox e Safari mais recente ( mas atualmente não é o Chrome ):No entanto, essa hifenização é baseada em um dicionário de hifenização e não é garantido a quebra de palavras longas. Pode tornar o texto justificado mais bonito.
Solução lamentável
<table>
para o layout é ruim, masdisplay:table
em outros elementos é bom. Será tão peculiar (e elástico) quanto as tabelas da velha escola:overflow
e aswhite-space: pre-wrap
respostas abaixo também são boas.fonte
Duas correções:
overflow:scroll
- isso garante que seu conteúdo possa ser visto ao custo do design (as barras de rolagem são feias)overflow:hidden
- apenas corta qualquer excesso. Isso significa que as pessoas não conseguem ler o conteúdo.Se (no exemplo SO) você deseja impedir que ele se sobreponha ao preenchimento, você provavelmente precisará criar outra div, dentro do preenchimento, para manter seu conteúdo.
Edit: Como as outras respostas afirmam, há uma variedade de métodos para truncar as palavras: trabalhar a largura de renderização no lado do cliente (nunca tente fazer isso no lado do servidor, pois nunca funcionará de forma confiável, em várias plataformas) através JS e inserção de caracteres de interrupção ou uso de tags CSS não padronizadas e / ou totalmente incompatíveis (
word-wrap: break-word
não parece funcionar no Firefox ).Você sempre precisará de um descritor de estouro. Se a sua div contiver outro conteúdo do tipo bloco muito amplo (imagem, tabela etc.), será necessário estourar para não destruir o layout / design.
Portanto, por qualquer meio, use outro método (ou uma combinação deles), mas lembre-se de adicionar excesso também para cobrir todos os navegadores.
Edite 2 (para endereçar seu comentário abaixo):
Comece usando a
overflow
propriedade CSS não é perfeita, mas impede a quebra de design. Apliqueoverflow:hidden
primeiro. Lembre-se de que o excesso pode não quebrar no preenchimento; portanto, aninhediv
s ou use uma borda (o que for melhor para você).Isso ocultará o conteúdo transbordante e, portanto, você poderá perder o significado. Você pode usar uma barra de rolagem (usando
overflow:auto
ou emoverflow:scroll
vez deoverflow:hidden
), mas dependendo das dimensões da div e do seu design, isso pode não parecer ou não funcionar muito bem.Para corrigi-lo, podemos usar o JS para recuar e executar alguma forma de truncamento automatizado. Eu estava no meio da escrita de algum pseudo-código para você, mas fica seriamente complicado no meio do caminho. Se você precisar mostrar o máximo possível, dê uma olhada no hifenizador ( como mencionado abaixo ).
Esteja ciente de que isso custa às CPUs dos usuários. Isso pode levar muito tempo para carregar e / ou redimensionar as páginas.
fonte
overflow: scroll;
o conteúdo contivesse informações úteis. E o próximo objetivo é tentar criar um CSS que as barras de rolagem não apareçam. E, caso o façam, você sempre terá as barras de rolagem como backup.text-overflow: ellipsis
stackoverflow.com/a/22811590/759452 #Esse é um problema complexo, como sabemos, e não é suportado de maneira comum entre navegadores. A maioria dos navegadores não suporta esse recurso de forma nativa.
Em algum trabalho feito com emails em HTML, em que o conteúdo do usuário estava sendo usado, mas o script não está disponível (e nem o CSS é suportado muito bem), o seguinte bit de CSS em um wrapper em torno do bloco de conteúdo não espaçado deve ao menos ajudar um pouco:
No caso de navegadores baseados no Mozilla, o arquivo XBL mencionado acima contém:
Infelizmente, o Opera 8+ não parece gostar de nenhuma das soluções acima, portanto o JavaScript terá que ser a solução para esses navegadores (como Mozilla / Firefox.) Outra solução entre navegadores (JavaScript) que inclui as edições posteriores do Opera seria usar o script de Hedger Wang encontrado aqui: http://www.hedgerwow.com/360/dhtml/css-word-break.html
Outros links / pensamentos úteis:
Babble Incoerent »Arquivo de Blog» Emulando o quebra-cabeças CSS para Mozilla / Firefox
http://blog.stchur.com/2007/02/22/emulating-css-word-wrap-for-mozillafirefox/
[OU] Não há quebra de linha no Opera, é exibido no IE
http://list.opera.com/pipermail/opera-users/2004-November/024467.html
http://list.opera.com/pipermail/opera- users / 2004-November / 024468.html
fonte
word-wrap: break-word;
propriedade CSS; portanto, se você não precisar de suporte no Firefox para versões anteriores, poderá eliminar o XBL.Quebra de linha do CSS Cross Browser
fonte
Use o estilo
word-break:break-all;
. Eu sei que funciona em mesas.fonte
Você quer dizer que, em navegadores compatíveis,
word-wrap: break-word
não funciona?Se incluída na definição do corpo da folha de estilo , ela funcionará em todo o documento.
Se o estouro não for uma boa solução, apenas um javascript personalizado pode quebrar artificialmente a palavra longa.
Nota: também existe esta
<wbr>
tag de quebra de palavra . Isso fornece ao navegador um local onde ele pode dividir a linha. Infelizmente, a<wbr>
tag não funciona em todos os navegadores, apenas no Firefox e no Internet Explorer (e no Opera com um truque de CSS).fonte
Apenas verifiquei o IE 7, Firefox 3.6.8 Mac, Firefox 3.6.8 Windows e Safari:
funciona para links longos dentro de uma div com uma largura definida e nenhum estouro declarado no css:
Não vejo nenhum problema de incompatibilidade
fonte
Acabei de descobrir sobre o hifenizador a partir desta pergunta . Isso pode resolver o problema.
fonte
Depois de muita luta, foi isso que funcionou para mim:
Funciona nas versões mais recentes do Chrome, Firefox e Opera.
Observe que eu excluí muitas das
white-space
propriedades sugeridas pelos outros - que realmente quebraram opre
recuo para mim.fonte
Para mim, em uma div sem tamanho fixo e com conteúdo dinâmico, funcionou usando:
fonte
No regex deste comentário , é bom, mas adiciona o hífen tímido apenas entre grupos de 5 caracteres que não são de espaço em branco ou hífen. Isso permite que o último grupo seja muito mais longo do que o pretendido, pois não há um grupo correspondente a ele.
Por exemplo, isto:
... resulta nisto:
Aqui está uma versão usando lookahead positivo para evitar esse problema:
... com este resultado:
fonte
A solução que costumo usar para esse problema é definir duas regras css diferentes para o IE e outros navegadores:
woks perfeitos no IE, mas a quebra de linha não é uma propriedade CSS padrão. É uma propriedade específica da Microsoft e não funciona no Firefox.
Para o Firefox, a melhor coisa a fazer usando apenas CSS é definir a regra
para o elemento que contém o texto que você deseja quebrar. Não quebra o texto, mas oculta a parte do texto que ultrapassa o limite do contêiner . Pode ser uma boa solução se não for essencial para você exibir todo o texto (ou seja, se o texto estiver dentro de uma
<a>
tag)fonte
Atualização: lidar com isso em CSS é maravilhosamente simples e com pouca sobrecarga, mas você não tem controle sobre onde ocorrem as quebras quando ocorrem. Tudo bem se você não se importa, ou seus dados têm execuções alfanuméricas longas sem interrupções naturais. Tínhamos muitos caminhos de arquivos, URLs e números de telefone longos, todos com lugares em que é significativamente melhor procurar do que outros.
Nossa solução foi usar primeiro uma substituição de regex para colocar um espaço de largura zero (& # 8203;) após cada 15 (digamos) caracteres que não são espaços em branco ou um dos caracteres especiais onde preferimos quebras. Em seguida, fazemos outra substituição para colocar um espaço de largura zero após esses caracteres especiais.
Espaços com largura zero são bons, porque eles nunca são visíveis na tela; hífens tímidos eram confusos quando mostraram, porque os dados têm hífens significativos. Os espaços com largura zero também não são incluídos quando você copia o texto do navegador.
Os caracteres de interrupção especiais que estamos usando atualmente são ponto final, barra invertida, barra invertida, vírgula, sublinhado, @, | e hífen. Você não acha que precisaria fazer algo para encorajar a quebra de hífens, mas o Firefox (pelo menos 3.6 e 4) não quebra sozinho em hífens cercados por números (como números de telefone).
Também queríamos controlar o número de caracteres entre quebras artificiais, com base no espaço de layout disponível. Isso significava que o regex para corresponder a longas execuções sem interrupção precisava ser dinâmico. Isso é chamado muito, e não queríamos criar as mesmas regexes idênticas repetidamente por motivos de desempenho; portanto, usamos um cache de regex simples, codificado pela expressão de regex e seus sinalizadores.
Aqui está o código; você provavelmente nomeará as funções em um pacote de utilitários:
Teste assim:
Atualização 2: Parece que espaços com largura zero estão incluídos no texto copiado em pelo menos algumas circunstâncias, você simplesmente não pode vê-los. Obviamente, incentivar as pessoas a copiarem textos com caracteres ocultos é um convite para que dados como esses sejam inseridos em outros programas ou sistemas, até os seus, onde isso pode causar problemas. Por exemplo, se ele terminar em um banco de dados, as pesquisas nele poderão falhar e as cadeias de pesquisa como essa provavelmente também falharão. O uso das teclas de seta para mover dados como esse requer (com razão) um pressionamento de tecla extra para mover o personagem que você não pode ver, um tanto bizarro para os usuários, se eles perceberem.
Em um sistema fechado, você pode filtrar esse caractere na entrada para se proteger, mas isso não ajuda outros programas e sistemas.
No total, essa técnica funciona bem, mas não tenho certeza de qual seria a melhor escolha de personagem causador de quebra.
Atualização 3: Ter esse personagem nos dados não é mais uma possibilidade teórica, é um problema observado. Os usuários enviam os dados copiados da tela, eles são salvos no banco de dados, as pesquisas quebram, as coisas ficam estranhamente etc.
Fizemos duas coisas:
Isso funciona bem, assim como a própria técnica, mas é uma história de advertência.
Atualização 4: estamos usando isso em um contexto em que os dados fornecidos a isso podem ser escapados em HTML. Sob as circunstâncias certas, ele pode inserir espaços de largura zero no meio de entidades HTML, com resultados descolados.
A correção foi adicionar e comercial à lista de caracteres que não quebramos, assim:
fonte
if(domainName.length > 15) domainName.replace(/([^\\s]{5})(?=[^\\s])/g, '$1​');
É necessário definir "layout da tabela: fixo" para que o quebra-cabeças funcione
fonte
ATUALIZAÇÃO: Em dezembro de 2011, agora temos outra opção, com o suporte emergente dessas tags no FF e Safari:
Fiz alguns testes básicos e parece funcionar em uma versão recente do Mobile Safari e Safari 5.1.1.
Tabela de compatibilidade: https://developer.mozilla.org/en/CSS/hyphens#AutoCompatibilityTable
fonte
Para compatibilidade com o IE 8+, use:
Veja aqui http://css-tricks.com/snippets/css/prevent-long-urls-from-breaking-out-of-container/
Tudo o que eu precisava fazer era aplicar isso ao estilo do contêiner div com uma largura definida.
fonte
Usa isto
fonte
Se você tem isso -
basta mudar para um formato vertical contendo divs e usar largura mínima no CSS em vez de largura -
Obviamente, se você estiver exibindo dados tabulares genuínos, não há problema em usar uma tabela real, pois ela é semanticamente correta e informará as pessoas que usam leitores de tela que deveriam estar em uma tabela. É para usá-los para o layout geral ou para fatiar imagens pelas quais as pessoas o lincham.
fonte
Eu tive que fazer o seguinte porque, se as propriedades não fossem declaradas na ordem correta, elas quebrariam aleatoriamente as palavras no lugar errado e sem adicionar um hífen.
Originalmente enviada por Enigmo: https://stackoverflow.com/a/14191114
fonte
Sim, se for possível, definir uma largura absoluta e definir
overflow : auto
bem.fonte
fonte
"word-wrap: break-word" funciona no Firefox 3.5 http://hacks.mozilla.org/2009/06/word-wrap/
fonte
Adicione isto ao
css
seu div:word-wrap: break-word;
fonte
depois de toda a palavra quebrar e quebrar, preserve seu excesso e veja se isso resolve seu problema. basta alterar a exibição da sua div para:
display: inline;
fonte
Uma função simples (requer underscore.js) - baseada na resposta @porneL
fonte
Eu escrevi uma função que funciona muito bem onde insere
­
x letras na palavra para uma boa quebra de linha. Todas as respostas aqui não suportam todos os navegadores e dispositivos, mas isso funciona bem usando o PHP:fonte