¿Cómo hacer un salto de línea desde CSS sin usar <br />?

398

salida:

Hola
Cómo estás

código:

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

¿Cómo lograr la misma salida sin <br>?

Jitendra Vyas
fuente

Respuestas:

385

Imposible con la misma estructura HTML, debe tener algo para distinguir entre Helloy How are you.

Sugiero usar spans que luego se mostrarán como bloques (al igual que en <div>realidad).

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

Vincent Robert
fuente
37
observe también cuánto margen adicional hay: el <br />elemento existe por una muy buena razón. Si desea el salto de línea porque son párrafos separados, simplemente márquelos como párrafos separados.
Rowland Shaw
8
Es posible que necesite líneas estructuradas sin usar párrafos. Para marcar un poema, una canción o una dirección, por ejemplo
Vincent Robert
2
@VincentRobert Correcto, pero un poema es el ejemplo canónico de cuándo <br>es el marcado correcto. Los tramos para un poema estarían "equivocados".
Alan H.
8
Tenga en cuenta que la asignación de display: block a un elemento forzará un salto de línea antes y después, por lo que no es lo mismo que tener un salto de línea.
jerseyboy
17
Definitivamente use los elementos <p>. Un elemento <span> NO debe mostrarse: bloque, el punto completo de <span> es que está en línea. Lo haría de esta manera: <div><p>hello</p> <p> ¿Cómo estás? </p> </div>. No se requiere CSS extraído.
Millas el
354

Puede usar white-space: pre;para hacer que los elementos actúen como <pre>, lo que conserva las nuevas líneas. Ejemplo:

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

Tenga en cuenta para IE que esto solo funciona en IE8 +.

Joey Adams
fuente
133
a menudo mejor de lo que prees pre-line, lo que permite envolver.
Alan H.
14
Más información sobre las diferencias entre pre-line y pre-wrap en developer.mozilla.org/en-US/docs/Web/CSS/white-space
patrick
1
Preferí pre en mi caso, porque también puedo usar desbordamiento de texto
Greg el
Tenga en cuenta que esto no funcionará con react porque el texto finalmente se agrupa y se colocará en la misma línea, lo que no activará la white-spaceregla CSS.
Vadorequest
119

Úselo <br/>normalmente, pero escóndelo display: nonecuando no lo desee.

Esperaría que la mayoría de las personas que encuentran esta pregunta quieran usar css / diseño receptivo para decidir si aparece o no un salto de línea en un lugar específico. (y no tengo nada personal en contra <br/>)

Si bien no es obvio de inmediato, puede aplicarlo display:nonea una <br/>etiqueta para ocultarla, lo que permite el uso de consultas de medios en conjunto con etiquetas 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)
    }
 }

Esto es útil en el diseño receptivo donde necesita forzar el texto en dos líneas en un salto exacto.

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

Simon_Weaver
fuente
55
Simon, estás en lo cierto: el ejemplo que nombras es la razón exacta por la que estaba investigando esta pregunta y la display: nonesolución es, con mucho, la más adecuada y útil.
abbottjam
8
Tenga en cuenta que para los casos en que las palabras se ejecuten juntas, puede usar algo como en display: inline-block; width: 1em;lugar de none.
Beejor
2
¡Incluso podría aplicar una clase <br class='foo'>si necesita más control, pero no se vuelva demasiado loco!
Simon_Weaver
Otro "¿por qué no pensé en esto?" responder. <br/>es genial en lo que hace; No hay necesidad de reinventar la rueda. ¡Gracias!
rinogo
Se puede aplicar un concepto similar al diseño de caja flexible: stackoverflow.com/questions/29732575/…
Simon_Weaver
106

Hay varias opciones para definir el manejo de espacios en blanco y saltos de línea. Si uno puede poner el contenido en, por ejemplo, una <p>etiqueta, es bastante fácil obtener lo que quiera.

Para preservar saltos de línea pero no espacios en blanco, use pre-line(no pre) como en:

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

<p>hello
How are you</p>

