Mit Inline-Block in eine neue Zeile einbrechen?

75

Ich möchte die <br />'s entfernen und die Unterbrechungslinien durch CSS machen. Wenn ich die Bereiche auf display:blockdie Breite ändere, wird sie 100% betragen und die Breite muss genau der Länge des Textes entsprechen, so wie sie jetzt ist. Irgendwelche Vorschläge?

<div class="fullscreen">
    <p class="text">
        <span class="medium">We</span> <br />
        <span class="large">build</span> <br />
        <span class="medium">the</span> <br />
        <span class="large">Internet</span>
    </p>
</div>

.text span {
   background:rgba(165, 220, 79, 0.8);
   display:inline-block;
   padding:7px 10px;
   color:white;
}
.fullscreen .large {  font-size:80px }

Fidddle

dito
quelle
1
=ARRAYFORMULA(UNIQUE(TEXT(INDIRECT("A1:A"&COUNTA(A1:A)), "mmm-yyyy")))- i.stack.imgur.com/lvbzL.png
player0
@ player0 danke Kumpel
dito

Antworten:

118

Entfernen Sie alle brTags und verwenden Sie display: table.

.text span {
   background: rgba(165, 220, 79, 0.8);
   display: table;
   padding: 7px 10px;
   color: white;
}
.fullscreen .large { font-size: 80px }

Erläuterung: Die Tabelle umschließt standardmäßig die Breite ihres Inhalts, ohne eine Breite festzulegen, ist jedoch weiterhin ein Element auf Blockebene. Sie können dasselbe Verhalten erzielen, indem Sie eine Breite für andere Elemente auf Blockebene festlegen:

<span style="display:block;border:1px solid red;width:100px;">Like a default table.</span>
<code>null</code>

Beachten Sie, dass das <code>Element nicht wie gewohnt inline fließt <span>. Probieren Sie es mit den berechneten Stilen in Ihren Entwicklertools aus. Sie sehen den Pseudorand rechts von <span>. Auf jeden Fall ist dies dasselbe wie die Tabelle, aber die Tabelle hat den zusätzlichen Vorteil, dass sie sich immer an die Breite ihres Inhalts anpasst.

Devang Rathod
quelle
8
Ich denke, diese Antwort ist relevanter als die akzeptierte Antwort. display: table fungiert als Inline-Block-Element, indem es so breit ist wie der darin enthaltene Inhalt, aber auch als Block-Element, indem vor UND nach dem Element ein Zeilenumbruch eingefügt wird. Floats fügen nach dem Element keinen Zeilenumbruch hinzu.
Pascalculator
Es ist auch nützlich, einen Randkollaps hinzuzufügen: getrennt; Polsterung funktionieren zu lassen
Arekk
5
display: table;trägt Verhalten jenseits des Zeilenumbruchs, das wahrscheinlich einige CSS brechen wird. Ich weiß heightund widthwerde nicht arbeiten
Robisrob
4
Diese Antwort würde von mehr Erklärung profitieren.
Paul Rooney
1
@PaulRooney Fügte gerade die Erklärung zu seiner Frage hinzu.
Bit-less
35

benutze float: left;undclear: left;

http://jsfiddle.net/rtM6J/

.text span {
   background: rgba(165, 220, 79, 0.8);
   float: left;
   clear: left;
   padding: 7px 10px;
   color: #fff;
}
Luca
quelle
1
Da der Inline-Block das OP nicht erreichen lässt, was er will, schweben: left macht immer noch das, wofür er den Inline-Block verwendet hat (lassen Sie das Element den Text umbrechen, anstatt die volle Breite zu erreichen). Ich hätte Anzeige verlassen können: Inline-Block, aber Float: Links setzt auch unsichtbar die Anzeige auf Block, ein sauberer Code ist besser als überladen. Ich nehme an, Sie haben das nicht gewusst, Grund, warum Sie sich entschieden haben, abzustimmen. Immerhin ist meine Antwort eine mögliche richtige Antwort (ich bin sicher, es gibt andere Möglichkeiten, dies zu erreichen) und ist nicht für die Google-Indizierung geeignet ...
Luca
1
Alle anzuzeigenden schwebenden Mengen: Block. Deshalb denke ich, dass die Verwendung von float hier, wenn nach dem Inline-Block gefragt wird, irreführend ist. Das Downvote war, während es danach suchte, dass es einen hohen Rang erhielt, jedoch nicht hilfreich war. Ich dachte, mein vorheriger Kommentar hätte das erklärt. Entschuldigung, wenn es nicht klar war.
hakre
1
@akre - das ist nicht ganz richtig. Da sie sich nicht mehr im selben Ablauf wie das übergeordnete Element befinden, werden die Blockbreiten so reduziert, als ob sie angezeigt würden: Inline-Block, was wirklich alles ist, was das OP will. Das hat bei mir gut funktioniert und das gleiche Problem gelöst.
Don McCurdy
1
@Luca Könnte auch erwähnenswert sein, dass Sie möglicherweise einen Clearfix für das übergeordnete Element der Bereiche benötigen, z .text { clear: left; overflow: auto; }.
Don McCurdy
13

