Warum funktioniert top:50% in CSS nicht?

Lesezeit: 8 Minuten

Benutzer-Avatar
Schwalbenfloh

Ich mache eine Website und versuche, vertikal zu zentrieren:

 position: absolute;
 width:1200px;
 height:600px;
 top: 50%;
 left: 50%;
 margin-left: -600px;

und mein HTML ist ein einziges div

  • Tun left: 50%; und dann margin-left: -600px; macht nicht viel Sinn, da Sie nur das eine mit dem anderen aufheben.

    – Jared Farrish

    19. März 2012 um 5:55 Uhr

  • swenflea: Ich habe meine Frage mit Informationen zu den übergeordneten Elementen bearbeitet position Wirkung.

    – Jared Farrish

    19. März 2012 um 6:19 Uhr


  • Können Sie die Frage konkreter machen? Möchten Sie, dass Ihr DIV in der Mitte der Seite steht? Ich meine genau in der Mitte….?

    – Vijay Sarin

    19. März 2012 um 6:30 Uhr

  • @JaredFarrish Es hält das div genau in der Mitte, aber ich bevorzuge die Verwendung von width:calc(50% – 600px)

    – Maarten Wolfsen

    20. September 2016 um 8:38 Uhr

  • @Swenflea, hast du es in den letzten sieben Jahren geschafft, das zu beheben? Wenn ja, waren die bereitgestellten Antworten gut? Wenn nicht, könntest du bitte deine Lösung posten?

    – gesund

    28. November 2019 um 16:48 Uhr

Benutzer-Avatar
w3debugger

Verwenden von Position – Statische Höhe erforderlich

i{
  -webkit-transform: translate(-50%,-50%);
  transform: translate(-50%,-50%);
  position: absolute;
  top: 50%;
  left: 50%;
}
<i>center</i>

Bearbeiten: Flex verwenden (2021-10-19)

i {
  display: flex;
  align-items: center; /* vertical centering if flex-direction: row */
  justify-content: center; /* horizontal centering if flex-direction: row */

  /* extra styles */
  background-color: limeGreen;
  min-height: 160px;
}
<i>center</i>
enter code here

  • das ist IMO die beste Lösung.

    – Kevin

    6. Januar 2017 um 19:40 Uhr

  • Danke! Das suche ich schon ewig!

    – Michael

    4. März 2017 um 4:15 Uhr

  • Dies wird nicht funktionieren, wenn Ihr Elternteil keine statische Größe hat, es sei denn, Sie haben eine height: 100%; sowohl auf Ihrem HTML als auch auf Ihrem Körper. Sie können meine Antwort unten überprüfen, wenn Sie weitere Informationen benötigen. Außerdem brauchen Sie in manchen Situationen keine absolute Position. Das kann mit Witz funktionieren position: relative; für diejenigen, die besorgt sind, sich für diese Lösung zu entscheiden, die eine Positionsbeziehung zu anderen Elementen aufrechterhalten müssen. Obwohl ein anderer Positionswert als position: static; ist erforderlich für die top und left arbeiten. (oder auch bottom, rightoderz-index)

    – Jomar Sevillajo

    29. Oktober 2017 um 0:24 Uhr


  • @JomarSevillejo Das ist eine andere Technik. Ich habe nur die Antwort gegeben, indem ich seinen aktuellen Code mitteilte. Es kann geben flexbox/table-cell/line-height/ oder irgendetwas anderes, aber warum versuchen wir, diesen Typen seinen Code umschreiben zu lassen? 🙂

    – w3debugger

    29. Oktober 2017 um 12:30 Uhr

  • @w3debugger Ich zwinge die Person nicht, ihre Antwort zu ändern. Bitte nicht als Beleidigung auffassen. Ich habe einfach alle davor gewarnt, dass diese Methode, die Sie gezeigt haben, eine statische Höhe erfordert, wenn Sie dies mit pposition verwenden: relative; auf Eltern. prntscr.com/h3pbpf Die meiste Zeit verwenden wir position:relative; on parent, um absolute Elemente zu steuern. und FYI die Frage ist “WARUM TOP:50%; FUNKTIONIERT NICHT” also was ist falsch daran zu antworten “DU BRAUCHST EINE HÖHE IN DEINEN ELTERN”?

    – Jomar Sevillajo

    30. Oktober 2017 um 1:52 Uhr

