Kann CSS nach jedem Wort in einem Element einen Zeilenumbruch erzwingen?

159

Ich baue eine mehrsprachige Website auf, wobei der Eigentümer mir bei einigen Übersetzungen hilft. Einige der angezeigten Phrasen benötigen Zeilenumbrüche, um den Stil der Site beizubehalten.

Leider ist der Besitzer kein Computer-Typ. Wenn er also sieht, foo<br />bardass die Möglichkeit besteht, dass er die Daten während der Übersetzung irgendwie ändert.

Gibt es eine CSS-Lösung (neben der Änderung der Breite), die auf ein Element angewendet werden kann, das nach jedem Wort unterbrochen wird?

(Ich weiß, dass ich dies in PHP tun kann, aber ich frage mich, ob es einen raffinierten Trick gibt, den ich in CSS nicht kenne, um dasselbe zu erreichen, vielleicht in den CJK-Funktionen.)

BEARBEITEN

Ich werde versuchen zu zeichnen, was passiert:

----------------          ----------------
| Short Word   |          | Gargantuan   |
|              |          | Word         |
----------------          ----------------

Das lange Wort bricht automatisch, das kurze Wort nicht. Ich möchte, dass es so aussieht:

----------------          ----------------
| Short        |          | Gargantuan   |
| Word         |          | Word         |
----------------          ----------------
Ben
quelle
2
In HTML werden Elemente nach jedem Wort unterbrochen, wenn die Breite eines bestimmten Elements dies erfordert. Meinst du in Worten?
Paul D. Waite
@Paul - Nein, ich brauche eine Lösung, die nicht auf der Festlegung der Breite basiert. Das Problem ist, dass einige Phrasen länger sind und automatisch brechen (wie Sie beschreiben) und einige Phrasen kürzer sind und nicht brechen, was zu einer inkonsistenten Darstellung führt.
Ben
@ Paul - Ja, es ist so, wie du es genau beschreibst. Das Layout nicht wirklich zu beschädigen, aber es könnte besser aussehen.
Ben
Sie könnten Wortabstände verwenden, aber es würde alle Wörter betreffen. Ich denke, Sie können nicht darum herumkommen, diese Wörter in span-Elemente zu wickeln.
Meo
@meo - Sieht so aus, danke für den Gedanken
Ben

Antworten:

261

Verwenden

.one-word-per-line {
    word-spacing: <parent-width>; 
}

.your-classname{
    width: min-intrinsic;
    width: -webkit-min-content;
    width: -moz-min-content;
    width: min-content;
    display: table-caption;
    display: -ms-grid;
    -ms-grid-columns: min-content;
}

Dabei <parent-width>ist die Breite des übergeordneten Elements (oder ein beliebig hoher Wert, der nicht in eine Zeile passt). Auf diese Weise können Sie sicher sein, dass nach einem einzelnen Buchstaben sogar ein Zeilenumbruch auftritt. Funktioniert mit Chrome / FF / Opera / IE7 + (und wahrscheinlich sogar mit IE6, da es auch Wortabstände unterstützt).

Hurs van Bloob
quelle
Dies ist definitiv die beste Antwort imho
Hezad
31
@ToniMichelCaubet Die Antwort ist wirklich schwer zu interpretieren, aber er meint: .parent { word-spacing: 100px; }Wo 100pxist die Breite des übergeordneten Elements ? Das Problem ist, dass diese Lösung nicht funktioniert, wenn Sie einen fließenden Elternteil haben.
John Kurlak
5
Stellen Sie einfach einen sehr hohen Wert für den Wortabstand ein, z. B. word-spacing: 100000pxund Sie müssen sich keine Sorgen machen, dass das übergeordnete Element in Bezug auf die Breite flüssig ist. Das Festlegen eines Wortabstands von 100% wäre sinnvoll gewesen (es wäre 100% der übergeordneten Breite gewesen), aber in Prozent ausgedrückte Werte werden für diese CSS-Eigenschaft nicht unterstützt.
Sboisse
1
Das war sehr hilfreich. Ich habe es in einer reaktionsschnellen Situation verwendet, in der bei einer Breite Text in Registerkarten so umbrochen werden soll, dass sie alle dieselbe Höhe haben. word-spacing: 2em; Bei einer mobilen Breite möchte ich, dass sie einzeilig sind:word-spacing: unset;
Wird am
1
Das ist großartig. Von Jahren in der Zukunft, vielen Dank :)
Lucas Medina
124

