Como quebrar a linha do css, sem usar <br />?

398

resultado:

Olá
Como você está

código:

<p>hello <br> How are you </p>

Como conseguir a mesma saída sem <br>?

Jitendra Vyas
fonte

Respostas:

385

Impossível com a mesma estrutura HTML, você deve ter algo para distinguir entre Helloe How are you.

Eu sugiro usar spans que você exibirá como blocos (exatamente como <div>na verdade).

p span {
  display: block;
}
<p><span>hello</span><span>How are you</span></p>

Vincent Robert
fonte
37
observe também a quantidade de marcação adicional existente - o <br />elemento existe por um motivo muito bom. Se você deseja que a linha quebre porque são parágrafos separados, basta marcá-los como parágrafos separados.
Rowland Shaw
8
Você pode precisar de linhas estruturadas sem usar parágrafos. Para marcar um poema, uma música ou um endereço, por exemplo
Vincent Robert
2
@VincentRobert Certo, mas um poema é o exemplo canônico de quando <br>é a marcação correta. A extensão de um poema seria "errada".
Alan H.
8
Observe que atribuir display: block a um elemento forçará uma quebra de linha antes e depois e, portanto, não é o mesmo que ter uma quebra de linha.
jerseyboy
17
Definitivamente use os elementos <p>. Um elemento <span> NÃO deve ser exibido: block, o ponto principal de <span> é que ele está embutido. Eu faria da seguinte maneira: <div><p> olá</p> <p> Como você está </p> </div>. Não é necessário CSS vencido.
Miles
354

Você pode usar white-space: pre;para fazer com que os elementos ajam como <pre>, o que preserva novas linhas. Exemplo:

p {
  white-space: pre;
}
<p>hello 
How are you</p>

Observe para o IE que isso funciona apenas no IE8 +.

Joey Adams
fonte
133
geralmente melhor do que preé pre-line, o que permite a embalagem.
Alan H.
14
Mais sobre as diferenças entre pré-linha e pré-quebra-cabeça em developer.mozilla.org/en-US/docs/Web/CSS/white-space
patrick
11
Eu preferi o pré no meu caso, porque também posso usar excesso de texto
Greg
Observe que isso não funcionará com reagir, porque o texto é finalmente empacotado e será colocado na mesma linha, o que não acionará a white-spaceregra CSS.
Vadorequest
119

Use <br/>normalmente, mas esconda-o display: nonequando não desejar.

Eu esperaria que a maioria das pessoas que encontrar essa pergunta queira usar o design responsivo / css para decidir se uma quebra de linha aparece ou não em um local específico. (e não tem nada pessoal contra <br/>)

Embora não seja imediatamente óbvio, você pode realmente aplicar display:noneuma <br/>tag para ocultá-la, o que permite o uso de consultas de mídia em conjunto com as tags BR semânticas.

 <div>
   The quick brown fox<br />
   jumps over the lazy dog
 </div>

 @media screen and (min-width: 20em) 
 {
    br 
    { 
       display: none;   // hide the BR tag for wider screens (i.e. disable the line break)
    }
 }

Isso é útil no design responsivo, onde você precisa forçar o texto em duas linhas em uma quebra exata.

http://jsfiddle.net/nNbD3/1/

Simon_Weaver
fonte
5
Simon, você está no lugar certo - o exemplo que você mencionou é o motivo exato pelo qual eu estava pesquisando essa questão e a display: nonesolução é de longe a mais apropriada e útil.
abbottjam
8
Observe que, nos casos em que isso faria com que as palavras fossem executadas juntas, você poderia usar algo como em display: inline-block; width: 1em;vez de none.
Beejor 11/08/16
2
Você pode até aplicar uma classe ao <br class='foo'>se precisar de mais controle, mas não enlouqueça!
Simon_Weaver
Outro "por que eu não pensei nisso ?!" responda. <br/>é ótimo no que faz; Não há necessidade de reinventar a roda. Obrigado!
rinogo 24/10
Conceito semelhante pode ser aplicado ao layout da caixa flexível: stackoverflow.com/questions/29732575/…
Simon_Weaver
106

Existem várias opções para definir a manipulação de espaços em branco e quebras de linha. Se alguém pode colocar o conteúdo, por exemplo, em uma <p>tag, é muito fácil obter o que se deseja.

Para preservar quebras de linha, mas não espaços em branco, use pre-line(não pre) como em:

<style>
 p {
     white-space: pre-line; /* collapse WS, preserve LB */
   }
</style>

<p>hello
How are you</p>

