Come interrompere la linea dal CSS, senza usare <br />?


398

produzione:

Ciao
Come stai

codice:

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

Come ottenere lo stesso risultato senza <br>?

Risposte:


385

Impossibile con la stessa struttura HTML, devi avere qualcosa per distinguere tra Helloe How are you.

Suggerisco di usare spans che verranno quindi visualizzati come blocchi (proprio come in <div>realtà).

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


37
nota anche la quantità di mark-up aggiuntiva: l' <br />elemento esiste per un'ottima ragione. Se si desidera l'interruzione di riga perché sono paragrafi separati, è sufficiente contrassegnarli come paragrafi separati.
Rowland Shaw,

8
Potresti aver bisogno di linee strutturate senza effettivamente utilizzare i paragrafi. Per contrassegnare una poesia, una canzone o un indirizzo, ad esempio
Vincent Robert,

2
@VincentRobert Giusto, ma una poesia è l'esempio canonico per quando <br>è il markup corretto. Span per una poesia sarebbe "sbagliato".
Alan H.

8
Si noti che l'assegnazione di display: block a un elemento forzerà un'interruzione di riga prima e dopo, e quindi non equivale affatto a un'interruzione di riga.
Jerseyboy,

17
Usa sicuramente gli elementi <p>. Un elemento <span> NON deve essere trasformato in display: blocco, l'intero punto di <span> è che è in linea. Lo farei in questo modo: <div><p> ciao</p> <p> Come stai </p> </div>. Non è richiesto CSS vincolato.
Miglia

354

È possibile utilizzare white-space: pre;per fare in modo che gli elementi si comportino come <pre>, preservando le nuove linee. Esempio:

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

Nota per IE che questo funziona solo in IE8 +.


133
spesso meglio di quanto non lo presia pre-line, il che consente di avvolgere.
Alan H.

14
Maggiori informazioni sulle differenze tra pre-line e pre-wrap su developer.mozilla.org/en-US/docs/Web/CSS/white-space
patrick,

1
Ho preferito pre nel mio caso, perché posso anche usare l'overflow del testo
Greg

Si noti che questo non funzionerà con reagire perché il testo viene infine raggruppato e verrà inserito sulla stessa riga, il che non attiverà la white-spaceregola CSS.
Vadorequest

119

Usalo <br/>normalmente, ma nascondilo display: nonequando non lo vuoi.

Mi aspetterei che la maggior parte delle persone che trovano questa domanda vogliano usare css / responsive design per decidere se un'interruzione di linea appare o meno in un posto specifico. (e non hai nulla di personale contro <br/>)

Anche se non immediatamente ovvio, puoi effettivamente applicare display:noneun <br/>tag per nasconderlo, il che consente l'uso di media query in tandem con tag BR semantici.

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

Ciò è utile nel design reattivo in cui è necessario forzare il testo in due righe in corrispondenza di un'interruzione esatta.

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


5
Simone, sei perfetto - l'esempio che chiami è il motivo esatto in cui stavo cercando questa domanda e la display: nonesoluzione è di gran lunga la più appropriata e utile.
abbottjam,

8
Nota che per i casi in cui le parole potrebbero scorrere insieme, potresti usare qualcosa di simile display: inline-block; width: 1em;invece di none.
Beejor,

2
Potresti persino applicare una classe al <br class='foo'>se avessi bisogno di un maggiore controllo ma non impazzire troppo!
Simon_Weaver,

Un altro "perché non ci ho pensato ?!" risposta. <br/>è bravo in quello che fa; Non c'è bisogno di reinventare la ruota. Grazie!
Rinogo,

Concetto simile può essere applicato a disposizione flex-box: stackoverflow.com/questions/29732575/...
Simon_Weaver

106

Esistono diverse opzioni per definire la gestione di spazi bianchi e interruzioni di riga. Se uno può inserire il contenuto in un <p>tag, ad esempio , è abbastanza facile ottenere ciò che si desidera.

