Wie kann man einen Zeilenumbruch von CSS machen, ohne <br /> zu verwenden?

398

Ausgabe:

Hallo
Wie geht es Ihnen

Code:

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

Wie erreicht man die gleiche Leistung ohne <br>?

Jitendra Vyas
quelle

Antworten:

385

Mit der gleichen HTML-Struktur unmöglich, müssen Sie etwas zwischen Hellound unterscheiden können How are you.

Ich schlage vor, spans zu verwenden, die Sie dann als Blöcke anzeigen (genau wie a <div>tatsächlich).

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

Vincent Robert
quelle
37
Beachten Sie auch, wie viel zusätzlicher Aufschlag vorhanden ist - das <br />Element existiert aus einem sehr guten Grund. Wenn Sie den Zeilenumbruch wünschen, weil es sich um separate Absätze handelt, markieren Sie sie einfach als separate Absätze.
Rowland Shaw
8
Möglicherweise benötigen Sie strukturierte Linien, ohne tatsächlich Absätze zu verwenden. Um zum Beispiel ein Gedicht, ein Lied oder eine Adresse zu markieren
Vincent Robert
2
@ VincentRobert Richtig, aber ein Gedicht ist das kanonische Beispiel dafür, wann <br>das richtige Markup ist. Spannweiten für ein Gedicht wären „falsch“.
Alan H.
8
Beachten Sie, dass das Zuweisen von display: block zu einem Element einen Zeilenumbruch vorher und nachher erzwingt und daher keineswegs mit einem Zeilenumbruch identisch ist.
Jerseyboy
17
Verwenden Sie auf jeden Fall die <p> -Elemente. Ein <span> -Element sollte NICHT in display: block aufgenommen werden. Der springende Punkt bei <span> ist, dass es inline ist. Ich würde es so machen: <div> <p> Hallo </ p> <p> Wie geht es dir </ p> </ div>? Kein Wonked-Out-CSS erforderlich.
Meilen
353

Sie können verwenden white-space: pre;, um Elemente so zu gestalten <pre>, dass Zeilenumbrüche erhalten bleiben. Beispiel:

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

Beachten Sie für IE, dass dies nur in IE8 + funktioniert.

Joey Adams
quelle
133
oft besser als es preist pre-line, was das Wickeln ermöglicht.
Alan H.
14
Weitere Informationen zu den Unterschieden zwischen Pre-Line und Pre-Wrap finden Sie unter developer.mozilla.org/en-US/docs/Web/CSS/white-space
patrick
1
Ich habe Pre in meinem Fall vorgezogen, weil ich auch Textüberlauf verwenden kann
Greg
Beachten Sie, dass dies mit "Reagieren" nicht funktioniert, da der Text schließlich gebündelt und in dieselbe Zeile gestellt wird, wodurch keine white-spaceCSS-Regel ausgelöst wird .
Vadorequest
119

Verwenden Sie es <br/>wie gewohnt, aber verstecken Sie es, display: nonewenn Sie es nicht möchten.

Ich würde erwarten, dass die meisten Leute, die diese Frage finden, mithilfe von CSS / Responsive Design entscheiden möchten, ob an einer bestimmten Stelle ein Zeilenumbruch auftritt oder nicht. (und nichts persönliches dagegen haben <br/>)

Obwohl dies nicht sofort offensichtlich ist, können Sie es tatsächlich display:noneauf ein <br/>Tag anwenden , um es auszublenden. Dies ermöglicht die Verwendung von Medienabfragen zusammen mit semantischen BR-Tags.

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

Dies ist nützlich bei reaktionsschnellen Designs, bei denen Sie Text genau in zwei Zeilen zwingen müssen.

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

Simon_Weaver
quelle
5
Simon, Sie sind genau richtig - das Beispiel, das Sie nennen, ist der genaue Grund, warum ich diese Frage untersucht habe, und die display: noneLösung ist bei weitem die am besten geeignete und nützlichste.
Abbottjam
8
Beachten Sie, dass Sie in Fällen, in denen Wörter zusammenlaufen würden, so etwas wie display: inline-block; width: 1em;anstelle von verwenden könnten none.
Beejor
2
Sie könnten sogar eine Klasse auf die anwenden, <br class='foo'>wenn Sie mehr Kontrolle benötigen, aber nicht zu verrückt werden!
Simon_Weaver
Ein anderes "Warum habe ich nicht daran gedacht?!" Antworten. <br/>ist großartig in dem, was es tut; Das Rad muss nicht neu erfunden werden. Vielen Dank!
Rinogo
Ein ähnliches Konzept kann auf das Flex-Box-Layout angewendet werden
Simon_Weaver
106

Es gibt verschiedene Optionen zum Definieren der Behandlung von Leerzeichen und Zeilenumbrüchen. Wenn man den Inhalt zB in ein <p>Tag einfügen kann, ist es ziemlich einfach, das zu bekommen, was man will.

