Wenn Sie die genaue Breite/Höhe eines Elements kennen, können Sie es mit diesem klassischen Trick ganz einfach genau in der Mitte seines Elternelements zentrieren: top und left auf 50% und negative Ränder, die der Hälfte der Breite und Höhe des Elements entsprechen. Das ist großartig, wenn Sie die Breite und Höhe des Elements kennen, das Sie zentrieren möchten, aber was ist, wenn es sich um Prozentsätze handelt?
Man würde denken, man könnte einfach negative Prozent-Ränder verwenden. Das funktioniert für horizontale Ränder, aber Ränder basieren auf der Breite (auch vertikale Ränder), daher funktioniert es nicht, wenn man versucht, einen negativen oberen Rand zu verwenden, um Dinge in Position zu ziehen.
Es gibt einen kleinen Trick mit einem "Ghost"-Pseudo-Element und inline-block/vertical-align, der ziemlich clever ist. Aber das erfordert, dass das zu zentrierende Element inline-block ist, und das ist kein sehr häufiges Szenario. Wahrscheinlicher ist, dass Sie versuchen, etwas wie ein modales Fenster genau in der Mitte zu zentrieren. Und da kleine Bildschirme / responsives Design ein großes Geschäft sind, ist es sehr wahrscheinlich, dass Sie möchten, dass Ihr Dialogfeld eine prozentuale Breite hat (oder ansonsten unbekannt ist, wie z. B. nur eine max-width).
Es gibt einen Weg! Ich habe diesen Trick von Mary Lou bei Codrops gesehen und ihr Artikel/Demo Nifty Modal Window Effects.
Anstatt negative Ränder zu verwenden, verwenden Sie negative translate() Transforms.
.center {
position: absolute;
left: 50%;
top: 50%;
/*
Nope =(
margin-left: -25%;
margin-top: -25%;
*/
/*
Yep!
*/
transform: translate(-50%, -50%);
/*
Not even necessary really.
e.g. Height could be left out!
*/
width: 40%;
height: 50%;
}
Verwenden Sie heutzutage, was immer Sie an Präfixen benötigen.
Da haben wir es dann
Check out this Pen!
Schöner Trick, das wird hilfreich sein, ich habe immer "Probleme", welchen Ansatz ich für die vertikale Zentrierung verwenden soll.
Mehr nützlich für echte vertikale Ausrichtung.
Anständige Unterstützung, muss beim Benutzen getestet werden, aber definitiv schön!
Falls Sie sich fragen – http://caniuse.com/transforms3d
Tatsächlich ist die Unterstützung besser, als Sie denken, denn das ist nur ein 2D-Transform.
http://caniuse.com/transforms2d
Und hier sind einige Polyfills für die anderen Browser
https://github.com/Modernizr/Modernizr/wiki/HTML5-Cross-browser-Polyfills#css-effects-modules
Das ist keine 3D-Transformation.
-> http://caniuse.com/transforms2d
Die Unterstützung für 2D-Transforms ist etwas besser.
Das ist eine 2D-Transformation ... http://caniuse.com/transforms2d
Mein Fehler, Entschuldigung!
Danke, Leute! Ich habe schnell nach 'caniuse transform' gegoogelt und das kam dabei heraus. Tatsächlich eine viel bessere Unterstützung, als ich dachte.
Das ist wirklich großartig! Tolle Lösung! Danke fürs Teilen!
Das ist ein sehr schöner Trick!
Dein Bart ist HEISS.
Apropos Codrops, diese Seite ist cool, viele nette UI-Demos, irgendwann ist es nur Mist, dass IE bei CSS3 hinterherhinkt
Man kann auch eine Kombination aus rechts+links oder oben+unten verwenden, um ein absolut mit Prozent definiertes Element ohne Transform zu zentrieren
http://codepen.io/anon/pen/bKuxJ
Dies unterscheidet sich geringfügig in der Art und Weise, wie es gemessen wird, aber es ergibt dasselbe Ergebnis wie Ihr Beispiel, wenn border-box angewendet würde.
Ja zu dieser Lösung. Ich wollte das posten, aber ich sah, dass jemand anderes mir zuvorkam. Für diejenigen, die zu faul sind, zum Codepen zu springen
Breite und Höhe unabhängig, vollständig skalierbar, perfekt zentriert.
Das ist auch großartig, wahrscheinlich mit etwas höherer Unterstützung. Aber beachten Sie, dass die Verwendung von rechts und unten zusammen mit oben und links eine Breite und Höhe impliziert, obwohl Sie keine Breite und Höhe verwenden.
Die Transform-Methode (trotz des Beispiels im Artikel und des Titels des Artikels) funktioniert, ohne die Breite/Höhe kennen zu müssen.
Hier mit komplett erweiterbarer Breite und Höhe: http://codepen.io/chriscoyier/pen/Lgaij (versuchen Sie, darauf zu klicken und den Text zu bearbeiten).
Hat jemand versucht, dies auf dem iPad zu öffnen? Etwas Seltsames passiert und der Container fällt vom Bildschirm!
Es wäre schön, wenn wir einen ähnlichen Ansatz für Elemente mit nicht fester Breite/Höhe finden könnten.
Probieren Sie es aus... diese Lösung funktioniert perfekt für dieses Problem!
http://cdpn.io/cmFaj
Das ist neu für mich!
Sie können dies nicht nur auf prozentual dimensionierte Elemente anwenden, sondern auch auf Elemente mit automatischer Breite und Höhe! Das ist *wirklich* gut!
Schade, dass man dafür IE8-Unterstützung aufgeben muss...
Schreckliche Unterstützung für IE. Was für ein Schock... :)
SEHR süß. Das funktioniert auch für automatische Höhe und Breite.
Nicht schlecht, nicht schlecht.
Ich bevorzuge die "TRBL"-Methode
Ich benutze sie ständig und sie funktioniert bis IE8.
Das ist auch ziemlich nett, wusste ich nicht.
(Aber ich nehme an, es funktioniert nur, wenn Breite und Höhe explizit angegeben sind, und nicht für auto?)
@ChrisB
Diese Methode benötigt überhaupt keine explizite Breite und Höhe. Sie können machen
Und es funktioniert einwandfrei. Siehe diesen Pen, den Ben ein paar Kommentare weiter oben gepostet hat.
Ich denke, der große Unterschied zwischen den beiden hier vorgestellten Lösungen liegt im *Layout* der Inhaltsbox. Überprüfen Sie die Hintergrundfarbe der Box mit dem Transform-2D-Ansatz und ohne Breite/Höhe. Sie wird nicht so groß angezeigt wie bei der TRBL-Technik (die übrigens auch in IE7 funktionieren sollte).
Es ist auch möglich, ein Element vertikal zu zentrieren, selbst ohne seine Abmessungen zu kennen, mit einer Kombination aus line-height, display inline-block und der neuen vh CSS-Einheit: http://codepen.io/anon/full/mkFDK
(funktioniert leider nicht in IE)
OMG, das ist der Hammer... es scheint sogar mit height:auto zu funktionieren
Hallo Cris –
Dein letzter Beitrag [Centering Percentage Width/Height Elements] war absolut großartig. Ich habe deine Sachen bereits in meinen Feedly-Account aufgenommen. Bitte halte mich auf dem Laufenden, wenn du woanders postest.
Mach weiter so –
Jon
Ich stimme zu, das ist sehr cool
Sehr nett. Warum funktioniert es nicht in jsfiddle
http://jsfiddle.net/fizerkhan/BFqA2/
Sie müssen das Transform präfixen. Ich habe -prefix-free in CodePen aktiviert.
Schöner Trick; ich habe jedoch einige Probleme beim Testen festgestellt. Tatsächlich scheint es in Chrome Probleme mit Transforms und Borders zu geben. Abhängig von der Parität von Breite/Höhe.
Wenn eine der Dimensionen ungerade ist, ist ihr 50%-Wert keine Ganzzahl und der Rand ist in einigen Fällen unscharf oder hat in anderen eine Verschiebung.
Hier ist ein Fork deines Pens, der das Problem veranschaulicht. Versuchen Sie, die Größe des Fensters zu ändern, um die Verschiebung in Chrome zu sehen.
Matt, während das ein seltsames Problem ist, kann man es beheben, indem man background-clip: padding-box hinzufügt. Hier ist mein Fork von dir.
Schöner Tipp, sehr nützlich.
Danke! Danke! Danke! Das ist genau das, was ich letzte Woche mit zwei Projekten zu erreichen versucht habe. Wie oben erwähnt, funktioniert es sogar mit height:auto, sodass ich das Bild nicht mehr verzerren muss.
Großartige Lösung, danke! :)
Bens Technik oben erweitert, um überlaufenden Inhalt einzuschließen
http://codepen.io/jacmaes/full/EFLjG
Danke Chris, dass du mir einen weiteren CSS-Trick verraten hast, vorher habe ich relative Positionierung verwendet, um mein absolutes Div zu zentrieren
.s3-relative{ position:relative; width:100%; height:100%; } .s3-absolute{ position:absolute; top:0; right:0; bottom:0; left:0; width:50%; height:50%; margin:auto; }Bitte schlage vor, welches besser ist
http://codepen.io/Shaz3e/pen/zaFbx
Großartig... Danke fürs Teilen dieses praktischen Tipps...
Deshalb lese ich diesen Blog so gerne!! Toller CSS-Trick
Wir können dies für vertikale und horizontale Zentrierung verwenden.
.center{width:500px;
height:500px;
display:table-cell;
vertical-align:middle;
text-align:center;
}
Tatsächlich, wenn Sie die Breite und Höhe des Elements haben, ist der einfachste Weg, negative Ränder zu verwenden, wie folgt: <br/>
.center {<br/>
width: 300px;<br/>
height: 300px;<br/>
top: 50%;<br/>
left: 50%;
margin-left: -150px;<br/>
margin-top: -150px;<br/>
}
Ich fand diesen Artikel sehr gut
Wenn Sie unbedingt und unter allen Umständen Legacy-Browser unterstützen müssen, dürfen wir die JavaScript-Lösung (mit jQuery) nicht vergessen
Demo
Für so etwas jQuery zu verwenden ist einfach ein riesiger Overkill... :-(
Damit das funktioniert, musste ich + ‘px’ zu beiden Rändern hinzufügen.
@LorDex Da ich jQuery in meinem gesamten Projekt verwende, halte ich das nicht für übertrieben.
hilfreich in responsiven Websites.
Ich bin letzte Woche genau auf dieses Problem mit den Nifty Modals gestoßen (http://tympanus.net/Development/ModalWindowEffects/)! Ich fand es wirklich cool, aber eine negative Nebenwirkung, die wir in einigen Browsern (Firefox tat dies am häufigsten) bemerkten, ist, dass es eine Glättung verwendet, um dieses Transform durchzuführen, und wenn Sie etwas Komplexes im Modal haben (in unserem Fall ein ExtJS-Grid und einige andere Komponenten), verursacht dies alle Arten von seltsamen Problemen mit der Scrollleiste und führt zu einem seltsamen Antialiasing-Look auf allem. Ich musste stattdessen den negativen Margin-Trick verwenden, damit es funktioniert.
Cool. Dies hat mir auch geholfen, ein Element mit width: auto zwischen einem festen Breite und einem anderen Element mit width: auto zu zentrieren.
Die Verwendung von display: block und margin: 0 auto funktioniert oft auch gut.
Ja, aber das zentriert nicht vertikal.
Ich suche seit Tagen nach der vertikalen Ausrichtung für responsive Divs oder Bilder, die auch in IE-Browsern funktionieren würde. Schließlich habe ich es selbst experimentiert und bin zu folgendem Ergebnis gekommen, das bisher am besten zu funktionieren scheint, ohne zusätzliche Hacks mit CSS3 :after oder translate()-Eigenschaften... Lassen Sie mich wissen, ob es für Sie auch funktioniert, ziemlich geradlinig
Der Rand des Divs wird quasi zu seinem vertikalen Zentrierungsmittel.
Darauf habe ich lange gewartet...
Kann es kaum erwarten, es auszuprobieren!
Tx.
Schöner Trick, er ist hilfreich für mich.
Was ist mit Flexbox?
(Dies unter der Annahme, dass das zu zentrierende Element das einzige im Dokument ist, ansonsten könnte HTML .container oder etwas anderes sein.)
Offensichtlich mit Präfixen wie -webkit-box usw.
Toller Trick – habe jedoch Probleme in Safari. Werde einige der in den Kommentaren aufgeführten Lösungen ausprobieren. Danke fürs Teilen!
Das ist wahrscheinlich die beste rein CSS-basierte Methode, um ein Element mit unbekannter Höhe vertikal zu zentrieren. Schöner Trick. In Chrome sehe ich einige Probleme mit der Schriftwiedergabe. Vielleicht, was @Nathan St. Pierre erwähnte. Anscheinend macht Chrome den Textinhalt des Elements mit transform: translate(-50%,-50%). Ich habe es auf einem iPhone 5 angesehen und der Text ist scharf.
Das verbleibende Problem, das ich habe, ist, wenn das Element, das mit dieser Methode vertikal zentriert wird, höher ist als das Fenster, wie z. B. bei der Anzeige im Querformat auf einem Handy, dann ist die Oberseite des Elements außerhalb des Bildschirms. Ich benutze also immer noch eine Methode wie die von @Yotam erwähnte, um vertikal zu zentrieren, nur wenn die Fensterhöhe größer ist als die Elementhöhe.
Ich meinte eigentlich, dass Chrome den Textinhalt des Elements mit
transform: translate(-50%,-50%)unscharf macht. Scheint ein seltsamer Bug zu sein. Habe das noch nie gesehen.Das treibt mich in den Wahnsinn
Das ist ein Codepen aus diesem Artikel mit reduzierten Stilelementen: Screenshot 1.
Und das ist derselbe Code, der in meinen Codepen übernommen, gespeichert (mit Firefox) und dann in Chrome geöffnet wurde: Screenshot 2.
Dasselbe passiert mit meinem Modal auf meiner Website...
Wie Sie sehen, ist der Code in beiden Beispielen derselbe. Warum????!!!
Gelöst
Webkit-Zeile hinzufügen:
-webkit-transform: translate(-50%, -50%);Es ist wahrscheinlich, dass die -prefix-free-Option in den CSS-Optionen des ersten Beispiels aktiviert ist.
Mit dieser Lösung sieht das zentrierte Div in Google Chrome 31 sehr unscharf aus.
Einige mobile Browser (Android 2.x) können translate() nicht mit Prozentwerten verwenden.
Das funktioniert also großartig, außer in dem Szenario, in dem man ein Bild hat, es auf 100% Höhe setzt (was dazu führt, dass die Breite *breiter* als 100% des Containers ist). Irgendwelche Ideen, wie man ein Bild zentriert, das > 100% wird?
CSS
Hier ist ein Codepen: http://codepen.io/napawapa/pen/soeGz mit meinem Beispiel mit dem Bild.
Oh mein Gott, du bist ein GROSSER Held für mich! Das ist SO CLEVER!
Tolle Korrektur, danke!
Ich konnte auf einigen Texten keine Zentrierung über einem Bild erreichen, während ich Skeleton.css verwendete. Das responsive Design bedeutete, dass alle Boxen gleich groß sein mussten oder einzeln korrigiert werden mussten, um sich auf die Spaltenanzahl zu beziehen. Dies war viel einfacher, wäre für responsive Seiten zu empfehlen.
Toller Beitrag!
Einige Erinnerungen für diejenigen, die feststecken, wie ich vor 10 Minuten
Verwenden Sie position:fixed anstelle von position:absolute, wenn Sie auf Ihrer Seite scrollen.
Danke! Ich habe so lange nach einer Lösung dafür gesucht. Du bist der Hammer.
Oh Gott sei Dank, endlich hatte jemand eine andere Idee als "Tabellen" oder "Ghost Element". Diese funktionieren nicht mit den Einschränkungen, die ich für mein Projekt berücksichtigen muss! - /Dieser/ Ansatz funktioniert perfekt, vielen Dank!
Danke, nette Tricks.
Ich sehe nicht, wie das zentriert ist... funktioniert anscheinend nicht mehr.
Verwende Firefox 29 und Chrome 34
Es funktioniert in beiden Browsern einwandfrei (die Demo auf dieser Website selbst). Erstellen Sie einen Pen mit Ihrer "nicht funktionierenden" Situation und posten Sie ihn, wenn Sie Probleme haben.
Bis dahin begraben wir das. Wir werden es wieder ausgraben, wenn wir ein echtes Problem entdecken.
.center{
position: absolute;
height: 50px;
width: 50px;
background:red;
top:calc(50% – 50px/2); /* 50% – height/2 /
left:calc(50% – 50px/2); / 50% – width/2 */
}
Beachten Sie, dass calc() in IE8 nicht unterstützt wirdENDLICH!! Du verdammter GENIE hast es geschafft!
danke!!