position: absolute dalam satu contoh
Elemen yang diposisikan secara absolute diangkat keluar dari normal flow lalu ditempatkan dengan top, right, bottom, dan left. Offset itu diukur dari ancestor terdekat yang punya position selain static, itulah sebabnya elemen induk diberi position: relative:
Hapus position: relative dari .card, maka badge-nya melompat ke kanan atas seluruh halaman, karena tidak lagi punya ancestor yang diposisikan. Satu baris itu menjelaskan sebagian besar pertanyaan "position absolute tidak berfungsi".
Hal yang perlu diketahui tentang elemen absolute:
- Elemen ini tidak memakan ruang. Judul dan paragraf ditata seolah-olah badge itu tidak ada.
- Lebarnya menyusut sesuai isinya, kecuali kamu menetapkan
widthatauleftdanrightsekaligus. - Offset diukur sampai tepi padding containing block, di dalam border-nya.
Lima nilai position
| Nilai | Di dalam flow? | Offset diukur dari | Penggunaan umum |
|---|---|---|---|
static (default) | Ya | Offset diabaikan | Elemen biasa |
relative | Ya, ruangnya tetap disimpan | Posisi normalnya sendiri | Patokan untuk child absolute, geseran kecil |
absolute | Tidak | Ancestor terdekat yang diposisikan (atau halaman) | Badge, tooltip, overlay, tombol tutup |
fixed | Tidak | Viewport | Header, tombol chat, bar cookie |
sticky | Ya | Scroll container-nya, begitu mencapai offset | Header tabel, judul bagian, sidebar |
position: relative
Elemen yang diposisikan secara relative tetap berada di tempatnya semula di dalam flow. Offset memindahkan posisi gambarnya, tetapi ruang aslinya tetap disediakan, jadi tidak ada yang bergeser di sekitarnya:
Kotak 2 digambar 20px ke bawah dan 20px ke kanan, menimpa kotak 3, tetapi kotak 3 tidak bergeser: kotak itu tetap menyisakan ruang untuk kotak 2 di posisi aslinya. Sendirian, relative jarang dipakai untuk memindahkan sesuatu. Tugas utamanya adalah menjadi kotak patokan untuk child yang absolute.
Offset dan inset
top, right, bottom, dan left menerima panjang, persentase (dari containing block), dan auto. Shorthand inset mengatur keempatnya dengan urutan yang sama seperti margin:
.overlay {
position: absolute;
inset: 0; /* top: 0; right: 0; bottom: 0; left: 0; */
}
.corner {
position: absolute;
inset: auto 16px 16px auto; /* bottom right corner, 16px in */
}
Mengatur sisi yang berlawanan akan meregangkan elemen: left: 0; right: 0 membuatnya selebar containing block. inset: 0 pada child absolute adalah cara standar untuk menutupi kartu dengan overlay.
Menengahkan dengan absolute dan transform
top: 50%; left: 50% menaruh sudut kiri atas elemen di titik tengah. translate(-50%, -50%) lalu menggesernya kembali sebesar setengah ukurannya sendiri:
Flexbox dan grid lebih sederhana untuk menengahkan kalau elemennya bisa tetap di dalam flow. Halaman center a div membandingkan semua caranya.
position: fixed
Elemen fixed ditempatkan relatif terhadap viewport dan tetap di sana saat halaman di-scroll:
.chat-button {
position: fixed;
bottom: 16px;
right: 16px;
}
Ada dua jebakan. Elemen fixed tidak memakan ruang, jadi header fixed menutupi bagian atas halaman kecuali kamu menambahkan padding-top pada body. Lalu, kalau ada ancestor yang punya transform, filter, atau perspective, ancestor itulah yang menjadi kotak patokan, bukan viewport, jadi elemennya ikut ter-scroll bersamanya.
position: sticky
Elemen sticky ikut ter-scroll seperti biasa sampai mencapai offset-nya, lalu menempel di sana sampai ujung elemen induknya ter-scroll lewat. Scroll kotak di bawah:
Setiap huruf menempel di bagian atas kotak scroll selama bagiannya terlihat, lalu terdorong pergi oleh huruf berikutnya, karena elemen sticky tidak pernah keluar dari elemen induknya.
Kalau sticky tidak menempel, periksa hal-hal ini:
- Tidak ada offset.
position: stickytidak berpengaruh apa-apa tanpatop,bottom,left, atauright. - Ada ancestor dengan
overflow: hidden,auto, atauscroll. Ancestor itu menjadi scroll container, dan kalau ia tidak benar-benar bisa di-scroll, tidak ada yang menempel. Pakaioverflow: clipkalau kamu hanya perlu menyembunyikan overflow. - Elemen induk yang tidak lebih tinggi dari elemen sticky. Tidak ada ruang untuk menempel di dalamnya.
- Elemen induk flex atau grid yang meregangkannya. Di baris flex, tambahkan
align-self: flex-startpada sidebar yang sticky.
Kesalahan yang sering terjadi
- Lupa memberi
position: relativepada elemen induk dari elemen absolute. - Memakai absolute untuk layout halaman. Elemen absolute mengabaikan satu sama lain dan juga kontennya, jadi teks saling menimpa di layar yang lebih kecil. Pakai flexbox atau grid untuk layout, dan absolute untuk hiasan kecil.
- Offset pada elemen static.
top: 10pxtidak berpengaruh tanpaposition. - Bingung elemen mana yang berada di atas. Elemen terposisi yang saling menimpa diurutkan oleh z-index.
- Header fixed menutupi konten. Tambahkan padding pada halaman, atau
scroll-padding-topsupaya link anchor mendarat di bawah header.
Pertanyaan yang sering diajukan
Apa fungsi position: absolute?
Deklarasi ini mengeluarkan elemen dari normal flow (elemen lain bersikap seolah-olah elemen itu tidak ada) lalu menempatkannya dengan top, right, bottom, dan left, diukur dari containing block-nya: ancestor terdekat yang position-nya bukan static.
Bagaimana cara memosisikan elemen secara absolute relatif terhadap elemen induknya?
Beri elemen induk position: relative; dan child position: absolute; dengan offset seperti top: 0; right: 0;. Tanpa elemen induk yang diposisikan, child ditempatkan relatif terhadap halaman.
Apa perbedaan position relative dan absolute?
relative menjaga elemen tetap di dalam flow dan hanya menggeser posisi gambarnya, sambil meninggalkan ruang aslinya. absolute mengeluarkannya dari flow dan menempatkannya relatif terhadap ancestor yang diposisikan.
Kenapa position: sticky tidak berfungsi?
Biasanya karena salah satu dari tiga hal: tidak ada top (atau offset lain) yang ditetapkan, ada ancestor dengan overflow: hidden atau auto yang menjadi scroll container, atau elemen induk dari elemen sticky tidak lebih tinggi dari elemen itu, jadi tidak ada ruang untuk menempel.
Apa perbedaan fixed dan sticky?
fixed dikeluarkan dari flow dan dipaku ke viewport (kecuali ada ancestor dengan transform atau filter). sticky tetap di dalam flow dan ikut ter-scroll seperti biasa sampai mencapai offset-nya, lalu menempel selama elemen induknya masih terlihat di layar.