Cara memusatkan div secara vertikal di dalam div induk yang diposisikan benar-benar


146

Saya mencoba untuk mendapatkan wadah biru di tengah-tengah yang merah muda, namun tampaknya vertical-align: middle;tidak berhasil dalam kasus itu.

<div style="display: block; position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;vertical-align: middle;background-color: pink;">
        <div style="background-color: lightblue;">test</div>
    </div>
</div>

Hasil:

masukkan deskripsi gambar di sini

Harapan:

masukkan deskripsi gambar di sini

Tolong sarankan bagaimana saya bisa mencapai itu.

Jsfiddle


1
Apakah ada alasan mengapa Anda menggunakan di position: absolutemana - mana?
Vucko

yang vertical-align: middle;bekerja dengan display: inline-blockatau tata letak meja
ctf0


@ Vucko ya - itu prasyarat karena ini hanya versi sederhana dari tata letak yang sangat kompleks, tetapi posisi absolut di kedua div paling atas adalah hal utama.
Vladimirs

@Vladimirs Saya hanya bisa memikirkan margin-top: calc((56px - 16px) / 2), di mana 56px - parent height, 16px - element height/font-size- JSFiddle
Vucko

Jawaban:


331

Pertama-tama catatan yang vertical-alignhanya berlaku untuk sel tabel dan elemen tingkat inline.

Ada beberapa cara untuk mencapai keberpihakan vertikal yang mungkin memenuhi atau tidak memenuhi kebutuhan Anda. Namun saya akan menunjukkan kepada Anda dua metode dari favorit saya:

1. Menggunakan transformdantop