Se outro comportamento for desejado, escolha um deles (WS = WhiteSpace, LB = LineBreak):

     white-space: normal;   /* collapse WS, wrap as necessary, collapse LB */
     white-space: nowrap;   /* collapse WS, no wrapping,       collapse LB */
     white-space: pre;      /* preserve WS, no wrapping,       preserve LB */
     white-space: pre-wrap; /* preserve WS, wrap as necessary, preserve LB */
     white-space: inherit;  /* all as parent element */

FONTE: Escolas W3

petermeissner
fonte
4
perfeito. deve ser a resposta selecionada.
Ben Lin
11
Acredito que é isso que o OP está procurando.
John Sardinha
65

O comando "\ a" em CSS gera um retorno de carro. Este é CSS, não HTML, portanto, deve estar mais próximo do que você deseja: sem marcação extra .

Em uma citação em bloco, o exemplo abaixo exibe o título e o link de origem e separa os dois com um retorno de carro ("\a" ):

blockquote[title][cite]:after {
    content:attr(title)"\a"attr(cite)
}
David Latapie
fonte
Fantasia, mas totalmente desnecessária para qual era a pergunta.
6294 YePhIcK
15
+1 porque é apenas CSS e não recomenda o uso de tags pre, br nem altera o modo de exibição para bloquear (o que adiciona um comportamento diferente, pode ser interrompido se o pai estiver dentro display:flexe, portanto, for um hack neste contexto). Não é chique, realmente, apenas uma técnica moderna. Se você deseja exatamente a mesma marcação, mas reagir de maneira diferente, esse é o caminho a seguir.
Renoirb
Ideia brilhante. Observe o "- não use aspas simples, 'pois você deseja permitir que a \aanálise seja feita como um caractere especial.
Hafenkranich 11/08/16
2
Eu quero dar um mas não trabalho para mim no Chrome 55
mimon pery
4
Eu teria votado positivamente se houvesse algum HTML e talvez um Fiddle para ajudar a visualizar o que você está fazendo.
John
29

No CSS, use o código

p {
    white-space: pre-line;
}

Com esse código css, cada entrada dentro da tag P será uma quebra de linha no html.

burunoh
fonte
11
Era exatamente isso que eu estava procurando! Funciona perfeitamente para o conteúdo do elemento gerado a partir do JS (por exemplo, resultado JSON da consulta AJAX, formulário do esquema angular etc.) que é passado através de escape / sanitization (por exemplo, comportamento normal de escape do AngularJS quando não estiver usando o ngBindHtml)
Stefan Dragnev
28

Com base no que foi dito antes, esta é uma solução CSS pura que funciona.

<style>
  span {
    display: inline;
  }
  span:before {
    content: "\a ";
    white-space: pre;
  }
</style>
<p>
  First line of text. <span>Next line.</span>
