Hoe kan ik elementen in een div verticaal uitlijnen?

Ik heb een divmet twee afbeeldingen en een H1. Ze moeten allemaal verticaal worden uitgelijnd binnen de div, naast elkaar.

Een van de afbeeldingen moet absolutezijn binnen de div.

Wat is de CSS die nodig is om dit in alle gangbare browsers te laten werken?

<div id="header">
  <img src=".." ></img>
  <h1>testing...</h1>
  <img src="..."></img>
</div>

Antwoord 1, autoriteit 100%

Wauw, dit probleem is populair. Het is gebaseerd op een misverstand in de eigenschap vertical-align. Dit uitstekende artikel legt het uit:

Inzicht in vertical-align, of “Hoe (niet) Inhoud verticaal centreren”door Gavin Kistner.

“Hoe te centreren in CSS”is een geweldige webtool die helpt bij het vinden de benodigde CSS-centreerattributen voor verschillende situaties.


In een notendop (en om linkrot te voorkomen):

  • Inline-elementen(en alleeninline-elementen) kunnen verticaal in hun context worden uitgelijnd via vertical-align: middle. De ‘context’ is echter niet de volledige hoogte van de bovenliggende container, maar de hoogte van de tekstregel waarin ze zich bevinden. jsfiddle voorbeeld
  • Voor blokelementen is verticale uitlijning moeilijker en sterk afhankelijk van de specifieke situatie:
    • Als het binnenste element een vaste hoogtekan hebben, kun je zijn positie absolutemaken en de height, margin-topen toppositie. jsfiddle-voorbeeld
    • Als het gecentreerde element bestaat uit een enkele regelende bovenliggende hoogte is vast, dan kun je eenvoudig de line-heightom de hoogte te vullen. Deze methode is vrij veelzijdig in mijn ervaring. jsfiddle-voorbeeld
    • … er zijn meer van zulke speciale gevallen.

Antwoord 2, autoriteit 27%

Nu de ondersteuning van Flexbox toeneemt, zou deze CSS toegepast op het bevattende element het ingesloten item verticaal centreren:

.container {
    display: flex;
    align-items: center;
}

Gebruik de versie met prefix als u ook Internet Explorer 10wilt targeten, en oudere (< 4.4(KitKat)) Android-browsers:

.container {
    display: -ms-flexbox;
      display: -webkit-flex;
    display: flex;
       -ms-flex-align: center;
    -webkit-align-items: center;
       -webkit-box-align: center;
       align-items: center;
}

Antwoord 3, autoriteit 12%

Ik heb deze zeer eenvoudige code gebruikt:

HTML:

<div class="ext-box">
    <div class="int-box">
        <h2>Some txt</h2>
        <p>bla bla bla</p>
    </div>
</div>

CSS:

div.ext-box { display: table; width:100%;}
div.int-box { display: table-cell; vertical-align: middle; }

Het resultaat verandert natuurlijk niet, of je nu een .classof een #idgebruikt.


Antwoord 4, autoriteit 8%

.outer {
   display: flex;
   align-items: center; 
   justify-content: center;
 }

Antwoord 5, autoriteit 5%

Het werkte voor mij:

.vcontainer {
    min-height: 10em;
    display: table-cell;
    vertical-align: middle;
}

Antwoord 6, autoriteit 3%

Een techniek van een vriend van mij:

HTML:

<div style="height:100px; border:1px solid;">
    <p style="border:1px dotted;">I'm vertically centered.</p>
</div>

CSS:

div:before {content:" "; display:inline-block; height:100%; vertical-align:middle;}
div p {display:inline-block;}

DEMOhier


Antwoord 7, autoriteit 2%

Verticaal en horizontaal element uitlijnen

Gebruik een van beide. Het resultaat zou hetzelfde zijn:

  1. Bootstrap 4
  2. CSS3

1. Bootstrap 4.3+

Voor verticale uitlijning: d-flex align-items-center

Voor horizontale uitlijning: d-flex justify-content-center

Voor verticale en horizontale uitlijning: d-flex align-items-center justify-content-center

.container {
    height: 180px;
    width:100%;
    background-color: blueviolet;
}
.container > div {
  background-color: white;
  padding: 1rem;
}
<link href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css"
rel="stylesheet"/>
<div class="d-flex align-items-center justify-content-center container">
  <div>I am in Center</div>
</div>

Antwoord 8, autoriteit 2%

Blokelementen in het midden plaatsen (werkt in Internet Explorer 9en hoger ), heeft het een wrapper divnodig:

