Tek örnekte position: absolute
Absolute konumlandırılmış bir element normal akıştan çıkarılır ve top, right, bottom ve left ile yerleştirilir. Bu uzaklıklar position değeri static dışında olan en yakın atadan ölçülür; ebeveynin position: relative almasının nedeni budur:
.card üzerinden position: relative'i sil, rozet bütün sayfanın sağ üst köşesine zıplar, çünkü artık konumlandırılmış bir atası yoktur. Bu tek satır, "position absolute çalışmıyor" sorularının çoğunu açıklar.
Absolute elementler hakkında bilmen gerekenler:
- Yer kaplamazlar. Başlık ve paragraf, rozet yokmuş gibi yerleşir.
- Genişlikleri içeriklerine uyacak şekilde küçülür,
widthya da hemlefthemrightvermedikçe. - Uzaklıklar kapsayıcı bloğun padding kenarına, kenarlığının içine göre ölçülür.
Beş position değeri
| Değer | Akışta mı? | Uzaklıklar neye göre ölçülür | Tipik kullanım |
|---|---|---|---|
static (varsayılan) | Evet | Uzaklıklar yok sayılır | Normal elementler |
relative | Evet, yeri korunur | Kendi normal konumu | Absolute çocuklar için çapa, küçük kaydırmalar |
absolute | Hayır | En yakın konumlandırılmış ata (ya da sayfa) | Rozetler, tooltip'ler, katmanlar, kapatma butonları |
fixed | Hayır | Viewport | Başlıklar, sohbet butonları, çerez çubukları |
sticky | Evet | Uzaklığa ulaştığında kaydırma kapsayıcısı | Tablo başlıkları, bölüm başlıkları, kenar çubukları |
position: relative
Relative konumlandırılmış bir element akıştaki yerinde kalır. Uzaklıklar nerede çizildiğini değiştirir, ama orijinal yeri ayrılmış kalır, bu yüzden çevresindeki hiçbir şey kıpırdamaz:
Kutu 2, 20px aşağıda ve 20px sağda çiziliyor ve kutu 3 ile çakışıyor, ama kutu 3 kıpırdamadı: hâlâ kutu 2'nin orijinal yeri için boşluk bırakıyor. relative tek başına bir şeyi taşımak için nadiren kullanılır; asıl işi absolute çocuklar için referans kutusu olmaktır.
Uzaklıklar ve inset
top, right, bottom ve left uzunluklar, (kapsayıcı bloğa göre) yüzdeler ve auto kabul eder. inset kısa yazımı dördünü de margin ile aynı sırada ayarlar:
.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 */
}
Karşılıklı kenarları ayarlamak elementi esnetir: left: 0; right: 0 onu kapsayıcı blok kadar geniş yapar. Absolute bir çocukta inset: 0, bir kartı bir katmanla kaplamanın standart yoludur.
absolute ve transform ile ortalamak
top: 50%; left: 50% elementin sol üst köşesini merkeze koyar. translate(-50%, -50%) ise onu kendi boyutunun yarısı kadar geri taşır:
Element akışta kalabildiğinde flexbox ve grid daha basit ortalar; div ortalama sayfası bütün yöntemleri karşılaştırıyor.
position: fixed
Fixed bir element viewport'a göre yerleştirilir ve sayfa kayarken orada kalır:
.chat-button {
position: fixed;
bottom: 16px;
right: 16px;
}
İki püf noktası var. Fixed bir element yer kaplamaz, bu yüzden body'ye padding-top eklemezsen sabit bir başlık sayfanın üst kısmını örter. Ve herhangi bir atanın transform, filter ya da perspective değeri varsa referans kutusu viewport yerine o ata olur, bu yüzden element onunla birlikte kayar.
position: sticky
Sticky bir element uzaklığına ulaşana kadar normal şekilde kayar, sonra ebeveyninin sonu kayıp gidene kadar orada yapışık kalır. Aşağıdaki kutuyu kaydır:
Her harf, bölümü görünürken kaydırma kutusunun üstüne yapışır, sonra bir sonraki tarafından itilir, çünkü sticky bir element asla ebeveyninden çıkmaz.
Sticky yapışmadığında şunları kontrol et:
- Uzaklık yok.
position: sticky,top,bottom,leftya darightolmadan hiçbir şey yapmaz. overflow: hidden,autoya dascrolldeğeri olan bir ata. Kaydırma kapsayıcısı o olur ve gerçekten kaymıyorsa hiçbir şey yapışmaz. Yalnızca taşmayı gizlemen gerekiyorsaoverflow: clipkullan.- Sticky elementten uzun olmayan bir ebeveyn. İçinde yapışacak yer yoktur.
- Onu esneten bir flex ya da grid ebeveyn. Bir flex satırında sticky kenar çubuğuna
align-self: flex-startekle.
Sık yapılan hatalar
- Absolute bir elementin ebeveynine
position: relativevermeyi unutmak. - Sayfa düzeni için absolute kullanmak. Absolute elementler birbirlerini ve içeriği yok sayar, bu yüzden küçük ekranlarda metinler çakışır. Düzen için flexbox ya da grid, küçük süslemeler için absolute kullan.
- Static bir elementte uzaklıklar.
top: 10pxbirpositionolmadan hiçbir şey yapmaz. - Hangi elementin üstte olacağı konusunda boğuşmak. Çakışan konumlandırılmış elementler z-index ile sıralanır.
- İçeriği gizleyen sabit bir başlık. Sayfaya padding ekle ya da çapa linkleri onun altına düşsün diye
scroll-padding-topkullan.
Sıkça Sorulan Sorular
position: absolute ne işe yarar?
Elementi normal akıştan çıkarır (diğer elementler o yokmuş gibi davranır) ve onu kapsayıcı bloğundan, yani position değeri static olmayan en yakın atadan ölçülen top, right, bottom ve left ile yerleştirir.
Bir element ebeveynine göre absolute olarak nasıl konumlandırılır?
Ebeveyne position: relative;, çocuğa ise top: 0; right: 0; gibi uzaklıklarla birlikte position: absolute; ver. Konumlandırılmış bir ebeveyn olmadan çocuk sayfaya göre yerleşir.
relative ile absolute konum arasındaki fark nedir?
relative elementi akışta tutar ve yalnızca nerede çizildiğini kaydırır; orijinal yerini boş bırakır. absolute ise onu akıştan çıkarır ve konumlandırılmış atasına göre yerleştirir.
position: sticky neden çalışmıyor?
Genellikle üç şeyden biri: hiçbir top (ya da başka bir uzaklık) ayarlanmamıştır, bir atanın overflow: hidden ya da auto değeri vardır ve kaydırma kapsayıcısı olur, ya da sticky elementin ebeveyni elementten uzun değildir, bu yüzden yapışacak yer yoktur.
fixed ile sticky arasındaki fark nedir?
fixed akıştan çıkarılır ve viewport'a sabitlenir (bir atanın transform ya da filter değeri yoksa). sticky ise akışta kalır ve uzaklığına ulaşana kadar normal şekilde kayar, sonra ebeveyni hâlâ ekrandayken yapışır.