Blok 3 · Ders 20
CSS temelleri: renk, yazı, kutu modeli
Seçiciler, renkler, yazı tipleri, kutu modeli (margin, border, padding), birimler ve özgüllük; geliştirici araçlarında canlı düzenleme.
Bu dersin sonunda
- Bir CSS dosyasını
<link>ile sayfana bağlayabilir,<style>etiketi vestyleniteliğiyle farkını açıklayabilirsin - Etiket, sınıf, kimlik, birleşik, torun ve
:hoverseçicileriyle istediğin öğeyi seçebilirsin - Renkleri ad, hex,
rgbvehslile yazabilir; yazı tipini, boyutunu ve satır yüksekliğini ayarlayabilirsin - Bir kutunun ekrandaki genişliğini içerik, padding ve border'dan hesaplayabilir,
box-sizing: border-boxile işini kolaylaştırabilirsin px,rem,%,vwvevharasından duruma uygun birimi seçebilirsin- Çalışmayan bir kuralın sebebini kalıtım, özgüllük ve sırayla açıklayıp geliştirici araçlarında bulabilirsin
Bu sayfada
- CSS ne işe yarar?
- CSS'i sayfaya bağlamak
- Bir CSS kuralının parçaları
- Seçiciler: kural kime uygulanacak?
- Renkler
- Yazı: yazı tipi, boyut, satır yüksekliği
- Kutu modeli: her öğe bir kutudur
- Birimler: px, rem, %, vw, vh
- Hangi kural kazanır? Kalıtım, özgüllük ve sıra
- Geliştirici araçlarında CSS denemek
- Kartın son hâli
- Sık hatalar: CSS sessizce görmezden gelir
- Görevler
- Kendini sına
- Kayıt noktası
Ders 19'da sayfanın iskeletini kurdun, ama tarayıcıda eski bir belge gibi görünüyordu: beyaz zemin, Times New Roman yazı, mavi bağlantılar. Bu derste o iskelete görünüm vereceksin: renkleri, yazıları ve boşlukları ayarlayacak, bir kutunun ekranda kaç piksel tutacağını hesaplayacak ve "yazdığım kural neden çalışmıyor?" sorusunu geliştirici araçlarıyla kendin cevaplayacaksın. Sonunda elinde, sıfırdan boyadığın bir şampiyon kartı olacak.
CSS ne işe yarar?
HTML bir şeyin ne olduğunu söyler: bu bir başlık, bu bir düğme. Nasıl görüneceğini söylemez; o iş CSS'indir (Cascading Style Sheets, "basamaklı stil sayfaları"). Aşağıdaki kartta tek satır CSS yok; gördüğün her şey tarayıcının varsayılan stilleri.
Tarayıcı her sayfaya kendiliğinden birkaç kural uygular: gövdenin kenarlarında 8 piksel boşluk, 16 piksellik Times New Roman, 32 piksellik kalın h1, maddelerde 40 piksel girinti. Senin CSS'in bu varsayılanların üstüne yazılır. Aynı kart, bu derste yazacağın CSS ile:
İki penceredeki <body> harfi harfine aynı; farkı yaratan, <head>'e eklenen birkaç <link> satırı ve 51 satırlık bir CSS dosyası. Dersin sonunda o dosyanın her satırını kendin yazmış olacaksın. Düğmenin üstüne fareyle gelmeyi de dene.
CSS'i sayfaya bağlamak
Proje klasörü
C:\kod içinde sampiyon-karti adında yeni bir klasör oluştur, VS Code'da File → Open Folder ile aç ve içinde iki dosya oluştur: index.html ve stil.css. index.html'e aşağıdakini yaz. Ders 19'daki iskeletten farkı 7. satır ve etiketlerdeki class ile id nitelikleri; ikisinin ne işe yaradığını seçiciler bölümünde göreceksin.
<!doctype html><html lang="tr"><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Ahri kartı</title> <link rel="stylesheet" href="stil.css"></head><body> <main> <article class="kart" id="ahri"> <h1 class="ad">Ahri</h1> <p class="rol">Büyücü · Orta koridor</p> <p>Dokuz kuyruklu bir tilki. Hızlı, çevik ve tehlikeli.</p> <ul class="degerler"> <li>Can: 590</li> <li>Mana: 418</li> <li>Hareket hızı: 330</li> </ul> <button class="dugme">Şampiyonu seç</button> </article> </main></body></html>Vurgulu <link> satırı sayfaya dışarıdan bir dosya bağlar:
rel="stylesheet": bağlanan dosya "bir stil sayfası" (relationship, ilişki).href="stil.css": dosyanın yolu. Ders 19'daki göreli yol kuralı geçerli: yolindex.html'in klasörüne göre okunur. Dosyacssadlı bir alt klasörde olsaydıcss/stil.cssyazardın.
<link>'in kapanış etiketi yoktur, tıpkı <img> gibi. <head>'e konur, çünkü tarayıcı sayfayı çizmeden önce stili bilmek ister. Şimdi stil.css'e ilk kuralını yaz:
body { background-color: #0a1428; color: #f0e6d2;}#0a1428 koyu lacivert, #f0e6d2 krem rengi. Bu yazımı renkler bölümünde çözeceğiz.
Kaydet ve sayfayı yerel sunucuyla aç (Live Server'da Go Live, ya da npx serve). Zemin lacivert, yazılar krem rengiyse bağlantı çalışıyor. Sayfa beyaz kaldıysa sık hatalar bölümüne bak.
Tarayıcı CSS'i nasıl alır?
CSS dosyası sayfanın içinde değil, ayrı bir dosyadır; tarayıcı onu Ders 18'de gördüğün türden ayrı bir istekle alır.
<link> görünce CSS dosyasını ayrıca ister.Sonuç: href'teki yol yanlışsa HTML yine gelir ama CSS gelmez. Sayfa stilsiz açılır ve hiçbir hata penceresi çıkmaz.
Üç yol: <link>, <style>, style
<!-- 1. Ayrı dosya: <head> içine tek satır --><link rel="stylesheet" href="stil.css"> <!-- 2. Aynı sayfada: <head> içinde <style> etiketi --><style> body { background-color: #0a1428; }</style> <!-- 3. Tek bir öğenin üstünde: style niteliği --><p style="color: gold;">Bu paragraf altın sarısı</p>| Yol | Nereye yazılır | Ne zaman |
|---|---|---|
<link> ve ayrı bir .css dosyası | <head> içine tek satır | Gerçek projelerde her zaman |
<style> etiketi | Aynı HTML'in <head> bölümü | Tek sayfalık küçük denemeler |
style niteliği | Tek bir öğenin açılış etiketi | Yalnızca hızlı bir deneme; kalıcı koda koyma |
Neden hep ayrı dosya? On sayfalık bir sitede hepsi aynı stil.css'i bağlar; başlık rengini tek satırda değiştirirsin (Ders 3'teki kendini tekrar etme ilkesi). Tarayıcı dosyayı bir kez indirir, sonraki sayfalarda deposundaki kopyayı, yani önbelleği kullanır. HTML içerikle, CSS görünümle uğraşır; Ders 17'de kodu modüllere bölmenle aynı düşünce.
style niteliği ise kuralı tek bir öğenin içine gömer: aynı görünüm için satırı her öğeye kopyalarsın ve değiştirirken hepsini tek tek ararsın.
Bir CSS kuralının parçaları
Bir CSS dosyası kurallardan oluşur. Her kural iki parçadır: seçici (kime?) ve süslü parantezin içindeki bildirimler (ne yapılsın?).
Şekildeki kural: "kart sınıfındaki her öğenin yazısı beyaz olsun, içinde 24 piksel boşluk olsun."
Yazım kuralları:
- Özellik adları İngilizcedir, sözcükleri tireyle ayrılır:
background-color. JavaScript'teki camelCase (backgroundColor) burada çalışmaz. - Her bildirim
;ile biter. Sondakinde zorunlu değil ama hep koy; altına satır ekleyince unutmuş olmazsın. - Birim sayıya bitişik yazılır:
24pxdoğru,24 pxyanlış. - Girinti ve satır sonları tarayıcı için önemsizdir; yine de her bildirimi ayrı satıra, 4 boşluk girintiyle yaz. Seçicinin içindeki boşluk ise anlam taşır; seçicilerde göreceksin.
- Yorum
/* ... */ile yazılır. JavaScript'teki//CSS'te yorum değildir (sık hatalarda göreceksin).
/* Kartın genel görünümü */.kart { color: white; padding: 24px;}Seçiciler: kural kime uygulanacak?
Seçici, kuralın sayfadaki hangi öğelere uygulanacağını söyler. Temel seçicileri kartın HTML'i üstünde görelim.
Etiket seçicisi
Etiketin adını yazarsın, o etiketteki bütün öğeler seçilir:
p { color: dimgray;}Karttaki iki paragraf da gri olur. Çoğu zaman daha seçici olman gerekir.
Sınıf seçicisi
HTML'de bir öğeye class niteliğiyle bir grup adı takarsın, CSS'te adın başına nokta koyarak seçersin:
<p class="rol">Büyücü · Orta koridor</p>.rol { font-weight: bold;}- Aynı sınıfı istediğin kadar öğeye verebilirsin; hepsi aynı görünür.
- Bir öğeye boşlukla ayırarak birden çok sınıf verebilirsin:
class="dugme ana"öğesine hem.dugmehem.anauygulanır. - Sınıf adlarını küçük ve İngilizce harflerle yaz, sözcükleri tireyle ayır:
ana-dugme.
Kimlik seçicisi
id niteliği bir öğeye sayfada tek olan bir ad, yani kimlik verir (Ders 19'da <label for="…"> ile kullandın). CSS'te başına # koyarsın:
#ahri { background-color: aliceblue;}Aynı id sayfada bir kez kullanılabildiği için #ahri kuralını ikinci bir karta veremezsin; özgüllükte göreceğin bir sebep daha var. Kural: stil için sınıf kullan, id'yi sayfa içi bağlantılara ve Ders 22'deki JavaScript'e sakla. Örneğin kutu modeli bağlantısı, bu sayfadaki o id'li başlığa gider.
Seçicileri birleştirmek
Seçicileri üç yolla birleştirebilirsin; aradaki işaret anlamı değiştirir:
| Yazım | Anlamı |
|---|---|
h1, .rol | virgül: h1'ler ve .rol'lar |
p.rol | bitişik: hem p hem rol sınıflı |
.kart li | boşluk: .kart'ın içindeki li'ler |
Kartta ilki başlığı ve rol satırını, ikincisi yalnız rol satırını (rol sınıflı bir span olsaydı onu almazdı), üçüncüsü üç değer satırını seçer.
Boşluklu yazımı anlamak için HTML'i bir soy ağacı gibi düşün. Bir öğeyi saran öğe onun ebeveyni, hemen içindekiler çocukları, çocukların içindekiler de torunlarıdır. Kartta ul, li'lerin ebeveyni; li'ler ul'un çocukları ve kartın torunları.
Boşluk "herhangi bir derinlikte içinde" demek: çocuk da olur, torun da. li kartın çocuğu değil torunu, arada ul olması fark etmez. Bu yüzden boşluklu yazıma torun seçicisi (descendant selector) denir.
Bitişik yazım p.rol ise bir birleşik seçicidir (compound selector): iki koşul aynı öğede aranır. Dikkat: .kart, li "kart ve bütün li'ler", li.kart ise "kart sınıflı li" demek. Yazımları benzer, anlamları çok farklı.
.kart li seçicisi kartın HTML ağacında aşağı iner ve içerideki bütün li'leri yakalar.Hepsini birlikte dene: deneme.html'in <style>'ına aşağıdaki CSS'i, <body>'sine kartın <article> bölümünü yaz.
p { color: dimgray;} .rol { font-weight: bold;} #ahri { background-color: aliceblue;} .kart li { color: darkgreen;}Rol satırı p'den gri rengi, .rol'dan kalınlığı aldı: çakışmayan bildirimler toplanır. Çakışınca ne olacağını "Hangi kural kazanır?" bölümünde göreceksin.
:hover: fare üstündeyken
Bazı seçiciler öğenin bir durumunu seçer. En çok kullanılanı :hover: "fare bu öğenin üstündeyken".
.dugme { background-color: royalblue; color: white;} .dugme:hover { background-color: midnightblue; cursor: pointer;}<button class="dugme">Şampiyonu seç</button>İki nokta seçiciye bitişik yazılır. Boşluklu .dugme :hover bambaşka bir şey seçer: ".dugme'nin içinde, fare üstündeki herhangi bir öğe". Düğmenin içinde başka öğe olmadığı için hiçbir şey değişmez. cursor: pointer imleci el işaretine çevirip "buraya tıklanır" der.
Renkler
Renk alan özellikler: color (yazı), background-color (zemin) ve kutu modelinde göreceğin border (kenarlık). Rengi dört yazımla verebilirsin; aşağıdaki dördü de aynı rengi verir:
| Yazım | Örnek |
|---|---|
| Ad | rebeccapurple |
| Hex | #663399 |
rgb | rgb(102 51 153) |
hsl | hsl(270 50% 40%) |
Tarayıcı dördünü de aynı biçimde saklar: geliştirici araçlarının Computed sekmesinde hepsi rgb(102, 51, 153) görünür. Nasıl okunduklarına sırayla bakalım:
- Ad:
rebeccapurple,gold,teal,crimsongibi hazır adlar; CSS'te 150 kadar var. Hızlı denemeler için iyidir, ama seçenek azdır. - Hex: Ekrandaki her nokta kırmızı, yeşil ve mavi ışığın karışımıdır. Hex, üç ışığın gücünü ikişer onaltılık haneyle verir: 0–9'dan sonra
a(10) …f(15) gelir,000,ff255 demektir. Tablodaki#663399'un çiftleri, yani66,33ve99, onluk sayıyla 102, 51 ve 153:rgbsatırındaki sayıların aynısı.#000000siyah,#ffffffbeyaz,#ff0000kırmızı. Çiftler aynı hanelerdense kısalır:#639,#fff. Tasarım programları renkleri çoğunlukla hex verir. - rgb: Aynı üç ışık (kırmızı, yeşil, mavi), 0–255 arası onluk sayılarla. Eski kodlarda virgüllüsünü görürsün,
rgb(102, 51, 153); o da geçerli. Eğik çizgiyle saydamlık eklenir:rgb(0 0 0 / 50%)yarı saydam siyah. - hsl: İnsan için en kolayı. Ton renk çemberindeki açıdır (0 kırmızı, 120 yeşil, 240 mavi); doygunluk
0%gri,100%en canlı; açıklık0%siyah,50%rengin kendisi,100%beyaz.
hsl'in kolaylığı: aynı rengin açık ya da koyu tonunu yalnızca son sayıyı değiştirerek üretirsin. Düğmenin :hover rengini böyle seçeceğiz.
Okunabilirlik: kontrast
Yazı ile zemin arasındaki fark yetmezse metin okunmaz. Kabul gören ölçü (WCAG) normal yazı için en az 4,5'e 1 kontrast oranı.
Ölçmek için geliştirici araçlarında bir color değerinin yanındaki renk karesine tıkla: renk seçicideki Contrast ratio (Türkçe arayüzde Kontrast oranı) bölümü oranı ve yeterli olup olmadığını gösterir. Krem yazımız lacivert zeminde 14,8'e 1, kartın koyu gri zemininde 12,8'e 1; gray ise beyaz zeminde 3,9'da kalır. Bu yüzden örneklerde gri için daha koyu dimgray'i (5,5'e 1) kullanıyoruz.
Yazı: yazı tipi, boyut, satır yüksekliği
Yazı tipi listesi
stil.css'teki body kuralına bir satır ekle:
body { background-color: #0a1428; color: #f0e6d2; font-family: "Segoe UI", Arial, sans-serif;}Yazı tipi ziyaretçinin bilgisayarında kurulu olmalı: Segoe UI Windows'ta var, Mac'te ve Android'de yok. Bu yüzden font-family'ye virgülle ayrılmış bir liste verirsin; tarayıcı soldan başlayıp bulduğu ilkini kullanır (Windows'ta Segoe UI, Mac'te Arial). Listenin sonuna hep bir genel aile koy; hiçbiri bulunamazsa tarayıcı o aileden kendi yazı tipini seçer:
| Genel aile | Nasıl bir yazı | Örnek |
|---|---|---|
sans-serif | harf uçları düz, sade | Arial, Segoe UI |
serif | harf uçlarında küçük çıkıntılar | Times New Roman, Georgia |
monospace | her harf aynı genişlikte | Consolas; kod yazısı |
Adında boşluk olan yazı tiplerini tırnağa al: "Segoe UI". Genel aileler ise tırnaksız yazılır: "sans-serif" yazarsan tarayıcı onu "adı sans-serif olan bir yazı tipi" sanar; listede başka bir yazı tipi de bulunamazsa Chrome'da Times New Roman'a düşersin.
Google Fonts: herkeste aynı yazı tipi
Ziyaretçide olmayan bir yazı tipini kullanmak için onu sayfanla birlikte göndermen gerekir. En kolay yol Google'ın ücretsiz servisi Google Fonts:
fonts.google.com'da bir yazı tipi seç. Başlık için Cinzel'i kullanacağız.- Get font, ardından Get embed code'a tıkla;
<link>satırları çıkar. (Arayüz değişmiş olabilir; aradığın şey bu satırlar.) - Satırları
<head>bölümüne, kendistil.cssbağlantının üstüne yapıştır. - CSS'te yazı tipini adıyla kullan, sonuna yine genel aileyi koy.
<head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Ahri kartı</title> <link rel="preconnect" href="https://fonts.googleapis.com"> <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> <link href="https://fonts.googleapis.com/css2?family=Cinzel:wght@700&display=swap" rel="stylesheet"> <link rel="stylesheet" href="stil.css"></head>.ad { font-family: "Cinzel", serif;}İlk iki <link> "şu sunuculara şimdiden bağlan" der, yazı tipi daha çabuk gelir. Üçüncüsü yazı tipinin CSS dosyasıdır: wght@700 "700 kalınlığını ver", display=swap "yazı tipi gelene kadar metni yedekle göster" demek. Google Fonts'un verdiği satırda wght@400..900 gibi bir aralık görebilirsin; o, bütün kalınlıkları getirir. Biz yalnızca kullanacağımız 700'ü istedik; ikisi de çalışır.
İnternet yoksa ya da adres yanlışsa sayfa bozulmaz, yalnızca yedek yazı tipiyle görünür; listenin işi bu.
Boyut, kalınlık, satır yüksekliği
stil.css'e devam et:
body { background-color: #0a1428; color: #f0e6d2; font-family: "Segoe UI", Arial, sans-serif; line-height: 1.6;} .ad { font-family: "Cinzel", serif; font-size: 32px;} .rol { font-size: 14px; text-transform: uppercase;}font-size: yazının boyu, varsayılanı 16 piksel. Birimler bölümündepx'ten daha iyi bir birim göreceğiz.font-weight: kalınlık;400normal,700(ya dabold) kalın.h1zaten kalın. Yazı tipinde o kalınlık yoksa tarayıcı en yakın kalınlığı kullanır ya da harfleri kendisi kalınlaştırır ve yazı kaba görünür; Google Fonts'tan 700'ü istememizin sebebi bu.line-height: satırların arası. Birimsiz yaz:1.6"yazı boyunun 1,6 katı" demek; 16 piksellik yazıda 25,6, 32 piksellik başlıkta kendiliğinden 51,2 piksel olur. Okuma metinlerinde 1,5–1,7 rahattır.text-transform: uppercase: yazıyı ekranda büyük harfe çevirir; HTML'deki metin değişmez.text-align(left,center,right) ise satırları hizalar.
Kutu modeli: her öğe bir kutudur
Tarayıcı her öğeyi dikdörtgen bir kutu olarak çizer: başlık, paragraf, düğme. Kutunun boyutu ve komşularıyla arası dört katmanla belirlenir. Katmanları karıştırırsan yazı kenara yapışır, kartlar birbirine değer ve "240 yazdım, neden 288 oldu?" diye düşünürsün.
İçeriden dışarıya:
- İçerik (content): yazı ya da resim.
widthnormalde yalnızca bunun genişliğidir. - Padding (iç boşluk): içerikle kenarlık arası; zemin rengi buraya da yayılır.
- Border (kenarlık): kutunun çizgisi.
- Margin (dış boşluk): kenarlığın dışında, komşulara olan boşluk; her zaman saydamdır.
Genişliği hesaplamak
.kutu { width: 240px; padding: 20px; border: 4px solid goldenrod; margin: 16px;}Bu kutu ekranda kaç piksel? 240 değil. Tarayıcı width'i yalnızca içeriğe uygular, padding ve kenarlığı iki yandan üstüne ekler: 4 + 20 + 240 + 20 + 4 = 288 piksel. Margin bu toplama girmez; kutunun etrafındaki boşluktur (onunla birlikte kapladığı yer 320 piksel).
Kısa yazımlar
| Yazım | Anlamı |
|---|---|
padding: 20px | dört yan 20 piksel |
padding: 10px 20px | üst ve alt 10, sağ ve sol 20 |
padding: 10px 20px 30px 40px | üst, sağ, alt, sol: üstten başlayıp saat yönünde |
padding-top: 10px | yalnız üst (-right, -bottom, -left da var) |
margin da böyle yazılır. Kenarlık üç parçalıdır: border: 4px solid goldenrod → kalınlık, çizgi türü (solid düz, dashed kesik, dotted noktalı), renk. border-radius: 12px köşeleri yuvarlar.
box-sizing: border-box
Her kutuda toplama yapmak yorucu ve hataya açık. box-sizing: border-box yazınca width kenarlık dahil bütün kutunun genişliği olur; padding ve kenarlık içeriden düşülür. Örnekteki <div>, Ders 19'da semantik etiketlerin yanında adını duyduğun anlamsız genel kutu: article gibi bir şey anlatmaz, yalnızca stil vermek için kullanılır.
.kutu { width: 240px; padding: 20px; border: 4px solid goldenrod; margin-bottom: 16px;} .ic-dahil { box-sizing: border-box;}<div class="kutu">Varsayılan: ekranda 288 piksel</div><div class="kutu ic-dahil">border-box: ekranda 240 piksel</div>İkinci kutuda içerik 240 − 2 × 20 − 2 × 4 = 192 piksele indi, ama kutunun tamamı yazdığın gibi 240. Bu yüzden hemen her projenin CSS'i şu kuralla başlar:
* { box-sizing: border-box;}* evrensel seçicidir: bütün öğeleri seçer. Bu kuralı stil.css'in en üstüne yaz.
Kartın kutusu
Şimdi kartın kendisi. stil.css'e ekle:
.kart { max-width: 320px; margin: 0 auto; padding: 24px; background-color: #1e2328; border: 2px solid #c8aa6e; border-radius: 12px;}max-width: 320px: "en fazla 320 piksel". Geniş ekranda 320 olur, dar ekranda sığacak kadar daralır;widthyazsaydın taşardı.margin: 0 auto: üst ve alt 0, sağ ve solauto, yani "kalan boşluğu iki yana eşit paylaştır": kart ortaya gelir. Bunun için kartın sayfadan dar olması gerekir;max-widthbunu sağlar.
Kutuyu geliştirici araçlarında görmek
- Kartın yazısız bir yerine (kenarına yakın boşluğa) sağ tıkla, İncele'yi seç (İngilizce: Inspect). Elements panelinde o öğe seçili gelir.
<article class="kart" id="ahri">satırının üstüne fareyle gel: sayfada margin turuncu, kenarlık sarı, padding yeşil, içerik mavi boyanır; yanındaki kutucuk öğenin boyutunu ve birkaç stilini gösterir.- Sağdaki Styles sekmesinin en altına in ya da Computed sekmesine geç (Türkçe arayüzde Stiller ve Hesaplandı): yukarıdaki şekle benzeyen iç içe kutular orada. Bir sayıya çift tıklarsan değiştirebilirsin.

Görüntüdeki kart dersin sonundaki hâliyle çekildi (gövdenin iki yanında 16'şar piksel iç boşluk var); senin sayfanda sayılar pencerenin genişliğine göre farklı çıkar. İki yandaki turuncu alanlar margin: 0 auto'nun bıraktığı boşluk: 480 piksellik pencerede gövdenin iç boşluklarından sonra kalan 448 pikselin 320'sini kart alıyor, artan 128 iki yana 64'er paylaşılıyor.
Kutucuktaki 320 × 351.14 kutunun kenarlık dahil boyutu; kutucuk hep bunu gösterir. border-box kullandığımız için bu genişlik, max-width'e yazdığın 320'nin ta kendisi.
Birimler: px, rem, %, vw, vh
Şu ana kadar hep px yazdın. Öbür birimler başka bir şeye göre ölçer:
| Birim | Neye göre | En iyi nerede |
|---|---|---|
px | sabit; ekrandaki CSS pikseli | ince kenarlık, küçük ayrıntılar |
rem | kök yazı boyu (varsayılan 16 px): 1.5rem = 24 px | yazı boyları ve boşluklar |
% | ebeveyn; genişlikte ebeveynin içerik genişliği | esnek genişlikler |
vw | pencere genişliğinin %1'i | pencereye göre genişlik |
vh | pencere yüksekliğinin %1'i | ekranı dolduran giriş bölümleri |
rem: kullanıcının ayarına saygı
rem (root em), kök öğenin, yani <html>'in yazı boyudur. Varsayılanı 16 piksel: 1rem 16, 1.5rem 24, 0.875rem 14 piksel. Hesap için 16'ya böl: 32 piksel = 2rem.
Neden uğraşalım? Görme güçlüğü olan biri Chrome'da Ayarlar → Görünüm → Yazı tipi boyutu'nu Büyük yapınca kök yazı 16'dan 20 piksele çıkar. rem ile yazdıkların onunla büyür, px ile yazdıkların yerinde sayar. (Sayfayı yakınlaştırmak, yani Ctrl basılıyken fare tekerleğini çevirmek, ikisini de büyütür; fark bu ayarda çıkar.) Ayarın yeri Chrome sürümüne göre biraz değişmiş olabilir; bulamazsan ayarlarda "yazı tipi boyutu" diye ara.
Kartı rem'e çevir; bu arada gövdenin 8 piksellik varsayılan margin'ini sıfırlayıp yerine rem cinsinden padding ver:
body { margin: 0; padding: 2rem 1rem; background-color: #0a1428; color: #f0e6d2; font-family: "Segoe UI", Arial, sans-serif; line-height: 1.6;} .kart { max-width: 320px; margin: 0 auto; padding: 1.5rem; background-color: #1e2328; border: 2px solid #c8aa6e; border-radius: 12px;} .ad { font-family: "Cinzel", serif; font-size: 2rem;} .rol { font-size: 0.875rem; text-transform: uppercase;}Kenarlık (2px) ve köşe (12px) px kalabilir; yazı büyüdü diye çizgi kalınlaşmasın. max-width de şimdilik px kalsın; mobil uyum Ders 21'de.
%: ebeveyne göre
width: 50% "ebeveynimin içerik genişliğinin yarısı": 400 piksellik kutunun içinde 200 piksel. Kartın düğmesine width: 100% vereceğiz, kartın içini boydan boya doldursun. Yüzdenin neye göre ölçtüğü özelliğe bağlıdır: width, padding ve margin'de ebeveynin genişliği, font-size'da ebeveynin yazı boyu (font-size: 50% ebeveyninin yazısının yarısı).
vw ve vh: pencereye göre
50vw pencere genişliğinin yarısı, 100vh pencerenin tam yüksekliğidir; pencereyle birlikte değişirler.
.cubuk { background-color: teal; color: white; margin-bottom: 8px;} .sabit { width: 200px;} .yuzde { width: 50%;} .pencere { width: 50vw;}<div class="cubuk sabit">200px</div><div class="cubuk yuzde">50%</div><div class="cubuk pencere">50vw</div>Önizleme penceresi küçük bir tarayıcıdır; vw onun genişliğine göre hesaplanır. 50% çubuğu biraz kısa, çünkü yüzde gövdenin içine (gövdenin iki yandaki 8 piksellik margin'inin arasına), vw ise pencerenin tamamına göre ölçer. Tarayıcını daraltıp genişlet: ilk çubuk yerinde durur, diğer ikisi değişir.
Hangi kural kazanır? Kalıtım, özgüllük ve sıra
Bir öğeye birden çok kural uygulanabilir. Biri color: dimgray, öbürü color: crimson derse ne olur? Tarayıcı bunu her seferinde aynı kurallarla çözer; CSS'in adındaki cascading (basamaklı) bu kurallar zincirinin adıdır.
Kalıtım: ebeveynden çocuğa geçenler
body'ye color yazınca kartın içindeki bütün yazılar krem rengi oldu, çünkü yazıyla ilgili özellikler (color, font-family, font-size, font-weight, line-height, text-align, text-transform) ebeveynden çocuğa kalıtımla geçer. Kutuyla ilgili olanlar (background-color, border, padding, margin, width) geçmez; yoksa kartın kenarlığı içindeki her paragrafa da çizilirdi.
.kart { color: teal; font-family: Georgia, serif; border: 2px solid goldenrod; padding: 8px;}<div class="kart"> <p>Bu paragraf rengi ve yazı tipini karttan aldı, kenarlığını almadı.</p></div>İki istisna seni bir gün mutlaka şaşırtacak:
- Bağlantılar mavi kalır. Tarayıcının varsayılan stillerinde
aiçin doğrudan bir renk kuralı var ve öğeye yazılmış her kural kalıtımla gelen değeri yener. Çözüm:.kart a { color: inherit; }.inherit"bu özelliği ebeveyninden al" demek. - Form öğeleri yazı tipini almaz.
button,input,selectvetextarea'ya tarayıcı kendi yazı tipini verir (Windows'ta Chrome'da 13,33 piksellik Arial;textarea'da Arial yerine eş aralıklı bir yazı tipi). Düğmen küçük ve farklı görünüyorsa sebep bu; çözümfont: inherit;.
body { color: teal; font-family: Georgia, serif; font-size: 20px;} .duzgun { font: inherit; color: inherit;}<p>Gövde metni. <a href="#">Bu bağlantı</a> mavi kaldı.</p><button>Varsayılan düğme</button><button class="duzgun">inherit ile düğme</button>Özgüllük: hangi seçici daha özel?
İki kural aynı öğeye aynı özelliği farklı değerle veriyor:
.kart p { color: dimgray;} .rol { color: crimson;}<article class="kart"> <p class="rol">Büyücü · Orta koridor</p> <p>Dokuz kuyruklu bir tilki.</p></article>.rol sonra yazıldığı hâlde rol satırı gri kaldı: tarayıcı önce sıraya değil özgüllüğe bakar ve .kart p, .rol'dan daha özeldir.
Özgüllük üç sütunlu bir puandır; seçicinin parçalarını sayarsın: ID sütununa # ile başlayanlar, Sınıf sütununa .kart gibi noktalı sınıflar ve :hover gibi sözde sınıflar, Etiket sütununa p, li gibi etiket adları. * ve boşluk puan eklemez; virgülle ayrılmış seçicilerin her biri ayrı puanlanır. Puanı bu sırayla, aralarına tire koyarak yazacağız: ID-sınıf-etiket.
| Seçici | Sayılan | Puan |
|---|---|---|
p | 1 etiket | 0-0-1 |
.rol | 1 sınıf | 0-1-0 |
.kart p | 1 sınıf, 1 etiket | 0-1-1 |
.kart .rol | 2 sınıf | 0-2-0 |
.dugme:hover | 1 sınıf, 1 sözde sınıf | 0-2-0 |
#ahri p | 1 ID, 1 etiket | 1-0-1 |
* | hiçbir şey | 0-0-0 |
Puanlar soldan sağa, sütun sütun karşılaştırılır:
Rol satırını kırmızı yapmak için ya .rol'u güçlendirirsin (.kart .rol, 0-2-0, .kart p'yi yener) ya da bütün paragrafları boyayan .kart p'ye gerçekten gerek var mı diye düşünürsün. Çoğu zaman ikincisi daha temizdir.
style niteliği ve !important
style niteliğine yazılan bildirim bütün seçicileri yener. Sonuna !important eklenen bildirim (color: red !important;) özgüllüğe bakmaz, style'ı bile yener.
İkisinden de uzak dur: bir kuralı yenemiyorsan çözüm büyük silah değil, sade seçicilerdir. Stil için sınıf kullan, CSS'te ID kullanma. !important dolu bir projede CSS çoktan kontrolden çıkmıştır.
Sıra: eşitlikte sonra yazılan kazanır
Özgüllük de eşitse dosyada daha aşağıda yazılan kural kazanır:
.rol { color: crimson;} .rol { color: teal;}İki seçici de 0-1-0; rol satırı teal olur. Sıra dosyalar arasında da geçerlidir: <head> bölümünde iki CSS dosyası bağladıysan, eşitlikte sonra bağlanan dosyadaki kural kazanır. Bu yüzden dışarıdan aldığın hazır CSS dosyalarını önce, kendi dosyanı en son bağlarsın: son sözü senin dosyan söyler.
Toparlarsak tarayıcı, bir özelliğin değerini şu sırayla seçer:
- Önem:
!importantişaretli bildirim kazanır. - Özgüllük:
styleniteliği her seçiciyi yener; seçiciler arasında puanı yüksek olan kazanır. - Sıra: Hâlâ eşitlerse en son yazılan kazanır.
- Kalıtım: Öğeye bu özelliği veren hiçbir kural yoksa ve özellik kalıtımla geçenlerdense değer ebeveynden gelir. Hiçbiri yoksa özelliğin başlangıç değeri kullanılır.
Tarayıcının varsayılan kuralları bu yarışta hep en altta kalır: senin yazdığın kural, ne kadar zayıf bir seçiciyle yazılmış olursa olsun, onları yener.
Geliştirici araçlarında CSS denemek
Kod yaz, kaydet, sayfayı yenile, bak, yeniden yaz: bu döngü yavaş. Geliştirici araçlarında CSS'i doğrudan tarayıcıda, anında değiştirerek deneyebilirsin. "Bu kural neden çalışmıyor?" sorusunun cevabı da orada.
- İncelemek istediğin öğeye sağ tıkla ve İncele'yi seç (İngilizce: Inspect). Klavyeden: Ctrl+Shift+C, sonra sayfada öğeye tıkla.
- Sağdaki Styles sekmesi o öğeye uyan bütün kuralları gösterir, en güçlüsü en üstte. Her kuralın sağında hangi dosyanın kaçıncı satırından geldiği yazar (
stil.css:13); tıklarsan o satıra gidersin. Seçicinin üstüne fareyle gelince özgüllük puanını da gösterir:Specificity: (0,2,0). - Bir değerin üstüne tıklayıp değiştir:
1.5remyerine3remyaz, sayfa anında değişir. Sayısal değerlerde ↑ ve ↓ 1'er, Shift ile birlikte 10'ar artırıp azaltır. - Bir bildirimin üstüne gelince solunda bir onay kutusu çıkar. Kutuyu boşaltırsan bildirim kapanır ve üstü çizilir: "Bu satır olmasa ne olurdu?" sorusunun en hızlı cevabı.
- Bir kuralın içinde boş bir yere tıklarsan yeni bir bildirim yazabilirsin. En üstteki
element.stylekutusuna yazmak, öğeninstyleniteliğine yazmakla aynıdır. - :hov düğmesine tıklayıp
:hoverkutusunu işaretlersen öğe, fare üstündeymiş gibi kalır; hover rengini rahatça ayarlarsın.
Aşağıdaki görüntü gerçek bir Styles sekmesi. Sayfa kartın kısa bir kopyası; stil.css'ine bilerek iki yazım hatası koyduk (9. ve 10. satırlar), sonra rol satırına sağ tıklayıp İncele dedik. Bu dosyayı yazman gerekmiyor; aynı ipuçlarını Görev 5'te kendi sayfanda arayacaksın.
body { background-color: #0a1428; color: #f0e6d2; font-family: "Segoe UI", Arial, sans-serif;} .kart p { color: dimgray; padding: 20; backround-color: #1e2328;} .kart .rol { color: crimson;}
p.rol) seçiliyken Styles sekmesi. Kurallar güçlüden zayıfa sıralı, her birinin sağında dosya adı ve satır numarası var.Görüntüde şunları bul; her biri bir ipucu:
- Üstü çizili bildirim (
color: dimgray): ezilmiş. Daha özgül bir kural (.kart .rol, 0-2-0) aynı özelliği vermiş ve kazanmış. Onay kutusuyla kendin kapattığın bildirimler de böyle çizilir. - Turuncu uyarı üçgeni: tarayıcı bildirimi anlamamış ve atmış. Özellik adı yanlışsa (
backround-color) bütün satırın, yalnızca değer yanlışsa (padding: 20) yalnızca değerin üstü çizilir. Üçgenin üstüne gelince sebebi yazar: Unknown property name (bilinmeyen özellik adı) ya da Invalid property value (geçersiz değer). user agent stylesheet: tarayıcının varsayılan kuralları. Paragrafların üstündeki ve altındaki boşluk buradan gelir:margin-block-startvemargin-block-end, üst ve alt margin'in başka bir yazımı (1emyazı boyu kadar demek).displayözelliğini Ders 21'de öğreneceksin.- Inherited from body: ebeveynden kalıtımla gelenler. Soluk yazılan
background-colorkalıtımla geçmez;colorgeçerdi ama öğenin kendi kuralı onu ezdi;font-familygeçti ve kullanılıyor. - Aradığın kural listede hiç yoksa seçici o öğeyi yakalamıyordur ya da dosya hiç gelmemiştir.
Geliştirici araçların Türkçe açılıyorsa aynı yerlerde şu adları görürsün:
| İngilizce | Türkçe arayüzde |
|---|---|
| Styles / Computed | Stiller / Hesaplandı |
| user agent stylesheet | kullanıcı aracısı stil sayfası |
| Inherited from | Devralındığı kaynak |
| Unknown property name | Özellik adı bilinmiyor |
| Invalid property value | Geçersiz özellik değeri |
| Specificity | Belirginlik |
Kartın son hâli
Şimdiye kadarki parçaları birleştir. stil.css'in son hâli aşağıda: satır satır yaz, sonra geliştirici araçlarında onay kutularıyla tek tek kapatıp aç ve her satırın neyi değiştirdiğini gör. Sonuç, dersin başındaki ikinci önizleme.
* { box-sizing: border-box;} body { margin: 0; padding: 2rem 1rem; background-color: #0a1428; color: #f0e6d2; font-family: "Segoe UI", Arial, sans-serif; line-height: 1.6;} .kart { max-width: 320px; margin: 0 auto; padding: 1.5rem; background-color: #1e2328; border: 2px solid #c8aa6e; border-radius: 12px;} .ad { margin: 0; color: #c8aa6e; font-family: "Cinzel", serif; font-size: 2rem;} .rol { margin-top: 0; color: hsl(40 20% 65%); font-size: 0.875rem; text-transform: uppercase;} .dugme { width: 100%; padding: 0.75rem; border: 0; border-radius: 8px; background-color: hsl(175 90% 41%); color: #0a1428; font: inherit; font-weight: 700; cursor: pointer;} .dugme:hover { background-color: hsl(175 90% 50%);}Yeni gördüklerin:
.adve.rol'dakimargin: 0vemargin-top: 0: tarayıcının başlığa ve paragrafa verdiği varsayılan boşlukları kaldırır; başlık ile rol satırı birbirine yaklaşır.- Düğmenin zemini
hsl(175 90% 41%), hover rengihsl(175 90% 50%): yalnızca açıklık değişti. Ton ve doygunluk aynı kaldığı için renk, "aynı rengin açığı" gibi görünür. Düğme yazısının zemine kontrastı 8,6'ya 1. border: 0: tarayıcının düğmeye çizdiği varsayılan kenarlığı kaldırır.font: inherit;yazı ayarlarının hepsini karttan alır; alttakifont-weight: 700yalnızca kalınlığı değiştirir. İki satırın yerini değiştirirsenfont: inheritkalınlığı da ebeveyninkine geri çevirir ve yazı incelir. Sıra kuralının küçük bir örneği.
Sık hatalar: CSS sessizce görmezden gelir
JavaScript'teki gibi programı durduran bir hata yok: sayfa her durumda açılır, yalnızca bir şey eksik ya da yanlış görünür. Console'da kırmızı bir satır yalnızca dosya hiç bulunamadığında çıkar (404). Bu yüzden ilk adım hep aynı: öğeye sağ tıkla, İncele'yi seç, Styles sekmesine bak. Bir hata aldığında buraya ya da bütün derslerin hatalarının toplandığı hata rehberine bak.
Ne zaman çıkar? Bir bildirimin sonundaki ; unutulunca. VS Code bir alt satırdan başlayarak birkaç yerin altını kırmızıyla çizer. İlk çizginin üstüne fareyle gelince semi-colon expected ("noktalı virgül bekleniyordu") yazar; aşağıdaki { expected gibi öbür çizgiler aynı hatanın yan etkisidir.
.bozuk { color: white background-color: purple; padding: 16px;}.dogru { color: white; background-color: purple; padding: 16px;}Tarayıcı bir bildirimi ; görene kadar okur. Bozuk kuralda color özelliğinin değeri white background-color: purple olmuş: böyle bir renk yok, bildirim bütünüyle atılır. Sonuçta yazı rengi de zemin de gider, yalnızca padding çalışır. Geliştirici araçlarında iki satır tek satıra kaynamış görünür:

background-color diye ayrı bir satır yok; o, color'ın üstü çizili değerinin içinde kalmış.Nasıl düzelir? white'tan sonra ; koy. VS Code'un ilk çizgisi eksiğin kendisini değil, okumanın takıldığı yeri gösterir; eksik ;'yi o çizginin hemen üst satırının sonunda ara. Düzeltince öbür çizgiler de kaybolur.
// kullanmakNe zaman çıkar? Bir kuralın üstüne JavaScript alışkanlığıyla // ile not yazınca. CSS'te // yorum değildir; VS Code satırın altını çizer ve at-rule or selector expected der.
// başlığın rengih1 { color: crimson;}Tarayıcı // işaretlerini de seçicinin parçası sanır, seçiciyi geçersiz bulur ve bütün kuralı atar: başlık siyah kalır. Bir kuralın içinde // color: crimson; yazarsan da o satır geçersiz sayılıp atlanır.
Nasıl düzelir? CSS'te yorum /* ... */ ile yazılır: /* başlığın rengi */. VS Code'da satırı seçip menüden Edit → Toggle Line Comment dersen, dosya CSS olduğu için doğru yorum işaretini kendisi koyar.
Ne zaman çıkar? .kart yazacağına kart yazınca. Hiçbir uyarı çıkmaz, VS Code da sesini çıkarmaz: kart geçerli bir seçicidir, yalnızca anlamı farklıdır.
kart { background-color: #1e2328;}Noktasız kart, bir etiket seçicisidir: tarayıcı sayfada <kart> adında bir etiket arar, bulamaz ve kuralı hiçbir öğeye uygulamaz. Geliştirici araçlarında kartı incelediğinde bu kural Styles sekmesinde hiç görünmez.
Nasıl düzelir? Sınıf için nokta, kimlik için #: .kart. Styles sekmesinde aradığın kural yoksa ilk şüphelin seçicidir.
padding: 20Ne zaman çıkar? Sıfırdan farklı bir uzunluğu birimsiz yazınca: padding: 20, width: 300. Ya da birimle sayının arasına boşluk koyunca: 20 px. VS Code bunu çizmez.
.kutu { border: 2px solid goldenrod; margin-bottom: 8px;} .birimsiz { padding: 20;} .birimli { padding: 20px;}20 ne? Piksel mi, rem mi, yüzde mi? Tarayıcı tahmin etmez, bildirimi atar; birinci kutunun hiç iç boşluğu yok. Geliştirici araçlarında 20 değerinin üstü çizili ve yanında uyarı simgesi görürsün. Tek istisna 0: sıfırın birimi önemsiz olduğu için margin: 0 yazılabilir.
Nasıl düzelir? Birimi sayıya bitişik yaz: 20px. Bir tuzak daha: sayfanın başında <!doctype html> yoksa tarayıcı eski sayfalarla uyumlu "tuhaflık moduna" (quirks mode) geçer ve padding: 20'yi kabul eder. Hata o sayfada gizlenir, doctype'lı sayfada ortaya çıkar. Doctype'ı hep yaz.
<link>'teki yol yanlış (404)Ne zaman çıkar? <link>'teki yol, dosyanın gerçek yeriyle uyuşmayınca. Sayfa açılır ama hiç stil yoktur: beyaz zemin, Times New Roman.
Örnek: stil.css'i düzenli olsun diye css adında bir klasöre taşıdın ama index.html'deki satırı güncellemedin:
<link rel="stylesheet" href="stil.css">Console sekmesinde kırmızı bir satır çıkar; metni, kullandığın sunucuya göre değişir. Live Server dosyayı bulamayınca "böyle bir dosya yok" diyen küçük bir HTML sayfası gönderir. Tarayıcı stil beklerken HTML gelince Ders 18'de gördüğün mesajı verir:
Refused to apply style from 'http://127.0.0.1:5500/stil.css' because its MIME type ('text/html') is not a supported stylesheet MIME type, and strict MIME checking is enabled.npx serve'de mesaj sorunu doğrudan söyler: sunucu 404, yani "bulunamadı" demiş.
Failed to load resource: the server responded with a status of 404 (Not Found)Mesaj hangisi olursa olsun asıl kanıt Network sekmesinde: stil.css satırı kırmızıdır, başında ✕ işareti, Status sütununda 404 yazar. Sayfanın kendisi ise 200 ile gelmiştir:

npx serve ile açılan sayfanın Network sekmesi. Sayfanın satırı bu yüzden localhost adını taşıyor; Live Server'da orada index.html görürsün. Üstte Disable cache işaretli; araçlar açık kaldıkça önbellek kullanılmaz.npx serve kullanıyorsan isteği terminalde de görürsün:
PS C:\kod\sampiyon-karti> npx serve... HTTP 11.10.2026 16:10:45 ::1 GET /stil.cssHTTP 11.10.2026 16:10:45 ::1 Returned 404 in 3 msSayfayı sunucusuz, dosyaya çift tıklayarak açtıysan Console'daki mesaj Failed to load resource: net::ERR_FILE_NOT_FOUND olur.
Nasıl düzelir? Yolu index.html'in yerine göre yeniden yaz: href="css/stil.css". Dosya adını harfi harfine denetle (stil.css mi still.css mi?) ve adın stil.css.txt olmadığından emin ol. Network sekmesinde satır 200 olunca stil gelir.
Ne zaman çıkar? CSS'i değiştirdin, kaydettin, sayfayı yeniledin; ekranda hâlâ eski görünüm var. Hata mesajı yok.
Sebepler, bakma sırasına göre:
- Dosya kaydedilmedi. VS Code sekmesinde dosya adının yanında ● var mı? Ctrl+S.
- Başka bir dosyayı düzenliyorsun. Klasörde iki ayrı
stil.cssolabilir (biricssklasöründe). Styles sekmesinde kuralın yanındaki dosya adına ve satır numarasına bak; hangi dosyanın geldiğini o söyler. - Kural geldi ama ezildi. Styles sekmesinde bildirimin üstü çiziliyse önbellek değil, özgüllük sorunudur.
- Tarayıcı eski kopyayı gösteriyor. Tarayıcı
stil.css'in eski kopyasını önbellekten kullanıyor olabilir. Bilgisayarındaki yerel sunucuda az olur, yayına aldığın sitede sık olur: örneğin GitHub Pages tarayıcıya "bu dosyayı 10 dakika boyunca önbellekten kullanabilirsin" der.
Nasıl düzelir? Ctrl+F5 ya da Ctrl+Shift+R ile sayfayı önbelleği atlayarak yenile. Geliştirici araçları açıkken Network sekmesindeki Disable cache kutusunu işaretlersen araçlar açık kaldıkça önbellek hiç kullanılmaz. Yayındaki sitede ziyaretçilerin de yeni dosyayı hemen alması için bağlantının sonuna bir sürüm ekleyebilirsin: href="stil.css?v=2". Tarayıcı bunu yeni bir adres sayar ve dosyayı yeniden indirir.
Ne zaman çıkar? Bir kural yazdın, seçici doğru, dosya geliyor; ama değer uygulanmıyor. Geliştirici araçlarında bildiriminin üstü çizili.
#ahri p { color: dimgray;} .vurgu { color: crimson;}<p class="vurgu"> kartın içindeyse gri kalır: #ahri p (1-0-1), .vurgu'yu (0-1-0) sırası ne olursa olsun yener. Styles sekmesinde .vurgu içindeki color bildiriminin üstü çizilidir; onu ezen kural hemen üstünde durur.
Nasıl düzelir? Ezen kuralı bul ve gereğinden güçlüyse sadeleştir: CSS'te id yerine sınıf kullan, bütün paragrafları değil yalnızca gerekenleri seç. !important ile "kazanmaya" çalışma; bir sonraki çakışmada daha büyüğüne ihtiyacın olur.
Unknown property: 'backround-color'Ne zaman çıkar? Bir özelliğin adını yanlış yazınca: backround-color, colour, JavaScript alışkanlığıyla backgroundColor. VS Code satırın altını sarıyla çizer ve bu uyarıyı gösterir.
.kart { backround-color: #1e2328;}Tarayıcı bu özelliği tanımaz ve bildirimi atar. Geliştirici araçlarında bütün bildirimin üstü çizilidir ve yanında uyarı simgesi vardır.
Nasıl düzelir? Adı düzelt: background-color. Yazarken VS Code'un önerdiği adların üstüne Enter'a basarsan bu hatayı hiç yapmazsın.
Görevler
Görevleri sampiyon-karti klasöründe, yeni dosyalarda yap. İlk dört görev aynı sayfa üstünde ilerler: bir eşya dükkânı. dukkan.html'i aşağıdaki gibi yaz; görevlerde yalnızca <head> bölümüne ve CSS'e dokunacaksın. İçindeki <span>, Ders 19'da adını duyduğun anlamsız satır içi kap: metnin bir parçasına sınıf verebilmek için kullanılır, <div>'in satır içi kardeşidir.
<!doctype html><html lang="tr"><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Eşya dükkânı</title></head><body> <h1>Eşya dükkânı</h1> <p class="altin">Altının: 1250</p> <ul class="esyalar"> <li class="esya">Uzun Kılıç <span class="fiyat">350</span></li> <li class="esya">Doran'ın Kalkanı <span class="fiyat">450</span></li> <li class="esya pahali">Sonsuzluk Kılıcı <span class="fiyat">3450</span></li> </ul> <p class="not">Fiyatlar altın cinsinden.</p> <button class="satin-al">Satın al</button></body></html>Dükkânı bağla ve boya
dukkan.css adında bir dosya oluştur ve dukkan.html'e bağla. Sonra:
- Sayfanın zemini
#10131a, yazı rengi#e8e6e3olsun. - Yazı tipi Segoe UI olsun; yoksa Arial, o da yoksa sistemin düz harfli genel ailesi.
- Satır yüksekliği yazı boyunun 1,5 katı olsun.
- Satın al düğmesinin yazı tipi sayfanınkiyle aynı olsun.
Bitirdiğinde sayfan şöyle görünmeli:
Sonra bağlantıyı bilerek boz: href'teki adı dukan.css yap, sayfayı yenile ve Console ile Network sekmelerinde ne gördüğüne bak. Ardından düzelt.
İpucu 1
<link> satırı <head> bölümünün içine gider; iki niteliği var: rel ve href.
İpucu 2
İlk üç madde tek bir body kuralına sığar: background-color, color, font-family, line-height.
İpucu 3
Düğme yazı tipini gövdeden kalıtımla almaz. Ona font: inherit; ver.
Çözümü göster
dukkan.html'in <head> bölümüne, <title> satırının altına:
<link rel="stylesheet" href="dukkan.css">body { background-color: #10131a; color: #e8e6e3; font-family: "Segoe UI", Arial, sans-serif; line-height: 1.5;} .satin-al { font: inherit;}Bozuk bağlantıda Console'da kırmızı bir satır çıkar: Live Server'da Refused to apply style from '…/dukan.css' because its MIME type ('text/html')…, npx serve'de Failed to load resource: … 404 (Not Found). Network'te dukan.css satırında 404 yazar ve sayfa beyaz zemine, Times New Roman'a döner.
Satır yüksekliği: 16 piksellik yazıda 1,5 × 16 = 24 piksel; geliştirici araçlarının Computed sekmesinde line-height: 24px görürsün. Düğmeyi incelersen yazı tipinin "Segoe UI", Arial, sans-serif ve boyunun 16 piksel olduğunu görürsün; font: inherit olmadan 13,33 piksellik Arial olurdu.
Seçicilerle boya
dukkan.css'e devam et. Her maddeyi tek bir kuralla yap:
- Başlık (
h1) ve altın satırı (.altin) aynı renkte olsun:#c8aa6e. İkisi için tek kural yaz. - Fiyatlar kalın olsun.
- Pahalı eşyanın yazısı
tomatorenginde olsun. - Yalnızca pahalı eşyanın fiyatının altı çizili olsun (
text-decoration: underline). Öbür fiyatlara dokunma. - Fare bir eşyanın üstüne gelince eşyanın zemini
hsl(220 25% 20%)olsun.
Sınır denemesi: Sonsuzluk Kılıcı hem esya hem pahali sınıfında. Fare üstüne gelince hem tomato rengini korumalı hem zemini değişmeli. .not paragrafı hiçbir kuraldan etkilenmemeli. Beklenen sonuç:
İpucu 1
Virgülle iki seçiciyi tek kurala bağlarsın: h1, .altin.
İpucu 2
Dördüncü madde için boşluklu (torun) seçici: önce pahalı eşya, sonra onun içindeki fiyat.
İpucu 3
Hover için sözde sınıf: .esya:hover.
Çözümü göster
Önceki kuralların altına:
h1,.altin { color: #c8aa6e;} .fiyat { font-weight: 700;} .pahali { color: tomato;} .pahali .fiyat { text-decoration: underline;} .esya:hover { background-color: hsl(220 25% 20%);}Pahalı eşyanın fiyatı tomato rengini kendi kuralı olmadan, .pahali'dan kalıtımla aldı. .esya:hover yalnızca zemini değiştirdiği, .pahali yalnızca rengi değiştirdiği için ikisi çakışmaz, toplanır. .not paragrafı hiçbir seçiciye uymadığı için gövdenin rengiyle kaldı.
Kutuları hesapla
Her eşya kendi kutusunda dursun. .esya için: genişlik 260 piksel; üstte ve altta 12, sağda ve solda 16 piksel iç boşluk; 2 piksellik #3c3c41 renkli düz kenarlık; altında 8 piksellik dış boşluk; 8 piksellik yuvarlak köşeler.
- Önce
box-sizingyazmadan dene. Bir eşyanın ekrandaki genişliğini kâğıt üstünde hesapla, sonra geliştirici araçlarında eşyanın üstüne gelerek doğrula. - Dosyanın en üstüne
box-sizing: border-boxkuralını ekle. Genişlik şimdi kaç? İçeriğe kaç piksel kaldı? - Sınır denemesi:
padding'in sağ ve sol değerini 16'dan 140'a çıkar. Eşya şimdi kaç piksel genişlikte, neden 260 değil? Denedikten sonra 16'ya geri al.
İkinci maddeyi bitirdiğinde sayfan şöyle görünmeli:
İpucu 1
Kısa yazım: padding: 12px 16px üst ve alt 12, sağ ve sol 16 demek.
İpucu 2
Varsayılan hesap: kenarlık + padding + width + padding + kenarlık.
İpucu 3
border-box'ta içerik = width − padding'ler − kenarlıklar. Bu sonuç sıfırın altına düşerse içerik sıfır olur ve kutu, padding'le kenarlığın toplamından küçük olamaz.
Çözümü göster
* { box-sizing: border-box;}.esya { width: 260px; padding: 12px 16px; border: 2px solid #3c3c41; margin-bottom: 8px; border-radius: 8px;}box-sizingyokken: 2 + 16 + 260 + 16 + 2 = 296 piksel. Geliştirici araçlarındaki kutucuktali.esya 296 × …yazar.border-boxile: 260 piksel. İçeriğe 260 − 2 × 16 − 2 × 2 = 224 piksel kalır.- 140 ile: 2 + 140 + 140 + 2 = 284 piksel, 260'tan büyük. Padding ile kenarlık 260'a sığmıyor, içerik sıfıra iniyor ve kutu 284 piksel oluyor. İçeriğe yer kalmadığı için yazı her sözcükte alt satıra kırılıyor ve sözcükler sağdaki iç boşluğun üstüne taşıyor.
border-box, kutuyu en az "padding + kenarlık" genişliğinde tutar.
rem ve yüzde
Dükkânın yazı boylarını rem'e çevir ve satın al düğmesini esnek yap:
h140 piksel, eşyalar 18 piksel,.not12 piksel olsun; amapxyazmak yok,remkullan.- Satın al düğmesi, gövdenin içerik genişliğinin yarısı kadar geniş olsun.
- Chrome'da Ayarlar → Görünüm → Yazı tipi boyutu'nu Büyük yap ve dükkâna dön.
h1şimdi kaç piksel? Geliştirici araçlarının Computed sekmesinde doğrula. Bitince ayarı eski hâline (Orta) getir.
Sınır denemesi: Büyük yazıda eşya kutularının genişliği de değişti mi? Bundan ne sonuç çıkarırsın?
Bir de düğmenin width: 50% değerini geçici olarak 50vw yap: düğme biraz genişler. Neden? Denedikten sonra 50%'ye geri al.
Varsayılan yazı boyutunda (Orta) sayfan şöyle görünmeli:
İpucu 1
rem = piksel ÷ 16. Örneğin 24 piksel = 1.5rem.
İpucu 2
width: 50% ebeveynin içerik genişliğinin yarısıdır; düğmenin ebeveyni body.
İpucu 3
Büyük ayarında kök yazı boyu 20 piksel olur; rem değerlerini 20 ile çarp.
Çözümü göster
dukkan.css'in son hâli:
* { box-sizing: border-box;} body { background-color: #10131a; color: #e8e6e3; font-family: "Segoe UI", Arial, sans-serif; line-height: 1.5;} h1 { font-size: 2.5rem;} .satin-al { width: 50%; font: inherit;} h1,.altin { color: #c8aa6e;} .fiyat { font-weight: 700;} .pahali { color: tomato;} .pahali .fiyat { text-decoration: underline;} .esya:hover { background-color: hsl(220 25% 20%);} .esya { width: 260px; padding: 12px 16px; border: 2px solid #3c3c41; margin-bottom: 8px; border-radius: 8px; font-size: 1.125rem;} .not { font-size: 0.75rem;}- 40 ÷ 16 =
2.5rem, 18 ÷ 16 =1.125rem, 12 ÷ 16 =0.75rem. - Büyük ayarında kök yazı 20 piksel olur:
h12,5 × 20 = 50 piksel, eşyalar 22,5,.not15 piksel.pxile yazsaydın hiçbiri değişmezdi. - Sınır denemesinin cevabı: eşya kutularının genişliği değişmedi, çünkü
pxile yazıldı (260). Kutular yalnızca içlerindeki yazı büyüdüğü için biraz uzadı. Büyük ayarında adlar hâlâ tek satıra sığıyor, ama Çok büyük'te (kök 24 piksel) her eşya adı iki satıra kırılır. Yazıyla birlikte büyümesi gereken genişlikleri deremile vermeyi düşün. 50vwpencerenin tamamının yarısı,50%ise gövdenin içerik genişliğinin yarısı. Gövdenin iki yandaki 8 piksellik margin'i düşüldüğü için50%biraz dar kalır: 1000 piksellik pencerede düğme 492 piksel,50vwile 500 piksel olur.
Hata avı: maç sonucu
skor.html ve skor.css dosyalarını aşağıdaki gibi yaz. CSS'te dört sessiz hata var. Tarayıcı hiçbirinde mesaj vermiyor; VS Code yalnızca birini fark ediyor (onun yüzünden iki yerin altını çiziyor). Geliştirici araçlarını kullanarak dördünü de bul ve düzelt.
<!doctype html><html lang="tr"><head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Maç sonucu</title> <link rel="stylesheet" href="skor.css"></head><body> <section class="sonuc" id="mac"> <h2 class="baslik">Zafer</h2> <p class="sure">Süre: 31:42</p> <p class="kda">Lux · 7 / 2 / 15</p> </section></body></html>body { background-color: #0a1428; color: #f0e6d2 font-family: "Segoe UI", Arial, sans-serif;} .sonuc { max-width: 360px; padding: 24; border: 2px solid #c8aa6e;} baslik { color: #0ac8b9;} #mac p { color: #a09b8c;} .kda { color: #f0e6d2; font-weight: 700;}Bu hâliyle sayfa şöyle görünüyor:
Dördünü de düzelttiğinde ise şöyle görünmeli: lacivert zeminde krem rengi, Segoe UI yazı; sonuç kutusunun içinde 24 piksel boşluk; Zafer başlığı camgöbeği (#0ac8b9); süre satırı soluk gri (#a09b8c); KDA satırı krem rengi ve kalın.
İpucu 1
En göze batan belirti: Zafer başlığı lacivert zeminde neredeyse görünmüyor ve yazıların hepsi Times New Roman. body kuralına bak. VS Code'un ilk çizdiği satır 4; hatanın kendisi bir üst satırın sonunda.
İpucu 2
Zafer başlığını incele: Styles sekmesinde senin yazdığın bir renk kuralı hiç görünmüyorsa seçici o öğeyi yakalamıyordur. Sonuç kutusunu incele: padding değerinin yanında ne var?
İpucu 3
KDA satırı kalın ama gri. Demek ki .kda kuralı çalışıyor, yalnızca rengi ezilmiş. Styles sekmesinde üstü çizili color bildirimini ve onu ezen kuralı bul; iki seçicinin puanını hesapla.
Çözümü göster
body { background-color: #0a1428; color: #f0e6d2; font-family: "Segoe UI", Arial, sans-serif;} .sonuc { max-width: 360px; padding: 24px; border: 2px solid #c8aa6e;} .baslik { color: #0ac8b9;} .sure { color: #a09b8c;} .kda { color: #f0e6d2; font-weight: 700;}- 3. satır:
#f0e6d2'dan sonra;eksikti.colorilefont-familybirlikte atılıyordu: bütün yazılar Times New Roman'a, kendi renk kuralı çalışmayanZaferbaşlığı da tarayıcının varsayılanı olan siyaha dönmüştü. Siyahın lacivert zemine kontrastı 1,1'e 1: neredeyse görünmez. - 9. satır:
padding: 24birimsizdi ve atılıyordu.24pxolmalı. - 13. satır:
basliknoktasızdı; sayfada<baslik>diye bir etiket aradı..baslikolmalı. - 17. satır:
#mac p(1-0-1),.kda'yı (0-1-0) eziyordu. Bütün paragrafları kimlikle boyamak yerine yalnızca süre satırını sınıfıyla seçtik:.sure. Artık.kda'nın rengiyle çakışan bir kural yok.
Kendini sına
Soru 1
Ahri başlığı hangi renkte görünür?
#ahri .ad { color: crimson;} .kart h1 { color: teal;} h1.ad { color: goldenrod;}<article class="kart" id="ahri"> <h1 class="ad">Ahri</h1></article>Cevabı göster
crimson. Puanlar: #ahri .ad 1-1-0, .kart h1 0-1-1, h1.ad 0-1-1. ID sütununda tek 1 olan ilk kural, gerisine bakılmadan kazanır. İlk kural olmasaydı öbür ikisi eşit olurdu (0-1-1) ve sonra yazılan h1.ad kazanırdı: goldenrod.
Soru 2
Bu kutu ekranda kaç piksel genişlikte? box-sizing: border-box eklenince ne olur?
.kutu { width: 250px; padding: 10px 20px; border: 1px solid gray; margin: 8px;}Cevabı göster
Varsayılanda 1 + 20 + 250 + 20 + 1 = 292 piksel. Dikey padding (10) genişliği etkilemez; margin (8) kutunun dışındaki boşluktur, genişliğe girmez. border-box ile kutu 250 piksel olur, içeriğe 250 − 40 − 2 = 208 piksel kalır.
Soru 3
.kart p, .kart, p ve p.kart seçicileri neyi seçer?
Cevabı göster
.kart p:kartsınıflı bir öğenin içindeki bütün paragraflar (boşluk: torun)..kart, p:kartsınıflı öğeler ve sayfadaki bütün paragraflar (virgül: iki ayrı seçici).p.kart:kartsınıfı olan paragraflar (bitişik: aynı öğede iki koşul).
Soru 4
Bu kuraldaki bildirimlerden hangileri uygulanır?
.rol { color: crimson font-size: 1.25rem; margin: 0;}Cevabı göster
Yalnızca margin: 0. crimson'dan sonra ; olmadığı için tarayıcı color'ın değerini crimson font-size: 1.25rem diye okur; geçersiz olduğu için bildirimi bütünüyle atar. Böylece color da font-size da gider. margin: 0 ayrı bir bildirim olarak sağlam kalır.
Soru 5
Yazı boylarını neden px yerine rem ile yazmalısın?
Cevabı göster
rem, kullanıcının tarayıcıdaki yazı tipi boyutu ayarına uyar. Görme güçlüğü olan biri ayarı büyüttüğünde kök yazı boyu 16'dan 20 piksele çıkar; rem ile yazılmış her şey onunla büyür. px ile yazılanlar yerinde sayar ve o kişi sayfayı rahat okuyamaz.
Soru 6
Hangileri kalıtımla ebeveynden çocuğa geçer: color, border, font-family, padding, line-height, background-color?
Cevabı göster
color, font-family ve line-height: yazıyla ilgili olanlar. border, padding ve background-color geçmez. background-color geçiyormuş gibi görünebilir, çünkü çocuğun zemini varsayılan olarak saydamdır ve ebeveynin zemini arkadan görünür; ama çocuğun kendi zemini yoktur.
Soru 7
hsl(120 100% 25%) hangi renk? Aynı rengin daha açık bir tonunu nasıl yazarsın?
Cevabı göster
Ton 120 yeşildir, doygunluk tam, açıklık düşük: koyu yeşil. Tarayıcı bunu rgb(0, 128, 0) olarak saklar, yani green adlı renkle aynıdır. Daha açık bir ton için yalnızca son sayıyı artır: hsl(120 100% 40%).
Soru 8
stil.css'te bir rengi değiştirdin, kaydettin, sayfayı yeniledin; ekran değişmedi. Neleri, hangi sırayla denetlersin?
Cevabı göster
- Dosya gerçekten kaydedildi mi (VS Code sekmesinde ● var mı)?
- Sayfa doğru dosyayı mı yüklüyor? Network sekmesinde
stil.css200mü? Styles sekmesinde kuralın yanındaki dosya adı ve satır numarası, düzenlediğin dosyayla aynı mı? - Kural öğeye uyuyor mu, uyuyorsa ezilmiş mi? Styles sekmesinde kural hiç yoksa seçici yanlış; üstü çiziliyse daha özgül bir kural kazanıyor.
- Hepsi doğruysa önbellek: Ctrl+F5 ile önbelleği atlayarak yenile.
Kayıt noktası
Kartı ve görev dosyalarını kaydet. VS Code terminalinde, C:\kod\sampiyon-karti klasöründeyken:
Bir sonraki derste kutuları yan yana ve ızgara hâlinde dizmeyi (flexbox ve grid) ve sayfayı telefona uydurmayı öğreneceksin; bu kartı çoğaltıp her ekrana uyan bir şampiyon listesi kuracaksın.