Comment faire un saut de ligne à partir de CSS, sans utiliser <br />?

398

production:

Bonjour
Comment ça va

code:

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

Comment obtenir la même sortie sans <br>?

Jitendra Vyas
la source

Réponses:

385

Impossible avec la même structure HTML, vous devez avoir quelque chose à distinguer entre Helloet How are you.

Je suggère d'utiliser spans que vous afficherez ensuite sous forme de blocs (comme un en <div>fait).

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

Vincent Robert
la source
37
notez également combien de marge supplémentaire il y a - l' <br />élément existe pour une très bonne raison. Si vous voulez le saut de ligne parce que ce sont des paragraphes séparés, marquez-les simplement comme des paragraphes séparés.
Rowland Shaw
8
Vous pourriez avoir besoin de lignes structurées sans réellement utiliser de paragraphes. Pour baliser un poème, une chanson ou une adresse par exemple
Vincent Robert
2
@VincentRobert C'est vrai, mais un poème est l'exemple canonique pour quand <br>est le bon balisage. L'envergure d'un poème serait «fausse».
Alan H.
8
Notez que l'attribution de display: block à un élément forcera un saut de ligne avant et après, et n'est donc pas du tout la même chose que d'avoir un saut de ligne.
jerseyboy
17
Utilisez certainement les éléments <p>. Un élément <span> ne doit PAS être transformé en display: block, tout l'intérêt de <span> est qu'il est en ligne. Je le ferais de cette façon: <div><p> bonjour</p> <p> Comment allez-vous </p> </div>. Aucun CSS gagné n'a été requis.
Miles
354

Vous pouvez utiliser white-space: pre;pour que les éléments agissent comme <pre>, ce qui préserve les retours à la ligne. Exemple:

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

Notez pour IE que cela ne fonctionne que dans IE8 +.

Joey Adams
la source
133
souvent mieux que preest pre-line, ce qui permet l' emballage.
Alan H.
14
Plus d'informations sur les différences entre la pré-ligne et le pré-emballage sur developer.mozilla.org/en-US/docs/Web/CSS/white-space
patrick
1
J'ai préféré le pré dans mon cas, car je peux aussi utiliser le débordement de texte
Greg
Notez que cela ne fonctionnera pas avec react car le texte est finalement regroupé et sera mis sur la même ligne, ce qui ne déclenchera pas la white-spacerègle CSS.
Vadorequest
119

Utilisez <br/>comme d'habitude, mais cachez-le avecdisplay: none quand vous ne le voulez pas.

Je m'attends à ce que la plupart des personnes qui trouvent cette question souhaitent utiliser css / responsive design pour décider si un saut de ligne apparaît ou non à un endroit spécifique. (et n'ont rien de personnel contre<br/> )

Bien que cela ne soit pas immédiatement évident, vous pouvez réellement appliquer display:noneà une <br/>balise pour la masquer, ce qui permet l'utilisation de requêtes multimédias en tandem avec des balises BR sémantiques.

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

Ceci est utile dans la conception réactive où vous devez forcer le texte en deux lignes à la rupture exacte.

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

Simon_Weaver
la source
5
Simon, vous êtes sur place - l'exemple que vous donnez est la raison exacte pour laquelle j'ai fait des recherches sur cette question et la display: nonesolution est de loin la plus appropriée et la plus utile.
abbottjam
8
Notez que dans les cas où cela entraînerait la fusion des mots, vous pouvez utiliser quelque chose comme display: inline-block; width: 1em;au lieu de none.
Beejor
2
Vous pouvez même appliquer une classe au <br class='foo'> si vous aviez besoin de plus de contrôle mais ne devenez pas trop fou!
Simon_Weaver
Un autre "pourquoi n'y ai-je pas pensé?!" réponse.<br/>est excellent dans ce qu'il fait; pas besoin de réinventer la roue. Merci!
rinogo
Un concept similaire peut être appliqué à la disposition des boîtes flexibles: stackoverflow.com/questions/29732575/…
Simon_Weaver
106

Il existe plusieurs options pour définir la gestion des espaces blancs et des sauts de ligne. Si l'on peut mettre le contenu par exemple dans une <p>balise, il est assez facile d'obtenir tout ce que l'on veut.