</p>
cruzanmo
fonte
Achei que uma variação dessa abordagem é útil para eventos de ponteiros input type='text', wrapping the input, and then laying the text over it with a wrapper div de várias linhas . That also requires : none; `on, a :beforefim de ainda poder clicar no botão abaixo.
Eric Lease
10
<pre> <---------------------------------------
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
</pre> <--------------------------------------

OU

<div style="white-space:pre">  <-----------------------------------
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
</div>                         <-----------------------------------

fonte: https://stackoverflow.com/a/36191199/2377343

T.Todua
fonte
9

Para fazer com que um elemento tenha uma quebra de linha depois, atribua-o:

display:block;

Elementos não flutuantes após um elemento de nível de bloco aparecerão na próxima linha. Muitos elementos, como <p> e <div>, já são elementos no nível do bloco, para que você possa usá-los.

Mas, embora seja bom saber, isso realmente depende mais do contexto do seu conteúdo. No seu exemplo, você não gostaria de usar CSS para forçar uma quebra de linha. O <br /> é apropriado porque semanticamente a tag p é a mais apropriada para o texto que você está exibindo. Mais marcação apenas para desligar o CSS, é desnecessário. Tecnicamente, não é exatamente um parágrafo, mas não existe uma tag <greeting>; portanto, use o que você possui. Descrever bem o seu conteúdo com HTMl é muito mais importante - depois que você o tiver , descubra como torná-lo bonito.

Erro de sintaxe
fonte
11
Mas isso torna toda a largura do contêiner, o que pode ser um efeito colateral indesejado (especialmente se o item for uma âncora / link).
NickG
Sim, por padrão, os elementos no nível do bloco ocupam toda a largura, a menos que você defina uma largura. Leia meu parágrafo sobre contexto - pensar em termos de contexto semântico em vez de escolher seu html com base em seu design geralmente ajuda a impedir que você se depare com problemas como esse.
Erro de sintaxe
11
Geralmente, o motivo pelo qual as tags precisam ser evitadas é mais técnico do que semântico. As tags <br> são independentes e você não pode necessariamente usá-las, pois você não sabe se os elementos à frente existirão no momento em que renderizar a página; portanto, talvez você não queira linhas em branco. Considere uma lista de <a> links em um menu vertical onde você deseja que todos eles em sua própria linha, mas não pode usá-lo, pois você não sabe quais links serão ocultados devido às regras do servidor. Ocultar os links causaria linhas em branco se o <br> fosse usado.
NickG
11
Por esse motivo, as pessoas costumam usar uma lista <ul> e depois ocultam as balas, mas isso é bastante hacky. Seria melhor se houvesse uma regra css que apenas dissesse "sempre renderize na própria linha".
NickG
11
Mas como eu disse no meu primeiro comentário - isso tem o efeito colateral indesejável dos elementos serem de largura total :) Eu só preciso de itens em uma nova linha, sem que eles sejam de largura total. Se o item for um link na extremidade esquerda da página, significa que até cliques na extremidade direita da tela seguem o link.
NickG
8

Aqui está uma solução ruim para uma pergunta ruim, mas que literalmente atende ao breve:

p {
    width : 12ex;
}

p:before {
    content: ".";
    float: right;
    padding-left: 6ex;
    visibility: hidden;
}
Danny Beckett
fonte
11
erro de digitação ou o que deveria exser? pe enão são tão perto do teclado, é por isso que eu estou pedindo
MMachinegun
11
Ruim ou não, isso é realmente muito inteligente.
Jonathan Dumaine
5

Para uma lista de links

As outras respostas fornecem algumas boas maneiras de adicionar quebras de linha, dependendo da situação. Mas deve-se notar que o :afterseletor é uma das melhores maneiras de fazer isso para o controle CSS sobre listas de links (e coisas semelhantes), pelas razões indicadas abaixo.

Aqui está um exemplo, assumindo um índice:

<style type="text/css">
    .toc a:after{ content: "\a"; white-space: pre; }
</style>

<span class="toc">
    <a href="#a1">Item A1</a> <a href="#a2">Item A2</a>
    <a href="#b1">Item B1</a> <a href="#b2">Item B2</a>
</span>

E aqui está a técnica de Simon_Weaver, que é mais simples e mais compatível. Não separa muito o estilo e o conteúdo, requer mais código e pode haver casos em que você deseja adicionar quebras após o fato. Ainda é uma ótima solução, especialmente para o IE mais antigo.

<style type="text/css">
    .toc br{ display: none; } /* comment out for horizontal links */
</style>

<span class="toc">
    <a href="#a1">Item A1</a><br/> <a href="#a2">Item A2</a><br/>
    <a href="#b1">Item B1</a><br/> <a href="#b2">Item B2</a><br/>
</span>

Observe as vantagens das soluções acima:

  • Não importa o espaço em branco no HTML, a saída é a mesma (vs. pre )
  • Nenhum preenchimento extra é adicionado aos elementos (consulte NickG's display:block comentários )
  • Você pode alternar facilmente entre listas horizontais e verticais de links com algum CSS compartilhado sem precisar ir a todos os arquivos HTML para alterar o estilo.
  • Nenhum estilo floatou clearestilos que afetam o conteúdo ao redor
  • O estilo é separado do conteúdo (vs. <br/>ou precom quebras codificadas)
  • Isso também pode funcionar para links soltos usando a.toc:aftere<a class="toc">
  • Você pode adicionar várias quebras e até texto de prefixo / sufixo
Beejor
fonte
4

Talvez alguém tenha o mesmo problema que eu:

Eu estava em um elemento com, display: flexentão tive que usar flex-direction: column.

Dorian
fonte
4

Configurando uma brtag paradisplay: none útil é útil, mas você pode acabar com o WordsRunTogether. Achei mais útil substituí-lo por um caractere de espaço, assim:

HTML:

<h1>
    Breaking<br />News:<br />BR<br />Considered<br />Harmful!
</h1>

CSS:

@media (min-device-width: 1281px){
    h1 br {content: ' ';}
    h1 br:after {content: ' ';}
}
Bryan
fonte
2
Você também pode considerar a configuração brem display: inline-block; width: 1em;que deve impedir que as palavras sejam executadas juntas quando estiverem na horizontal.
precisa saber é o seguinte
11
Eu gosto mais da sua sugestão. Vou tentar na próxima vez que encontrar isso.
18716 Bryan
3

Que tal <pre>tag?

fonte: http://www.w3schools.com/tags/tag_pre.asp

stephan
fonte
Oh! Eu vejo o que você quer dizer. Então você usa espaços em branco no seu <pre>para que ele quebre a linha. E se você quiser ter espaços em branco regulares?
Micha Mazaheri
A tag pré interpretará os retornos de carro feitos dentro. Então, se você quebrar sua linha entre 'olá' e 'como vai' em uma tag pré, a quebra será processada
Godineau Félicie
2

Você pode adicionar muito preenchimento e forçar o texto a ser dividido em nova linha, por exemplo

p{
    padding-right: 50%;
}

Funcionou bem para mim em uma situação com design responsivo, onde somente dentro de uma certa faixa de largura era necessário que o texto fosse dividido.

Alexxandar
fonte
11
Parece uma boa idéia, mas aumentar o preenchimento também aumentará a largura geral de um objeto. E isso pode ter um efeito negativo, especialmente no caso de uma página responsiva.
itsols
1

Eu gosto de soluções muito simples, aqui está mais uma

<p>hello <span>How are you</span></p>

e css

p {
 display: flex;
 flex-direction: column;
}
Jarek
fonte
1

Use overflow-wrap: break-word; gostar :

.yourelement{
overflow-wrap: break-word;
}
Den Pat
fonte
1

Você precisa declarar o conteúdo dentro <span class="class_name"></span>. Depois disso, a linha será interrompida.

\A significa caractere de avanço de linha.

.class_name::after {
  content: "\A";
  white-space: pre;
}
Jacek Krawczyk
fonte
0

As respostas de Vincent Robert e Joey Adams são válidas. Se você não quiser, no entanto, alterar a marcação, basta inserir um<br /> javascript usando.

Não há como fazer isso em CSS sem alterar a marcação.

e-satis
fonte
Isso não é preciso. Pode-se usar :afterou :beforefazer isso.
Artur Bodera
0

No meu caso, eu precisava de um botão de entrada para ter uma quebra de linha antes dele.
Apliquei o seguinte estilo no botão e ele funcionou:

clear:both;
Gene Bo
fonte
0

Caso isso ajude alguém ...

Você pode fazer isso:

<p>This is an <a class="on-new-line">inline link</a>?</p>

Com este css:

a.on-new-line:before { 
  content: '&nbsp;'; 
  font-size:0; 
  display:block;
  line-height:0;
}
Jay
fonte
ou.on-new-line:before {content: ""; display: block;}
meuwka 6/03/19
0

Usar em &nbsp;vez de espaços impedirá uma pausa.

<span>I&nbsp;DONT&nbsp;WANT&nbsp;TO&nbsp;BREAK&nbsp;THIS&nbsp;LINE&nbsp;UP, but this text can be on any line.</span>
JPB
fonte
0

Isso funciona no Chrome:

p::after {
    content: "-";
    color: transparent;
    display: block;
}
Andi Giga
fonte
0

Suponho que você não desejou usar um ponto de interrupção porque ele sempre quebrará a linha. Isso está correto? Em caso afirmativo, que tal adicionar um ponto de interrupção <br />no seu texto e atribuir a ela uma classe, como <br class="hidebreak"/>usar a consulta de mídia logo acima do tamanho que você deseja interromper para ocultar o<br /> que quebra em uma largura específica, mas permanece alinhado acima dessa largura.

HTML:

<p>
The below line breaks at 766px.
</p>

<p>
 This is the line of text<br class="hidebreak"> I want to break.
</p>

CSS:

@media (min-width: 767px) {
  br.hidebreak {display:none;}
}

https://jsfiddle.net/517Design/o71yw5vd/

Krankit
fonte
Acabei de notar que Simon_Weaver postou uma resposta semelhante à minha. Desculpe Simon, não estava tentando plagiar sua resposta. Não li todas as respostas antes de publicar as minhas e, portanto, não percebi as suas. Minha má ... lição aprendida .. Vou ler as outras respostas antes de postar as minhas no futuro.
Krankit
Não se preocupe! Mas você tem que me escrever um poema. A partir de w3schools.com/tags/tag_br.asp "Tip: The <br> tag is useful for writing addresses or poems."
Simon_Weaver,
0

O código pode ser

<div class="text-class"><span>hello</span><span>How are you</span></div>

CSS seria

.text-class {
     display: flex;
     justify-content: flex-start;
     flex-direction: column;
     align-items: center;
 }
homem louco
fonte
-1

Não. Se você deseja uma quebra de linha rígida, use uma.

Rich Bradshaw
fonte
3
+1 Sim, mas se a nova linha for puramente para uso em apresentações display: block;.
Web_Designer 30/05
21
Não entendo por que essa resposta recebeu votos positivos. Se eu tivesse a capacidade de usar uma quebra de linha rígida, não estaria analisando essa pergunta.
trliner