grid-template-columns,frbirimi verepeat()ile ızgara oluşturmak- Öğeleri birden çok sütuna yaymak ve
grid-template-areasile sayfa düzeni kurmak - Grid ile Flexbox arasında seçim yapmak
- Medya sorguları ve göreli birimlerle “önce mobil” duyarlı bir sayfa yazmak
Aynı siteyi telefonda, tablette ve geniş bir monitörde açıyorsun: bilgisayarda ürünler üç sütunda, telefonda tek sütunda duruyor ve hiçbir şey ekrandan taşmıyor. Buna duyarlı tasarım (responsive design) denir. Başlıca araçları CSS Grid (satır ve sütunlardan oluşan ızgara) ve medya sorgularıdır; bu derste ikisini de öğreneceksin.
CSS Grid: satırlar ve sütunlar
display: grid bir kapsayıcıyı ızgaraya çevirir. grid-template-columns sütunların sayısını ve genişliğini belirler. Burada özel bir birim kullanılır: **fr** (fraction, yani pay). 1fr 2fr boş alanı üç paya böler; ilk sütun bir pay, ikincisi iki pay alır. repeat(3, 1fr) ise 1fr 1fr 1fr yazımının kısaltmasıdır. Flexbox'ta olduğu gibi gap hücreler arasına boşluk koyar.
<style>
body { font-family: system-ui, sans-serif; padding: 12px; }
.grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 10px; }
.grid div { padding: 16px; text-align: center; background: #fbcfe8; border-radius: 8px; }
.grid .wide { grid-column: span 2; background: #f9a8d4; }
.grid .tall { grid-row: span 2; background: #c4b5fd; }
</style>
<div class="grid">
<div class="wide">1 (span 2 columns)</div>
<div class="tall">2 (span 2 rows)</div>
<div>3</div>
<div>4</div>
<div>5</div>
<div>6</div>
</div>repeat(3, 1fr) değerini 1fr 2fr 1fr yap ve ortadaki sütunun iki kat genişlediğini gör. Öğeler boş hücreleri kendileri doldurur: 3 ve 4, birinci öğenin altındaki boşluğa yerleşir.grid-column: span 2 bir öğeyi iki sütuna, grid-row: span 2 ise iki satıra yayar. Tüm sayfa düzenini de grid-template-areas ile adeta bir resim gibi çizebilirsin: alanlara ad ver ve onları tırnak içinde satır satır yerleştir. Her öğe grid-area ile kendi alanına gönderilir.
<style>
body { font-family: system-ui, sans-serif; margin: 0; padding: 12px; }
.page {
display: grid;
grid-template-columns: 140px 1fr;
grid-template-areas:
"header header"
"side main"
"footer footer";
gap: 8px;
}
.page > * { padding: 12px; border-radius: 8px; }
header { grid-area: header; background: #fde68a; }
aside { grid-area: side; background: #bfdbfe; }
main { grid-area: main; background: #e2e8f0; min-height: 90px; }
footer { grid-area: footer; background: #d1fae5; }
</style>
<div class="page">
<header>Header</header>
<aside>Sidebar</aside>
<main>Main content</main>
<footer>Footer</footer>
</div>"side main" yerine "main side" yaz; kenar çubuğu sağa geçer, HTML ise aynı kalır. Sütun genişliklerinin de yerini değiştir (grid-template-columns: 1fr 140px); yoksa ana içerik 140 px'lik dar sütuna düşer. .page > * seçicisi .page'in tüm doğrudan alt öğelerini seçer.| Ölçüt | Flexbox | Grid |
|---|---|---|
| Boyut | tek yön: satır ya da sütun | iki yön: satırlar ve sütunlar birlikte |
| Neye dayanır | içeriğin boyutuna | önceden tanımlanmış ızgaraya |
| Tipik kullanım | menüler, düğme sıraları, kartın içi | sayfa düzeni, galeri, kart ızgarası |
<style>
body { font-family: system-ui, sans-serif; margin: 0; padding: 12px; background: #0f172a; }
.gallery {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
gap: 10px;
}
.tile { aspect-ratio: 1; display: flex; justify-content: center; align-items: center;
font-size: 40px; background: #1e293b; border-radius: 12px; }
</style>
<div class="gallery">
<div class="tile">🌊</div><div class="tile">🏔️</div><div class="tile">🌳</div>
<div class="tile">🌅</div><div class="tile">🏜️</div><div class="tile">🌋</div>
<div class="tile">🏝️</div><div class="tile">❄️</div>
</div>110px değerini 200px yap; sütunlar azalır, kareler büyür. aspect-ratio: 1 her kareyi kare biçiminde tutar; karenin içinde ise emojiyi Flexbox ortalar.Duyarlı tasarım ve medya sorguları
Bir medya sorgusu, CSS kurallarını yalnızca bir koşul doğru olduğunda uygular; örneğin pencere belirli bir değerden genişse: @media (min-width: 600px) { … }. Duyarlı sayfa yazmanın modern yolu önce mobil (mobile-first) yaklaşımıdır: temel stilleri küçük ekran için yazarsın, sonra geniş ekranlar için min-width sorgularıyla eklemeler yaparsın.
<style>
body { font-family: system-ui, sans-serif; margin: 0; padding: 12px; }
h1 { font-size: 1.4rem; color: #7c3aed; }
.cards { display: grid; grid-template-columns: 1fr; gap: 10px; }
.card { padding: 14px; background: #ede9fe; border-radius: 10px; }
@media (min-width: 500px) {
.cards { grid-template-columns: 1fr 1fr; }
}
@media (min-width: 900px) {
.cards { grid-template-columns: repeat(3, 1fr); }
h1 { font-size: 2rem; }
}
</style>
<h1>Mobile first</h1>
<div class="cards">
<div class="card">One</div>
<div class="card">Two</div>
<div class="card">Three</div>
</div>500px değerini 1500px yap.- Her sayfanın
<head>kısmında<meta name="viewport" content="width=device-width, initial-scale=1">bulunmalıdır. O olmadan telefon tarayıcısı sayfayı yaklaşık 980px genişliğinde bir ekran için çizer ve küçültür; medya sorguları da beklendiği gibi çalışmaz. - Sabit
width: 800pxyerinemax-width: 800pxyaz: geniş ekranda blok 800px'ten büyümez, dar ekranda ise küçülür. - Görselleri esnek yap:
img { max-width: 100%; height: auto; }; görsel asla kapsayıcısından taşmaz ve oranını korur. - Göreli birimler kullan: yazı boyutları için
rem, alanlar için%,frya davw.font-size: clamp(1.5rem, 5vw, 3rem)başlığı ekranla birlikte büyütür ama verilen sınırlar içinde tutar.
Cmd+Option+I)F12Cmd+Shift+M)Ctrl+Shift+MÖnemli noktalar
display: gridvegrid-template-columnsbir ızgara oluşturur;frboş alanın bir payıdır,repeat(3, 1fr)üç eşit sütundur.spanbir öğeyi birkaç hücreye yayar;grid-template-areastüm düzeni adlandırılmış alanlarla çizer.- Flexbox tek yön, Grid iki yön içindir; ikisini birlikte kullanmak olağandır.
- Önce mobil: temel stiller küçük ekran için,
@media (min-width: …)ise geniş ekranlar için eklemelerdir. - Viewport meta etiketi,
max-width, esnek görseller ve göreli birimler duyarlı bir sayfanın temelidir.
Kendini test et
10 soru. Her doğru cevap XP kazandırır.
grid-template-columns: 1fr 2fr yazılı (gap yok). Sütunların genişliği nedir?