Pour conserver les sauts de ligne mais pas les espaces blancs, utilisez pre-line(pas pre) comme dans:

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

<p>hello
How are you</p>

Si un autre comportement est souhaité, choisissez parmi l'un d'eux (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 */

SOURCE: Écoles W3

petermeissner
la source
4
parfait. devrait être la réponse choisie.
Ben Lin
1
Je pense que c'est ce que recherche OP.
John Sardinha
65

La commande "\ a" en CSS génère un retour chariot. C'est du CSS, pas du HTML, donc il sera plus proche de ce que vous voulez: pas de balisage supplémentaire .

Dans un blockquote, l'exemple ci-dessous affiche à la fois le titre et le lien source et séparez les deux par un retour chariot ( "\a"):

blockquote[title][cite]:after {
    content:attr(title)"\a"attr(cite)
}
David Latapie
la source
Fantaisie, mais totalement inutile pour ce que la question était.
YePhIcK
15
+1 parce que son CSS uniquement, et ne recommande pas l'utilisation de balises pre, br ni de changer le mode d'affichage pour bloquer (ce qui ajoute un comportement différent, peut casser si le parent est dedans display:flexet est donc un hack dans ce contexte). Ce n'est pas une fantaisie, vraiment, juste une technique moderne. Si vous voulez exactement le même balisage, mais que vous réagissez différemment, c'est la voie à suivre.
renoirb
Idée brillante. Notez le "- n'utilisez pas de guillemets simples 'parce que vous voulez permettre au \apour être analysé en tant que caractère spécial.
Hafenkranich
2
je veux donner +1 mais ça ne marche pas pour moi sur chrome 55
pery mimon
4
J'aurais voté favorablement s'il y avait du HTML et peut-être un violon pour aider à visualiser ce que vous faites.
John
29

Au CSS utiliser le code

p {
    white-space: pre-line;
}

Avec ce code css, chaque entrée à l'intérieur de la balise P sera une ligne de rupture au html.

Burunoh
la source
1
Ceci est exactement ce que je cherchais! Fonctionne parfaitement pour le contenu d'élément généré à partir de JS (par exemple, résultat JSON d'une requête AJAX, forme de schéma angulaire, etc.) qui est transmis par échappement / désinfection (par exemple, comportement d'échappement AngularJS normal lorsque vous n'utilisez pas ngBindHtml)
Stefan Dragnev
28

S'appuyant sur ce qui a été dit précédemment, il s'agit d'une solution CSS pure qui fonctionne.

<style>
  span {
    display: inline;
  }
  span:before {
    content: "\a ";
    white-space: pre;
  }
</style>
<p>
  First line of text. <span>Next line.</span>