Um Zeilenumbrüche, aber keine Leerzeichen beizubehalten, verwenden Sie pre-line(nicht pre) wie in:

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

<p>hello
How are you</p>

Wenn ein anderes Verhalten gewünscht wird, wählen Sie eines davon aus (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 */

QUELLE: W3-Schulen

Petermeissner
quelle
4
perfekt. sollte die ausgewählte Antwort sein.
Ben Lin
1
Ich glaube, das ist es, wonach OP sucht.
John Sardinha
64

Der Befehl "\ a" in CSS generiert einen Wagenrücklauf. Dies ist CSS, nicht HTML, daher sollte es näher an dem sein, was Sie möchten: kein zusätzliches Markup .

In einem Blockzitat werden im folgenden Beispiel sowohl der Titel als auch der Quelllink angezeigt und die beiden durch einen Wagenrücklauf ( "\a") getrennt:

blockquote[title][cite]:after {
    content:attr(title)"\a"attr(cite)
}
David Latapie
quelle
Ausgefallen, aber für die Frage völlig unnötig.
YePhIcK
15
+1, da es nur CSS ist und nicht die Verwendung von pre, br-Tags oder die Änderung des Anzeigemodus in block empfiehlt (was zu einem anderen Verhalten führt, kann zu Unterbrechungen führen, wenn sich das übergeordnete Element befindet, display:flexund ist daher in diesem Zusammenhang ein Hack). Es ist eigentlich nichts Besonderes, nur eine moderne Technik. Wenn Sie genau das gleiche Markup möchten, aber tatsächlich anders reagieren möchten, ist dies der richtige Weg.
Renoirb
Brilliante Idee. Beachten Sie Folgendes: "Verwenden 'Sie keine einfachen Anführungszeichen, da Sie zulassen möchten, dass das \aals Sonderzeichen analysiert wird.
Hafenkranich
2
Ich möchte +1 geben, aber es funktioniert nicht für mich auf Chrom 55
Pery Mimon
4
Ich hätte dies positiv bewertet, wenn es HTML und vielleicht eine Geige gegeben hätte, um zu visualisieren, was Sie tun.
John
29

Verwenden Sie beim CSS den Code

p {
    white-space: pre-line;
}

Mit diesem Code CSS wird jede Eingabe innerhalb des P-Tags eine Unterbrechungszeile im HTML-Code sein.

Burunoh
quelle
1
Genau das habe ich gesucht! Funktioniert perfekt für aus JS generierte Elementinhalte (z. B. JSON-Ergebnis aus AJAX-Abfrage, Winkelschema-Form usw.), die durch Escape / Desinfektion (z. B. normales AngularJS-Escape-Verhalten, wenn ngBindHtml nicht verwendet wird) durchlaufen werden
Stefan Dragnev
28

Aufbauend auf dem, was zuvor gesagt wurde, ist dies eine reine CSS-Lösung, die funktioniert.

<style>
  span {
    display: inline;
  }
  span:before {
    content: "\a ";
    white-space: pre;
  }
</style>
<p>
  First line of text. <span>Next line.</span>
</p>
Cruzanmo
quelle
Ich habe gerade eine Variation dieses Ansatzes gefunden, die für mehrzeilige input type='text', wrapping the input, and then laying the text over it with a wrapper Div- . That also requires Zeiger-Ereignisse hilfreich ist : none; `on the :before, um weiterhin auf die Schaltfläche unten klicken zu können.
Eric Lease
10
<pre> <---------------------------------------
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
lorem ipsum
</pre> <--------------------------------------

ODER

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

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

T.Todua
quelle
9

Weisen Sie einem Element anschließend einen Zeilenumbruch zu:

display:block;

Nicht schwebende Elemente nach einem Element auf Blockebene werden in der nächsten Zeile angezeigt. Viele Elemente, wie z. B. <p> und <div>, sind bereits Elemente auf Blockebene, sodass Sie diese nur verwenden können.

Dies ist zwar gut zu wissen, hängt jedoch mehr vom Kontext Ihres Inhalts ab. In Ihrem Beispiel möchten Sie kein CSS verwenden, um einen Zeilenumbruch zu erzwingen. Das <br /> ist angemessen, da das p-Tag semantisch am besten für den angezeigten Text geeignet ist. Mehr Markup, nur um CSS aufzuhängen, ist unnötig. Technisch gesehen ist es nicht gerade ein Absatz, aber es gibt kein <greeting> -Tag. Verwenden Sie also das, was Sie haben. Beschreiben Sie Ihre Inhalte gut mit HTML ist viel wichtiger - nachdem Sie haben , dann herauszufinden , wie es hübsch aussehen zu machen.

Syntax-Fehler
quelle
1
Dies macht es jedoch zur vollen Breite des Containers, was eine unerwünschte Nebenwirkung sein kann (insbesondere wenn es sich bei dem Gegenstand um einen Anker / eine Verbindung handelt).
NickG
Ja, standardmäßig nehmen Elemente auf Blockebene die volle Breite ein, es sei denn, Sie legen eine Breite fest. Lesen Sie meinen Absatz über den Kontext. Wenn Sie in Bezug auf den semantischen Kontext denken, anstatt Ihr HTML basierend auf Ihrem Design auszuwählen, können Sie im Allgemeinen verhindern, dass Sie auf solche Probleme stoßen.
Syntaxfehler
1
Oft ist der Grund, warum <br> Tags vermieden werden müssen, eher technischer als semantischer Natur. <br> Tags sind eigenständig und können nicht unbedingt verwendet werden, da Sie nicht wissen, ob die vorderen Elemente zum Zeitpunkt des Renderns der Seite vorhanden sind. Daher möchten Sie möglicherweise keine Leerzeilen. Betrachten Sie eine Liste von <a> -Links in einem vertikalen Menü, in dem Sie alle in einer eigenen Zeile haben möchten, aber <br> nicht verwenden können, da Sie nicht wissen, welche Links aufgrund serverseitiger Regeln ausgeblendet werden. Das Ausblenden der Links würde leere Zeilen verursachen, wenn <br> verwendet würde.
NickG
1
Aus diesem Grund verwenden die Leute oft eine <ul>-Liste und verstecken dann die Kugeln, aber das ist ziemlich hackig. Es wäre besser, wenn es eine CSS-Regel gäbe, die nur "immer in eigener Zeile rendern" besagt.
NickG
1
Aber wie ich in meinem ersten Kommentar sagte - das hat den unerwünschten Nebeneffekt, dass die Elemente in voller Breite sind :) Ich brauche nur Elemente in einer neuen Zeile, ohne dass sie in voller Breite sind. Wenn es sich bei dem Element um einen Link ganz links auf der Seite handelt, bedeutet dies, dass sogar Klicks ganz rechts auf dem Bildschirm dem Link folgen.
NickG
8

Hier ist eine schlechte Lösung für eine schlechte Frage, aber eine, die buchstäblich den Auftrag erfüllt:

p {
    width : 12ex;
}

p:before {
    content: ".";
    float: right;
    padding-left: 6ex;
    visibility: hidden;
}
Danny Beckett
quelle
1
Tippfehler oder was soll exsein? pund esind nicht so nah an der Tastatur, deshalb
frage
1
Schlecht oder nicht, das ist eigentlich ziemlich klug.
Jonathan Dumaine
5

Für eine Liste von Links

Die anderen Antworten bieten je nach Situation einige gute Möglichkeiten zum Hinzufügen von Zeilenumbrüchen. Es sollte jedoch beachtet werden, dass der :afterSelektor eine der besseren Möglichkeiten ist, dies für die CSS-Kontrolle über Listen von Links zu tun unten genannten Gründen (und ähnlichen Dingen) .

Hier ein Beispiel unter der Annahme eines Inhaltsverzeichnisses:

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

Und hier ist die Technik von Simon_Weaver, die einfacher und kompatibler ist. Es trennt Stil und Inhalt nicht so sehr, erfordert mehr Code und es kann Fälle geben, in denen Sie nachträglich Pausen hinzufügen möchten. Trotzdem eine großartige Lösung, insbesondere für ältere 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>

Beachten Sie die Vorteile der oben genannten Lösungen:

  • Unabhängig vom Leerzeichen im HTML ist die Ausgabe dieselbe (vs. pre )
  • Den Elementen wird keine zusätzliche Polsterung hinzugefügt (siehe NickGs) display:block Kommentare von ).
  • Sie können mit einigen gemeinsam genutzten CSS problemlos zwischen horizontalen und vertikalen Listen von Links wechseln, ohne in jeder HTML-Datei eine Stiländerung vornehmen zu müssen
  • Nein floatoder clearStile, die den umgebenden Inhalt beeinflussen
  • Der Stil ist vom Inhalt getrennt (vs. <br/>oder premit fest codierten Unterbrechungen).
  • Dies kann auch für lose Links mit a.toc:afterund funktionieren<a class="toc">
  • Sie können mehrere Unterbrechungen und sogar Präfix- / Suffix-Text hinzufügen
Beejor
quelle
4

Vielleicht hat jemand das gleiche Problem wie ich:

Ich war in einem Element mit, display: flexalso musste ich verwenden flex-direction: column.

Dorian
quelle
4

Ein brTag auf setzendisplay: none ist hilfreich, aber dann können Sie mit WordsRunTogether enden. Ich fand es hilfreicher, es stattdessen durch ein Leerzeichen zu ersetzen, wie folgt:

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
quelle
2
Sie können auch eine Einstellung brin Betracht ziehen , display: inline-block; width: 1em;die verhindern soll, dass die Wörter bei horizontaler Ausrichtung zusammenlaufen.
Beejor
1
Ihr Vorschlag gefällt mir besser. Ich werde es versuchen, wenn ich das nächste Mal darauf stoße.
Bryan
3

Wie wäre es mit <pre>Tag?

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

stephan
quelle
Oh! Ich verstehe was du meinst. Dann verwenden Sie Leerzeichen in Ihrem, <pre>damit die Linie unterbrochen wird. Was ist, wenn Sie regelmäßige Leerzeichen haben möchten?
Micha Mazaheri
Das Pre-Tag interpretiert die darin vorgenommenen Wagenrückläufe. Wenn Sie also Ihre Grenze zwischen "Hallo" und "Wie geht es Ihnen
?
2

Sie können beispielsweise viel Auffüllen hinzufügen und erzwingen, dass Text in eine neue Zeile aufgeteilt wird

p{
    padding-right: 50%;
}

Funktionierte gut für mich in einer Situation mit reaktionsschnellem Design, in der nur innerhalb eines bestimmten Breitenbereichs Text aufgeteilt werden musste.

Alexxandar
quelle
1
Klingt nach einer guten Idee, aber durch Erhöhen der Polsterung wird auch die Gesamtbreite eines Objekts erhöht. Dies kann sich insbesondere bei einer reaktionsfähigen Seite negativ auswirken.
Itsols
1

Ich mag sehr einfache Lösungen, hier ist noch eine

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

und css

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

Verwenden Sie Overflow-Wrap: break-word; mögen :

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

Sie müssen den Inhalt innerhalb deklarieren <span class="class_name"></span>. Danach wird die Linie unterbrochen.

\A bedeutet Zeilenvorschubzeichen.

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

Die Antworten von Vincent Robert und Joey Adams sind gültig. Wenn Sie das Markup jedoch nicht ändern möchten, können Sie einfach ein einfügen<br /> mit Javascript .

In CSS ist dies nicht möglich, ohne das Markup zu ändern.

e-satis
quelle
Das stimmt nicht. Man könnte das gebrauchen :afteroder :beforetun.
Artur Bodera
0

In meinem Fall brauchte ich eine Eingabetaste, um einen Zeilenumbruch davor zu haben.
Ich habe den folgenden Stil auf die Schaltfläche angewendet und es hat funktioniert:

clear:both;
Gene Bo
quelle
0

Falls dies jemandem hilft ...

Sie könnten dies tun:

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

Mit diesem CSS:

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

Die Verwendung &nbsp;anstelle von Leerzeichen verhindert eine Unterbrechung.

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

Dies funktioniert in Chrome:

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

Ich vermute, Sie wollten keinen Haltepunkt verwenden, da dieser immer die Linie unterbricht. Ist das korrekt? Wenn ja, wie wäre es, wenn Sie <br />Ihrem Text einen Haltepunkt hinzufügen und ihm eine Klasse wie <br class="hidebreak"/>die Medienabfrage direkt über der Größe geben, die er unterbrechen soll, um den zu verbergen<br /> damit er bei einer bestimmten Breite bricht, aber über dieser Breite inline bleibt.

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
quelle
Ich habe gerade bemerkt, dass Simon_Weaver eine ähnliche Antwort wie ich gepostet hat. Entschuldigung Simon, ich habe nicht versucht, Ihre Antwort zu plagiieren. Ich habe nicht alle Antworten gelesen, bevor ich meine gepostet habe, und habe daher Ihre nicht bemerkt. Meine schlechte ... Lektion gelernt ... Ich werde die anderen Antworten lesen, bevor ich meine in Zukunft poste.
Krankit
Keine Sorge! Aber du musst mir ein Gedicht schreiben. Von w3schools.com/tags/tag_br.asp "Tip: The <br> tag is useful for writing addresses or poems."
Simon_Weaver
0

Der Code kann sein

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

CSS wäre

.text-class {
     display: flex;
     justify-content: flex-start;
     flex-direction: column;
     align-items: center;
 }
verrückter Mann
quelle
-1

Tu es nicht. Wenn Sie einen harten Zeilenumbruch wünschen, verwenden Sie einen.

Rich Bradshaw
quelle
3
+1 Ja, aber wenn die neue Zeile nur für Präsentationszwecke bestimmt ist display: block;.
Web_Designer
21
Ich verstehe nicht, warum diese Antwort keine Stimmen erhalten hat. Wenn ich die Möglichkeit hätte, einen harten Zeilenumbruch zu verwenden, würde ich mir diese Frage nicht ansehen.
Trliner