CSS Grid Layout
Modern web tasarımının ana omurgasını oluşturan,
sayfa içeriğini iki boyutlu (satır ve sütun)
matris yapısında
düzenleyen sistemdir.
Grid, Flexbox'ın tek boyutlu sınırlamalarını aşarak, karmaşık
kapsamlı sayfa düzenlerinin (page-level
layouts)
manuel matematik gerektirmeden yapılmasını sağlar.
Aşağıda Grid'in felsefesini ve temel özelliklerini inceleyeceğiz.
CSS Grid Layout Giriş ve Felsefe: 2D Yerleşim Çözümü
CSS Grid Layout, CSS3 modülleriyle hayatımıza giren ve karmaşık sayfa düzenlerini yönetmek için özel olarak tasarlanmış olan, web tasarımındaki en güçlü iki boyutlu ( Two-Dimensional ) düzenleme modelidir.
Geleneksel yöntemlerde ( Float, Position ), layout oluşturmak manuel hesaplamalar ve yüksek Özgüllük puanları gerektirirken, Grid, tüm düzeni ana kapsayıcıya tanımlama imkanı sunarak içerik ve sunum ayrımını en üst seviyeye taşır.
1D vs 2D: Flexbox'ın SınırlamalarıGrid'i anlamanın anahtarı, onu Flexbox ile karşılaştırmaktır.
Flexbox, öğeleri ya bir satır boyunca ya da bir sütun boyunca ( tek boyutlu ) hizalamak için tasarlanmıştır.
Grid ise, öğeleri aynı anda hem yatay (sütun) hem de dikey ( satır ) düzlemde konumlandırma ve boyutlandırma yeteneği sunar.
Bu, Grid'i sayfa iskeletini (page-level layout) ve dergi/gazete tarzı karmaşık yerleşimleri oluşturmak için ideal bir araç yapar.
Temel Grid AnatomisiGrid'in temel anatomisi üç ana bileşenden oluşur:
Kapsayıcı (Grid Container): display: grid; özelliğini taşıyan ebeveyn öğedir, tüm grid tanımı buradan yapılır.
Öğeler (Grid Items): Kapsayıcının doğrudan çocuklarıdır, bunlar grid yapısı içine yerleştirilen içeriklerdir.
Hatlar, Satırlar ve Sütunlar: Grid sisteminin temelini oluşturan, sayfa iskeletinin yapıtaşlarıdır.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grid Layout (Izgara Düzeni) Yapısı Örneği</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="izgara-giris">
<div class="kutu">1</div>
<div class="kutu">2</div>
<div class="kutu">3</div>
</div>
</body>
</html>
.izgara-giris {
display: grid;
grid-template-columns: 1fr 1fr 1fr;
gap: 15px;
padding: 20px;
background-color: #f8fafc;
}
.kutu {
background-color: #0f172a;
color: white;
padding: 30px;
text-align: center;
border-radius: 8px;
font-family: sans-serif;
}
Grid Kapsayıcı (Parent) Tanımı Temel Yapı ve Izgara Şablonu (Grid Template)
CSS Grid, bir öğeye display: grid; veya display: inline-grid; atanmasıyla başlar, bu, o öğeyi Grid Kapsayıcıya dönüştürür.
Flexbox'taki gibi, Grid de tüm yerleşim mantığını ebeveyn öğeye verir.
Doğrudan alt öğeler, ebeveyn tarafından tanımlanan ızgara çizgileri içine yerleştirilir.
Izgara Yapısı: Satır ve Sütunların OluşturulmasıGrid'in çekirdek mekanizması, sanal bir ızgara sistemi oluşturmaktır, bu sistemin boyutları ve sayısı, iki temel özellik ile belirlenir:
1. Grid-template-columns: Dikey çizgileri ve sütunların genişliğini tanımlar.
grid-template-columns: 1fr 2fr 100px; ( Üç sütun oluşturur.)
2.
grid-template-rows: Yatay
çizgileri ve
satırların yüksekliğini tanımlar.
grid-template-rows: auto 50vh 1fr; ( Üç satır
oluşturur.)
Grid Layout'un en büyük avantajlarından biri, fr ( Fractional Unit ) birimidir ve bu birim, kapsayıcıda kalan
boş alanı orantısal olarak dağıtır.
Eğer ızgarada 200px ve 1fr olarak tanımlanmış iki sütun varsa, tarayıcı önce 200px sütununu ayırır, ardından kalan tüm alanı 1fr sütununa verir.
Eğer 1fr 2fr tanımlanmışsa, kalan alanın üçte biri ilk sütuna, üçte ikisi ikinci sütuna gider.
Tekrar Fonksiyonu (repeat()) Çok sayıda (örneğin 12) sütun tanımlanması gerektiğinde, repeat() fonksiyonu kullanılır.
Bu, kod tekrarını önler ve okunabilirliği artırır.
Örneğin: grid-template-columns: repeat(4, 1fr); ( Bu, 1fr genişliğinde 4 eşit sütun oluşturur. )
grid-template: özelliği ise hem satır hem de sütun tanımlamalarını tek bir kısayol içinde yapmanızı sağlar.
|
Özellik
|
Tanım ve İşlevi
|
Kullanım Amacı (Basit ve Kritik)
|
|---|---|---|
|
display: grid
|
Bu, Grid düzenini başlatmak için zorunlu
olan kuraldır.
Bir öğeye uygulandığında, o öğeyi bir Grid Kapsayıcıya dönüştürür ve tüm doğrudan alt öğeler otomatik olarak Grid Öğelerine dönüşür. |
Grid'in temelini atar.
Bu kural, öğeleri Normal Akış'tan çıkarıp, tanımlanan satır ve sütun çizgileri arasına yerleştirilebilecekleri iki boyutlu bir alana taşır. |
|
grid-template-columns
|
Grid Kapsayıcısının dikey çizgilerini ve
bu çizgiler arasındaki sütunların
genişliklerini tanımlar.
|
Sütun yapısını kurar.
100px 1fr 2fr değeri, üç sütun yaratır. br Bu, sabit ( 100px ), esnek ( 1 kısım ) ve daha da esnek ( 2 kısım ) sütunların bir arada kullanılmasını sağlar. |
grid-template-rows
|
Grid Kapsayıcısının yatay çizgilerini ve
bu çizgiler arasındaki satırların
yüksekliklerini belirler.
|
Satır yapısını kurar.
auto 200px değeri, içeriği kadar yüksekliğe sahip dinamik bir satır ile sabit 200px yüksekliğe sahip statik bir satır yaratır. |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grid Kapsayıcı (Parent) Satır ve Sütun İnşası Örneği</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="grid-ana-kapsayici">
<header class="grid-oge header">Header (Auto Height)</header>
<aside class="grid-oge sidebar">Sidebar (200px)</aside>
<main class="grid-oge icerik">
<section class="kart">Kart 1 (1fr)</section>
<section class="kart">Kart 2 (1fr)</section>
<section class="kart">Kart 3 (1fr)</section>
<section class="kart">Kart 4 (1fr)</section>
</main>
<footer class="grid-oge footer">Footer (1fr)</footer>
</div>
</body>
</html>
/* style.css */
/* 1. Grid Kapsayıcıyı Başlatma */
.grid-ana-kapsayici {
display: grid;
/* 2. Sütun Yapısı (grid-template-columns) */
/* Sidebar sabit 200px olsun, kalan tüm alan içeriğin olsun (1fr) */
grid-template-columns: 200px 1fr;
/* 3. Satır Yapısı (grid-template-rows) */
/* Üst kısım içeriği kadar (auto), orta kısım geniş (50vh), alt kısım esnek (1fr) */
grid-template-rows: auto 50vh 1fr;
gap: 15px;
/* Hücreler arası boşluk */
padding: 15px;
background-color: #f1f5f9;
min-height: 100vh;
}
/* 4. İçerik Alanı İçin Alt Grid (repeat() kullanımı) */
.icerik {
display: grid;
/* repeat(4, 1fr) sayesinde 4 eşit sütun oluşturuyoruz */
grid-template-columns: repeat(4, 1fr);
gap: 10px;
background: #e2e8f0;
padding: 15px;
}
/* Görsel Süslemeler */
.grid-oge {
padding: 20px;
color: white;
font-weight: bold;
border-radius: 8px;
text-align: center;
}
.header {
background-color: #0f172a;
grid-column: span 2;
}
/* Üstü kapla */
.sidebar {
background-color: #3b82f6;
}
.footer {
background-color: #10b981;
grid-column: span 2;
}
/* Altı kapla */
.kart {
background: white;
color: #334155;
padding: 20px;
border-radius: 6px;
border: 1px solid #cbd5e1;
}
Boşluk, Oranlar ve Otomatik Akış Orta Seviye: Esneklik ve Boşluk Yönetimi
Grid Layout'un en büyük konfor özelliklerinden biri, hücreler arasındaki boşlukları yan etkisiz yöneten gap ( eski adıyla grid-gap ) özelliğidir.
Geleneksel yöntemlerde margin kullanmak, kapsayıcının sınırlarında istenmeyen boşluklar yaratırdı.
Çalışma Prensibi: gap özelliği, boşlukları sadece Grid hücreleri arasına, fakat dış sınırlara uygulamayacak şekilde uygular.
Kullanım: row-gap ( satırlar arası ), column-gap ( sütunlar arası ) veya kısayol olarak sadece gap kullanılır.
Grid-auto-flow: Otomatik Öğelerin Yerleşimi Grid'de bazı öğeleri manuel olarak konumlandırabiliriz, ancak kalan öğelerin ızgara içinde nasıl yerleşeceğini grid-auto-flow özelliği belirler.
Oransal Esneklik: minmax() Fonksiyonuminmax(min, max) fonksiyonu, Grid'i responsive tasarımın zirvesine taşıyan kritik bir araçtır.
Bu, bir satır veya sütunun hem minimum hem de maksimum boyutunu aynı anda belirlemeyi sağlar.
Kullanım: grid-template-columns: minmax(200px, 1fr); Bu tanım, o sütunun genişliğinin minimum 200 piksel olmasını, ancak kapsayıcıda yer varsa maksimum olarak kalan alanın tamamını kullanmasını garanti eder.
Bu, içerik sığmadığında taşmayı önler.
Auto-fit ve Auto-fill: Otomatik Responsive Izgaralarrepeat() fonksiyonu ile birleşen auto-fit ve auto-fill anahtar kelimeleri, Media Queries yazmadan tamamen esnek ve responsive ızgaralar oluşturmanın modern yoludur.
repeat(auto-fit, minmax(250px, 1fr)); Bu tek satır kod: Kapsayıcı küçülürken 250px'ten daha dar olamayan mümkün olduğu kadar çoksütun oluşturur.
Bu, Grid'i tarayıcının boyutuna göre kendiliğinden adapte etmesini sağlar.
|
Değer
|
Açıklama ve Yerleşim Yönü
|
|---|---|
|
row
(varsayılan)
|
Öğeler, satırlar boyunca soldan
sağa doğru yerleştirilir.
Grid'in varsayılan davranışıdır. |
|
column
|
Öğeler, sütunlar boyunca yukarıdan aşağıya
doğru
yerleştirilir.
Dikey yerleşim sağlar. |
|
dense
|
Grid'in bir sonraki öğeyi yerleştirirken,
kalan boşlukları doldurmak için
öğelerin sırasını değiştirmesine izin verir.
Bu, boş hücreleri en aza indirir. row dense veya column dense şeklinde de kullanılabilir. |
Grid Birimi: fr (Fraction Unit) Oransal Dağıtımın Matematiği
fr, CSS Grid Layout'a özgü bir göreceli uzunluk birimidir.
Bu birim, geleneksel piksel ( px ) veya yüzde ( %) gibi statik değerlerin aksine, kapsayıcıda tanımlanan diğer sabit boyutlu öğelere yer ayrıldıktan sonra kalan serbest boşluğun bir kısmını temsil eder.
Temel işlevi, öğelerin boyutlarını Flexbox'ın flex-grow mantığına benzer şekilde, matematiksel olarak orantılı hale getirmektir. Bu, Grid düzeninin ekran genişliği değişse bile tutarlı kalmasını sağlar.
Duyarlı Tasarımın Omurgasıfr birimi, responsive tasarımda manuel yüzde hesaplama yükünü ortadan kaldırır.
En önemlisi, ekran genişliği W değişse bile, 1fr ve 2fr sütunları arasındaki 1:2 oranı her zaman matematiksel olarak korunur.
Bu sistem, hem sabit boyutlu ( logo, kenar çubuğu ) hem de esnek boyutlu ( ana içerik ) öğelerin tek bir satırda, hatasız bir şekilde yan yana var olmasını sağlayan modern Flex-Rigid layout'ların temelini oluşturur.
|
Hesaplama Adımı
|
Açıklama ve Formül
|
|---|---|
|
1. Sabit Alana Öncelik
|
Grid, kapsayıcının toplam genişliğinden
W,
öncelikle sabit boyutlu öğelere yer ayırır S =
100px.
Bu alan, serbest bölüşümden hariç tutulur. |
|
2. Serbest Alanın Tespiti
|
Geriye kalan serbest alan R, şu formülle
bulunur: R = W - S
|
|
3. Oran Hesaplaması
|
Kalan R alan, 1fr ve 2fr olmak üzere toplam
1 + 2 = 3 orana bölünür.
|
|
4. Matematiksel Dağıtım
|
İkinci
sütun (1fr): Serbest alanın 1/3'ünü
alır (1/3 × R).
Üçüncü sütun (2fr): Serbest alanın 2/3'ünü alır (2/3 × R). |
|
Özellik
|
Tanım ve İşlevi
|
Akademik ve Pratik Kullanım
|
|---|---|---|
|
grid-auto-flow
|
Grid Öğelerinin, açıkça
konumlandırılmadığı durumlarda ızgaraya nasıl otomatik
olarak yerleşeceğini belirler.
|
Row
(Varsayılan): Öğeleri sırasıyla
satırları doldurarak
yerleştirir ve ihtiyaç oldukça yeni satırlar ekler (sayfayı dikeyde uzatır).
Column: Öğeleri sütunları doldurarak yerleştirir ve ihtiyaç oldukça yeni sütunlar ekler (sayfayı yatayda uzatır, dikkatli kullanılmalıdır). |
|
grid-auto-rows / grid-auto-columns
|
Otomatik akışla oluşturulan satır ve
sütunlara varsayılan bir boyut atar.
|
İçeriğin ötesine geçen yer tutucular için
veya düzene eklenecek içerik
miktarının belirsiz olduğu ( bir blog listesi )
durumlarda, otomatik
eklenen satırların sabit bir yüksekliğe ( 150px )
sahip olmasını garanti eder.
|
|
gap
(Boşluk Yönetimi) |
Flexbox'tan miras alınan bu özellik, Grid
Öğeleri arasındaki dikey ( row-gap ) ve yatay
( column-gap )
boşlukları yönetir.
|
Margin
Çakışması Yok: Grid sisteminde, öğe
aralarına margin
yerine gap kullanmak, çakışma ve dışa taşma ( bleed ) sorunlarını ortadan
kaldırır.
Boşluğu sadece öğelerin arasında tutan temiz ve öngörülebilir bir çözümdür. |
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Akıllı Medya Kütüphanesi</title>
</head>
<body>
<div class="medya-kutuphanesi">
<div class="medya-kart">1</div>
<div class="medya-kart">2</div>
<div class="medya-kart ozel-kart">3 (Dense Etkisi)</div>
<div class="medya-kart">4</div>
<div class="medya-kart">5</div>
<div class="medya-kart">6</div>
</div>
<div class="oran-bilgi">
<p>Pencereyi daraltın; kartlar <strong>200px</strong> altına düşmeden otomatik alt satıra geçer.</p>
</div>
</body>
</html>
/* style.css */
.medya-kutuphanesi {
display: grid;
/* 1. Auto-fit ve minmax(): Duyarlı Tasarımın Omurgası */
/* Sütunlar en az 200px olsun, yer varsa 1fr ile alanı paylaşsın. */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
/* 2. gap: Temiz Boşluk Yönetimi */
/* Satır ve sütunlar arası 20px tertemiz boşluk, dış sınırlara taşmaz */
gap: 20px;
/* 3. grid-auto-flow: Otomatik Akış Yönetimi */
/* 'dense' sayesinde büyük öğelerden kalan boşluklar otomatik doldurulur */
grid-auto-flow: row dense;
/* 4. grid-auto-rows: Otomatik eklenen satırların yüksekliği */
grid-auto-rows: 150px;
padding: 20px;
background: #f8fafc;
}
.medya-kart {
background-color: #3b82f6;
color: white;
display: flex;
align-items: center;
justify-content: center;
font-size: 1.5rem;
border-radius: 12px;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
/* Özel durum: Bazı kartların akışı bozduğu senaryo */
.ozel-kart {
background-color: #f59e0b;
grid-column: span 2; /* 2 sütun kaplar */
grid-row: span 2; /* 2 satır kaplar */
}
.oran-bilgi {
text-align: center;
padding: 20px;
font-family: sans-serif;
color: #475569;
}
Responsive Grid Tasarımı Gelişmiş Teknikler: Media Query Olmadan Akışkanlık
CSS Grid Layout'un en büyük mimari vaadi, geliştiricilerin sayfa düzeni için çok sayıda Media Query yazma zorunluluğunu ortadan kaldırmasıdır.
Grid, bileşenlerin tarayıcı genişliğine göre akışkan bir şekilde otomatik olarak sütun sayısını ve boyutlarını ayarlamasını sağlayan yerleşik mekanizmalara sahiptir.
Duyarlı Boyutlandırma FormülüResponsive Grid'in temel formülü, repeat() ve minmax() fonksiyonlarının birleşimidir:
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
Bu tek satır kod, aşağıdaki karmaşık işlevleri yerine getirir:
250px (minmax): Her sütunun minimum genişliğinin 250 piksel taşmasını önler.
1fr (minmax): 250px minimum boyutu sağlandıktan sonra, kalan boşluğun orantısal olarakboşluğun orantısal olarak dağıtılmasını sağlar.
auto-fit (repeat): 250px'ten daha dar olmayacak şekilde, kapsayıcıya sığabilen en fazla sayıda sütunu otomatik olarak oluşturur.
Boşluk Yönetimi: auto-fit ve auto-fillHer iki anahtar kelime de sütun sayısını dinamik olarak belirlerken, temel farkları boş hücreleri nasıl ele aldıklarıdır:
Auto-fill: Kapsayıcıya sığabilecek tüm olası sütunları oluşturur, içerik olsa da olmasa da ( boş hücreler yaratır ), bu, düzeni daha katı hale getirir.
Auto-fit: Yalnızca içerik içeren sütunları hesaba katar. Eğer boş sütunlar varsa, kalan alanı mevcut öğelere yayarak tüm alanı kullanır ve boş hücreleri sanal olarak "daraltır" ve genellikle <div class="grid-container"> kullanılırken tercih edilen yöntemdir.
Container Queries ile TamamlayıcılıkGrid'in bu otomatik akış yeteneği, modern @container sorgularıyla mükemmel bir uyum içindedir.
Grid, sayfanın genişliğine göre sütun sayısını otomatik olarak değiştirirken; Container Queries, bu her bir sütunun içindeki bileşenlerin
( ürün kartı ) kendi daralan boyutuna göre iç stilini ( font boyutu, resim konumu ) değiştirmesini sağlar.
Böylece CSS, tamamen bağlama duyarlı hale gelir.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Grid Alanları (Grid Areas) Özelliği Örneği </title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="sayfa-haritasi">
<div class="h">Header</div>
<div class="s">Sidebar</div>
<div class="i">İçerik</div>
<div class="f">Footer</div>
</div>
</body>
</html>
.sayfa-haritasi {
display: grid;
grid-template-areas:
"header header"
"sidebar icerik"
"footer footer";
gap: 10px;
}
.h {
grid-area: header;
background: #334155;
color: white;
padding: 10px;
}
.s {
grid-area: sidebar;
background: #94a3b8;
padding: 20px;
}
.i {
grid-area: icerik;
background: #f1f5f9;
padding: 20px;
}
.f {
grid-area: footer;
background: #1e293b;
color: white;
padding: 10px;
}
Grid Formülü: Akışkan Sütun Mimarisi repeat(auto-fit, minmax(min-size, 1fr)) Analizi
CSS Grid'de medya sorgularından kaçınarak tamamen duyarlı bir düzen oluşturmak için kullanılan en önemli ve güçlü sözdizimi şudur:
.grid-container {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr));
}
Bu kod, tarayıcıya şu karmaşık, ancak net talimatı verir:
" Mümkün olduğu kadar çok sütun yerleştir; ama her sütunun boyutu minimum 250px yap ve sığdıktan sonra kalan boşluğu eşit olarak paylaşmalılar."
Modüler Analiz: Her Parçanın GöreviBu sözdizimi, üç kritik işlevi birleştirerek çalışır:
Minmax(min, max): Bu, sütun genişliğinin okunabilirlik sınırını tanımlar.
250px sayesinde sütunlar, içeriklerinin güvenli bir şekilde görüntülenebileceği en dar sınıra sabitlenir.
1fr ise her zaman kalan boşluğu orantısal olarak paylaşma esnekliğini sağlar.
Auto-fit: Sütunların sayısını otomatik olarak hesaplayan bu anahtar kelime, kapsayıcıya sığabilecek maksimum sütun sayısını belirler.
Kalan boşluk, var olan sütunlara eşit olarak dağıtılır (1fr sayesinde).
Repeat(): Bu iki fonksiyonu bir araya getirerek, tarayıcının ekran genişlediğinde sütunları çoğaltmasını, daraldığında ise sayılarını azaltmasını sağlar.
Dinamik AkışkanlıkBu tek satırlık CSS kuralı, karmaşık JavaScript veya yüzlerce satırlık Media Query kodunun yerini alır.
Ekran genişlediğinde, sütunlar çoğalır.
Ekran daraldığında ve sütunlar 250px'in altına düşmek üzereyken, otomatik olarak alt satıra geçerler ( wrap ).
Bu, modern web uygulamalarında esnek içerik listeleri ( ürün kartları, galeri öğeleri vb. ) oluşturmak için en verimli ve en az bakım gerektiren yöntemdir.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Explicit ve Implicit Grid (Belirgin vs. Örtük) Yapısı Örneği</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="otomatik-izgara">
<div class="kart">Veri 1</div>
<div class="kart">Veri 2</div>
<div class="kart">Veri 3 (Otomatik Satır)</div>
</div>
</body>
</html>
.otomatik-izgara {
display: grid;
grid-template-columns: 1fr 1fr;
grid-auto-rows: 150px;
gap: 10px;
}
.kart {
background: #fbbf24;
padding: 20px;
border: 2px solid #d97706;
}
Repeat() Fonksiyonu: Akıllı Tekrarlama Kod Tekrarını Önleme ve Dinamik Sütun Sayısı
repeat() fonksiyonu, grid-template-columns veya grid-template-rows özelliklerinde aynı boyutta birden fazla sütun veya satır tanımlaması gerektiğinde, kod tekrarını önlemek amacıyla kullanılan Grid'e özgü bir araçtır.
Örnek (Sabit Tekrar): grid-template-columns: repeat(4, 1fr); ifadesi, kapsayıcıda eşit genişlikte dört ayrı sütun tanımlar.
Bu, 1fr 1fr 1fr 1fr yazmaktan çok daha temiz, okunaklı ve sürdürülebilirdir.
Duyarlılık Kontrolü: auto-fill ve auto-fitrepeat() fonksiyonunun asıl gücü, tekrar sayısını sabit bir sayı yerine, duyarlı tasarımlar için özel olarak geliştirilmiş dinamik anahtar kelimelerle kontrol etme yeteneğidir.
Çalışma Felsefesi: auto-fill ve auto-fit kullanıldığında, tarayıcıya "Kapsayıcıya sığabildiği kadar çok sütun/satır yerleştir" talimatı verilir.
Bu, Grid'in ekran genişliği ne olursa olsun, sütun sayısını otomatik olarak ayarlamasını sağlayarak, geliştiricinin Media Query yazma zorunluluğunu büyük ölçüde ortadan kaldırır.
Kod Kalitesi ve Sürdürülebilirlikrepeat() fonksiyonu sadece bir kısayol değildir; aynı zamanda Grid mimarisinin programatik doğasının bir parçasıdır.
Geleneksel olarak, 12 sütunlu bir grid yapısı oluşturmak için 12 kez 8.33% yazmak veya her satır için ayrı ayrı tanımlar yapmak gerekirdi.
repeat(12, 1fr) ise hem kodun daha kısa hem de okunaklı olmasını sağlar.
Ayrıca, sütun sayısını değiştirmek gerektiğinde, sadece tek bir rakamı güncellemek yeterli olur.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Başlık</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="vitrin-konteyner">
<header class="vitrin-baslik">Haftanın Trendleri</header>
<div class="urun-kart">Ürün 1</div>
<div class="urun-kart">Ürün 2</div>
<div class="urun-kart">Ürün 3</div>
<div class="urun-kart">Ürün 4</div>
<div class="urun-kart">Ürün 5</div>
<div class="urun-kart">Ürün 6</div>
</div>
<div class="kontrol-paneli">
<p>Ekranı daraltın: <code>auto-fill</code> sayesinde kartlar sığmadıkça otomatik olarak alt satıra kayar.</p>
</div>
</body>
</html>
/* style.css */
.vitrin-konteyner {
display: grid;
/* 1. Programatik 12 Sütunlu Yapı (Sürdürülebilirlik) */
/* Eskiden 12 kez %8.33 yazılırdı, şimdi tek satır: */
grid-template-columns: repeat(12, 1fr);
/* 2. Dinamik Tekrarlama (Duyarlılık Kontrolü) */
/* Ürün kartları için: Minimum 250px olsun, sığdığı kadar sütun oluştur */
/* Not: Gerçek projelerde genellikle alttaki satır tercih edilir: */
grid-template-columns: repeat(auto-fill, minmax(250px, 1fr));
gap: 15px;
padding: 20px;
background-color: #fdfdfd;
}
.vitrin-baslik {
/* 12 sütunlu yapıda tüm satırı kaplamasını sağlar */
grid-column: 1 / -1;
background: #1e293b;
color: white;
padding: 15px;
text-align: center;
border-radius: 8px;
font-weight: bold;
}
.urun-kart {
background: #ffffff;
border: 1px solid #e2e8f0;
height: 300px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 10px;
transition: transform 0.3s, box-shadow 0.3s;
color: #475569;
font-weight: 500;
}
.urun-kart:hover {
transform: translateY(-5px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
border-color: #3b82f6;
}
.kontrol-paneli {
text-align: center;
padding: 20px;
color: #64748b;
font-size: 0.9rem;
}
Minmax() Fonksiyonu: Duyarlılık Limitleri Kontrollü Esneklik: Minimum ve Maksimum Değerler Sayısı
minmax(min, max) fonksiyonundaki ilk argüman, Grid hücresinin alabileceği minimum boyutu tanımlar
( minmax(250px, 1fr) ).
İşlevi: Bu, özellikle mobil cihazlarda metin veya kartların aşırı daralarak okunaksız hale gelmesini önleyen kritik bir erişilebilirlik ve okunabilirlik kuralıdır.
Tarayıcı ne kadar daralırsa daralsın, sütun genişliği belirlenen alt sınırın altına inmeyecektir.
Max Değeri: Oransal Paylaşımİkinci argüman, sütunun alabileceği maksimum boyutu veya oranı belirler.
Bu değer genellikle fr birimiyle kullanılır ve bu, sütunların kalan tüm serbest alanı eşit olarak paylaşmasını emreder.
Önemi: Bu, sütunların her zaman esnek kalmasını ve ekran büyüdükçe orantılı olarak genişlemesini sağlar, ancak asla gereğinden fazla yer kaplamaz (veya gereğinden fazla boşluk bırakmaz).
Duyarlı Tasarımdaki Kritik Rolüminmax() fonksiyonu, Grid'in en önemli duyarlılık kuralının temelini oluşturur:
"Gerektiği zaman esne, ama asla belirlenen limitleri ihlal etme."
Bu tek fonksiyon, karmaşık medya sorgularına ihtiyaç duymadan, tek bir kural bloğu içinde tam bir duyarlı sütun sistemi oluşturulmasına olanak tanır.
Bu, Grid'i sayfa seviyesindeki yerleşimler için Flexbox'tan çok daha güçlü ve öngörülebilir bir araç yapar.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Hizmet Kartları / Özellikler Paneli</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="ozellikler-grid">
<div class="ozellik-kart">
<i class="fas fa-rocket"></i>
<h3>Hızlı Performans</h3>
<p>Sistemimiz en yüksek hız limitlerini zorlamak için tasarlandı.</p>
</div>
<div class="ozellik-kart">
<i class="fas fa-shield-alt"></i>
<h3>Güvenli Altyapı</h3>
<p>Verileriniz uçtan uca şifreleme ile koruma altındadır.</p>
</div>
<div class="ozellik-kart">
<i class="fas fa-code"></i>
<h3>Temiz Kod</h3>
<p>En modern standartlara uygun, sürdürülebilir mimari.</p>
</div>
</div>
<div class="limit-test-alani">
<p>Tarayıcıyı daraltın: Kartlar <strong>280px</strong> sınırına dayandığında otomatik alt satıra geçerler.</p>
</div>
</body>
</html>
/* style.css */
.ozellikler-grid {
display: grid;
/* 1. minmax() Kullanımı: Duyarlılık Limitleri */
/* Min: 280px (Okunabilirlik sınırı), Max: 1fr (Kalan tüm alan) */
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 25px;
padding: 30px;
background-color: #f1f5f9;
}
.ozellik-kart {
background: #ffffff;
padding: 30px;
border-radius: 15px;
text-align: center;
border: 2px solid transparent;
transition: all 0.3s ease;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
}
/* Hover ile görsel geri bildirim */
.ozellik-kart:hover {
border-color: #3b82f6;
transform: scale(1.02);
}
.ozellik-kart i {
font-size: 2.5rem;
color: #3b82f6;
margin-bottom: 15px;
}
.ozellik-kart h3 {
margin: 10px 0;
color: #1e293b;
}
.ozellik-kart p {
color: #64748b;
font-size: 0.95rem;
line-height: 1.6; /* Okunabilirlik için satır aralığı */
}
.limit-test-alani {
text-align: center;
margin-top: 20px;
color: #94a3b8;
font-style: italic;
}
Auto-fit vs. auto-fill Farkı Akademik Ayrım: Boşluk Yönetimi ve Kapasite
Hem auto-fit hem de auto-fill, repeat() fonksiyonu içinde kullanılarak Grid'in dinamik yerleştirme mantığını yönetir.
İkisi de ortak olarak kapsayıcıya sığabileceği kadar çok sütun yerleştirmeyi hedefler.
Aralarındaki temel fark, Grid Kapsayıcının son satırında veya sırasında boş hücreler kaldığında ortaya çıkar.
Bu, Grid'in izleri nasıl saydığı ve kalan boş alanı nasıl dağıttığıyla ilgilidir.
Auto-fill: Boşlukları Koruauto-fill anahtar kelimesi, ızgarada içerik olsun ya da olmasın, kapsayıcıya sığabilecek maksimum iz sayısını hesaplar.
Davranış: Son sırada içerik eksikse ( 5 öğe var ama 6 sütun sığıyor ), auto-fill, o boş hücreleri oluşturur ve görünür bir boşluk olarak korur ve bu boş hücreler, öğe yerleştirme amaçları için hala vardır ve diğer öğelerin genişlemesini engeller.
Auto-fit: Kalan Alanı Yayauto-fit ise, tarayıcıya sadece aktif, yani içerik içeren Grid öğelerini hesaba katma talimatı verir.
Davranış: Son sırada boş hücreler kaldığında, auto-fit bu boş izleri sıfır genişliğe düşürür.
Böylece kalan boş alan, mevcut öğeler arasında eşit olarak dağıtılır.
Bu, öğelerin tüm kapsayıcı genişliğini kaplayarak genişlemesini sağlar.
Mimari Karar: Hangi Senaryoda Hangisi?Auto-fit, genellikle tüm kapsayıcı alanın kullanılmasını istediğimiz, dinamik içerik listeleri ( Ürün Kartları, Galeri ) oluştururken tercih edilir.
Amacı, içerik öğelerinin kendilerini otomatik olarak yaymasını sağlamaktır.
Auto-fill ise, Grid'in belirli bir sayıda boş izi korumasını istediğimiz ve bu boşlukları daha sonra manuel olarak dolduracağımız veya sadece belli sayıda iz olmasını garantilemek istediğimiz durumlarda kullanılır.
Ancak çoğu Responsive tasarım senaryosunda auto-fit daha yaygındır.
|
Anahtar Kelime
|
Tanım ve İşlevi
|
Etkisi ve Kullanım Amacı
|
|---|---|---|
|
auto-fill
|
Kapsayıcıda kaç tane sütun sığabileceğini hesaplar ve o kadar sütun hücresi
oluşturur.
|
Yer Tutucudur: Son satırda doldurulacak
öğe kalmasa bile, tarayıcı boş sütunları tutar ve alanlarını işgal eder.
Daha sonra dinamik olarak öğe eklenmesi beklenen yerlerde kullanılır. |
|
auto-fit
|
Tıpkı auto-fill gibi sütunları hesaplar,
ancak son satırda boş kalan sütunları
daraltır ve o alanı, diğer aktif sütunların genişlemesi için serbest bırakır.
|
Daha Duyarlı: Genellikle tercih edilen
yöntemdir.
Tüm aktif öğelerin, kalan alanı eşit olarak paylaşmasını ve genişlemesini sağlar. Boşlukları gereksiz yere tutmaz. |
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Dinamik Kategori Paneli vs. Esnek Portföy</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="test-konteyner">
<h3>1. Auto-Fill (Boşlukları Koru)</h3>
<div class="grid-kapsayici fill">
<div class="oge">1</div>
<div class="oge">2</div>
<div class="oge">3</div>
</div>
<h3>2. Auto-Fit (Kalan Alanı Yay)</h3>
<div class="grid-kapsayici fit">
<div class="oge">1</div>
<div class="oge">2</div>
<div class="oge">3</div>
</div>
</div>
<p class="analiz-notu">
Not: Her iki grid de 4 sütun alabilecek kapasitededir ancak sadece 3 öğe eklenmiştir.
</p>
</body>
</html>
/* style.css */
.grid-kapsayici {
display: grid;
gap: 15px;
padding: 15px;
background-color: #f1f5f9;
border: 2px dashed #cbd5e1;
margin-bottom: 30px;
}
/* AUTO-FILL: Sığabildiği kadar hayali sütun oluşturur ve yerlerini korur */
.fill {
grid-template-columns: repeat(auto-fill, minmax(150px, 1fr));
}
/* AUTO-FIT: Boş kalan sütunları daraltır ve alanı mevcut öğelere dağıtır */
.fit {
grid-template-columns: repeat(auto-fit, minmax(150px, 1fr));
}
.oge {
background-color: #3b82f6;
color: white;
height: 100px;
display: flex;
align-items: center;
justify-content: center;
font-weight: bold;
border-radius: 8px;
}
.test-konteyner h3 {
font-family: sans-serif;
color: #1e293b;
margin-bottom: 10px;
}
.analiz-notu {
text-align: center;
font-family: monospace;
background: #fffbeb;
padding: 10px;
border: 1px solid #fef3c7;
}
Konumlandırma ve Alan İsimlendirme İleri Seviye: Görsel Tasarımın CSS'e Aktarılması
Bu seviyedeki Grid özellikleri, Grid Layout'un asıl gücünü, yani iki boyutlu, karmaşık sayfa iskeletini görsel olarak kodlama yeteneğini ortaya çıkarır.
Grid, geleneksel HTML akışındaki sıralamaya (Source Order) bağımlı kalmadan, öğeleri ızgaranın herhangi bir hücresine veya alanına hassas koordinatlarla yerleştirmeyi sağlar.
Bu, özellikle erişilebilirlik veya SEO amaçlı olarak HTML sırasını korurken, görsel düzeni tamamen değiştirmek gerektiğinde kritik öneme sahiptir.
Çizgi Bazlı Yerleşim (Line-Based Placement)Grid'in en temel konumlandırma yöntemi, oluşturulan sanal çizgileri (Line Numbers) kullanmaktır.
Bu, öğeyi yerleştirmek istediğimiz satır ve sütun çizgilerinin başlangıç ve bitiş koordinatlarını tanımlamayı içerir.
Temel Özellikler: grid-column-start / grid-column-end: Öğenin kaçıncı sütun çizgisinden başlayıp, kaçıncı çizgiye kadar uzanacağını belirler. grid-row-start / grid-row-end: Aynı işlemi satırlar için yapar.
Kısayol: grid-column: 1 / span 3; ifadesi, öğenin 1. çizgiden başlayıp, 3 sütun boyunca uzanmasını söyler. Bu, belirli bir genişliği manuel olarak ayarlamaktan daha hassas bir yöntemdir.
grid-template-areas: Sayfa PlanıGrid'in en okunabilir ve en sürdürülebilir özelliği, grid-template-areas ile sayfa düzenini bir harita gibi çizme yeteneğidir.
Bu, bir web sayfasının ana düzenini ( Header, Sidebar, Footer ) kağıt üzerinde çizilmiş bir plan gibi CSS kodunda tanımlamayı mümkün kılar.
.container {
grid-template-areas:
"header header header"
"sidebar main main"
"footer footer footer";
}
Nasıl Kullanılır: Kapsayıcıda alanlar tanımlandıktan sonra, HTML öğeleri (.header, .sidebar vb.) doğrudan bu alana atanır:
grid-area: header;.
Bu, kodun okunabilirliğini ve karmaşık yönetilebilirlik seviyesini radikal bir şekilde artırır.
Grid Öğelerinin Konumlandırılması Çizgi Bazlı Yerleşim ve Koordinat Sistemi
Grid Layout, Flexbox'tan farklı olarak, düzeni doğrudan izler yerine bu izleri çevreleyen çizgilerle tanımlar.
Grid Kapsayıcıda kaç tane sütun veya satır tanımlarsanız, bu alanları çevreleyen o kadar çizgi numarası oluşur.
Örneğin: 4 sütun tanımlarsanız, 1'den 5'e kadar numaralandırılmış 5 dikey çizgi oluşur.
Öğeler, bu çizgi numaralarına göre yerleştirilir ve yayıldıkları alan ( span) belirlenir.
Bu, öğenin konumunu, sabit bir koordinat sistemi kullanarak tanımlamayı sağlar.
Her Grid öğesi, ait olduğu Kapsayıcı içinde konumunu ve kapladığı alanı dört temel özellik ile tanımlar:
Span Anahtar Kelimesi ve Negatif ÇizgilerKısayollar: grid-column ve grid-row özellikleri, start ve end değerlerini tek bir satırda, / ile ayırarak birleştirmeyi sağlar.
grid-column: 2 / 5; ( 2. çizgiden başla, 5. çizgide bitir. )
Span ile Uzunluk Belirtme: Bitiş çizgisini net bir numara yerine, başlangıç noktasından kaç iz boyunca uzayacağını belirtmek için span anahtar kelimesi kullanılır.
grid-row: 3 / span 2; ( 3. çizgiden başla ve 2 satır aşağı yayıl. )
Negatif Çizgiler: Grid çizgileri, kutunun sağ ve alt sınırlarından geriye doğru saymak için negatif değerler de alabilir ( -1, en sondaki çizgiyi temsil eder).
Bu, dinamik genişliğe sahip kapsayıcılarda esneklik sağlar.
|
Özellik
|
Tanım ve İşlevi
|
Akademik ve İleri Kullanım
|
|---|---|---|
|
grid-column-start / grid-column-end
|
Öğenin yatayda ( sütunda
) başlayacağı ve biteceği çizgi numaralarını belirler.
|
Spanning (Yayılma): Bir öğeyi birden fazla
sütuna yaymak için kullanılır.
( grid-column-start: 1; grid-column-end: 4; ile öğe 3 sütun kaplar) |
|
grid-row-start / grid-row-end
|
Öğenin dikeyde ( satırda
) başlayacağı ve biteceği çizgi numaralarını belirler.
|
Öğeyi birden fazla satıra yayarak, yatay
ve dikey akışı birbirinden ayırırız
. |
|
grid-column / grid-row
(Kısayol) |
Başlangıç ve bitiş çizgilerini tek bir
satırda, / işaretiyle ayırarak tanımlar
( grid-column: 2 / 5; ). |
|
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Haber Portalı / Magazin Layout</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="magazin-iskeleti">
<header class="bolum-header">Günün Başlıkları</header>
<aside class="bolum-sidebar">Popüler Haberler</aside>
<main class="bolum-ana">
<article class="manset">Ana Manşet (Geniş Alan)</article>
<article class="alt-haber">Kısa Haber 1</article>
<article class="alt-haber">Kısa Haber 2</article>
</main>
<footer class="bolum-footer">2026 Haber Ajansı</footer>
</div>
</body>
</html>
/* style.css */
.magazin-iskeleti {
display: grid;
/* 1. grid-template-areas: Sayfa Planını Görsel Olarak Çizme */
grid-template-areas:
"ust ust ust"
"yan ana ana"
"alt alt alt";
/* 2. Çizgi Bazlı Tanımlama (Line-Based) */
grid-template-columns: 250px 1fr 1fr;
grid-template-rows: auto 1fr auto;
gap: 20px;
min-height: 100vh;
padding: 20px;
background-color: #f8fafc;
}
/* Alan Atamaları */
.bolum-header { grid-area: ust; background: #0f172a; color: white; padding: 20px; }
.bolum-sidebar { grid-area: yan; background: #3b82f6; color: white; padding: 20px; }
.bolum-ana { grid-area: ana; display: grid; grid-template-columns: repeat(2, 1fr); gap: 15px; }
.bolum-footer { grid-area: alt; background: #1e293b; color: white; padding: 15px; text-align: center; }
/* 3. Çizgi Bazlı Yerleşim ve Span Kullanımı */
.manset {
/* 1. sütun çizgisinden başla, sona kadar (-1) git */
grid-column: 1 / -1;
background: #ffffff;
border-left: 5px solid #ef4444;
padding: 40px;
font-size: 1.5rem;
font-weight: bold;
box-shadow: 0 4px 6px -1px rgba(0,0,0,0.1);
}
.alt-haber {
/* Span ile 1 birimlik yer kapla (Varsayılan) */
background: #ffffff;
padding: 20px;
border: 1px solid #e2e8f0;
border-radius: 8px;
}
Grid vs. Flexbox (İki Boyutlu Paradigma) Akademik Fark: 1D Mikro Düzen vs. 2D Makro Düzen
Grid ve Flexbox, her ikisi de modern düzen sistemi olsa da, birbirinin yerine geçmezler; aksine farklı ölçeklerdeki düzenleme sorunlarını çözmek için tasarlanmışlardır.
İkisini bir arada kullanmak, CSS'te en verimli ve güçlü mimariyi oluşturur.
Grid: Sayfa Planını ÇizmekGrid, düzeni aynı anda hem satırlar hem de sütunlar üzerinde kontrol etme felsefesine dayanır, bu, tüm yerleşim mantığını ebeveyn öğeye yığar.
Kullanım Amacı: Sayfanın ana iskeletini ve makro düzenini ( Header, Sidebar, Footer, Ana İçerik alanlarının konumu ) tasarlamak için kullanılır.
Geliştiricinin amacı, içeriği yerleştireceği sanal bir ızgara yapısı oluşturmaktır.
Flexbox: Bileşen İçini YönetmekFlexbox, düzeni ya sadece bir satır ( row ) ya da sadece bir sütun ( column ) üzerinde çalıştırır.
Esas amacı, öğeler arasındaki boşluğu adil ve esnek bir şekilde dağıtmaktır.
Kullanım Amacı: Tek bir Grid hücresi veya bir bileşenin içindeki öğeleri ( bir kartın altındaki iki düğme grubunu yan yana hizalamak, bir navigasyon çubuğundaki linkleri eşit boşlukla yaymak veya dikey merkezleme yapmak ) düzenlemek için kullanılır.
Katmanlı Mimari (Layout Synergy)Geliştiriciler, günümüzde bu iki sistemi katmanlı bir mimari içinde entegre eder:
1. Katman (Makro): Sayfanın ana çatısı ( genel satır ve sütun yapısı ) Grid ile kurulur.
2. Katman (Mikro): Bu ana çatının her bir hücresinin içindeki içeriğin hizalanması ve dağıtımı Flexbox ile yapılır.
Bu yaklaşım, sadece verimli değil, aynı zamanda son derece esnek ve sürdürülebilir bir düzenleme mimarisi oluşturur.
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Modern Uygulama Arayüzü (App Shell & Dashboard)</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="app-konteyner">
<header class="app-header">
<div class="brand">
<i class="fas fa-grip-lines"></i> <span>FlexGrid App</span>
</div>
<nav class="top-nav">
<a href="#" class="nav-item">
<i class="fas fa-home"></i> Dashboard
</a>
<a href="#" class="nav-item">
<i class="fas fa-project-diagram"></i> Projeler
</a>
<div class="user-profil">
<img src="avatar.png" alt="Profil" class="user-avatar">
<span class="user-name">Can Yılmaz</span>
<i class="fas fa-chevron-down"></i>
</div>
</nav>
</header>
<aside class="app-sidebar">
<ul class="side-menu">
<li><a href="#" class="active"><i class="fas fa-chart-line"></i> Genel Bakış</a></li>
<li><a href="#"><i class="fas fa-tasks"></i> Görevler</a></li>
<li><a href="#"><i class="fas fa-envelope"></i> Mesajlar</a></li>
<li class="menu-baslik">Yönetim</li>
<li><a href="#"><i class="fas fa-users"></i> Ekip</a></li>
<li><a href="#"><i class="fas fa-cogs"></i> Ayarlar</a></li>
</ul>
</aside>
<main class="app-main">
<div class="ozet-kart">
<header class="kart-header">
<h3>Hızlı Özet</h3>
<span class="kart-tarih">Bugün, 21 Mart</span>
</header>
<div class="kart-icerik">
<p>Proje durumu: <strong>Aktif</strong>. Son güncelleme 15 dakika önce yapıldı.</p>
</div>
<footer class="kart-footer">
<button class="btn btn-secondary">Reddet</button>
<button class="btn btn-primary">Onayla</button>
</footer>
</div>
</main>
</div>
</body>
</html>
/* style.css */
/* Temel Sıfırlama ve Font */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Inter', system-ui, sans-serif;
background-color: #f1f5f9;
color: #1e293b;
}
/* 1. KATMAN (MAKRO): Uygulama Şablonu (GRID) */
.app-konteyner {
display: grid;
/* İskelet planı: Header tam genişlik, Sidebar sabit, İçerik esnek */
grid-template-areas:
"header header"
"sidebar main";
grid-template-columns: 260px 1fr;
grid-template-rows: 80px 1fr;
min-height: 100vh;
}
/* --- HEADER --- */
.app-header {
grid-area: header;
background: #0f172a;
/* Derin mavi-siyah */
color: white;
padding: 0 30px;
display: flex;
justify-content: space-between;
align-items: center;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1);
z-index: 10;
}
.brand {
display: flex;
align-items: center;
gap: 15px;
font-size: 1.4rem;
font-weight: bold;
letter-spacing: -0.5px;
}
.brand i {
color: #3b82f6;
}
/* Mavi vurgulu ikon */
.top-nav {
display: flex;
align-items: center;
gap: 25px;
}
.nav-item {
color: #e2e8f0;
text-decoration: none;
font-size: 1rem;
display: flex;
align-items: center;
gap: 10px;
transition: color 0.3s;
}
.nav-item:hover {
color: #fff;
}
.user-profil {
display: flex;
align-items: center;
gap: 12px;
padding: 8px 15px;
background: rgba(255, 255, 255, 0.05);
border-radius: 50px;
cursor: pointer;
}
.user-avatar {
width: 35px;
height: 35px;
border-radius: 50%;
border: 2px solid rgba(255, 255, 255, 0.2);
}
.user-name {
font-weight: 500;
}
/* --- SIDEBAR --- */
.app-sidebar {
grid-area: sidebar;
background: #ffffff;
border-right: 1px solid #e2e8f0;
padding: 30px 20px;
}
.side-menu {
list-style: none;
}
.side-menu li {
margin-bottom: 8px;
}
.side-menu li a {
color: #475569;
text-decoration: none;
display: flex;
align-items: center;
gap: 15px;
padding: 12px 18px;
border-radius: 8px;
font-weight: 500;
transition: all 0.2s ease;
}
.side-menu li a:hover,
.side-menu li a.active {
background-color: #eff6ff;
color: #2563eb;
}
.side-menu li a.active i {
color: #2563eb;
}
.side-menu .menu-baslik {
color: #94a3b8;
font-size: 0.8rem;
text-transform: uppercase;
letter-spacing: 1px;
margin-top: 25px;
margin-bottom: 10px;
font-weight: bold;
}
/* --- MAIN & KART --- */
.app-main {
grid-area: main;
padding: 40px;
}
.ozet-kart {
background: white;
padding: 30px;
border-radius: 15px;
width: 100%;
max-width: 450px;
display: flex;
flex-direction: column;
gap: 20px;
border: 1px solid #e2e8f0;
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.05);
}
.kart-header {
display: flex;
justify-content: space-between;
align-items: center;
border-bottom: 1px solid #e2e8f0;
padding-bottom: 15px;
}
.kart-header h3 {
font-size: 1.3rem;
color: #1e293b;
font-weight: 600;
}
.kart-tarih {
color: #94a3b8;
font-size: 0.9rem;
}
.kart-icerik p {
color: #64748b;
line-height: 1.6;
font-size: 0.95rem;
}
.kart-footer {
display: flex;
justify-content: flex-end;
gap: 12px;
}
/* Temel Buton Stilleri */
.btn {
border: none;
padding: 10px 20px;
border-radius: 8px;
cursor: pointer;
font-weight: bold;
font-size: 0.9rem;
transition: background-color 0.3s ease;
}
.btn-primary {
background: #3b82f6;
color: white;
}
.btn-primary:hover {
background: #2563eb;
}
.btn-secondary {
background: #f1f5f9;
color: #475569;
}
.btn-secondary:hover {
background: #e2e8f0;
}
Grid Area İsimlendirme Görsel Planlama: grid-area ve grid-template-areas
Grid'in en güçlü ve okunaklı özelliklerinden biri, sayfanın ana düzenini, satır ve sütun numaraları ( grid-column: 1 / 4; ) yerine anlamlı isimlerle tanımlama yeteneğidir.
Bu yöntem, geliştiricilerin bir sayfanın temel düzenini, tıpkı kağıt üzerinde bir görsel plan çizer gibi, doğrudan CSS kodu içinde tanımlamasına olanak tanır.
Bu sayede, karmaşık çizgi numaralarını akılda tutmak yerine, kodun yapısı görsel bir haritaya dönüşür.
Grid-template-areas: Alanların ŞekillendirilmesiAlan isimlendirme süreci, Grid Kapsayıcıda grid-template-areas özelliği ile başlar.
Bu, sayfanın düzenini dize (string) olarak tanımlar.
Her dize bir satırı, dize içindeki kelimeler ise sütunları temsil eder.
.page-layout {
display: grid;
grid-template-columns: 200px 1fr 1fr; /* Üç Sütun */
grid-template-areas:
"header header header" /* Birinci Satır */
"nav main main" /* İkinci Satır */
"nav ad ad" /* Üçüncü Satır */
"footer footer footer"; /* Dördüncü Satır */
}
Not: Aynı alan adını yan yana veya alt alta tekrarlamak ( "header header header"), o alanın birden fazla hücreyi birleştirmesini ( merge ) sağlar, nokta (.) kullanmak, o hücrenin boş kalmasını sağlar.
grid-area: Öğeyi Haritaya YerleştirmeKapsayıcıda alanlar tanımlandıktan sonra, ilgili Grid öğeleri (.header, .nav vb.), grid-area özelliği ile bu alanlara atanır.
.header {
grid-area: header; /* Üç sütunu kaplar */
}
.navigation {
grid-area: nav; /* İki satırı kaplar */
}
Bu yaklaşımın en büyük avantajı, düzenin değiştirilmesinin son derece kolay ve güvenli hale gelmesidir.
Örneğin: Kenar çubuğunu ( nav ) soldan sağa almak için, geliştiricinin yapması gereken tek şey Grid tanımındaki dizeyi güncellemektir:
/* Soldan Sağa Değişiklik */
grid-template-areas:
"header header header"
"main main nav" /* Navigasyonu sağa taşıdık */
"ad ad nav"
"footer footer footer";
Bu işlem, HTML yapısına dokunmadan, sadece CSS'teki görsel harita tanımını güncelleyerek anında gerçekleştirilir.
Kapsayıcıda Alan Tanımlama grid-template-areas: Düzenleme Haritası Oluşturma
grid-template-areas kuralı , Grid Kapsayıcıda ( Parent ) tanımlanır ve tüm ızgaranın haritasını, satır ve sütun çizgileri yerine anlamsal isimlerle çıkarır.
Felsefesi: Geliştiriciler, bu kuralı kullanarak sayfanın ana düzenini, kod satırları değil, görsel bir şema olarak tasarlar.
Bu, düzenin nasıl göründüğünü anlamak için Grid tanımına bakmanın, sayfanın ortasındaki bir kod bloğuna bakmaya kıyasla çok daha hızlı ve sezgisel olmasını sağlar.
Satır ve Sütun TemsiliKural, tırnak işaretleri içinde birden fazla dizeden (string) oluşur.
Her dize ızgaranın yataydaki bir satırını, dize içindeki boşlukla ayrılmış her isim ise bir sütun hücresini temsil eder.
.page-grid {
grid-template-areas:
"header header header" /* 1. Satır: Tamamen header */
"sidebar content content" /* 2. Satır: sidebar ve iki içerik sütunu */
"footer footer footer"; /* 3. Satır: Tamamen footer */
}
Ön Koşul: grid-template-areas kuralını kullanabilmek için, önce kaç sütun olacağını grid-template-columns ile tanımlamak gerekir.
Yukarıdaki örnekte, her satırda üç isim ( veya kelime ) olduğu için, Grid'in üç sütunlu olması beklenir.
Hücre Birleştirme (Merging) MekanizmasıAlan Birleştirme (Merging): Bu kuralın en önemli özelliği, aynı ismin yan yana ( veya alt alta ) tekrarının, o hücrelerin birleşerek tek bir büyük bölgeyi tanımlamasını sağlamasıdır.
Örneğin: "header header header" kuralı, üç sütunun yatayda birleşerek header adlı tek bir alanı oluşturmasını emreder.
Boşluk Bırakma: Bir hücrenin boş kalması ve hiçbir alana atanmaması isteniyorsa, o hücreye nokta işareti (.) konur.
Bu, planlamayı daha da esnek hale getirir. "content . sidebar".
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Video İzleme Platformu Arayüzü</title>
<link rel="stylesheet" href="style.css?v=1.0.150">
</head>
<body>
<div class="video-platform-grid">
<header class="ust-bilgi">
<div class="logo-alan">
<i class="fab fa-youtube" style="color: #ff0000; font-size: 1.8rem;"></i>
<span>VideoStream</span>
</div>
<div class="arama-bar">
<input type="text" placeholder="Ara...">
<button><i class="fas fa-search"></i></button>
</div>
</header>
<nav class="yan-menu">
<div class="menu-grup">
<a href="#" class="aktif"><i class="fas fa-home"></i> Ana Sayfa</a>
<a href="#"><i class="fas fa-bolt"></i> Shorts</a>
<a href="#"><i class="fas fa-layer-group"></i> Abonelikler</a>
</div>
<hr>
<div class="menu-grup">
<span class="grup-baslik">Siz</span>
<a href="#"><i class="fas fa-history"></i> Geçmiş</a>
<a href="#"><i class="fas fa-clock"></i> Daha sonra izle</a>
</div>
</nav>
<main class="video-alani">
<div class="video-player">
<i class="fas fa-play-circle"></i>
</div>
<div class="video-detay">
<h1>CSS Grid ile Görsel Haritalama Dersi</h1>
<div class="video-stats">1.2 Mn görüntüleme • 2 saat önce</div>
</div>
</main>
<aside class="reklam-alani">
<div class="reklam-kart">
<span class="reklam-etiket">Sponsorlu</span>
<img src="example.png" alt="Ad">
<p>Modern Tasarım Kursu %50 İndirimle!</p>
</div>
</aside>
<footer class="alt-bilgi">
<div class="footer-links">
<a href="#">Hakkında</a> • <a href="#">Telif Hakkı</a> • <a href="#">Gizlilik</a>
</div>
</footer>
</div>
</body>
</html>
/* style.css */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
font-family: 'Segoe UI', sans-serif;
}
.video-platform-grid {
display: grid;
gap: 0;
/* Alanlar arası boşluğu sıfırlayıp borderlar ile ayıracağız, daha modern durur */
min-height: 100vh;
background-color: #ffffff;
/* 1. İSKELET TANIMI (GRID) */
grid-template-columns: 240px 1fr 300px;
grid-template-rows: 60px 1fr 50px;
grid-template-areas:
"header header header"
"nav video ads"
"footer footer footer";
}
/* 2. ALAN ATAMALARI */
.ust-bilgi {
grid-area: header;
border-bottom: 1px solid #e5e5e5;
}
.yan-menu {
grid-area: nav;
border-right: 1px solid #e5e5e5;
}
.video-alani {
grid-area: video;
background: #f9f9f9;
padding: 24px;
}
.reklam-alani {
grid-area: ads;
padding: 24px;
border-left: 1px solid #e5e5e5;
}
.alt-bilgi {
grid-area: footer;
border-top: 1px solid #e5e5e5;
background: #fff;
}
/* 3. MODERN TASARIM DOKUNUŞLARI (ORTA SEVİYE) */
/* Header Tasarımı */
.ust-bilgi {
display: flex;
align-items: center;
justify-content: space-between;
padding: 0 20px;
}
.logo-alan {
display: flex;
align-items: center;
gap: 10px;
font-weight: bold;
font-size: 1.2rem;
cursor: pointer;
}
.arama-bar {
display: flex;
width: 40%;
}
.arama-bar input {
flex: 1;
padding: 8px 15px;
border: 1px solid #ccc;
border-radius: 20px 0 0 20px;
outline: none;
}
.arama-bar button {
padding: 0 20px;
border: 1px solid #ccc;
border-left: none;
border-radius: 0 20px 20px 0;
cursor: pointer;
}
/* Sidebar Menü */
.yan-menu {
padding: 15px 10px;
}
.menu-grup {
display: flex;
flex-direction: column;
gap: 5px;
margin-bottom: 15px;
}
.grup-baslik {
padding: 10px;
font-weight: bold;
font-size: 0.9rem;
color: #606060;
}
.yan-menu a {
text-decoration: none;
color: #0f0f0f;
padding: 10px;
border-radius: 10px;
display: flex;
align-items: center;
gap: 20px;
transition: 0.2s;
}
.yan-menu a:hover {
background: #f2f2f2;
}
.yan-menu a.aktif {
background: #f2f2f2;
font-weight: bold;
}
/* Video Alanı */
.video-player {
width: 100%;
aspect-ratio: 16 / 9;
background: #000;
border-radius: 12px;
display: flex;
align-items: center;
justify-content: center;
color: #fff;
font-size: 5rem;
box-shadow: 0 10px 30px rgba(0, 0, 0, 0.1);
}
.video-detay {
margin-top: 20px;
}
.video-detay h1 {
font-size: 1.4rem;
margin-bottom: 8px;
color: #0f0f0f;
}
.video-stats {
color: #606060;
font-size: 0.9rem;
}
/* Reklam Kartı */
.reklam-kart {
background: #fff;
border: 1px solid #e5e5e5;
padding: 10px;
border-radius: 10px;
}
.reklam-etiket {
font-size: 0.7rem;
background: #eee;
padding: 2px 6px;
border-radius: 4px;
}
.reklam-kart img {
width: 100%;
border-radius: 6px;
margin: 10px 0;
}
.reklam-kart p {
font-size: 0.9rem;
font-weight: 500;
}
/* Footer */
.alt-bilgi {
display: flex;
align-items: center;
justify-content: center;
font-size: 0.8rem;
color: #606060;
}
.footer-links a {
text-decoration: none;
color: #606060;
}
İleri Düzey Hizalama (Alignment) Özellikleri Kapsamlı ve Tutarlı Hizalama Seti
CSS Grid ve Flexbox, öğeleri yatay ve dikey olarak hizalamak için kapsamlı ve tutarlı bir özellik setini paylaşır.
Bu hizalama mekanizmaları, geleneksel CSS'in (margin: auto ve position) getirdiği hizalama zorluklarını tamamen ortadan kaldırır.
Bu sistem, öğeleri sadece yerleştirmekle kalmaz, aynı zamanda içeriğin kapsayıcı içindeki konumunu, aralarındaki boşlukların nasıl dağıtılacağını ve bir hücre içindeki bireysel öğenin nasıl konumlanacağını hassas ve öngörülebilir bir şekilde kontrol etmeyi sağlar.
İki Katmanlı Hizalama ModeliGrid hizalama sistemi, iki farklı seviyede çalışır ve bu ayrımı anlamak kritik öneme sahiptir:
1. Kapsayıcı Seviyesi (Container Alignment): Grid içindeki tüm öğelerin, kapsayıcı alanı içinde nasıl hizalanacağını belirler.
justify-content (yatay eksen) ve align-content (dikey eksen), boş alanın dağıtımını kontrol eder.
2. Öğe Seviyesi (Item Alignment): Her bir Grid öğesinin, kendi hücresi içinde nasıl konumlanacağını belirler.
justify-items ve align-items, öğenin hücre içindeki hizalamasını kontrol eder.
Bireysel Override: Tek bir öğe için hizalama değiştirilmek istendiğinde justify-self ve align-self kullanılır.
Eksen Mantığı (Axis Logic)Grid'de hizalama mantığı, iki temel eksen üzerinden çalışır:
Inline Axis (Yatay): justify-* ile kontrol edilir.
Block Axis (Dikey): align-* ile kontrol edilir.
Bu ayrım, Flexbox'taki main-axis / cross-axis kavramına benzer, ancak Grid'de eksenler sabittir ve içerik yönüne göre değişmez.
Tutarlı Değer SistemiTüm hizalama özellikleri, ortak bir değer setini paylaşır:
start → başlangıca hizalar
end → sona hizalar
center → ortalar
stretch → varsayılan, alanı doldurur
Bu tutarlılık sayesinde, Grid ve Flexbox arasında geçiş yapmak son derece kolaydır ve öğrenilen hizalama mantığı tüm layout sistemlerinde tekrar kullanılabilir.
Öğeleri Konumlandırma (justify-items / align-items) Hücre İçi Hizalama Kurallarının Toplu Uygulanması
Bu özellikler, Grid Kapsayıcıya uygulanır ve kapsayıcı içindeki her bir hücrenin içinde yer alan öğelerin nasıl konumlanacağını belirler. Kısacası, bunlar hücre içi hizalama kurallarını toplu olarak tüm çocuklara uygular.
Bu özelliklerin varsayılan değeri genellikle stretch'tir, yani öğeler, ait oldukları hücrenin tamamını doldurmaya çalışır.
Justify-items: Yatay Konumlandırmajustify-items özelliği, öğeleri satır ekseni boyunca, ait oldukları hücrenin içinde hizalar.
Bu, bir metin bloğunun sola ( start ), sağa ( end ) veya ortaya (center) hizalanması gibi düşünülebilir.
.grid-container {
/* Tüm öğeleri yatayda ortaya hizalar */
justify-items: center;
}
Align-items: Dikey Konumlandırma
align-items özelliği, öğeleri sütun ekseni boyunca, ait oldukları hücrenin içinde hizalar.
Bu, öğenin hücrenin üstünde ( start ), altında ( end ) veya tam ortasında ( center ) yer almasını sağlar.
Merkezleme Avantajı: Bu iki özellik, Grid'in en önemli avantajlarından birini sunar: Karmaşık CSS hileleri kullanmadan, bir hücrenin içindeki herhangi bir içeriği tek bir kuralda tam olarak merkezleme yeteneği: justify-items: center; align-items: center;
|
Değer
|
Tanım ve İşlevi
|
Etkisi ve Pratik Kullanım
|
|---|---|---|
|
start
|
İçeriği, ilgili eksenin başlangıç
kenarına
( sol veya üst ) hizalar.
|
Yatayda ( justify ) sol
kenara, dikeyde ( align ) üst kenara hizalar.
Yazı yönünün ( ltr/rtl ) değişmesi bu yönü de değiştirebilir. |
|
end
|
İçeriği, ilgili eksenin bitiş kenarına (
sağ veya alt ) hizalar.
|
Yatayda ( justify ) sağ kenara, dikeyde ( align ) alt kenara hizalar.
|
|
center
|
İçeriği, ait olduğu hücrenin tam ortasına
hizalar.
|
Hem justify-items: center hem de
align-items: center kullanıldığında, öğe hücrenin tam merkezine yerleşir. |
|
stretch
|
Öğenin width veya height değeri açıkça
belirtilmemişse, tüm hücreyi dolduracak
şekilde esnemesini sağlar.
|
Bu, her iki eksende de varsayılan
davranıştır.
Öğelerin, kendilerine atanan hücrenin boyutuna uzamasını sağlar. |
|
self-start / self-end
|
Öğenin, kendine ait içeriğin başlangıç
veya bitişine hizalanmasını sağlar.
|
Bu değerler, özellikle metin yönü
değiştiğinde, içeriğin
kendi yazma moduna göre hizalanmasını garanti eder.
|
Kapsayıcı İçeriğini Yönetme (justify-content / align-content) Toplu Boşluk Dağıtımı ve Kalan Alanın Yönetimi
Bu özellikler, bir Grid veya Flexbox Kapsayıcıdaki tüm satırların ve sütunların kapsayıcı içinde nasıl bir araya geleceğini ve
kalan fazlalık boşluğun nasıl dağıtılacağını belirler.
Tetikleyici Koşul:Bu kurallar, öğeler küçültülmediğinde veya Grid'in toplam boyutu, kapsayıcının tamamını doldurmadığı durumlarda
( yani fazlalık bir alan kaldığında ) devreye girer.
Bu, öğelerin kendilerini değil, öğeler arasındaki ve etrafındaki boşluğu kontrol eder.
Justify-content: Yatay Dağıtımjustify-content, Ana Eksen üzerinde Grid/Flex öğeleri bittikten sonra kalan boşluğu yönetir.
Space-between: Öğeler arasına eşit boşluk bırakır (kenarlara boşluk bırakılmaz).
Space-around: Öğeler arasına ve kenarlara eşit boşluk bırakır (kenarlardaki boşluklar, aradaki boşluğun yarısıdır).
Center: Tüm öğe grubunu kapsayıcı içinde ortalar.
Align-content: Dikey Dağıtımalign-content, Çapraz Eksen ( Grid'de satırlar, Flexbox'ta sütunlar ) üzerinde Grid/Flex satırları bittikten sonra kalan boşluğu yönetir.
Bu özellik, Flexbox'ta flex-wrap: wrap; kullanıldığında birden fazla satır varsa kritik öneme sahiptir.
Grid'deki Önemi: Grid'de, toplam satırların yüksekliği kapsayıcının yüksekliğinden azsa, align-content özelliği, kalan dikey boşluğu satırlar arasında veya etrafında dağıtmayı sağlar, böylece tüm dikey alanı etkin bir şekilde kullanırız.
|
Değer
|
Tanım ve İşlevi
|
Kullanım Amacı ve Önemli
Etkisi
|
|---|---|---|
|
space-between
|
Tüm çizgileri/satırları kapsayıcının
kenarlarına yapıştırır ve aradaki
boşluğu
eşit
dağıtır.
|
İçeriğin kapsayıcı içinde
kenarlara sıfır olacak şekilde yayılmasını
sağlar.
( Bir navigasyon menüsünde logo
solda, linkler sağda
olmalı.)
|
|
space-around
|
Her bir satır/sütun grubunun etrafına eşit
boşluk koyar.
|
Boşluğun tüm öğelerin çevresinde
dağılmasını isteyen estetik
düzenlemeler için
kullanılır.
Kenar boşlukları, öğeler arasındaki boşluğun yarısı kadar olacaktır. |
|
space-evenly
|
Tüm öğeler arasına ve kenarlarına
tamamen eşit miktarda boşluk dağıtır.
|
Boşlukların görsel olarak tutarlı
ve simetrik görünmesini sağlar.
|
|
start / end
|
Tüm Grid/Flex çizgilerini, ilgili eksenin
başlangıç veya bitiş kenarına
toplar.
|
Öğelerin toplu olarak kapsayıcının
bir köşesine veya kenarına
hizalanmasını
sağlar.
|
|
center
|
Tüm Grid/Flex çizgilerini ve öğe grubunu,
kapsayıcının tam ortasına
hizalar.
|
Tüm Grid'in veya Flex satırının,
tarayıcı penceresinde yatay ve/veya
dikey
olarak
ortalanmasını sağlayan kritik bir kuraldır.
|
|
Özellik
|
Tanım ve İşlevi
|
Avantajı ve Pratik Kullanım
|
|---|---|---|
|
place-items
(Kısayol) |
align-items (dikey) ve justify-items (yatay) değerlerini tek
bir kuralda
birleştirir.
|
Hücre İçi Merkezleme: Bu kısayol,
bir öğeyi hücrenin içinde (hem yatay
hem de
dikeyde) tam olarak merkezlemek ( place-items: center; ) için tek satırda
çözüm sunar, bu kod tekrarını önler.
|
|
place-content
(Kısayol) |
align-content (dikey boşluk) ve
justify-content (yatay boşluk) değerlerini tek bir kuralda birleştirir. |
Grid Yapısı Merkezleme: Tüm Grid
yapısının kapsayıcı içinde kolayca
merkezlenmesini
veya boşluk dağıtımını tek satırda sağlar.
Genellikle Grid'i tarayıcı penceresinin ortasına almak için kullanılır. |
|
justify-self / align-self
|
Öğenin, ebeveyne atanmış genel
hizalama kuralını geçersiz kılarak, hücre
içinde
kendi hizalamasını bireysel olarak belirlemesini sağlar.
|
Bireysel Kontrol: Genel kuraldan
farklı davranması gereken tek bir öğeyi
( bir butonu tüm öğeler ortalanmışken hücrenin solunda tutmak) kontrol
etmek için
kullanılır.
Bu, bir istisna kuralı yaratmanın temiz yoludur. |
Explicit Grid (Açık Grid) Planlı Yapı ve Kesin Tanımlama
Explicit Grid, Grid Kapsayıcıda grid-template-columns ve grid-template-rows gibi özellikler kullanılarak **geliştirici tarafından bilinçli ve kesin olarak** tanımlanan satır ve sütun çizgilerinden oluşan ızgara yapısıdır.
Oluşum Mekanizması: Açık Grid, grid-template-columns: 1fr 1fr 1fr; gibi kesin boyut değerleri verilerek oluşturulur.
Bir kez bu çizgiler tanımlandığında, Grid Öğeleri bu çizgilerin arasına yerleştirilmeye hazırdır.
Track ve Çizgi Sayısı İlişkisi
Grid'de iz (track, yani satır veya sütun) sayısı
ile çizgi (line)
sayısı arasında matematiksel bir ilişki vardır: N sayıda iz (track)
tanımladığınızda, otomatik
olarak N+1
sayıda çizgi oluşur.
Örneğin: grid-template-columns: 1fr 1fr 1fr; kuralı ile 3 sütun tanımlanır ve bu sütunları çevreleyen 4 adet dikey çizgi oluşur.
Bu ilişki, çizgi numaralarıyla konumlandırmanın (Line-Based Placement) temelini oluşturur.
Bakım Kolaylığı ve ÖngörülebilirlikAçık Grid, tamamen öngörülebilirdir, geliştirici, Grid Öğelerini yerleştirirken hangi çizgi numaralarını veya alan isimlerini hedefleyeceğini kesin olarak bilir.
Bu öngörülebilirlik, kodun bakımını kolaylaştırır ve düzenleme hatalarını ( layout bugs ) en aza indirir.
Kullanım Amacı: Sayfanın ana iskeleti (başlık, kenar çubuğu ve ana içerik) gibi kritik, statik yapılar daima Açık Grid kullanılarak tanımlanmalıdır.
Bu, projenin temel yapısının stabil olmasını garanti eder.
Implicit Grid (Örtük Grid) Otomatik Oluşum ve Güvenlik Ağı
Implicit Grid, geliştirici tarafından bilinçli olarak tanımlanmayan, ancak Grid Öğelerinin Açık Grid'in tanımlı sınırlarının dışına taştığı zaman tarayıcı tarafından otomatik olarak oluşturulan ek satır veya sütunlardan oluşur.
Bu yapı, Grid sisteminin esnekliğini korumak ve içerik taşması durumunda düzenin tamamen bozulmasını engellemek için tasarlanmış bir
"güvenlik ağıdır".
Taşma Esnekliği SenaryolarıÖrtük Grid, iki temel durumda ortaya çıkar:
- 1. Yerleştirme Dışı (Out-of-Bounds Placement): Geliştirici, Grid'i sadece 3 sütun olarak tanımlar, ancak bir öğeyi grid-column-start: 5; ile 5. çizgiye yerleştirmeye çalıştığında. Tarayıcı, bu 5. çizgiyi oluşturmak için 4. ve 5. sütunları otomatik olarak yaratır.
- 2. Otomatik Akış (Auto-Flow): grid-auto-flow kuralı, Grid Öğelerinin tanımlı alanı doldurduktan sonra yeni satırlara akmasını emrettiğinde. Oluşan bu yeni satırlar, boyutları Açıkça tanımlanmadığı sürece Örtük Grid'in bir parçasıdır.
Örtük olarak oluşan bu satır ve sütunların boyutlarının belirsiz olmaması için özel kurallarla kontrol edilmeleri gerekir:
- Grid-auto-rows: Otomatik olarak oluşan satırlara varsayılan bir boyut atar ( grid-auto-rows: 150px; ).
- Grid-auto-columns: Otomatik olarak oluşan sütunlara varsayılan bir boyut atar.
Risk Yönetimi ve En İyi Uygulama: Örtük Grid'in kendiliğinden boyutu, içeriğine ( auto ) göre belirleneceği için, bir öğe yanlışlıkla bu alana yerleştiğinde, düzenleme sorunları ( Layout bugs ) ve beklenmedik taşmalar ortaya çıkabilir.
Bu durum, Grid'in mantıksal olarak karmaşıklaşmasına neden olur.
En İyi Uygulama: Örtük Grid'in varlığını bilmek ve onu grid-auto-rows gibi kurallarla kontrol altında tutmak önemlidir. Ancak, sayfanın ana iskeleti ve tüm kritik yapılar daima Açık Grid kullanılarak tanımlanmalıdır.
Bu Ayrımın Performans Etkileri Explicit vs Implicit Grid: Layout Maliyeti ve Hız
Açık Grid, tarayıcının tüm sütun ve satır çizgilerinin konumunu ve boyutlarını CSSOM oluşurken önceden bilmesini sağlar.
Maliyet Etkisi: Bu öngörülebilirlik, tarayıcının Layout hesaplamasını daha hızlı ve daha az maliyetli yapmasını sağlar, çünkü herhangi bir dinamik karar vermesine gerek kalmaz.
Tarayıcı, hücrelerin nerede başlayıp nerede biteceğini anında belirler.
Bu, sayfanın ilk oluşturma süresini kısaltmaya yardımcı olur.
Örtük Hesaplama Maliyeti (Runtime Maliyeti)Örtük Grid alanları oluştuğunda, tarayıcı bu yeni, geliştirici tarafından tanımlanmamış satır ve sütunların boyutlarını anlık olarak hesaplamak zorundadır.
Dinamik Maliyet: Bu dinamik, beklenmedik hesaplama, özellikle sayfa yükleme sırasında veya JavaScript dinamik olarak yeni öğeler eklediğinde ek işlemci yüküne neden olabilir.
Bu durum, sayfanın Layout sürecini yavaşlatabilir ve kullanıcı arayüzü akıcılığını etkileyebilir.
En İyi Uygulama: Explicit KontrolMimarinin Güvencesi: Geliştiriciler, sayfanın ana iskeletini ve beklenen tüm alanlarını daima Açık Grid olarak tanımlamalıdır.
Bu, grid-template-areas veya kesin çizgi numaraları kullanılarak sağlanır.
Örtük Grid'in oluşumunu ise yalnızca beklenmedik içerik taşmaları veya sonsuz listeler gibi dinamik durumlar için, boyutlarını grid-auto-rows gibi kurallarla önceden belirleyerek, bilinçli bir güvenlik mekanizması olarak kullanmalıdır.
Bu, CSS kodunun performansını garanti altına alan temel bir mimari kuraldır.