</p>
cruzanmo
la source
Je viens de trouver une variation sur cette approche pour être utile pour les événements de pointeur input type='text', wrapping the input, and then laying the text over it with a wrapper div sur plusieurs lignes . That also requires : aucun; `sur :beforeafin de pouvoir toujours cliquer sur le bouton ci-dessous.
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>                         <-----------------------------------

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

T.Todua
la source
9

Pour qu'un élément ait un saut de ligne par la suite, affectez-le:

display:block;

Les éléments non flottants après un élément de niveau bloc apparaîtront sur la ligne suivante. De nombreux éléments, tels que <p> et <div> sont déjà des éléments de niveau bloc, vous pouvez donc simplement les utiliser.

Mais bien que cela soit bon à savoir, cela dépend vraiment davantage du contexte de votre contenu. Dans votre exemple, vous ne voudriez pas utiliser CSS pour forcer un saut de ligne. Le <br /> est approprié car sémantiquement la balise p est la plus appropriée pour le texte que vous affichez. Plus de balisage juste pour suspendre CSS, c'est inutile. Techniquement, ce n'est pas exactement un paragraphe, mais il n'y a pas de balise <greeting>, alors utilisez ce que vous avez. Bien décrire votre contenu avec HTMl est beaucoup plus important - après avoir cela, alors découvrez comment le rendre joli.

Erreur de syntaxe
la source
1
Mais cela en fait toute la largeur du conteneur, ce qui pourrait être un effet secondaire indésirable (surtout si l'article est une ancre / un lien).
NickG
Oui, par défaut, les éléments de niveau bloc occupent toute la largeur sauf si vous définissez une largeur. Lisez mon paragraphe sur le contexte - penser en termes de contexte sémantique plutôt que de choisir votre html en fonction de votre conception vous aide généralement à éviter de rencontrer des problèmes comme celui-ci.
Erreur de syntaxe
1
Souvent, la raison pour laquelle les balises doivent être évitées est plus technique que sémantique. Les balises <br> sont autonomes et vous ne pouvez pas nécessairement les utiliser car vous ne savez pas si les éléments en face existeront au moment du rendu de la page, vous ne voudrez donc pas de lignes vides. Considérez une liste de <a> liens dans un menu vertical où vous voulez qu'ils soient tous sur leur propre ligne, mais ne pouvez pas utiliser <br> car vous ne savez pas quels liens seront masqués en raison des règles côté serveur. Masquer les liens entraînerait des lignes vides si <br> était utilisé.
NickG
1
..Pour cette raison, les gens utilisent souvent une liste <ul>, puis cachent les balles, mais c'est assez hacky. Ce serait mieux s'il y avait une règle css qui disait juste "toujours rendre sur sa propre ligne".
NickG
1
Mais comme je l'ai dit dans mon premier commentaire - cela a l'effet secondaire indésirable des éléments étant pleine largeur :) J'ai juste besoin d'articles sur une nouvelle ligne, sans qu'ils soient pleine largeur. Si l'élément est un lien à l'extrême gauche de la page, cela signifie que même des clics à l'extrême droite de l'écran suivent le lien.
NickG
8

Voici une mauvaise solution à une mauvaise question, mais qui répond littéralement au mémoire:

p {
    width : 12ex;
}

p:before {
    content: ".";
    float: right;
    padding-left: 6ex;
    visibility: hidden;
}
Danny Beckett
la source
1
faute de frappe ou ce qui devrait exêtre? pet ene sont pas si proches du clavier, c'est pourquoi je demande
MMachinegun
1
Mauvais ou pas, c'est en fait assez intelligent.
Jonathan Dumaine
5

Pour une liste de liens

Les autres réponses fournissent de bons moyens d'ajouter des sauts de ligne, selon la situation. Mais il convient de noter que le :aftersélecteur est l'un des meilleurs moyens de le faire pour le contrôle CSS des listes de liens (et des choses similaires), pour les raisons indiquées ci-dessous.

Voici un exemple, en supposant une table des matières:

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

Et voici la technique de Simon_Weaver, qui est plus simple et plus compatible. Il ne sépare pas autant le style et le contenu, nécessite plus de code et il peut y avoir des cas où vous souhaitez ajouter des sauts après coup. Pourtant, c'est une excellente solution, en particulier pour les anciens IE.

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

Notez les avantages des solutions ci-dessus:

  • Peu importe l'espace dans le HTML, la sortie est la même (vs. pre )
  • Aucun rembourrage supplémentaire n'est ajouté aux éléments (voir NickG display:block commentaires )
  • Vous pouvez facilement basculer entre les listes horizontales et verticales de liens avec du CSS partagé sans entrer dans chaque fichier HTML pour un changement de style
  • Non floatouclear styles affectant le contenu environnant
  • Le style est distinct du contenu (vs. <br/>, oupre avec des pauses codées en dur)
  • Cela peut également fonctionner pour les liens lâches en utilisant a.toc:after et<a class="toc">
  • Vous pouvez ajouter plusieurs sauts et même un préfixe / suffixe
Beejor
la source
4

Peut-être que quelqu'un aura le même problème que moi:

J'étais dans un élément avec display: flexdonc je devais l'utiliser flex-direction: column.

Dorian
la source
4

Définition d'une brbalise surdisplay: none est utile, mais vous pouvez vous retrouver avec WordsRunTogether. Je l'ai trouvé plus utile de le remplacer par un espace, comme ceci:

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
la source
2
Vous pouvez également envisager de mettre brà ce display: inline-block; width: 1em;qui devrait empêcher les mots de courir ensemble lors du passage horizontal.
Beejor
1
J'aime mieux votre suggestion. J'essaierai la prochaine fois que je rencontrerai cela.
Bryan
3

Et le <pre>tag?

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

stephan
la source
Oh! Je vois ce que tu veux dire. Ensuite, vous utilisez des espaces dans votre <pre>afin qu'il brise la ligne. Et si vous voulez avoir des espaces blancs réguliers?
Micha Mazaheri
La balise pré interprétera les retours de chariot effectués à l'intérieur. Donc, si vous cassez votre ligne entre «bonjour» et «comment allez-vous» dans un pré-tag, la pause sera rendue
Godineau Félicie
2

Vous pouvez ajouter beaucoup de remplissage et forcer le texte à être divisé en nouvelle ligne, par exemple

p{
    padding-right: 50%;
}

A bien fonctionné pour moi dans une situation avec un design réactif, où seulement dans une certaine plage de largeur, il fallait que le texte soit divisé.

Alexxandar
la source
1
Cela semble une bonne idée, mais l'augmentation du rembourrage augmentera également la largeur globale d'un objet. Et cela peut avoir un effet négatif, notamment dans le cas d'une page responsive.
itsols
1

J'aime les solutions très simples, voici la plus

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

et css

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

Utilisez overflow-wrap: break-word; comme :

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

Vous devez déclarer le contenu à l'intérieur <span class="class_name"></span>. Après cela, la ligne sera rompue.

\A signifie caractère de saut de ligne.

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

Les réponses de Vincent Robert et Joey Adams sont valides. Si vous ne souhaitez cependant pas modifier le balisage, vous pouvez simplement insérer un<br /> utilisant javascript.

Il n'y a aucun moyen de le faire en CSS sans changer le balisage.

e-satis
la source
Ce n'est pas exact. On pourrait utiliser :afterou :beforepour cela.
Artur Bodera
0

Dans mon cas, j'avais besoin d'un bouton d'entrée pour avoir un saut de ligne avant.
J'ai appliqué le style suivant au bouton et cela a fonctionné:

clear:both;
Gene Bo
la source
0

Au cas où cela aiderait quelqu'un ...

Vous pouvez faire ceci:

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

Avec ce css:

a.on-new-line:before { 
  content: '&nbsp;'; 
  font-size:0; 
  display:block;
  line-height:0;
}
Geai
la source
ou.on-new-line:before {content: ""; display: block;}
meuwka
0

L'utilisation &nbsp;au lieu d'espaces empêchera une pause.

<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
la source
0

Cela fonctionne dans Chrome:

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

Je suppose que vous ne vouliez pas utiliser un point d'arrêt, car cela rompra toujours la ligne. Est-ce exact? Si c'est le cas, que diriez-vous d'ajouter un point d'arrêt <br />dans votre texte, puis de lui donner une classe comme celle d' <br class="hidebreak"/>utiliser la requête multimédia juste au-dessus de la taille que vous souhaitez qu'il casse pour masquer le<br /> afin qu'il se casse à une largeur spécifique mais reste en ligne au-dessus de cette largeur.

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
la source
Je viens de remarquer que Simon_Weaver a posté une réponse similaire à la mienne. Désolé Simon, je n'essayais pas de plagier votre réponse. Je n'ai pas lu toutes les réponses avant de poster la mienne et je n'ai donc pas remarqué la vôtre. Ma mauvaise ... leçon apprise .. Je vais lire les autres réponses avant de poster la mienne à l'avenir.
Krankit
Pas de soucis! Mais tu dois m'écrire un poème. De w3schools.com/tags/tag_br.asp "Tip: The <br> tag is useful for writing addresses or poems."
Simon_Weaver
0

Le code peut être

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

CSS serait

.text-class {
     display: flex;
     justify-content: flex-start;
     flex-direction: column;
     align-items: center;
 }
homme fou
la source
-1

Non. Si vous voulez un saut de ligne dur, utilisez-en un.

Rich Bradshaw
la source
3
+1 Oui, mais si la nouvelle ligne est uniquement destinée à la présentation display: block;.
Web_Designer
21
Je ne comprends pas pourquoi cette réponse a reçu des votes positifs. Si j'avais la possibilité d'utiliser un saut de ligne dur, je ne regarderais pas cette question.
trliner