.vcontainer {
  position: relative;
  top: 50%;
  transform: translateY(-50%);
  -webkit-transform: translateY(-50%);
}

Antwoord 9, autoriteit 2%

Ze moeten allemaal verticaal worden uitgelijnd binnen de div

hoeuitgelijnd? Bovenkanten van de afbeeldingen uitgelijnd met de bovenkant van de tekst?

Een van de afbeeldingen moet absoluut binnen de div worden gepositioneerd.

Absoluut gepositioneerd ten opzichte van de DIV? Misschien kun je schetsen wat je zoekt…?

fd heeftde stappen beschreven voor absolute positionering, evenals het aanpassen van de weergave van het H1-element zodat afbeeldingen in lijn ermee verschijnen. Daaraan voeg ik toe dat je de afbeeldingen kunt uitlijnen met behulp van de stijl vertical-align:

#header h1 { display: inline; }
#header img { vertical-align: middle; }

…dit zou de koptekst en afbeeldingen samenvoegen, met de bovenranden uitgelijnd. Er zijn andere uitlijningsopties; zie de documentatie. Mogelijk vindt u het ook nuttig om de DIV te verwijderen en de afbeeldingen binnen het H1-element te verplaatsen – dit geeft semantische waarde aan de container en maakt het niet nodig om de weergave van de H1:

<h1 id=header">
   <img src=".." ></img>
   testing...
   <img src="..."></img>
</h1>

Antwoord 10, autoriteit 2%

Gebruik deze formule en het werkt altijd zonder scheuren:

#outer {height: 400px; overflow: hidden; position: relative;}
#outer[id] {display: table; position: static;}
#middle {position: absolute; top: 50%;} /* For explorer only*/
#middle[id] {display: table-cell; vertical-align: middle; width: 100%;}
#inner {position: relative; top: -50%} /* For explorer only */
/* Optional: #inner[id] {position: static;} */
<div id="outer">
  <div id="middle">
    <div id="inner">
      any text
      any height
      any content, for example generated from DB
      everything is vertically centered
    </div>
  </div>
</div>

Antwoord 11, autoriteit 2%

Bijna alle methoden moeten de hoogte specificeren, maar vaak hebben we geen hoogtes.

Dus hier is een CSS 3-truc met drie regels waarvoor je de hoogte niet hoeft te weten.

.element {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
}

Het wordt zelfs in IE9 ondersteund.

met zijn leveranciersvoorvoegsels:

.element {
    position: relative;
    top: 50%;
    -webkit-transform: translateY(-50%);
    -ms-transform: translateY(-50%);
    transform: translateY(-50%);
}

Bron: Alles verticaal uitlijnen met slechts 3 regels CSS


Antwoord 12

Mijn truc is om een tabel in de div te plaatsen met één rij en één kolom, 100% van de breedte en hoogte in te stellen, en de eigenschap vertical-align:middle:

<div>
    <table style="width:100%; height:100%;">
        <tr>
            <td style="vertical-align:middle;">
                BUTTON TEXT
            </td>
        </tr>
    </table>
</div>

Viool:
http://jsfiddle.net/joan16v/sbqjnn9q/


Antwoord 13

Drie manieren om een ​​Center Child Div te maken in een ouder div

  • absolute positioneringsmethode
  • FLEXBOX-methode
  • Transform / Translate-methode

Demo