Die Antwort von @HursVanBloob funktioniert nur mit übergeordneten Containern mit fester Breite, schlägt jedoch bei Containern mit flüssiger Breite fehl .

Ich habe viele Immobilien ausprobiert, aber nichts hat wie erwartet funktioniert. Schließlich kam ich zu dem Schluss, dass es word-spacingsehr gut funktioniert , einen sehr großen Wert zu geben .

p { word-spacing: 9999999px; }

Für moderne Browser können Sie auch die CSS- vwEinheit verwenden (visuelle Breite in% der Bildschirmgröße).

p { word-spacing: 100vw; }
Deepak Yadav
quelle
das werde ich versuchen!
Vaskort
Dies ist eine großartige Lösung!
Joe Conlin
Bricht vollständig mit & nbsp; obwohl.
Matt Fletcher
2
Nun, es funktioniert bei mir nicht, dass die Flüssigkeitsbreite des Behälters sehr hoch ist.
Onza
@Onza Kannst du einen Geigen-Link teilen, der dein Problem zeigt?
Deepak Yadav
37

Eine alternative Lösung wird unter Separater Satz auf ein Wort pro Zeile beschrieben , indem display:table-caption;auf das Element angewendet wird

Malcomio
quelle
Dies gruppiert tatsächlich nur Wörter basierend auf der Breite des längsten Wortes.
James South
1
Obwohl dies Wörter in einer Zeile gruppieren kann, funktioniert es in vielen Situationen sehr gut und fühlt sich nicht so hackig an wie die Option für massive Wortabstände.
Dale
1
Dies ist derjenige, der perfekt für mich funktioniert hat, nett!
Matt Fletcher
1
Es gibt kein Ergebnis
jafarbtech
32

Versuchen Sie es mit white-space: pre-line; . Es wird ein Zeilenumbruch erstellt, wo immer ein Zeilenumbruch im Code angezeigt wird, ignoriert jedoch das zusätzliche Leerzeichen (Tabulatoren und Leerzeichen usw.).

Schreiben Sie zuerst Ihre Wörter in separate Zeilen in Ihrem Code:

<div>Short
Word</div>

Wenden Sie dann den Stil auf das Element an, das die Wörter enthält.

div { white-space: pre-line; }

Seien Sie jedoch vorsichtig , jeder Zeilenumbruch im Code innerhalb des Elements führt zu einem Zeilenumbruch. Wenn Sie also Folgendes schreiben, führt dies zu einem zusätzlichen Zeilenumbruch vor dem ersten und nach dem letzten Wort:

<div>
    Short
    Word
</div>

Es gibt einen großartigen Artikel über CSS-Tricks , in dem die anderen Leerraumattribute erläutert werden.

Nass
quelle
Sie sollten erklären, wie Sie white-spacedie Frage beantworten können. Entschuldigung, aber ich verstehe nicht wie.
Jlgrall
2
Nun, der Artikel über CSS-Tricks erklärt es vollständig, daher dachte ich, ein Link würde ausreichen, anstatt zu versuchen, die Antwort hier wieder zu erbrechen.
Nass
Ok, Sie schlagen also vor, echte Zeilenumbrüche in die Quelle einzufügen und das CSS " white-space: pre;" zu verwenden, um diese Zeilenumbrüche anzuzeigen, wie es ein <pre>Tag tun würde? Das könnte funktionieren, und ein Zeilenumbruch sollte für Übersetzer natürlicher aussehen als ein <br />. Ich werde versuchen, Ihre Antwort zu bearbeiten, um sie hinzuzufügen :)
jlgrall
Genau. Nun, eigentlich white-space: pre-line;wäre es wahrscheinlich angemessener, da es zusätzliche Leerzeichen in Ihrem Code ignoriert. Ich werde die Antwort aktualisieren.
Nass
Gut, vielleicht nur white-space: pre;für IE 7 hinzufügen .
jlgrall
12

Wenn Sie zusätzlich zu den gegebenen Antworten aus verschiedenen Lösungen wählen möchten ...

Eine alternative Methode besteht darin, dem Container eine Breite von 0 zu geben und sicherzustellen, dass ein Überlauf sichtbar ist. Dann wird jedes Wort überlaufen und in einer eigenen Zeile stehen.