Legen Sie die Elemente in display: inlineund verwenden Sie :after:

.text span { display: inline }
.break-after:after { content: '\A'; white-space:pre; }

und fügen Sie die Klasse in Ihre HTML-Bereiche ein:

<span class="medium break-after">We</span>
ET-CS
quelle
1
Musste die Linienhöhe
Gute Antwort. Dies war die einzige Antwort, die in meiner spezifischen Situation für mich funktioniert hat.
wp-overwatch.com
Dies ist die beste Antwort, da keine Stile für die Inline-Spanne (wie Rand unten)
unterbrochen werden
8

Hier ist eine andere Lösung (nur relevante Erklärungen aufgelistet):

.text span {
   display:inline-block;
   margin-right:100%;
}

Wenn der Rand in Prozent ausgedrückt wird, wird dieser Prozentsatz aus der Breite des übergeordneten Knotens entnommen. 100% bedeutet also so breit wie der übergeordnete Knoten, was dazu führt, dass das nächste Element in eine neue Zeile "verschoben" wird.

ultracrepidarian
quelle
Kein Teil der Antwort, aber ich dachte, eine Erklärung wäre angebracht. Ich wollte <pre>Blöcke so gestalten, dass sie Ränder haben, nur so breit wie der Inhalt sind, aber nicht breiter als der übergeordnete Knoten, und jeder wird in einer neuen Zeile angezeigt. Aus verschiedenen Gründen (ich kann näher darauf eingehen, wenn jemand interessiert ist) war keine der früheren Lösungen in meinem Fall zufriedenstellend, so dass ich meine eigene fand. Es sieht gut aus, wenn der übergeordnete Knoten eine begrenzte Breite hat und overflow: visible; Andernfalls kann es zu einer unnötigen horizontalen Bildlaufleiste oder einem leeren Bereich kommen.
Ultracrepidarian
8

Ich denke, der beste Weg, dies ab 2018 zu tun, ist die Verwendung von Flexbox.

.text {
  display: flex;
  flex-direction: column;
  align-items: flex-start;
}
/* same as original below */
.text span {
   background:rgba(165, 220, 79, 0.8);
   display:inline-block;
   padding:7px 10px;
   color:white;
}
.fullscreen .large {  font-size:80px }
<div class="fullscreen">
    <p class="text">
        <span class="medium">We</span> 
        <span class="large">build</span> 
        <span class="medium">the</span> 
        <span class="large">Internet</span>
    </p>
</div>

Wille
quelle
Hat am besten für mich funktioniert. Ich musste Elemente links, in der Mitte oder rechts ausrichten. So konnte ich nutzen align-items: flex-start, align-items: center& align-items: flex-end.
Rehmat
3

Ich denke, Floats funktionieren hier am besten für Sie. Wenn Sie nicht möchten, dass das Element die gesamte Zeile einnimmt, sollte Float es nach links funktionieren.

.text span {
       background:rgba(165, 220, 79, 0.8);
       float: left;
       clear: left;
       padding:7px 10px;
       color:white;
    }

Hinweis: Entfernen Sie die <br/>, bevor Sie diesen Off-Course verwenden.

Bhushan Firake
quelle
2

Wenn Sie <p>s (nur <div>s und <span>s) nicht verwenden können, können Sie mit dieser Lösung möglicherweise sogar die inline-blockMitte oder rechts Ihres S ausrichten , wenn Sie möchten (oder sie einfach so lassen, wie Sie es ursprünglich gewünscht haben). Obwohl die Lösung möglicherweise noch mit <p>s funktioniert, denke ich nicht, dass der resultierende HTML-Code ganz korrekt wäre , aber es liegt trotzdem an Ihnen.

Der Trick besteht darin, jedes Ihrer <span>s mit einem entsprechenden zu versehen <div>. Auf diese Weise nutzen wir den durch die <div>'s verursachten Zeilenumbruch display: block(Standardeinstellung), während das visuelle grüne Kästchen (mit Ihrer display: inline-blockErklärung) an den Grenzen des Textes bleibt .

.text span {
   background:rgba(165, 220, 79, 0.8);
   display:inline-block;
   padding:7px 10px;
   color:white;
}
.large {  font-size:80px }
<div class="text">
  <div><span class="medium">We</span></div>
  <div><span class="large">build</span></div>
  <div><span class="medium">the</span></div>
  <div><span class="large">Internet</span></div>
</div>

Rui Pimentel
quelle
-1

Sie können versuchen mit:

    display: inline-table;

Bei mir funktioniert es gut.

Pablo Navarro
quelle