/* First way */
.parent1 {
  background: darkcyan;
   width: 200px;
   height: 200px;
   position: relative;
}
.child1 {
  background: white;
  height: 30px;
  width: 30px;
  position: absolute;
  top: 50%;
  left: 50%;
  margin: -15px;
}
/* Second way */
.parent2 {
  display: flex;
  justify-content: center;
  align-items: center;
  background: darkcyan;
  height: 200px;
  width: 200px;
}
.child2 {
  background: white;
  height: 30px;
  width: 30px;
}
/* Third way */
.parent3 {
  position: relative;
  height: 200px;
  width: 200px;
  background: darkcyan;
}
.child3 {
  background: white;
  height: 30px;
  width: 30px;
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
<div class="parent1">
  <div class="child1"></div>
</div>
<hr />
<div class="parent2">
  <div class="child2"></div>
</div>
<hr />
<div class="parent3">
  <div class="child3"></div>
</div>

Antwoord 14

Als u CSS gebruikt om verticaal te centreren, kunt u de buitenste containers als een tabel laten werken en de inhoud als een tabelcel. In dit formaat blijven uw objecten gecentreerd. 🙂

Ik heb bijvoorbeeld meerdere objecten in JSFiddle genest, maar het kernidee is als volgt:

HTML

<div class="circle">
  <div class="content">
    Some text
  </div>
</div>

CSS

.circle {
  /* Act as a table so we can center vertically its child */
  display: table;
  /* Set dimensions */
  height: 200px;
  width: 200px;
  /* Horizontal center text */
  text-align: center;
  /* Create a red circle */
  border-radius: 100%;
  background: red;
}
.content {
  /* Act as a table cell */
  display: table-cell;
  /* And now we can vertically center! */
  vertical-align: middle;
  /* Some basic markup */
  font-size: 30px;
  font-weight: bold;
  color: white;
}

Het voorbeeld van meerdere objecten:

HTML

<div class="container">
  <div class="content">
    <div class="centerhoriz">
      <div class="circle">
        <div class="content">
          Some text
        </div><!-- content -->
      </div><!-- circle -->
      <div class="square">
        <div class="content">
          <div id="smallcircle"></div>
        </div><!-- content -->
      </div><!-- square -->
    </div><!-- center-horiz -->
  </div><!-- content -->
</div><!-- container -->

CSS

.container {
  display: table;
  height: 500px;
  width: 300px;
  text-align: center;
  background: lightblue;
}
.centerhoriz {
  display: inline-block;
}
.circle {
  display: table;
  height: 200px;
  width: 200px;
  text-align: center;
  background: red;
  border-radius: 100%;
  margin: 10px;
}
.square {
  display: table;
  height: 200px;
  width: 200px;
  text-align: center;
  background: blue;
  margin: 10px;
}
.content {
  display: table-cell;
  vertical-align: middle;
  font-size: 30px;
  font-weight: bold;
  color: white;
}
#smallcircle {
  display: inline-block;
  height: 50px;
  width: 50px;
  background: green;
  border-radius: 100%;
}

resultaat

https://jsfiddle.net/martjemeyer/ybs032UC/1/


Antwoord 15

Ik heb een nieuwe oplossing gevonden om meerdere tekstlijnen in een div te uitlijnen met behulp van CSS & NBSP; 3 (en ik gebruik ook Bootstrap V3-rastersysteem om de UI te verfraaien), die is zoals hieronder:

.immediate-parent-of-text-containing-div {
    height: 50px;         /* Or any fixed height that suits you. */
}
.text-containing-div {
    display: inline-grid;
    align-items: center;
    text-align: center;
    height: 100%;
}

Volgens mijn begrip moet de onmiddellijke ouder van tekst met element een hoogte hebben.


Antwoord 16

Standaard is H1 een blokelement en zal na het eerste IMG op de lijn rennen en zal de tweede IMG verschijnen op de regel na het blok.

Om dit te stoppen, kunt u de H1 instellen om inline stromingsgedrag te hebben:

#header > h1 { display: inline; }

Wat betreft absoluut de IMG in de div , moet u de bevattende div instellen om een ​​”bekende grootte” te hebben voordat dit goed werkt. In mijn ervaring moet je ook het standpunt wijzigen weg van de standaardpositie: relatieve werkt voor mij:

#header { position: relative; width: 20em; height: 20em; }
#img-for-abs-positioning { position: absolute; top: 0; left: 0; }

Als u dat aan het werk kunt krijgen, wilt u misschien proberen de hoogte, breedte, positie-kenmerken van DIV.HOOPER te verwijderen om de minimale vereiste kenmerken te krijgen om het gewenste effect te krijgen.

update:

Hier is een compleet voorbeeld dat werkt op Firefox 3:

& LT;! DOCTYPE HTML PUBLIEK "- // W3C // DTD XHTML 1.0 Streng // NL"
     "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd">
& lt; html & gt;
  & LT; HOOFD & GT;
    & LT; TITLE & GT; Voorbeeld van verticale positionering in een div & lt; / titel & GT;
    & LT; Style Type = "Tekst / CSS" & GT;
      # Shader & GT; H1 {display: inline; }
      #Heater {Border: solide 1px rood;
           Positie: familielid; }
      # img-for-abs-positionering {positie: absoluut;
                    onderkant: -1em; Rechts: 2em; }
    & LT; / STYLE & GT;
  & LT; / HOOFD & GT;
  & LT; BODY & GT;
    & LT; DIV ID = "Header" & GT; 

Other episodes