Benutzer-Avatar
Jomar Sevillajo

Um deine Frage zu beantworten warum top: 50% funktioniert nicht, wenn Sie Eigentum verwenden top Bei einem Element muss für das übergeordnete Element dieses Elements eine statische Höhe festgelegt werden. Das sollte drin sein px oder eine andere Einheit als Prozent. Wenn Sie wirklich auch Prozent in Ihrem Elternteil verwenden müssen, können Sie zum nächsten Elternteil (das das Elternteil dieses Elternteils ist) übergehen und diesem eine feste statische Höhe geben.

Alles vertikal zentrieren. Ich bevorzuge diese Methode

Die Verwendung von CSS transform da Sie nicht wissen müssen, welche Breite oder Höhe Ihr Element hat.

position: relative;
top: 50%;
left: 50%;
-webkit-transform: translate(-50%, -50%);
-moz-transform: translate(-50%, -50%);
-ms-transform: translate(-50%, -50%);
-o-transform: translate(-50%, -50%);
transform: translate(-50%, -50%);

Vergessen Sie nicht, Browser-/Anbieterpräfixe hinzuzufügen.

Sie können sich hier auf Herstellerpräfixe beziehen.


Wenn Sie die Größe Ihrer Eltern nicht kennen. Sie haben zwei Möglichkeiten:

  1. Verwenden Sie JavaScript, nehmen Sie die natürliche Höhe des übergeordneten Elements und setzen Sie dann die Eigenschaft height dieses übergeordneten Elements auf den Wert, den Sie gerade genommen haben. Sie können diese Methode verwenden, wenn die Höhe des übergeordneten Elements durch ein anderes untergeordnetes Element verursacht wird, das dem Element, das Sie zentrieren, gleichgeordnet ist.
$('.parent').height( $(this).height() );
.parent {
  /* Unkown height */
}

.child {
  /* Create columns */
  width: 50%;
  float: left;
}

.child-1 {
  position: relative;
  top: 50%;
  text-align: center;
  -webkit-transform: translateY(-50%);
  -moz-transform: translateY(-50%);
  -ms-transform: translateY(-50%);
  -o-transform: translateY(-50%);
  transform: translateY(-50%);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<!-- Example Start -->
<div class="parent">
  <div class="child child-1">
    Lorem ipsum
  </div>  
  <div class="child child-2">
    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
  </div>
</div>

Tipp: Wenn Sie Responsive in Betracht ziehen, legen Sie die Höhe einfach erneut in JavaScript fest, wenn Sie die Größe des Browsers ändern. Sie können die neue natürliche Höhe erhalten, indem Sie die Höhe in JavaScript auf automatisch setzen und den Vorgang wiederholen.

  1. Sie können die obigen Ideen abkratzen und die Zentrierung mit verwenden display: table stattdessen. CSS-Tricks hat hier ein sehr gutes Beispiel.

  • “Wenn Sie die Eigenschaft oben auf einem Element verwenden, muss für das übergeordnete Element dieses Elements eine statische Höhe festgelegt werden” – Dies war die Antwort auf die Frage. Ich habe mein Problem in Safari gelöst.

    – codecribblr

    17. März 2017 um 17:05 Uhr

  • RE: “Für das übergeordnete Element dieses Elements muss eine statische Höhe festgelegt werden.” Hinweis 1: HTML und Body können beide als Eltern angesehen werden, wenn es kein Eltern-Div gibt. Hinweis 2: Ein % funktioniert auch. Zum Beispiel enthält amp.css die Zeile: html,body{height: auto !important;} Dies kann dazu führen, dass Anzeigen enthauptet werden, wenn Sie Ihre eigene remote.html/frame.max.amp.html rollen, es sei denn, Sie fügen diese CSS darin ein: html,body{height:100% !important;} Dadurch können die top:50% funktionieren.

    – Brian Laie

    21. März 2017 um 23:31 Uhr


Benutzer-Avatar
kba

Die CSS-Eigenschaft top funktioniert genau so left. Es schiebt das div aus dieser Richtung. Wenn du schreibst top:50%das div wird um 50 % von oben nach unten gedrückt. Sie möchten, dass es vertikal zentriert ist, also müssen Sie dem entgegenwirken zieht es wieder hoch. Dies kann mit erfolgen margin-top: -300px so wie du es gewohnt bist margin-left: -600px zu ziehen Sie es nach links.

position: absolute;
width: 1200px;
height: 600px;
top: 50%;
margin-top: -300px;
left: 50%;
margin-left: -600px;

  • Dies funktioniert für Elemente mit fester Höhe. Verwenden Sie dies für variable Höhen.

    – Lukas

    30. August 2016 um 16:45 Uhr

top:50%; funktioniert gut, aber “zentriert” das Element nicht, es platziert seine Oberkante 50% der Seitenhöhe von oben. Ähnlich wie du es hast margin-left:-600px; sollten Sie auch hinzufügen margin-top:-300px;

Sie können verwenden

calc(%50 - (items_height/2));

zum Zentrum.

  • Ich hätte dieser Aussage mehr Kontext hinzugefügt, aber das war es, was ich vorschlagen wollte.

    – Tgwizman

    19. Juni 2019 um 20:10 Uhr

  • Beachten Sie, dass es 50 % statt %50 sein sollte. Und vergessen Sie nicht, nach dem zweiten Wert “px” hinzuzufügen. Das Format sollte etwa so sein calc(50% - 5px);. Das wird zum Beispiel nicht funktionieren: calc(50% - (10/2)px);

    – infografnet

    24. Juli um 17:25 Uhr


Ich glaube, dies könnte die Antwort von Kristian etwas nachahmen, aber hier sind meine zwei Cent, die die Verwendung von Prozentsätzen beinhalten und auch eine in der anderen demonstrieren:

#parent {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 120px;
    height: 60px;
    margin: -60px 0 0 -30px;
    background: blue;
}
#center {
    position: absolute;
    width: 50%;
    height: 50%;
    top: 50%;
    left: 50%;
    margin: -12.5% 0 0 -25%;
    background: green;
}