.valign {
    position: relative;
    top: 50%;
    transform: translateY(-50%);
    /* vendor prefixes omitted due to brevity */
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div style="text-align: left; position: absolute;height: 56px;background-color: pink;">
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

Poin kuncinya adalah bahwa nilai persentase pada toprelatif terhadap heightblok yang berisi; Sedangkan nilai persentase pada transforms relatif terhadap ukuran kotak itu sendiri (kotak pembatas).

Jika Anda mengalami masalah rendering font (font buram), perbaikannya adalah menambahkan perspective(1px)ke transformdeklarasi sehingga menjadi:

transform: perspective(1px) translateY(-50%);

Perlu dicatat bahwa CSS transform didukung di IE9 + .

2. Menggunakan inline-blockelemen (pseudo-)

Dalam metode ini, kami memiliki dua inline-blockelemen saudara yang disejajarkan secara vertikal di tengah oleh vertical-align: middledeklarasi.

Salah satu dari mereka memiliki salah heightsatu 100%dari induknya dan yang lainnya adalah elemen yang kami inginkan yang ingin kami selaraskan di tengah.

.parent {
    text-align: left;
    position: absolute;
    height: 56px;
    background-color: pink;
    white-space: nowrap;
    font-size: 0; /* remove the gap between inline level elements */
}

.dummy-child { height: 100%; }

.valign {
    font-size: 16px; /* re-set the font-size */
}

.dummy-child, .valign {
    display: inline-block;
    vertical-align: middle;
}
<div style="position: absolute; left: 50px; top: 50px;">
    <div class="parent">
        <div class="dummy-child"></div>
        <div class="valign" style="background-color: lightblue;">test</div>
    </div>
</div>

Akhirnya, kita harus menggunakan salah satu metode yang tersedia untuk menghilangkan celah antara elemen-elemen inline-level .


Terima kasih atas tips yang bermanfaat ini. Itu bekerja untuk proyek saya. Kerja bagus.
Sedat Kumcu

Untuk valignelemen metode pertama harusdisplay: block
Oleg

transform: translateY(-50%);Belum pernah melihat ini sebelumnya, tetapi bekerja dengan sempurna. Penghemat kehidupan nyata.
Benny Bottema

55

Gunakan ini :

.Absolute-Center {
    margin: auto;
    position: absolute;
    top: 0; left: 0; bottom: 0; right: 0;
}

lihat tautan ini: https://www.smashingmagazine.com/2013/08/absolute-horizontal-vertical-centering-css/


Bagaimana ini bukan solusi utama? Sangat mudah dan berhasil!
Mason

21
Ingatlah bahwa heightproperti harus didefinisikan (dalam px, em, dll.) Agar ini berfungsi.
Vaidas

Bagaimana jika saya memiliki banyak div di dalam induk? tidak semua akan ditempatkan di atas satu sama lain?
psykid

tidak berfungsi jika ada satu anak lagi di level yang sama dengan "absolute-center"
Pascut

18

Gunakan flex blox di div Anda yang diposisikan tidak tepat untuk memusatkan kontennya.

Lihat contoh https://plnkr.co/edit/wJIX2NpbNhO34X68ZyoY?p=preview

.some-absolute-div {    
  display: -webkit-box;
  display: -webkit-flex;
  display: -moz-box;
  display: -moz-flex;
  display: -ms-flexbox;
  display: flex;

  -webkit-box-pack: center;
  -ms-flex-pack: center;
  -webkit-justify-content: center;
  -moz-justify-content: center;
  justify-content: center;

  -webkit-box-align: center;
  -ms-flex-align: center;
  -webkit-align-items: center;
  -moz-align-items: center;
  align-items: center;
}

11

Pusatkan secara vertikal dan horizontal:

.parent{
  height: 100%;
  position: absolute;
  width: 100%;
  top: 0;
  left: 0;
}
.c{
  position: absolute;
  top: 50%;
  left: 0;
  right: 0;
  transform: translateY(-50%);
}

3

Anda dapat menggunakan display:table/table-cell;

.a{
   position: absolute; 
  left: 50px; 
  top: 50px;
  display:table;
}
.b{
  text-align: left; 
  display:table-cell;
  height: 56px;
  vertical-align: middle;
  background-color: pink;
}
.c {
  background-color: lightblue;
}
<div class="a">
  <div  class="b">
    <div class="c" >test</div>
  </div>
</div>


Terima kasih, contoh Anda berfungsi dengan baik, namun .bhilang position: absolute;yang penting untuk mendapatkan properti hal-hal lain yang ditampilkan yang saya tidak termasuk untuk menjaga kode lebih jelas. Saya tahu itu tidak masuk akal memiliki sel tabel benar-benar diposisikan tetapi mungkin ada pendekatan lain yang akan memungkinkan untuk mempertahankan position: absolute;keduanya .adan .bkelas?
Vladimirs

jika a adalah posisi absolut, dan b (anak) memberikan ukurannya, b itu sendiri dalam posisi absolut terhadap seluruh konten. kecuali a yang seharusnya tetap tidak berukuran saya tidak mengerti tujuan absolut di dalam absolut?
G-Cyrillus

1

Ini cara sederhana menggunakan objek Top.

misalnya: Jika ukuran elemen absolut adalah 60px.

.absolute-element { 
    position:absolute; 
    height:60px; 
    top: calc(50% - 60px);
}

2
Menggunakan calcsangat membantu, meskipun ini seharusnya top: calc(50% - 30px)benar-benar terpusat.
brainbag

1

Solusi sederhana tambahan

HTML:

<div id="d1">
    <div id="d2">
        Text
    </div>
</div>

CSS:

#d1{
    position:absolute;
    top:100px;left:100px;
}

#d2{
    border:1px solid black;
    height:50px; width:50px;
    display:table-cell;
    vertical-align:middle;
    text-align:center;  
}

0

Silakan periksa jawaban ini untuk masalah serupa.

Sejauh ini cara termudah yang saya temukan.

https://stackoverflow.com/a/26079837/4593442

CATATAN. Saya menggunakan tampilan: -webkit-flex; bukannya tampilan: flex; untuk pengujian di dalam safari.

FOOTNOTE. Saya seorang pemula saja, berbagi bantuan dari seseorang yang jelas berpengalaman.


0

Anda dapat melakukannya dengan menggunakan display:table;di div orangtua dan display: table-cell; vertical-align: middle;di div anak

<div style="display:table;">
      <div style="text-align: left;  height: 56px;  background-color: pink; display: table-cell; vertical-align: middle;">
          <div style="background-color: lightblue; ">test</div>
      </div>
  </div>


3
mungkin saja jawaban Anda baik tetapi Anda dapat memperbaikinya dengan menambahkan beberapa deskripsi tentang apa yang kode Anda lakukan ...
DaFois
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.