Jawaban singkatnya
Untuk menengahkan div secara horizontal dan vertikal di dalam induknya, jadikan induknya grid dan tengahkan isinya:
.parent {
display: grid;
place-items: center;
min-height: 200px; /* the parent needs room to center in */
}
Cara ini berfungsi untuk anak berukuran berapa pun dan tidak butuh apa-apa pada anaknya. Di bawah ini ada enam metode berdampingan. Setiap kotak mengukur dirinya sendiri setelah tampil dan mencetak seberapa jauh titik tengahnya dari titik tengah induk:
Keenamnya melaporkan 0px di kedua sumbu (border 1px pada panggungnya sama di setiap sisi, jadi tidak menggeser titik tengah). Ubah lebar atau teks sebuah kotak lalu jalankan lagi: metode yang tidak bergantung pada ukuran tetap akan tetap di 0.
Metode mana yang dipakai
| Metode | Menengahkan | Anak butuh ukuran tetap? | Paling cocok untuk |
|---|---|---|---|
Grid place-items: center | Kedua sumbu | Tidak | Pilihan default: satu anak di dalam kotak |
Flexbox justify-content + align-items | Kedua sumbu | Tidak | Satu baris atau kolom item, ditengahkan sebagai kelompok |
margin: auto di induk flex atau grid | Kedua sumbu | Tidak | Menengahkan satu item sementara saudaranya ditata dengan cara lain |
margin: 0 auto | Horizontal saja | width atau max-width | Wadah halaman, artikel, form di alur normal |
Absolute + translate(-50%, -50%) | Kedua sumbu | Tidak | Overlay, badge, dan modal di atas konten lain |
Absolute + inset: 0; margin: auto | Kedua sumbu | Ya, lebar dan tinggi | Dialog berukuran tetap |
align-content: center pada block | Vertikal | Tidak | Penengahan vertikal tanpa mengubah display induknya |
Metode 1: flexbox
Flexbox menengahkan di dua sumbu dengan dua properti. justify-content mengurus sumbu utama (horizontal pada baris), dan align-items mengurus sumbu silang:
Dengan beberapa anak, flexbox menengahkan mereka sebagai satu kelompok sambil tetap dalam satu baris. Di sinilah flexbox lebih unggul dari grid, yang akan menumpuk ketiga item dalam satu kolom di tengah. Halaman justify-content membahas setiap nilai perataan.
Metode 2: grid
place-items: center adalah singkatan dari align-items: center ditambah justify-items: center. Pada grid container dengan satu anak, properti ini menengahkan anak itu ke dua arah:
Memakai min-height alih-alih height membuat induk bisa membesar jika kartunya lebih tinggi dari 180px, bukannya kartu meluber keluar.
Metode 3: margin: 0 auto (horizontal)
Elemen block dengan lebar yang lebih kecil dari wadahnya bisa ditengahkan secara horizontal dengan margin samping otomatis. Browser membagi ruang kosong sama rata ke dua sisi:
Kotak kedua mengisi seluruh lebar, jadi tidak ada ruang kosong dan tidak ada yang bergeser. Itulah alasan umum margin: 0 auto "tidak berfungsi". Cara ini juga hanya menengahkan secara horizontal di alur normal; margin vertikal auto menjadi 0 di sana. Tetapi di dalam induk flex atau grid, margin: auto menengahkan ke dua arah, yaitu kotak ketiga di perbandingan di atas.
Metode 4: posisi absolute dan transform
Saat elemen harus berada di atas konten lain (badge di atas foto, modal di atas halaman), posisikan secara absolute di 50% lalu tarik kembali sebesar setengah ukurannya sendiri:
top: 50%; left: 50% menaruh pojok kiri atas elemen di titik tengah. Persentase di dalam translate() mengacu pada ukuran elemen itu sendiri, jadi -50% menggesernya kembali sebesar setengah lebar dan tingginya, berapa pun ukurannya. Induknya harus diposisikan (position: relative), kalau tidak elemen akan ditengahkan di halaman. Pemosisian dibahas di halaman position.
Variasi untuk elemen yang ukurannya diketahui: position: absolute; inset: 0; margin: auto; ditambah width dan height. Margin otomatis membagi ruang di keempat sisi.
Metode 5: align-content pada block biasa
align-content: center sekarang juga berfungsi pada block container biasa, tidak hanya flex dan grid. Properti ini menengahkan konten secara vertikal tanpa mengubah cara anak-anaknya ditata:
.parent {
min-height: 200px;
align-content: center; /* vertical centering, still display: block */
}
.child {
max-width: 300px;
margin-inline: auto; /* horizontal centering */
}
Properti ini didukung di Chrome, Firefox, dan Safari versi saat ini. Browser lama mengabaikannya, jadi pakai grid jika kamu harus mendukung browser lama.
Menengahkan di seluruh layar
Untuk menengahkan dialog di viewport tanpa terpengaruh scroll, gabungkan lapisan layar penuh yang fixed dengan grid:
.overlay {
position: fixed;
inset: 0; /* covers the viewport */
display: grid;
place-items: center;
background: rgb(0 0 0 / 50%);
}
Untuk menengahkan konten seluruh halaman secara vertikal, pakai min-height: 100dvh pada induknya, bukan 100vh: di ponsel, 100vh ikut menghitung area di belakang toolbar browser, sehingga "tengah"-nya terletak terlalu rendah.
Menengahkan teks adalah pekerjaan lain
Semua cara di atas menengahkan kotak. Untuk menengahkan teks di dalam kotak, pakai text-align: center padanya, seperti yang ditunjukkan di halaman teks rata tengah HTML. Sering kali kamu butuh keduanya: grid untuk menengahkan kartu, dan text-align untuk menengahkan baris-baris di dalamnya.
Kesalahan umum
- Induk tanpa tinggi. Penengahan vertikal butuh ruang kosong; induk yang menyusut mengikuti isinya tidak punya ruang itu.
margin: 0 autopada block selebar penuh. Beriwidthataumax-widthlebih dulu.margin: autountuk menengahkan vertikal di alur normal. Margin auto vertikal bernilai 0 di sana; pakai flex atau grid.- Penengahan absolute tanpa induk yang diposisikan. Elemen ditengahkan di halaman, bukan di kotak.
align-items: centerpada anak. Properti perataan ditaruh di induk (flex atau grid container), kecualimargin: autodanalign-self.text-align: centeruntuk menengahkan block. Properti ini menengahkan konten inline (teks, gambar, anak inline-block), bukan anak berupa block.
Pertanyaan yang sering diajukan
Bagaimana cara membuat div di tengah secara horizontal dan vertikal?
Jadikan induknya grid dan tengahkan isinya: .parent { display: grid; place-items: center; }. Versi flexbox-nya adalah display: flex; justify-content: center; align-items: center;. Dengan cara mana pun, induknya butuh tinggi yang lebih besar dari div.
Bagaimana cara membuat div di tengah secara horizontal saja?
Beri lebar dan margin kiri kanan otomatis: .box { width: 300px; margin: 0 auto; } (atau max-width untuk blok yang responsif). margin-inline: auto adalah hal yang sama dalam properti logis.
Kenapa margin: 0 auto tidak membuat div saya ke tengah?
Div itu tidak punya lebar yang lebih kecil dari wadahnya, jadi tidak ada ruang kosong untuk dibagi (secara default, sebuah block mengisi lebar penuh). Atur width atau max-width. Cara ini juga tidak berpengaruh pada elemen inline dan tidak pernah menengahkan secara vertikal di alur normal.
Kenapa div saya tidak mau ke tengah secara vertikal?
Tinggi induknya hanya setinggi isinya, jadi tidak ada ruang lebih untuk menengahkan. Beri induk sebuah tinggi (atau min-height), lalu pakai penengahan dengan grid atau flexbox.
Apa cara paling mudah membuat div di tengah?
display: grid; place-items: center; pada induknya: dua deklarasi, kedua sumbu, anak berukuran berapa pun. Pakai flexbox jika induknya juga menata item lain dalam satu baris.
Bagaimana cara membuat teks di tengah div?
Pakai text-align: center pada div untuk teks dan konten inline. Menengahkan div itu sendiri dan menengahkan teks di dalamnya adalah dua pekerjaan yang berbeda.