http://jsfiddle.net/userdude/MYD27/

BEARBEITEN

Wenn Sie es weiter betrachten, denke ich, dass Sie auf Probleme stoßen könnten, wenn Sie versuchen, dies mit einem Element zu tun, das kein Container innerhalb eines positionierten Elements ist. Zum Beispiel:

Vollansicht | Codeansicht

Ich glaube nicht, dass es so funktioniert, wie Sie es beabsichtigt haben. Wenn ich hinzufüge position: relative (oder alternativ position: absolute), es funktioniert, denke ich, wie Sie es beabsichtigt haben:

Vollansicht | Codeansicht

  • Ich hätte dieser Aussage mehr Kontext hinzugefügt, aber das war es, was ich vorschlagen wollte.

    – Tgwizman

    19. Juni 2019 um 20:10 Uhr

  • Beachten Sie, dass es 50 % statt %50 sein sollte. Und vergessen Sie nicht, nach dem zweiten Wert “px” hinzuzufügen. Das Format sollte etwa so sein calc(50% - 5px);. Das wird zum Beispiel nicht funktionieren: calc(50% - (10/2)px);

    – infografnet

    24. Juli um 17:25 Uhr


Benutzer-Avatar
Gemeinschaft

Ich möchte diese Gelegenheit nutzen, um für meine Antwort auf eine andere Frage hier auf SO offen Werbung zu machen 🙂

Davon abgesehen wird die CSS-Eigenschaft „top“ basierend auf der Höhe des Containerelements korrekt berechnet – wodurch das Zielelement effektiv unterhalb der Mittellinie gerendert wird. Dies bedeutet, dass das Element auf halbem Weg nach oben geschoben werden muss, wie in der verknüpften Frage erläutert.

Leider kann eine so scheinbar einfache Aufgabe nicht durch Anpassen des oberen Rands usw. ohne die Verwendung absoluter pixelbasierter Werte (+1 für Christian Antonsen‘s answer) – man könnte sich vorstellen, dass das Setzen von margin-top auf “-50%” genau das bedeuten würde, aber laut CSS-Spezifikation werden Margin-Werte sogar auf der vertikalen Achse als berechnet ein Prozentsatz immer relativ zur Breite des umgebenden Blocks

1098760cookie-checkWarum funktioniert top:50% in CSS nicht?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy