CSS display özelliği iki şeyi aynı anda belirler: Öğenin dışarıya karşı nasıl davrandığını (blok mu, satır içi mi) ve kendi alt öğelerini hangi düzen modeliyle yerleştirdiğini (normal akış, flex, grid, tablo). MDN bunlara dış görüntü türü (outer display type) ve iç görüntü türü (inner display type) der. display: block öğeyi yeni satırda başlatır, inline metnin içinde akıtır, inline-block ise satır içinde duran ama kendi içinde blok gibi davranan bir kutu üretir.
Bu yazıda en sık kullanılan değerleri, CSS Display Level 3 ile gelen çok anahtar kelimeli sözdizimini (display: inline flex gibi), yeni blok biçimlendirme bağlamı oluşturan flow-root değerini ve display: none ile display: contents değerlerinin erişilebilirlik etkilerini MDN'ye dayanarak anlatıyoruz. Flex ve grid düzenlerinin kendisi ayrı yazılarda: CSS flexbox rehberi ve CSS grid rehberi.
Dış ve iç görüntü türü

Her kutunun bir dış görüntü türü vardır ve bu, kutunun aynı biçimlendirme bağlamındaki diğer kutuların yanında nasıl duracağını belirler. Ayrıca bir iç görüntü türü vardır ve bu da kutunun içindeki alt kutuların nasıl davranacağını belirler. MDN'nin normal akış rehberi bunu flex örneğiyle açıklar: display: flex verilen bir <div> dışarıya karşı blok öğe gibi davranır, yeni bir satırda başlar ve satır yönündeki tüm alanı kaplar. Bu, dış türün block olmasıdır. İçindeki alt öğeler ise flex biçimlendirme bağlamına katılır; bu da iç türün flex olmasıdır.
Bu ayrımın önemli bir sonucu var: Flex ya da grid kapsayıcısı olan bir öğe hâlâ blok ve satır içi düzene katılır, çünkü dış türü block değeridir. Flex öğelerinin kendileri ise iç türü flow olan kutulardır; yani bir flex öğesinin içindeki paragraf ve bağlantılar, siz değiştirmedikçe normal blok ve satır içi kurallarla dizilir.
block: Blok kutu üretir; normal akışta öncesinde ve sonrasında satır sonu oluşur.inline: Bir ya da daha fazla satır içi kutu üretir; öncesinde ve sonrasında satır sonu oluşmaz. Yer varsa sonraki öğe aynı satırda devam eder.flow: İçeriği normal akışla (blok ve satır içi düzen) yerleştirir.flow-root: Yeni bir blok biçimlendirme bağlamı oluşturan blok kutu üretir.flexvegrid: Alt öğeleri flexbox ya da grid modeline göre yerleştirir.table: HTML<table>öğesi gibi davranır.
block, inline ve inline-block farkı
Bu üç değer, düzen kurarken en sık karşılaştırılanlardır. MDN'ye göre inline-block, çevresindeki içerikle birlikte tek bir satır içi kutu gibi akan, ama kendisi bir blok kutu olan öğe üretir ve yerine konan (replaced) bir öğe gibi davranır. Çok anahtar kelimeli karşılığı inline flow-root değeridir; yani dışarıya satır içi, içeride yeni bir blok biçimlendirme bağlamı.
| Özellik | block | inline | inline-block |
|---|---|---|---|
| Yeni satırda başlar mı | Evet | Hayır | Hayır |
| Satır yönünde tüm alanı kaplar mı | Evet (varsayılan) | Hayır, içerik kadar | Hayır, içerik veya width kadar |
| Üst ve alt margin düzeni iter mi | Evet | Hayır (yerine konmayan öğede) | Evet |
| Yeni BFC oluşturur mu | Duruma göre | Hayır | Evet |
| Çok anahtarlı karşılığı | block flow | inline flow | inline flow-root |
Tablodaki margin satırı MDN'nin margin sayfasına dayanır: <span> ya da <code> gibi yerine konmayan satır içi öğelerde üst ve alt margin'in etkisi yoktur. Bir bağlantıya tıklanabilir alan kazandırmak için dikey padding ve margin'in düzeni etkilemesini istiyorsanız inline-block doğru araçtır. Blok kutuların satır yönündeki tüm alanı kaplaması ise MDN'nin normal akış rehberindeki bir kuraldır: Blok öğelere genişlik vermediğiniz sürece içeren bloklarında olabildiğince geniş yer kaplarlar; genişlik verseniz bile yan yana sığacak yer olsa da alt alta dizilmeye devam ederler.
nav a {
display: inline-block;
padding: 0.5em 1em;
margin-block: 0.25em;
/* satır içinde kalır, dikey padding ve margin düzene dahil olur */
}
strong.uyari {
display: block;
/* satır içi strong artık kendi satırında başlar */
}İkinci kural MDN'nin normal akış rehberindeki bir örneğe dayanır: Tarayıcı <strong> öğesini varsayılan olarak satır içi gösterir, ama display: block ile blok kutuya dönüştürebilirsiniz. Rehberin vurguladığı nokta şudur: CSS ile görünüm değiştirilebildiği için HTML'de içeriğe en uygun anlamsal öğeyi seçip görüntüsünü CSS ile ayarlamak mümkündür.
Çok anahtar kelimeli sözdizimi
CSS 2, blok ve satır içi türevler için birleşik tek kelimeler kullanıyordu: inline-block, inline-flex, inline-grid gibi. CSS display modülü ise dış ve iç türü ayrı ayrı yazmanızı sağlayan çok anahtar kelimeli sözdizimini tanımlar. Tek kelimelik değerler geriye dönük uyumluluk için desteklenmeye devam eder. MDN'deki eşleşmelerin bir kısmı şöyledir:
| Tek değer | Çok anahtarlı yazım |
|---|---|
| block | block flow |
| inline | inline flow |
| flow-root | block flow-root |
| inline-block | inline flow-root |
| flex | block flex |
| inline-flex | inline flex |
| grid | block grid |
| inline-grid | inline grid |
| list-item | block flow list-item |
| table | block table |
Varsayılan tamamlama kuralları da MDN'de belirtilir: Yalnızca dış değer yazarsanız (display: block) iç değer flow olur. Yalnızca iç değer yazarsanız (display: flex) dış değer block olur; tek istisnası ruby olup onun dış türü inline değerine tamamlanır. MDN, yeni sözdizimini desteklemeyen ortamlar için tek değerli yazımı yedek olarak önce yazmayı önerir; tarayıcı anlamadığı bildirimi yok sayar ve öncekini kullanır.
.kapsayici {
display: inline-flex;
display: inline flex;
/* çok anahtarlı yazımı tanıyan tarayıcı ikinciyi uygular,
tanımayan ilkiyle devam eder */
}flow-root ve yeni blok biçimlendirme bağlamı
display: flow-root değerinin tek amacı yeni bir blok biçimlendirme bağlamı (BFC) oluşturmaktır. MDN'nin çok anahtarlı sözdizimi rehberi BFC'yi, kutunun içindeki her şeyin içeride kaldığı ve dışarıdakilerin içeri giremediği bir alan olarak tarif eder. Yeni bir BFC oluşturan öğe üç şey yapar: içindeki kayan (float) öğeleri kapsar, dışarıdaki kayan öğelerle çakışmaz ve margin çökmesini bastırır.
BFC oluşturmanın başka yolları da vardır; MDN bunların listesini verir. Kök öğe, kayan öğeler, mutlak konumlu öğeler, inline-block öğeler, tablo hücreleri, overflow değeri visible ve clip dışında olan blok öğeler, contain: layout, content ya da paint olan öğeler, kendileri flex, grid ya da tablo kapsayıcısı olmayan flex ve grid öğeleri, container-type değeri normal olmayan sorgu kapsayıcıları ve çok sütunlu kapsayıcılar bunlardandır. flow-root değerinin farkı, bu işi başka bir yan etki yaratmadan yapmasıdır. Değerin adı da buradan gelir: Kök öğe <html> gibi, içindeki akış için yeni bir kök oluşturur.
.kart {
display: flow-root;
border: 5px solid steelblue;
}
.kart .gorsel {
float: left;
width: 200px;
height: 100px;
/* flow-root sayesinde kayan görsel kartın dışına taşmaz,
kartın kenarlığı görselin altından geçmez */
}Bu kalıp MDN'nin BFC rehberindeki örnekten uyarlandı. Kapsayıcıda flow-root olmadığında, kayan öğe akıştan çıktığı için kapsayıcının arka planı ve kenarlığı yalnızca yanındaki içeriği sarar ve kenarlık kayan öğenin ortasından geçer. Aynı etki overflow: auto ile de alınabilir, ama rehberin belirttiği gibi bu, istenmeyen kaydırma çubukları ya da kırpılmış gölgeler doğurabilir. Margin çökmesine etkisini margin collapsing yazısında ayrıntılı gösterdik.
display: contents
display: contents verilen öğe kendisi için bir kutu üretmez; yerini alt öğelerinin kutuları ve sözde kutuları alır. Pratikte öğenin kendi arka planı, kenarlığı ve padding'i kaybolur, alt öğeleri ise sanki doğrudan büyükbabanın çocuklarıymış gibi düzene katılır. Örneğin bir grid kapsayıcısının içindeki sarmalayıcı <div> öğesine display: contents verirseniz, o sarmalayıcının çocukları grid öğesi olur.
.grid {
display: grid;
grid-template-columns: repeat(3, 1fr);
}
.grid .grup {
display: contents;
/* .grup kutu üretmez; çocukları doğrudan grid öğesi olur */
}<div class="grid">
<div class="grup">
<p>Bir</p>
<p>İki</p>
</div>
<p>Üç</p>
</div>Tablolar için de benzer bir uyarı vardır: MDN, bazı tarayıcılarda bir <table> öğesinin display değerini block, grid ya da flex yapmanın erişilebilirlik ağacındaki temsilini değiştirdiğini ve tablonun ekran okuyucular tarafından doğru seslendirilmeyebileceğini belirtir.
list-item ve tablo değerleri
display: list-item, öğenin içerik için bir blok kutu ve ayrı bir liste işareti kutusu üretmesini sağlar; böylece herhangi bir öğe liste maddesi gibi davranabilir ve list-style-type ile list-style-position özellikleriyle birlikte kullanılabilir. İç değer yazılmazsa flow, dış değer yazılmazsa block kabul edilir.
table-row, table-cell, table-caption gibi iç değerler ise yalnızca tablo düzeni içinde anlam taşır ve öğeleri sırasıyla <tr>, <td>, <caption> öğeleri gibi davrandırır. Günümüzde sütunlu düzenler için bu değerler yerine genellikle grid ve flexbox tercih edilir.
display değerini animasyonla değiştirmek
MDN'ye göre destekleyen tarayıcılar display özelliğini ayrık (discrete) animasyon türüyle canlandırır; yani değer animasyonun ortasında bir anda değişir. display: none ile ilgili bir istisna vardır: none değerinden görünür bir değere geçişte değer animasyonun başında, görünür bir değerden none değerine geçişte ise sonunda değişir. Böylece içerik animasyon boyunca görünür kalır ve örneğin opacity ile yavaşça kaybolabilir.
Bunu geçişlerle (transition) yapmak için iki ek özellik gerekir: Öğe ilk gösterildiğinde başlangıç değerlerini veren @starting-style kuralı ve display geçişini etkinleştiren transition-behavior: allow-discrete. Bu konunun ayrıntıları CSS transition yazısında anlatılıyor.
Sık yapılan hatalar

spanöğesine width ve dikey margin verip sonuç beklemek: Yerine konmayan satır içi öğede dikey margin etkisizdir; önceinline-blockya dablockyapın.- Gizlemek için her yerde
display: nonekullanmak: İçerik ekran okuyuculardan da gizlenir. Yalnızca görsel gizleme gerekiyorsa farklı bir teknik seçin. - Yer korunsun diye
display: nonebeklemek: Yer korunmaz; yerin kalması içinvisibility: hiddenkullanın. - Float temizlemek için gereksiz
overflow: hidden: Gölgeleri kırpabilir;display: flow-rootaynı işi yan etkisiz yapar. - Anlamlı öğelerde
display: contents: Bazı tarayıcılarda öğe erişilebilirlik ağacından düşer. display: flexverince öğenin satır içi kalacağını sanmak: Tek iç değerde dış türblockolur; satır içi kalması içininline-flexya dainline flexyazın.
Sık Sorulan Sorular
display: inline-block ile display: inline arasındaki fark nedir?
İkisi de satır içinde akar. inline-block ise kendisi bir blok kutudur: Dikey padding ve margin düzeni etkiler, içinde yeni bir blok biçimlendirme bağlamı oluşur. Çok anahtarlı karşılığı inline flow-root değeridir.
display: flex mi display: block flex mi yazmalıyım?
İkisi aynı anlama gelir. Tek değerli yazım geriye dönük uyumluluk için desteklenir. Çok anahtarlı yazımı kullanacaksanız, MDN'nin önerdiği gibi önce tek değerli yedeği yazabilirsiniz.
display: none ile gizlenen öğe sayfanın yüklenmesini engeller mi?
MDN'nin display sayfası yalnızca öğenin düzende hiçbir etki bırakmadığını ve erişilebilirlik ağacından çıktığını belirtir; kaynak yükleme davranışı bu sayfanın konusu değildir. Sayfa hızı konuları için Core Web Vitals yazısına bakabilirsiniz.
Kapsayıcının yüksekliği neden kayan öğeyi içermiyor?
Kayan öğe normal akıştan çıkar, bu yüzden kapsayıcı onu hesaba katmaz. Kapsayıcıya display: flow-root vererek yeni bir blok biçimlendirme bağlamı oluşturduğunuzda kayan öğe kapsanır.
Marka adları sahiplerine aittir. Bu yazı bağımsız bir teknik rehberdir; adı geçen kuruluşlarla bayilik veya ortaklık ilişkisi bulunduğu anlamına gelmez.
İlgili içerikler: CSS öğrenme rehberi · CSS kutu modeli · Margin collapsing · Flexbox rehberi · Grid rehberi · position değerleri · Geçiş efektleri
