Vorteile der Verwendung von display: inline-block vs float: links in CSS

127

Normalerweise würden wir, wenn wir mehrere DIVsin einer Reihe haben wollen, verwenden float: left, aber jetzt habe ich den Trick von entdecktdisplay:inline-block

Beispiellink hier . Es scheint mir, dass dies display:inline-blockein besserer Weg ist align DIVs, aber gibt es irgendwelche Nachteile? Warum ist dieser Ansatz weniger beliebt als der floatTrick?

Ryan
quelle
@Moak , dass bestimmte Fragen ist etwa inline, nicht inline-block. Aber der erste in verwandten ist gut: stackoverflow.com/a/11823622/918414
ThinkingStiff
2
Beispiel Link ist tot
information_interchange

Antworten:

156

In 3 Worten: inline-blockist besser.

Inline-Block

Der einzige Nachteil des display: inline-blockAnsatzes besteht darin, dass in IE7 und darunter ein Element nur angezeigt werden kann, inline-blockwenn es bereits inlinestandardmäßig war. Dies bedeutet, dass Sie anstelle eines <div>Elements ein <span>Element verwenden müssen. Es ist überhaupt kein großer Nachteil, da a semantisch <div>zum Teilen der Seite dient, während a <span>nur zum Abdecken eines Seitenbereichs dient, sodass es keinen großen semantischen Unterschied gibt. Ein großer Vorteil davon display:inline-blockist, dass, wenn andere Entwickler Ihren Code zu einem späteren Zeitpunkt warten, es viel offensichtlicher ist, was display:inline-blockund was text-align:right zu erreichen versucht, als eine float:leftoder- float:rightAnweisung. Mein Lieblingsvorteil des inline-blockAnsatzes ist, dass er einfach zu bedienen vertical-align: middleist line-heightundtext-align: centerdie Elemente auf eine intuitive Weise perfekt zu zentrieren. Ich habe im Mozilla-Blog einen großartigen Blog-Beitrag über die Implementierung eines browserübergreifenden Inline-Blocks gefunden . Hier ist die Browserkompatibilität .

Schweben

Der Grund dafür, dass die Verwendung der floatMethode nicht für das Layout Ihrer Seite geeignet ist, liegt darin, dass die floatCSS-Eigenschaft ursprünglich nur dazu gedacht war, einen Text um ein Bild zu wickeln (Magazinstil), und sich aufgrund ihres Designs nicht am besten für allgemeine Seitenlayoutzwecke eignet. Wenn Sie schwebende Elemente später ändern, treten manchmal Positionierungsprobleme auf, da sie nicht im Seitenfluss enthalten sind . Ein weiterer Nachteil ist, dass im Allgemeinen ein Clearfix erforderlich ist, da sonst Aspekte der Seite beschädigt werden können. Der Clearfix erfordert das Hinzufügen eines Elements nach den schwebenden Elementen, um zu verhindern, dass die übergeordneten Elemente um sie herum zusammenfallen. Dies überschreitet die semantische Grenze zwischen der Trennung von Stil und Inhalt und ist daher ein Anti-Muster in der Webentwicklung .

Alle im obigen Link erwähnten Leerraumprobleme können leicht mit der white-spaceCSS-Eigenschaft behoben werden .

Bearbeiten:

SitePoint ist eine sehr glaubwürdige Quelle für Webdesign-Ratschläge und sie scheinen die gleiche Meinung zu haben wie ich:

Wenn Sie mit CSS-Layouts noch nicht vertraut sind, wird Ihnen verziehen, dass die Verwendung von CSS-Floats auf einfallsreiche Weise die Höhe der Fähigkeiten ist. Wenn Sie so viele CSS-Layout-Tutorials wie möglich verwendet haben, können Sie davon ausgehen, dass das Beherrschen von Floats ein Übergangsritus ist. Sie werden von dem Einfallsreichtum geblendet sein, der von der Komplexität überrascht ist, und Sie werden ein Erfolgserlebnis gewinnen, wenn Sie endlich verstehen, wie Floats funktionieren.

Lass dich nicht täuschen. Du wirst einer Gehirnwäsche unterzogen.

http://www.sitepoint.com/give-floats-the-flick-in-css-layouts/

Update 2015 - Flexbox ist eine gute Alternative für moderne Browser :

.container {
  display: flex; /* or inline-flex */
}

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

Mehr Info

21. Dezember 2016 Update

Bootstrap 4 entfernt die Unterstützung für IE9 und entfernt somit Floats aus Zeilen und die volle Flexbox.

Pull-Anfrage Nr. 21389

Alex W.
quelle
4
"clearfix" ist nur ein Name; Das "Fix" zeigt an, dass falsche Erwartungen und / oder eine falsche Browser-Implementierung behoben wurden. Ich stimme (glücklich) zu, dass es Alternativen zum Floating / Clearing gibt, aber es gibt nichts, was von Natur aus kaputt oder repariert ist.
Tim Medora
10
@Alex - Gibt es eine nicht hackige, browserübergreifende Möglichkeit, das Leerzeichen zwischen Inline-Block-Elementen zu entfernen, die sich in separaten Zeilen befinden? Ich würde gerne aufhören können, Floats zu verwenden, aber die besten Links, die ich zu diesem Problem finden konnte ( hier und hier ), sind unbefriedigend. Sie erwähnen die white-spaceImmobilie - können Sie das erklären?
Antinom
3
@Alex - danke, das ist sehr cool, aber ich finde den Float-with-Modern-Clearfix-Ansatz immer noch etwas wartbarer, da er nicht kaputt geht, wenn ich ihn irgendwann an einer letter-spacinganderen Stelle in meinem CSS anpasse .
Antinom
1
Warum verwendet der Bootstrap immer noch float für sein Grid-System? Sind das nicht Layouts?
AzDesign
2
Beachten Sie, dass der Inline-Block Leerzeichen um Elemente hinzufügt. Wenn Sie es für ein Raster verwenden oder diesen Leerraum nicht möchten, müssen Sie zusätzliche Styling- / HTML-Hacks hinzufügen, um dies zu berücksichtigen. Siehe: css-tricks.com/fighting-the-space-between-inline-block-elements/…
kretzm
23

Ich stimme zu, dass dies im Allgemeinen inline-blockbesser ist, aber es gibt eine zusätzliche Sache, die berücksichtigt werden muss, wenn Sie prozentuale Breiten verwenden , um ein ansprechendes Raster zu erstellen (oder wenn Sie pixelgenaue Breiten wünschen):

Wenn Sie inline-blockRaster mit einer Gesamtbreite von 100% oder nahezu 100% verwenden, müssen Sie sicherstellen, dass Ihr HTML-Markup keinen Leerraum zwischen den Spalten enthält .

Bei Floats müssen Sie sich keine Sorgen machen - die Spalten schweben über Leerzeichen oder anderen Inhalten zwischen Spalten. Die Antworten dieser Frage enthalten einige gute Tipps zum Entfernen von HTML-Leerzeichen, ohne Ihren Code hässlich zu machen .

Wenn Sie das HTML-Markup aus irgendeinem Grund nicht steuern können (z. B. ein restriktives CMS), können Sie die hier beschriebenen Tricks ausprobieren, oder Sie müssen möglicherweise Kompromisse eingehen und Floats anstelle von Inline-Block verwenden. Es gibt auch hässliche CSS-Tricks, die nur unter extremen Umständen verwendet werden sollten, z. B. font-size:0;auf dem Spaltencontainer, und dann die Schriftgröße in jeder Spalte erneut anwenden .

Beispielsweise:

user56reinstatemonica8
quelle
Gibt es eine mögliche Problemumgehung für das No-Whitespace-Between, vielleicht div+(whitespace) {display:none}oder so?
NoBugs
1
Siehe den dritten Absatz nach seinem ersten Satz ... Siehe insbesondere die verknüpfte Frage
user56reinstatemonica8
@NoBugs wenden einfach die Schriftgröße an: 0; Achten Sie auf das enthaltene Element, wenn Sie keine bestimmten Schriftgrößen für Elemente in den Inline-Blöcken festgelegt haben.
Jai
@Jai Genau, und da Styling / Ansicht vom Prozess der Erstellung des HTML / Modells getrennt sein sollte, ist dies eine schlechte Praxis. (Was ist, wenn Sie einen Dienst verwenden, der Ihnen gegeben hat <div class="inlinething">hi</div> <div class="inlinething">there</div> more content here... ?)
NoBugs
4

Wenn Sie die Pixelgenauigkeit ausrichten möchten div, verwenden Sie float. inline-blockscheint immer zu erfordern, dass Sie ein paar Pixel abhacken (zumindest im IE)

Vins
quelle
6
Ja, das liegt daran, dass Sie die Verwendung von Leerzeichen zwischen Elementen vermeiden müssen, da Inline-Blöcke Leerzeichen genauso berücksichtigen wie Inline-Elemente. Halten Sie Inline-Block-Tags eng beieinander und keine Probleme mit Pixeln.
Ben Sinclair
Auch dies kann ein Browserunterschied mit Standardauffüllung / Rand für Elemente sein. Nun, zumindest in der Vergangenheit habe ich immer getan, * {padding:0px; margin:0px; }da dies hilft, meine Codierung auszugleichen
Angry 84
Ist dies der Grund, warum Bootstrap (vielleicht andere) es eher als Inline-Block verwenden, frage ich mich?
NoBugs
1

Eine ausführliche Antwort finden Sie hier .

Aber im Allgemeinen müssen floatSie sich der umgebenden Elemente bewusst sein und sich um sie kümmern und auf inline-blockeinfache Weise Elemente auskleiden.

Vielen Dank

abhijit
quelle
1

Es gibt ein Merkmal des Inline-Blocks, das jedoch möglicherweise nicht einfach ist. Das heißt, der Standardwert für die vertikale Ausrichtung in CSS ist die Basislinie. Dies kann zu unerwartetem Ausrichtungsverhalten führen. Schauen Sie sich diesen Artikel an.

http://www.brunildo.org/test/inline-block.html

Wenn Sie stattdessen einen float: left ausführen, sind die divs unabhängig voneinander und Sie können sie mithilfe des Randes einfach ausrichten.

Sydney
quelle