Ich habe ein Problem, wenn ich versuche, den Div-Block "Produkte" zu zentrieren, weil ich die Div-Breite nicht im Voraus kenne. Hat jemand eine Lösung?
Update: Das Problem ist, dass ich nicht weiß, wie viele Produkte ich anzeigen werde. Ich kann 1, 2 oder 3 Produkte haben. Ich kann sie zentrieren, wenn es eine feste Zahl ist, da ich die Breite des übergeordneten Produkts kenne div, ich weiß nur nicht, wie ich es machen soll, wenn der Inhalt dynamisch ist.
.product_container {
text-align: center;
height: 150px;
}
.products {
height: 140px;
text-align: center;
margin: 0 auto;
clear: ccc both;
}
.price {
margin: 6px 2px;
width: 137px;
color: #666;
font-size: 14pt;
font-style: normal;
border: 1px solid #CCC;
background-color: #EFEFEF;
}
<div class="product_container">
<div class="products" id="products">
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
<div id="product_15">
<img src="/images/ecommerce/card_default.png">
<div class="price">R$ 0,01</div>
</div>
</div>
</div>
Antworten:
Update 27. Februar 2015: Meine ursprüngliche Antwort wird immer wieder abgestimmt, aber jetzt verwende ich normalerweise stattdessen den Ansatz von @ bobince.
Mein ursprünglicher Beitrag für historische Zwecke:
Vielleicht möchten Sie diesen Ansatz ausprobieren.
Hier ist der passende Stil:
JSFiddle
Die Idee hier ist, dass Sie den Inhalt, den Sie zentrieren möchten, in zwei Divs enthalten, einem äußeren und einem inneren. Sie schweben beide Divs so, dass ihre Breite automatisch an Ihren Inhalt angepasst wird. Als nächstes positionieren Sie das äußere Div relativ mit seiner rechten Kante in der Mitte des Containers. Zuletzt positionieren Sie den inneren Teil relativ in die entgegengesetzte Richtung um die Hälfte seiner eigenen Breite (tatsächlich die Breite des äußeren Teils, aber sie sind gleich). Letztendlich zentriert das den Inhalt in dem Container, in dem er sich befindet.
Sie können am Ende dieses leer div benötigen , wenn Sie die Höhe auf dem „Produkt“ Inhalt der Größe abhängen für die „product_container“.
quelle
overflow:hidden
für.product_container
dasouter-center
div sorgen , überlappen sich andere Inhalte in der Nähe rechts davon. Alle Links oder Schaltflächen rechts vonouter-center
funktionieren nicht. Versuchen Sie die Hintergrundfarbeouter-center
, um die Notwendigkeit zu verstehenoverflow :hidden
. Dies war eine vorgeschlagene Bearbeitung von Cicil ThomasEin Element mit 'display: block' (standardmäßig div) hat eine Breite, die durch die Breite seines Containers bestimmt wird. Sie können die Breite eines Blocks nicht von der Breite seines Inhalts abhängig machen (auf Anpassung verkleinern).
(Mit Ausnahme von Blöcken, die in CSS 2.1 "float: left / right" sind, aber für die Zentrierung nicht geeignet sind.)
Sie können die Eigenschaft 'display' auf 'inline-block' setzen, um einen Block in ein Objekt zu verwandeln, das an die Größe angepasst werden kann. Dies kann durch die Textausrichtungseigenschaft des übergeordneten Objekts gesteuert werden. Die Browserunterstützung ist jedoch unvollständig. Sie können meistens mit Hacks davonkommen (siehe z. B. -moz-inline-stack), wenn Sie diesen Weg gehen möchten.
Der andere Weg sind Tische. Dies kann erforderlich sein, wenn Sie Spalten haben, deren Breite im Voraus nicht bekannt sein kann. Ich kann anhand des Beispielcodes nicht wirklich sagen, was Sie versuchen - es ist nichts Offensichtliches darin, das einen Schrumpfblock benötigt -, aber eine Liste von Produkten könnte möglicherweise als tabellarisch betrachtet werden.
[PS. Verwenden Sie niemals 'pt' für Schriftgrößen im Web. 'px' ist zuverlässiger, wenn Sie wirklich Text mit fester Größe benötigen, andernfalls sind relative Einheiten wie '%' besser. Und "klar: ccc beide" - ein Tippfehler?]
JSFiddle
quelle
display: inline-block
wird in IE7 und älteren Versionen von Firefox nicht unterstütztDie meisten Browser unterstützen die
display: table;
CSS-Regel. Dies ist ein guter Trick, um ein Div in einem Container zu zentrieren, ohne zusätzlichen HTML-Code hinzuzufügen oder einschränkende Stile auf den Container anzuwenden (wietext-align: center;
dies bei allen anderen Inline-Inhalten im Container der Fall wäre), während die dynamische Breite für das enthaltene Div beibehalten wird:HTML:
CSS:
Code-Snippet anzeigen
Update (09.03.2015):
Der richtige Weg, dies heute zu tun, besteht darin, Flexbox-Regeln zu verwenden. Die Browserunterstützung ist etwas eingeschränkter ( CSS-Tabellenunterstützung vs. Flexbox-Unterstützung ), aber diese Methode ermöglicht auch viele andere Dinge und ist eine dedizierte CSS-Regel für diese Art von Verhalten:
HTML:
CSS:
Code-Snippet anzeigen
quelle
display: table;
Variante ist ideal für Pseudoelemente (::before
,::after
), bei denen Sie kein zusätzliches Markup hinzufügen können und Störungen benachbarter Elementstile vermeiden möchten.Sechs Möglichkeiten, diese Katze zu häuten:
Schaltfläche eins: Jeder Typ
display: block
nimmt die volle Breite der Eltern an. (sofern nicht mitfloat
oder einemdisplay: flex
Elternteil kombiniert ). Wahr. Schlechtes Beispiel.Taste 2: Wenn Sie nach "gehen",
display: inline-block
wird die Breite automatisch (und nicht in voller Breite) angezeigt. Sie können dann mittext-align: center
auf dem Verpackungsblock zentrieren . Wahrscheinlich der einfachste und am weitesten kompatible, selbst mit "Vintage" -Browsern ...Taste 3: Sie müssen nichts auf die Verpackung legen. Vielleicht ist dies die eleganteste Lösung. Funktioniert auch vertikal. (Browser-Unterstützung für Transtlate ist heutzutage gut genug (≥IE9) ...).
Übrigens: Auch eine gute Möglichkeit, Blöcke unbekannter Höhe vertikal zu zentrieren (in Verbindung mit der absoluten Positionierung).
Taste 4: Absolute Positionierung. Stellen Sie einfach sicher, dass Sie genügend Höhe im Wrapper reservieren, da dies sonst niemand tun wird (weder Clearfix noch implizit ...).
Schaltfläche 5: float (wodurch auch Elemente auf Blockebene auf dynamische Breite gebracht werden) und eine relative Verschiebung. Obwohl ich das noch nie in freier Wildbahn gesehen habe. Vielleicht gibt es Nachteile ...
Update: Button 6: Und heutzutage können Sie auch Flex-Box verwenden. Beachten Sie, dass Stile für den Wrapper des zentrierten Objekts gelten.
→ vollständiger Quellcode (Stiftsyntax)
quelle
Ich fand eine elegantere Lösung, indem ich "Inline-Block" kombinierte, um die Verwendung von Float und Hacky Clear zu vermeiden: beides. Es erfordert immer noch verschachtelte Divs tho, was nicht sehr semantisch ist, aber es funktioniert einfach ...
Ich hoffe es hilft!
quelle
Wenn das Zielelement absolut positioniert ist, können Sie es zentrieren, indem Sie es zu 50% in eine Richtung bewegen (
left: 50%
) und dann zu 50% in die entgegengesetzte Richtung transformieren (transform:translateX(-50%)
). Dies funktioniert ohne Definition der Breite des Zielelements (oder mitwidth:auto
). Die Position des übergeordneten Elements kann statisch, absolut, relativ oder fest sein.quelle
Standardmäßig werden
div
Elemente als Blockelemente angezeigt, sodass sie eine Breite von 100% haben, sodass das Zentrieren bedeutungslos ist. Wie von Arief vorgeschlagen, müssen Sie a angebenwidth
und können es dannauto
beim Angeben verwenden,margin
um a zu zentrierendiv
.Alternativ könnten Sie auch erzwingen
display: inline
, aber dann hätten Sie etwas, das sich so ziemlich wie einspan
statt wie ein verhältdiv
, so dass das nicht viel Sinn macht.quelle
Dadurch wird ein Element wie eine geordnete Liste oder eine ungeordnete Liste oder ein beliebiges Element zentriert. Wickeln Sie es einfach mit einem Div in die Klasse von OuterElement ein und geben Sie dem inneren Element die Klasse von InnerElement.
Die Outerelement-Klasse berücksichtigt IE, alten Mozilla und die meisten neueren Browser.
quelle
Verwenden Sie die CSS3-Flexbox mit Rechtfertigungsinhalt: Mitte;
quelle
Leichte Variation der Antwort von Mike M. Lin
Wenn Sie hinzufügen
overflow: auto;
(oderhidden
)div.product_container
, dann brauchen Sie nichtdiv.clear
.Dies leitet sich aus diesem Artikel ab -> http://www.quirksmode.org/css/clearing.html
Hier ist modifiziertes HTML:
Und hier ist modifiziertes CSS:
Der Grund, warum es ohne besser ist
div.clear
(abgesehen davon, dass es sich falsch anfühlt, ein leeres Element zu haben), ist die übereifrige Margenzuweisung von Firefox.Wenn Sie zum Beispiel dieses HTML haben:
In Firefox (8.0 zum Zeitpunkt des Schreibens) sehen Sie zuvor den
11px
Rand . Schlimmer ist, dass Sie eine vertikale Bildlaufleiste für die gesamte Seite erhalten, auch wenn der Inhalt gut in die Bildschirmabmessungen passt.product_container
quelle
Probieren Sie dieses neue CSS und Markup aus
Hier ist modifiziertes HTML:
Und hier ist modifiziertes CSS:
quelle
Wenn Sie für ".product_container" kein "overflow: hidden" angeben, überlappt das Div "Außenmitte" andere Inhalte in der Nähe rechts davon. Alle Links oder Schaltflächen rechts von "Außenmitte" funktionieren nicht. Versuchen Sie die Hintergrundfarbe für "äußere Mitte", um die Notwendigkeit von "Überlauf: versteckt" zu verstehen.
quelle
Ich fand eine interessante Lösung, ich machte einen Schieberegler und musste die Schieberegler zentrieren, und ich tat dies und funktionierte einwandfrei. Sie können dem Elternteil auch eine relative Position hinzufügen und die untergeordnete Position vertikal verschieben. Schauen Sie sich http://jsfiddle.net/bergb/6DvJz/ an.
CSS:
HTML:
quelle
Tun
display:table;
und einstellenmargin
aufauto
Wichtiges Codebit:
Egal wie viele Elemente Sie jetzt haben, es wird automatisch in der Mitte ausgerichtet
Beispiel im Code-Snippet:
Code-Snippet anzeigen
quelle
Ich fürchte, der einzige Weg, dies zu tun, ohne die Breite explizit anzugeben, ist die Verwendung von (keuchenden) Tabellen.
quelle
Crappy Fix, aber es funktioniert ...
CSS:
HTML:
quelle
Einfache Korrektur, die in alten Browsern funktioniert (verwendet jedoch Tabellen und erfordert das Festlegen einer Höhe):
quelle
}}
Verwenden Sie die Spanne anstelle der inneren Divs
quelle
Ich weiß, dass diese Frage alt ist, aber ich mache einen Sprung drauf. Sehr ähnlich zu Bobince's Antwort, aber mit funktionierendem Codebeispiel.
Machen Sie jedes Produkt zu einem Inline-Block. Zentrieren Sie den Inhalt des Behälters. Getan.
http://jsfiddle.net/rgbk/6Z2Re/
Siehe auch: Inline-Blöcke mit dynamischer Breite in CSS zentrieren
quelle
Dies ist eine Möglichkeit, alles innerhalb eines Div zu zentrieren, ohne die innere Breite der Elemente zu kennen.
quelle
Meine Lösung war:
quelle
Fügen Sie diese CSS zu Ihrer product_container-Klasse hinzu
quelle