Per preservare le interruzioni di riga ma non gli spazi bianchi usare pre-line(non pre) come in:

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

<p>hello
How are you</p>

Se si desidera un altro comportamento, scegliere tra uno di questi (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: scuole W3


4
Perfetto. dovrebbe essere la risposta selezionata.
Ben Lin,

1
Credo che questo sia ciò che OP sta cercando.
John Sardinha,

65

Il comando "\ a" nei CSS genera un ritorno a capo. Questo è CSS, non HTML, quindi dovrebbe essere più vicino a quello che vuoi: nessun markup extra .

In una blockquote, l'esempio seguente mostra sia il titolo che il link sorgente e separa i due con un ritorno a capo ( "\a"):

blockquote[title][cite]:after {
    content:attr(title)"\a"attr(cite)
}

Fantasioso, ma totalmente inutile per quale fosse la domanda.
YePhIcK,

15
+1 perché è solo CSS e non consiglia l'uso di tag pre, br né la modifica della modalità di visualizzazione per bloccare (il che aggiunge un comportamento diverso, potrebbe interrompersi se il genitore è presente display:flexe quindi è un hack in questo contesto). Non è lussuoso, davvero, solo una tecnica moderna. Se vuoi lo stesso markup esatto, ma reagire in modo diverso, questa è la strada da percorrere.
renoirb

Idea brillante. Nota ": non utilizzare virgolette semplici 'perché desideri consentire \adi essere analizzato come carattere speciale.
Hafenkranich,

2
voglio dare +1 ma non funziona per me su Chrome 55
pery mimon

4
Avrei votato in questo modo se ci fosse un po 'di HTML e forse un violino per aiutare a visualizzare quello che stai facendo.
Giovanni,

29

Al CSS usa il codice

p {
    white-space: pre-line;
}

Con questo codice CSS ogni invio all'interno del tag P sarà una linea di interruzione nell'html.


1
Questo e 'esattamente quello che stavo cercando! Funziona perfettamente con il contenuto di elementi generato da JS (ad es. Risultato JSON da query AJAX, modulo schema angolare, ecc.) Che viene superato tramite escape / sanitizzazione (ad es. Normale comportamento di escape AngularJS quando non si utilizza ngBindHtml)
Stefan Dragnev

28

Basandosi su ciò che è stato detto prima, questa è una soluzione CSS pura che funziona.

<style>
  span {
    display: inline;
  }
  span:before {
    content: "\a ";
    white-space: pre;
  }
</style>
<p>
  First line of text. <span>Next line.</span>
</p>

Ho appena trovato una variante di questo approccio per essere utile per eventi puntatore input type='text', wrapping the input, and then laying the text over it with a wrapper div multilinea . That also requires : nessuno; `sul :beforeper poter ancora fare clic sul pulsante qui sotto.
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>                         <-----------------------------------

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


9

Per fare in modo che un elemento abbia un'interruzione di riga in seguito, assegnalo:

display:block;

Gli elementi non mobili dopo un elemento a livello di blocco appariranno sulla riga successiva. Molti elementi, come <p> e <div> sono già elementi a livello di blocco, quindi puoi semplicemente usarli.

Ma mentre questo è buono a sapersi, questo dipende molto di più dal contesto dei tuoi contenuti. Nel tuo esempio, non vorrai usare i CSS per forzare un'interruzione di riga. <br /> è appropriato perché semanticamente il tag p è il più appropriato per il testo che stai visualizzando. Non è necessario altro markup solo per appendere CSS. Tecnicamente non è esattamente un paragrafo, ma non esiste un tag <greeting>, quindi usa quello che hai. Descrivendo bene i tuoi contenuti con HTML è il modo più importante - dopo che avete che allora capire come farlo sembrare abbastanza.


1
Ma questo rende l'intera larghezza del contenitore, il che potrebbe essere un effetto collaterale indesiderato (soprattutto se l'oggetto è un ancoraggio / collegamento).
NickG

Sì, per impostazione predefinita gli elementi a livello di blocco occupano l'intera larghezza a meno che non si imposti una larghezza. Leggi il mio paragrafo sul contesto: pensare in termini di contesto semantico piuttosto che scegliere il tuo html in base al tuo progetto generalmente ti aiuta a evitare di imbatterti in problemi del genere.
Errore di sintassi

1
Spesso il motivo per cui è necessario evitare i tag è più tecnico che semantico. I tag <br> sono autonomi e non puoi necessariamente usarli perché non sai se gli elementi davanti esisteranno al momento del rendering della pagina, quindi potresti non voler linee vuote. Prendi in considerazione un elenco di <a> collegamenti in un menu verticale in cui li desideri tutti sulla loro stessa linea, ma non puoi utilizzare <br> poiché non sai quali collegamenti verranno nascosti a causa delle regole sul lato server. Nascondere i collegamenti causerebbe righe vuote se venisse utilizzato <br>.
NickG

1
..Per questo motivo, le persone usano spesso un elenco <ul> e poi nascondono i proiettili, ma è piuttosto confuso. Sarebbe meglio se ci fosse una regola CSS che dicesse "Rendi sempre sulla propria linea".
NickG

1
Ma come ho detto nel mio primo commento, questo ha l'effetto indesiderato di elementi a larghezza intera :) Ho solo bisogno di elementi su una nuova linea, senza che siano a larghezza intera. Se l'elemento è un collegamento all'estrema sinistra della pagina, significa che anche i clic all'estrema destra dello schermo seguono il collegamento.
NickG

8

Ecco una cattiva soluzione a una cattiva domanda, ma una che soddisfa letteralmente il brief:

p {
    width : 12ex;
}

p:before {
    content: ".";
    float: right;
    padding-left: 6ex;
    visibility: hidden;
}

1
errore di battitura o cosa dovrebbe exessere? pe enon sono così vicini sulla tastiera, ecco perché te lo chiedo
MMachinegun,


1
Male o no, questo è in realtà abbastanza intelligente.
Jonathan Dumaine,

5

Per un elenco di collegamenti

Le altre risposte forniscono alcuni buoni modi per aggiungere interruzioni di riga, a seconda della situazione. Ma va notato che il :afterselettore è uno dei modi migliori per farlo per il controllo CSS su elenchi di collegamenti (e cose simili), per i motivi indicati di seguito.

Ecco un esempio, assumendo un sommario:

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

Ed ecco la tecnica di Simon_Weaver, che è più semplice e più compatibile. Non separa molto stile e contenuto, richiede più codice e potrebbero esserci casi in cui si desidera aggiungere interruzioni dopo il fatto. Comunque un'ottima soluzione, soprattutto per IE più vecchi.

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

Nota i vantaggi delle soluzioni di cui sopra:

  • Indipendentemente dallo spazio bianco nell'HTML, l'output è lo stesso (vs. pre)
  • Nessuna imbottitura aggiuntiva viene aggiunta agli elementi (vedere i display:blockcommenti di NickG )
  • È possibile passare facilmente da un elenco di collegamenti orizzontale a uno verticale con alcuni CSS condivisi senza passare a tutti i file HTML per cambiare stile
  • No floatoclear stili che incidono sul contenuto circostante
  • Lo stile è separato dal contenuto (vs. <br/>, opre con interruzioni codificate)
  • Questo può funzionare anche per i collegamenti liberi usando a.toc:aftere<a class="toc">
  • È possibile aggiungere più interruzioni e persino testo prefisso / suffisso

4

Forse qualcuno avrà lo stesso problema come me:

Ero in un elemento con display: flexquindi ho dovuto usare flex-direction: column.


4

Impostare un brtag sudisplay: none è utile, ma poi puoi finire con WordsRunTogether. Ho trovato più utile sostituirlo con un carattere spaziale, in questo modo:

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: ' ';}
}

2
Si potrebbe anche considerare l'impostazione brsu display: inline-block; width: 1em;quale dovrebbe impedire alle parole di scorrere insieme quando si va in orizzontale.
Beejor,

1
Mi piace di più il tuo suggerimento. Ci proverò la prossima volta che lo incontrerò.
Bryan,

3

Che ne dici di <pre>tag?

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


Oh! Capisco cosa intendi. Quindi usi gli spazi bianchi in <pre>modo da interrompere la linea. Cosa succede se si desidera avere spazi bianchi regolari?
Micha Mazaheri,

Il tag pre interpreterà i ritorni a capo effettuati all'interno. Quindi, se interrompi la linea di demarcazione tra "ciao" e "come stai" in un pre tag, l'interruzione verrà visualizzata
Godineau Félicie,

2

Ad esempio, puoi aggiungere molta imbottitura e forzare la divisione del testo in una nuova riga

p{
    padding-right: 50%;
}

Ha funzionato bene per me in una situazione con un design reattivo, dove solo all'interno di una certa gamma di larghezza era necessario per dividere il testo.


1
Sembra una buona idea, ma l'aumento dell'imbottitura aumenterà anche la larghezza complessiva di un oggetto. E questo può avere un effetto negativo, specialmente nel caso di una pagina reattiva.
itsols,

1

Mi piacciono le soluzioni molto semplici, ecco un'altra

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

e css

p {
 display: flex;
 flex-direction: column;
}

1

Usa overflow-wrap: break-word; piace :

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

1

Devi dichiarare il contenuto all'interno <span class="class_name"></span> . Dopo di ciò la linea verrà interrotta.

\A indica il carattere di avanzamento riga.

.class_name::after {
  content: "\A";
  white-space: pre;
}

0

Le risposte di Vincent Robert e Joey Adams sono valide. Se non vuoi, tuttavia, modificare il markup, puoi semplicemente inserire a<br /> usando javascript.

Non è possibile farlo nei CSS senza modificare il markup.


Non è accurato Si potrebbe usare :aftero :beforeper farlo.
Artur Bodera,

0

Nel mio caso, avevo bisogno di un pulsante di input per avere un'interruzione di linea prima di esso.
Ho applicato il seguente stile al pulsante e ha funzionato:

clear:both;

0

Nel caso questo aiuti qualcuno ...

Potresti farlo:

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

Con questo css:

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

oppure.on-new-line:before {content: ""; display: block;}
meuwka,

0

L'uso al &nbsp;posto degli spazi impedisce una 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>

0

Questo funziona in Chrome:

p::after {
    content: "-";
    color: transparent;
    display: block;
}

0

Immagino che non volessi usare un breakpoint perché romperà sempre la linea. È corretto? In tal caso, che ne dici di aggiungere un punto <br />di interruzione nel tuo testo, quindi assegnargli una classe come <br class="hidebreak"/>allora usando media query proprio sopra la dimensione che vuoi che si interrompa per nascondere il<br /> modo che si spezzi ad una larghezza specifica ma rimanga in linea sopra quella larghezza.

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/


Ho appena notato che Simon_Weaver ha pubblicato una risposta simile alla mia. Scusa Simon, non stavo cercando di plagiare la tua risposta. Non ho letto tutte le risposte prima di aver pubblicato le mie e quindi non ho notato le tue. La mia cattiva ... lezione imparata .. Leggerò le altre risposte prima di pubblicare la mia in futuro.
Krankit,

Nessun problema! Ma devi scrivermi una poesia. Da w3schools.com/tags/tag_br.asp "Tip: The <br> tag is useful for writing addresses or poems."
Simon_Weaver,

0

Il codice può essere

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

CSS sarebbe

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

-1

Non farlo. Se si desidera un'interruzione della linea dura, utilizzare uno.


3
+1 Sì, ma se la nuova riga è esclusivamente per uso presentazione display: block;.
Web_Designer

21
Non capisco perché questa risposta abbia ricevuto voti positivi. Se avessi la possibilità di usare un'interruzione di linea, non starei guardando questa domanda.
Trliner,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.