Menu

CSS Position: Absolute, Relative, Fixed ve Sticky

position: absolute bir elementi en yakın konumlandırılmış atasının içinde tam koordinatlara yerleştirir. absolute'un position: relative ile nasıl çalıştığını, ardından fixed ve sticky'yi, top/right/bottom/left ve inset özelliklerini ve sticky'nin neden bazen yapışmadığını öğren.

Bu sayfada çalıştırılabilir editörler var - düzenle, çalıştır ve sonucu anında gör.

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, width ya da hem left hem right vermedikç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ğerAkışta mı?Uzaklıklar neye göre ölçülürTipik kullanım
static (varsayılan)EvetUzaklıklar yok sayılırNormal elementler
relativeEvet, yeri korunurKendi normal konumuAbsolute çocuklar için çapa, küçük kaydırmalar
absoluteHayırEn yakın konumlandırılmış ata (ya da sayfa)Rozetler, tooltip'ler, katmanlar, kapatma butonları
fixedHayırViewportBaşlıklar, sohbet butonları, çerez çubukları
stickyEvetUzaklığ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, left ya da right olmadan hiçbir şey yapmaz.
  • overflow: hidden, auto ya da scroll değ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 gerekiyorsa overflow: clip kullan.
  • 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-start ekle.

Sık yapılan hatalar

  • Absolute bir elementin ebeveynine position: relative vermeyi 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: 10px bir position olmadan 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-top kullan.

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.

Coddy programming languages illustration

Coddy ile kodlamayı öğren

BAŞLA