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

Vladimirs
sumber
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
periksa tautan ini: vanseodesign.com/css/vertical-centering ;)
Jordi Castilla
@ 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 .

Hashem Qolami
sumber
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/

Triển Trương
sumber
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;
}
Chris Aelbrecht
sumber
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%);
}
Juan Angel
sumber
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>

G-Cyrillus
sumber
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);
}
Sainul Abid
sumber
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;  
}
Hicham
sumber
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.

Whanau Paitai
sumber
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>

Arindam Sarkar
sumber
3
mungkin saja jawaban Anda baik tetapi Anda dapat memperbaikinya dengan menambahkan beberapa deskripsi tentang apa yang kode Anda lakukan ...
DaFois