div {
  width: 0;
  overflow: visible;
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

Oder Sie können einen dieser neu vorgeschlagenen widthWerte verwenden, sofern diese zum Zeitpunkt des Lesens noch vorhanden sind.

div {
  width: min-intrinsic;       /* old Chrome, Safari */
  width: -webkit-min-content; /* less old Chrome, Safari */
  width: -moz-min-content;    /* current Firefox */
  width: min-content;         /* current Chrome, Safari; not IE or Edge */
}
<div>Short Word</div>
<hr>
<div>Gargantuan Word</div>

Herr Lister
quelle
4

Sie können nicht jedes Wort in CSS als Ziel festlegen. Mit ein bisschen jQuery könnten Sie es jedoch wahrscheinlich.

Mit jQuery können Sie jedes Wort in eine <span>und dann eine CSS-festgelegte Spanne einschließen, auf display:blockdie es in eine eigene Zeile gesetzt wird.

Theoretisch natürlich: P.

Kennzeichen
quelle
Ja, ich hatte Angst davor. Könnte es auch in PHP tun, aber es scheint eine hässliche Lösung zu sein. Ich dachte, es könnte einen :first-childTrick oder etwas da draußen geben ...
Ben
@Steve: Nein, mit CSS-Selektoren können Sie derzeit nur HTML-Elemente auswählen, keine Textknoten. Ich habe mir das CSS 3-Textmodul angesehen , aber es scheint nichts zu geben, das nach jedem Wort in einem Element eine Unterbrechung erzwingt. Marks Lösung ist die beste Wahl.
Paul D. Waite
@Paul, @Mark - Wenn einer von euch den Repräsentanten will, könntet ihr das zu einer Antwort machen und ich werde es akzeptieren. Ich werde dies ( vorerst ) per meta.stackoverflow.com/questions/48013/… als unbeantwortbar markieren .
Ben
Ich denke, Mark hat es bereits zu einer Antwort gemacht, für mich ist der ganze Repräsentant sein.
Paul D. Waite
@ Paul - +1 Teamplayer geben dem Kerl ein Abzeichen oder so :)
Ben
2

https://jsfiddle.net/bm3Lfcod/1/

Für diejenigen, die nach einer Lösung suchen, die in einem flexiblen übergeordneten Container mit einem in beiden Dimensionen flexiblen untergeordneten Container funktioniert. z.B. Navbar-Schaltflächen.

//the parent (example of what it may be)
div {
  display:flex;
  width: 100%;
}

//The children
a {
  display: inline-block;
}

//text wrapper
span {
  display: table-caption;
}
Onza
quelle
Versuchen Sie, dieser Spanne eine andere CSSEigenschaft zu geben, die Sie geben können. Sagen Sie eine Eigenschaft, die verursachen könntebrowser reflow
Deepak Yadav
1
Browser-Reflow?
Onza
2

Ich hatte das gleiche Problem und keine der Optionen hier hat mir geholfen. Einige Mail-Dienste unterstützen bestimmte Stile nicht. Hier ist meine Version, die das Problem gelöst hat und überall funktioniert, wo ich sie überprüft habe:

<table>
    <tr>
        <td width="1">Gargantuan Word</td>
    </tr>
</table>

ODER mit CSS:

<table>
    <tr>
        <td style="width:1px">Gargantuan Word</td>
    </tr>
</table>
eep
quelle
2

Die beste Lösung ist die word-spacing Immobilie.

Fügen Sie die <p>in einem Container mit einer bestimmten Größe hinzu (Beispiel300px ) und nachdem Sie diese Größe als Wert im Wortabstand hinzugefügt haben.

HTML

<div>
 <p>Sentence Here</p>
</div>

CSS

div {
 width: 300px;
}

p {
 width: auto;
 text-align: center;
 word-spacing: 300px;
}

Auf diese Weise wird Ihr Satz immer gebrochen und in eine Spalte gesetzt, aber das Mit des Absatzes ist dynamisch.

Hier ein Beispiel Codepen

Cosimo wiSe
quelle
0

In meinem Fall,

    word-break: break-all;

hat perfekt funktioniert, hoffe es hilft jedem anderen Newcomer wie mir.

Emanuel Hiroshi
quelle
Ein -1 von mir, weil dies eine falsche Antwort ist. Dies unterbricht die Linie bei jedem Zeichen, wenn es benötigt wird.
Emobe