Si se desea otro comportamiento, elija uno de estos (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 */

FUENTE: Escuelas W3

Petermeissner
fuente
44
Perfecto. debería ser la respuesta seleccionada.
Ben Lin
1
Creo que esto es lo que está buscando OP.
John Sardinha
65

El comando "\ a" en CSS genera un retorno de carro. Esto es CSS, no HTML, por lo que estará más cerca de lo que desea: sin marcado adicional .

En una cita en bloque, el siguiente ejemplo muestra el título y el enlace de origen y separa los dos con un retorno de carro ( "\a"):

blockquote[title][cite]:after {
    content:attr(title)"\a"attr(cite)
}
David Latapie
fuente
Elegante, pero totalmente innecesario para lo que era la pregunta.
YePhIcK
15
+1 porque es solo CSS, y no recomienda el uso de etiquetas pre, br ni cambiar el modo de visualización para bloquear (lo que agrega un comportamiento diferente, podría romperse si el padre está dentro display:flexy, por lo tanto, es un hack en este contexto). No es lujoso, en realidad, solo una técnica moderna. Si desea exactamente el mismo marcado, pero en realidad reaccionar de manera diferente, ese es el camino a seguir.
renoirb
Brillante idea. Tenga en cuenta "que no utilice comillas simples 'porque desea permitir \aque se analice como un carácter especial.
Hafenkranich
2
Quiero dar +1 pero no me funciona en Chrome 55
pery mimon
44
Hubiera votado a favor si hubiera algo de HTML y tal vez un violín para ayudar a visualizar lo que estás haciendo.
John
29

En el CSS usa el código

p {
    white-space: pre-line;
}

Con este código css cada entrada dentro de la etiqueta P será una línea de corte en el html.

burunoh
fuente
1
¡Esto es exactamente lo que estaba buscando! Funciona perfectamente para el contenido de elementos generado a partir de JS (p. Ej., Resultado de JSON de la consulta AJAX, forma de esquema angular, etc.) que se pasa por escape / desinfección (p. Ej., Comportamiento de escape normal de AngularJS cuando no se usa ngBindHtml)
Stefan Dragnev
28

Sobre la base de lo que se ha dicho antes, esta es una solución 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
fuente
Acabo de encontrar una variación en este enfoque que es útil para eventos de puntero input type='text', wrapping the input, and then laying the text over it with a wrapper div de varias líneas . That also requires : ninguno; ` :beforepara poder seguir haciendo clic en el botón a continuación.
Eric Lease
10
<pre> <---------------------------------------
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
</pre> <--------------------------------------

O

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

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

T.Todua
fuente
9

Para hacer que un elemento tenga un salto de línea después, asígnelo:

display:block;

Los elementos no flotantes después de un elemento de nivel de bloque aparecerán en la siguiente línea. Muchos elementos, como <p> y <div> ya son elementos de nivel de bloque, por lo que puede usarlos.

Pero si bien es bueno saberlo, esto realmente depende más del contexto de su contenido. En su ejemplo, no querría usar CSS para forzar un salto de línea. <br /> es apropiado porque semánticamente la etiqueta p es la más apropiada para el texto que está mostrando. Más marcado solo para colgar CSS es innecesario. Técnicamente no es exactamente un párrafo, pero no hay una etiqueta <greeting>, así que usa lo que tienes. Describir bien su contenido con HTMl es mucho más importante: después de eso , descubra cómo hacer que se vea bonito.

Error de sintaxis
fuente
1
Pero esto lo convierte en todo el ancho del contenedor, lo que podría ser un efecto secundario no deseado (especialmente si el artículo es un ancla / enlace).
NickG
Sí, de manera predeterminada, los elementos de nivel de bloque ocupan todo el ancho a menos que establezca un ancho. Lea mi párrafo sobre el contexto: pensar en términos de contexto semántico en lugar de elegir su html basado en su diseño generalmente ayuda a evitar que se encuentre con problemas como ese.
Error de sintaxis el
1
A menudo, la razón por la que deben evitarse las etiquetas es más técnica que semántica. Las etiquetas de <br> son independientes y no necesariamente puede usarlas, ya que no sabe si los elementos en el frente existirán en el momento en que renderice la página, por lo que es posible que no desee líneas en blanco. Considere una lista de enlaces <a> en un menú vertical donde los quiere a todos en su propia línea, pero no puede usar <br> ya que no sabe qué enlaces se ocultarán debido a las reglas del lado del servidor. Ocultar los enlaces provocaría líneas en blanco si se usaran <br>.
NickG
1
Por esa razón, las personas a menudo usan una lista <ul> y luego ocultan las viñetas, pero eso es bastante hacky. Sería mejor si hubiera una regla css que dijera "siempre renderizar en línea propia".
NickG
1
Pero como dije en mi primer comentario, eso tiene el efecto secundario indeseable de que los elementos sean de ancho completo :) Solo necesito elementos en una nueva línea, sin que sean de ancho completo. Si el elemento es un enlace en el extremo izquierdo de la página, significa que incluso los clics en el extremo derecho de la pantalla siguen el enlace.
NickG
8

Aquí hay una mala solución a una mala pregunta, pero que literalmente cumple con el resumen:

p {
    width : 12ex;
}

p:before {
    content: ".";
    float: right;
    padding-left: 6ex;
    visibility: hidden;
}
Danny Beckett
fuente
1
error tipográfico o lo que debería exser? py eno están tan cerca del teclado, es por eso que pregunto
MMachinegun
1
Malo o no, esto es bastante inteligente.
Jonathan Dumaine
5

Para una lista de enlaces

Las otras respuestas proporcionan algunas buenas formas de agregar saltos de línea, dependiendo de la situación. Pero debe tenerse en cuenta que el :afterselector es una de las mejores formas de hacer esto para el control CSS sobre las listas de enlaces (y cosas similares), por las razones que se detallan a continuación.

Aquí hay un ejemplo, suponiendo una tabla de contenido:

<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>

Y aquí está la técnica de Simon_Weaver, que es más simple y más compatible. No separa tanto el estilo y el contenido, requiere más código y puede haber casos en los que desee agregar interrupciones después del hecho. Sin embargo, sigue siendo una gran solución, especialmente para IE más antiguos.

<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>

Tenga en cuenta las ventajas de las soluciones anteriores:

  • No importa el espacio en blanco en el HTML, el resultado es el mismo (vs. pre )
  • No se agrega relleno adicional a los elementos (ver NickG's display:block comentarios )
  • Puede cambiar fácilmente entre listas de enlaces horizontales y verticales con algunos CSS compartidos sin tener que acceder a cada archivo HTML para un cambio de estilo
  • No floatoclear estilos que afectan el contenido circundante
  • El estilo es independiente del contenido (vs. <br/>opre con saltos codificados)
  • Esto también puede funcionar para enlaces sueltos usando a.toc:after y<a class="toc">
  • Puede agregar múltiples saltos e incluso texto de prefijo / sufijo
Beejor
fuente
4

Quizás alguien tenga el mismo problema que yo:

Estaba en un elemento con display: flexlo que tuve que usar flex-direction: column.

dorio
fuente
4

Establecer una bretiqueta paradisplay: none es útil, pero luego puede terminar con WordsRunTogether. Me pareció más útil reemplazarlo con un carácter de espacio, así:

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
fuente
2
También podría considerar el establecimiento brde display: inline-block; width: 1em;lo que debería impedir las palabras se desplacen juntos cuando se va horizontal.
Beejor
1
Me gusta más tu sugerencia. Lo intentaré la próxima vez que me encuentre con esto.
Bryan
3

Qué tal si<pre> etiqueta?

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

stephan
fuente
Oh! Veo a que te refieres. Luego usas espacios en blanco en tu <pre>para que rompa la línea. ¿Qué pasa si quieres tener espacios en blanco regulares?
Micha Mazaheri
La etiqueta previa interpretará los retornos de carro realizados dentro. Entonces, si rompes tu línea entre 'hola' y 'cómo estás' en una etiqueta previa, el descanso se procesará
Godineau Félicie
2

Puede agregar mucho relleno y forzar el texto para que se divida en una nueva línea, por ejemplo

p{
    padding-right: 50%;
}

Me funcionó bien en una situación con un diseño receptivo, donde solo dentro de un cierto rango de ancho era necesario que el texto se dividiera.

Alexxandar
fuente
1
Suena una buena idea, pero aumentar el relleno también aumentará el ancho total de un objeto. Y eso puede tener un efecto negativo, especialmente en el caso de una página receptiva.
itsols
1

Me gustan las soluciones muy simples, aquí está la más.

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

y css

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

Utilice overflow-wrap: break-word; me gusta :

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

Debes declarar el contenido dentro de <span class="class_name"></span> . Después de eso, la línea se romperá.

\A significa carácter de avance de línea.

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

Las respuestas de Vincent Robert y Joey Adams son válidas. Sin embargo, si no desea cambiar el marcado, puede insertar un <br />usando javascript.

No hay forma de hacerlo en CSS sin cambiar el marcado.

e-satis
fuente
Eso no es exacto. Se podría usar :aftero :beforehacer eso.
Artur Bodera
0

En mi caso, necesitaba un botón de entrada para tener un salto de línea antes.
Apliqué el siguiente estilo al botón y funcionó:

clear:both;
Gene Bo
fuente
0

En caso de que esto ayude a alguien ...

Podrías hacer esto:

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

Con este css:

a.on-new-line:before { 
  content: '&nbsp;'; 
  font-size:0; 
  display:block;
  line-height:0;
}
Arrendajo
fuente
o.on-new-line:before {content: ""; display: block;}
meuwka
0

Usar en &nbsp;lugar de espacios evitará un descanso.

<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
fuente
0

Esto funciona en Chrome:

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

Supongo que no querías usar un punto de interrupción porque siempre romperá la línea. ¿Es eso correcto? Si es así, ¿qué tal si agrega un punto <br />de interrupción en su texto, luego le da una clase como <br class="hidebreak"/>luego usando una consulta de medios justo encima del tamaño que desea que rompa para ocultar el<br /> para que se rompa en un ancho específico pero permanezca en línea por encima de ese ancho.

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
fuente
Acabo de notar que Simon_Weaver publicó una respuesta similar a la mía. Lo siento, Simon, no estaba tratando de plagiar tu respuesta. No leí todas las respuestas antes de publicar las mías y, por lo tanto, no noté las suyas. Mi mala ... lección aprendida ... Leeré las otras respuestas antes de publicar la mía en el futuro.
Krankit
¡Sin preocupaciones! Pero tienes que escribirme un poema. De w3schools.com/tags/tag_br.asp "Tip: The <br> tag is useful for writing addresses or poems."
Simon_Weaver
0

El código puede ser

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

CSS sería

.text-class {
     display: flex;
     justify-content: flex-start;
     flex-direction: column;
     align-items: center;
 }
hombre loco
fuente
-1

No lo hagas Si desea un salto de línea difícil, use uno.

Rich Bradshaw
fuente
3
+1 Sí, pero si la nueva línea es solo para uso de presentación display: block;.
Web_Designer
21
No entiendo por qué esta respuesta recibió votos positivos. Si tuviera la capacidad de usar un salto de línea difícil, no estaría mirando esta pregunta.
Trliner