Sıfırdan CSS öğrenin
CSS, HTML'in kurduğu şeyin nasıl görüneceğine karar verir: renk, boşluk, boyut ve her öğenin yeri. Her kuralın üç parçası vardır: hangi öğe diyen bir seçici, neyi diyen bir özellik ve bir değer.
- Ders 3 / 12
- Başlangıç
- Ücretsiz, kayıt yok
Bir stil bir öğeye nasıl ulaşır
-
1
Etiketin üzerindeki style özniteliği
Öğeye en yakın katman ve sonradan değiştirmesi en zor şey.
-
2
Sınıf ya da kimlikle yazdığınız kural
Seçici ne kadar belirginse ağırlığı o kadar fazladır. Kimlik en ağırıdır; bu yüzden daha az kullanın.
-
3
Etiket adıyla yazdığınız kural
En hafif kuralınız, yine de tarayıcı varsayılanının önünde.
-
4
Tarayıcı varsayılanı
Büyük başlıklar, mavi bağlantılar, madde imli listeler. Her şey siz gelmeden önce burada tanımlandı.
-
5
Ebeveynden miras kalan değer
En zayıf katman. body üzerindeki bir renk bağlantılara ulaşmaz, çünkü tarayıcının bağlantılar için doğrudan bir kuralı vardır.
important bu sırayı bozar; bu yüzden son çaredir. Kalıtım en dıştaki katmandır: doğrudan her kural, tarayıcının kendi kuralı bile onu geçer.
Son kontrol: Bu dersteki bilgiler ve araç adları bu tarihte kaynaklarıyla yeniden doğrulanır.
CSS neyi denetler ve sayfaya nasıl ulaşır?
Tek bir iş yapar: HTML'in kurduğu şeyin nasıl görüneceğine karar verir. CSS, cascading style sheets ifadesinin kısaltmasıdır ve en küçük birimi bir kuraldır:
p {
color: #333;
line-height: 1.9;
}Onu sayfaya bağlamanın üç yolu var; pratikte birini kullanırız. Etiketin üzerine style özniteliği yazabilir, kuralları head içindeki bir style etiketine koyabilir ya da hepsini ayrı bir dosyada tutup tek satırla çağırabilirsiniz:
<link rel="stylesheet" href="style.css">Üçüncüyü seçin, diğer ikisini istisnalara saklayın. Sebep zevk değil: ayrı dosya bir kez iner ve tarayıcı sonraki sayfada onu kendi önbelleğinden alır; düğme rengi değişeceği gün elli yeri değil bir yeri değiştirirsiniz.
Bir şey de her yeni başlayanı şaşırtır. Siz tek satır CSS yazmadan önce sayfanın stilleri zaten vardır: başlık büyük ve kalındır, bağlantılar mavi ve altı çizilidir, listelerin madde imleri vardır. Bunları tarayıcı kendi yerleşik stil sayfasıyla koyar; sizin yazdığınız şey onların yeniden yazımıdır.
Seçiciler: tarayıcıya hangi öğe olduğunu söylemek
Bir etiket adı yazarsınız ve o etiketlerin hepsini alırsınız. Bir nokta ve sınıf adı yazarsanız yalnızca o sınıfı taşıyan öğeleri, bir diyez ve kimlik yazarsanız tek bir benzersiz öğeyi alırsınız.
a { color: #0b5; } /* her bağlantı */
.btn { border-radius: 12px; } /* class="btn" olan her şey */
#header { position: sticky; } /* id="header" olan öğe */
.card p { margin-block: 0; } /* .card içindeki her p */
a:hover { text-decoration: underline; }Pratikte neredeyse hep sınıf yazın. Kimlik sayfada benzersizdir ve bağlantılar ile JavaScript için değerlidir, ama stilde ağırlık getirir ve sonradan onu aşmak için daha fazla ağırlık getirmeye zorlar. Bu, important'ta biten yoldur.
Daha az öğretilen ve klavye kullanıcısı için hayati bir seçici var. hover yalnızca fare için bir anlam taşır; sayfada Tab ile gezen biri şu anda hangi öğenin üzerinde durduğunu görmek zorundadır:
.btn:focus-visible {
outline: 2px solid #0b5;
outline-offset: 2px;
}Tarayıcının varsayılan halkasını outline: none ile kaldırıp yerine bir şey koymadıysanız, sayfayı klavye kullanıcısına karşı kör ettiniz. Bu, tek satır CSS'in erişilebilirliğe doğrudan zarar verdiği ender yerlerden biridir.
Yazdığım stil neden uygulanmıyor?
Kısa yanıt: kuralınız uygulandı, yalnızca başka bir kural onu geçti. Tarayıcı her öğenin her özelliği için sırayla üç şey sorar. Hangi kurallar bu öğeyi hedefliyor, hangisi daha belirgin ve belirginlik eşitse hangisi dosyada daha sonra geldi.
Sayfanın en üstündeki şekil bu katmanlardır; öğeye en yakından dışa doğru. Etiketin üzerindeki style en yakındır, bu yüzden sonradan değiştirilmesi en zor şeydir; tarayıcı varsayılanı ise en uzaktır. En çok yanlış anlaşılan yer en dıştaki katmandır: kalıtım.
Renk verirsiniz body öğesine ve bağlantıların da onu almasını beklersiniz. Almazlar. Tarayıcının a etiketi için doğrudan bir kuralı vardır ve herhangi bir doğrudan kural, tarayıcının kendi kuralı bile, ebeveynden miras kalan bir değeri geçer. Kalıtım en zayıf katmandır, en güçlüsü değil.
Şimdi çözüm; on saniye sürer. Tahmin etmek yerine öğeye sağ tıklayın, incele deyin ve Computed sekmesini açın. Her özelliğin son değeri orada yazar; birini açınca kazanan kuralı dosya adı ve satır numarasıyla, kaybeden kuralları da üstü çizili görürsünüz. Tahminin bunun yerini tutacak hâli yok.
Bir de bu sırayı kıran kelime var: important. Bir kez yazın, sonraki her kural kazanmak için onu yazmak zorunda kalır ve dosyanız o andan sonra mantıkla değil ağırlıkla ilerler. Kuralımız basit: important olmadan çalışmıyorsa seçici yanlıştır. Tek gerçek istisna, yazmadığınız ve erişemediğiniz bir kodu biçimlendirmektir.
Her öğe bir kutudur
Sayfadaki her şey bir dikdörtgendir, tek bir harf bile. Bu dikdörtgenin dört katmanı vardır: içeriğin kendisi, çerçeveye kadar olan iç boşluk padding, çevresindeki çizgi border ve diğer öğelere kadar olan dış boşluk margin. CSS'teki tüm boşluk işi bu dörttür.
Neredeyse herkesin değiştirdiği ve pek azının açıkladığı bir varsayılan karar da var. Varsayılan olarak width içine yazdığınız sayı yalnızca içeriğin boyutudur; bu yüzden yüzde yüz genişlikte olup padding de taşıyan bir öğe kendi yerinden taşar. Tek satır bunu kalıcı olarak çözer:
*, *::before, *::after { box-sizing: border-box; }border-box ile genişlik sayısı iç boşluğu ve kenarlığı da kapsar; yani baştan beklediğiniz şeyi. Bu satırı her CSS dosyasının başına koyun ve bir daha düşünmeyin.
Bir davranış da herkesi bir kez şaşırtır. Art arda gelen iki öğe arasındaki dikey boşluk toplanmaz; büyük olan kazanır. Buna kenar boşluğu birleşmesi denir ve yalnızca dikey kenar boşluklarında olur; iç boşlukta olmaz, flex ve grid içinde de olmaz. Modern yerleşimlerin kenar boşluğu yerine gap kullanmasının bir sebebi budur.
Yerleşim: ne zaman flexbox, ne zaman grid?
Flexbox'ın bir ekseni, grid'in iki ekseni vardır ve bu fark kararların çoğunu belirler. Flex ile birkaç şeyi bir satıra ya da sütuna dizer, her birinin boyutunu kendi içeriğinden almasına izin verirsiniz. Grid ile önce yapıyı çizersiniz; sütunları ve satırları kendiniz tanımlarsınız, içerik de içlerine oturur.
.toolbar {
display: flex;
align-items: center;
gap: 12px;
}
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(220px, 1fr));
gap: 16px;
}İkinci kural ezbere bilmeye değer. Her sütunun en az 220 piksel olmasını ve artan alanı paylaşmasını söyler; tarayıcı da her genişlikte kaç sütunun sığdığını kendisi hesaplar. Tek bir media query olmadan duyarlı bir ızgara.
İkisi rakip değil ve birini seçmek diğerinden vazgeçmek anlamına gelmez. Pratikte sayfanın iskeleti grid ile kurulur ve her hücresinin içinde bir flex satırı oturur. Pratik kural: "şu birkaç şey yan yana" diyebiliyorsanız flex; "şu hücrelerden oluşan tablo" diyorsanız grid.
Flexbox ve grid: iki tür sorun için iki araç
Biri içeriği tek eksende dizer, diğeri iki eksende bir yapı tanımlar.
Flexbox, tek eksen
- Tek satır ya da tek sütun; her öğe kendi içeriğine göre boyutlanır
- Araç çubuğu, menü, düğme satırı, metnin yanındaki simge için
- Kaç öğe geleceğini bilmediğinizde ve yalnızca yan yana dursunlar istediğinizde
- wrap ile alt satıra geçer, ama sütunlar hizalı kalmaz
Grid, iki eksen
- Sütunları ve satırları siz tanımlarsınız, içerik içlerine oturur
- Sayfa iskeleti, kart ızgarası ve dikey hizanın önemli olduğu her yer için
- repeat ve minmax ile media query olmadan her genişlikte sütun sayısını kendi seçer
- Basit bir satır için fazla; orada flex daha kısa ve okunaklıdır
Gerçek bir sayfada ikisi birlikte çalışır: iskelet grid ile, her hücrenin içinde bir flex satırı. Birini seçmek diğerinden vazgeçmek değildir.
Farsça bir site neden margin-left değil margin-inline-start ister
Çünkü margin-left, Farsçada İngilizcedeki yerle aynı yer değildir. Fiziksel özellikler ekranın soluyla sağını düşünür; mantıksal özellikler satırın başını ve sonunu düşünür. margin-inline-start, satırın başladığı yerden itibaren boşluk demektir; tarayıcı bunu Farsça ve Arapçada sağ, İngilizcede sol olarak okur, siz hiçbir şey yapmazsınız.
Çevirisi de zor değil:
| Fiziksel | Mantıksal | Sağdan sola yazımda ne yapar |
|---|---|---|
| margin-left | margin-inline-start | satırın başından boşluk, Farsçada sağ taraf |
| padding-right | padding-inline-end | satırın sonundan iç boşluk, Farsçada sol taraf |
| left: 0 | inset-inline-start: 0 | satırın başladığı kenara yapışmak |
| border-left | border-inline-start | öğenin yanındaki çizgi, hep başlangıç tarafında |
| text-align: left | text-align: start | metnin satır başına hizalanması, ikisinde de doğru |
| width ve height | inline-size ve block-size | satır boyunca ve ona dik boyut |
Sınamak on saniye sürer ve kimse öğretmez: tarayıcı geliştirici araçlarında html etiketi üzerinde dir değerini rtl'den ltr'ye çevirin ve aynı sayfaya bakın. Yerinden kıpırdamayan ya da yanlış kenara yapışan her şey, geride kalmış bir fiziksel özelliktir. Kendi sitemizde bu denetim her yeni şablonun gözden geçirilmesinin bir parçası.
Kuralın gerekmediği yer: tek bir soldan sağa dili olan ve başka dil almayacak bir site. Orada margin-left hiç ısırmaz ve mantıksal özelliklerde ısrar bir gereklilik değil iyi bir alışkanlıktır. Ama siteniz Farsçaysa ya da bir gün İngilizce de olacaksa, bu fark o günün size bir saate mi bir haftaya mı mal olacağını belirler.
Aynı kart: fiziksel özelliklerle ve mantıksal özelliklerle
Mantıksal özelliklerle
- Dört dil için tek CSS dosyası, ayrı bir sağdan sola sürümü olmadan
- Yeni bir dil eklemek CSS işi gerektirmez
- Metnin yanındaki simge her zaman doğru tarafta kalır
- Sınamak, geliştirici araçlarında tek bir dir özniteliğini değiştirmektir
Fiziksel özelliklerle
- İkinci dil ya ikinci bir dosya ya da aynalanmış kurallar ister
- Biri yeni bir margin-left eklediğinde orada yeniden bozulur
- Hatalar sessizdir: hiçbir şey kırılmaz, yalnızca yanlış yere oturur
- Tek dilli bir sitede bunların hiçbiri olmaz
Bu fark yalnızca sitenin birden fazla yönü olduğunda ortaya çıkar. Tek dilli, soldan sağa bir sitede fiziksel özellikler hiçbir şeyi bozmaz.
CSS değişkenleri: bir kez tanımlayın, her yerde kullanın
CSS değişkeni, bir değeri tutan bir addır. Teknik adı özel özelliktir, iki tireyle başlar ve var ile okunur:
:root {
--brand: #0b5;
--gap: 16px;
}
.btn {
background: var(--brand);
padding: var(--gap);
}Daha az söylenen şey, bu değişkenin diğer her değer gibi kalıtımla geçmesidir. Aynı adı tek bir öğe üzerinde yeniden tanımlayın; o öğenin içindeki her şey yeni değeri görür, sayfanın geri kalanı olduğu gibi kalır:
.card--warn { --brand: #d97706; }Artık o kartın içindeki her düğme turuncu; .btn kuralının tek satırı değişmeden. Koyu tema da tam bu fikirle kurulur: ikinci bir CSS dosyası değil, birkaç adı yeniden tanımlayan tek bir blok.
Sınırı ise şu: bu, programlama anlamında bir değişken değildir. Onunla aritmetik yalnızca calc içinde olur ve bir media query koşulunda kullanamazsınız. Döngü, koşul ve fonksiyon arıyorsanız işi tam da bu olan Sass gibi araçlara gidiyorsunuz demektir; onların çıktısı da yine bu sade CSS'tir.
Yapay zekayla hızlı yol
Dil modelleri "bana şu yerleşimi kur" işinde iyidir, çünkü bu iş bir tarifin flex ve grid'e mekanik çevirisidir. Yetersiz kaldıkları yer, tam da yeni başlayanın takıldığı yerdir: bir stilin neden uygulanmadığını bulmak. Bunun için sayfanızı görmeleri gerekir, görmezler. Yani hızlı yolun iki yarısı var: yerleşimi devredin, kademeyi kendinizde tutun. İlk yarı için hızlı ve ucuz bir model yeter; güncel tercihimiz <a class="text-link" href="/tr/ai/">yapay zeka bölümünde</a>.
- Sorunlu bloğu ayırın ve onun gerçek HTML'ini alın. Sayfayı işaretlemeyi yapıştırmak yerine anlatmak, alakasız yanıtın tek başına en büyük sebebidir.
- Aşağıdaki tarifi çalıştırın. Renk ve boşluk değişkenleriniz varsa onları orada listeleyin ki model yeni adlar uydurmasın.
- Çıktıyı yerleştirin ve iki yönü de sınayın: geliştirici araçlarında html etiketindeki dir değerini değiştirip aynı sayfaya bakın.
- Bir stil uygulanmadıysa sohbete geri dönmeyin. Computed sekmesini açın: hangi kuralın kazandığını, hangi dosya ve satırdan geldiğini yazar.
Kopyalamaya hazır şablon
Rol: çerçeve kullanmadan modern CSS yazan biri.
İstediğim:
Bölüm: {bölüm adı}
Mevcut işaretleme: {HTML'i buraya yapıştırın}
İstenen davranış: {örneğin yan yana üç kart, mobilde alt alta}
Yön: sağdan sola (Farsça), ama aynı kod soldan sağa da doğru olmalı
Çıktı kuralları:
- Yalnızca CSS ver. İşaretlemeyi değiştirme; bir sınıf eklenmesi gerekiyorsa önce nerede ve neden olduğunu söyle.
- Tüm boşluk ve yön mantıksal özelliklerle: margin-inline, padding-inline, inset-inline-start, text-align: start. Fiziksel left ve right yazma.
- Renkleri ve boşlukları şu değişkenlerden al: {mevcut değişkenlerinizi listeleyin}. Nedenini yazmadan yeni değişken uydurma.
- Tek eksenli yerleşim flex ile, iki eksenli grid ile. Hangisini neden seçtiğini bir satırda yaz.
- important yasak. Onsuz çalışmıyorsa seçici yanlıştır; bunun yerine onu söyle.
- Gerçekten sabit bir şey dışında, örneğin bir simge dışında, sabit piksel genişliği verme.
- Hover durumu olan her şeyin focus-visible durumu da olmalı.
Kodun ardından üç satırda soldan sağa yönde neyin yer değiştirdiğini ve nerede tereddüt ettiğini söyle.
Çıktıya güvenmeden önce: Kendinizin denetlemesi gereken iki şey var. Birincisi yön: sayfanın aynada yanlış durduğunu hiçbir otomatik araç söylemez, yalnızca kendi gözünüz söyler. İkincisi kademe: bir modele stilinizin neden uygulanmadığını sorarsanız yanıt biçiminde bir şey alırsınız ama o bir tahmindir, çünkü sayfanızı hiç görmedi. O sorunun yanıtı başka yerdedir: kendi tarayıcınızın Computed sekmesinde.
Bu işte yapay zeka
CSS'te yapay zekanın net bir yeri var ve onun dışında hızla işe yaramaz olur. Gerçekten hızlandırdığı üç şey: tarif edilen bir yerleşimi flex ve grid'e çevirmek, tanımadığınız bir CSS bloğunu satır satır açıklamak ve left ile right dolu bir dosyayı mantıksal sürümüne dönüştürmek. Devretmediğimiz iki şey: sayfanın nasıl görüneceğine karar vermek ve bir kuralın neden uygulanmadığını bulmak.
Gerçekten işe yarayan araçlar
- Claude Bir CSS dosyasını satır satır açıklamakta ve fiziksel özellikleri mantıksal olanlara çevirmekte iyi. İran, Anthropic'in desteklenen ülkeler listesinde yok; bunu Anthropic'in kendi sayfasında okuduk.
- Gemini Bir tarifden yerleşim kurmaya ve temel sorulara yeter; Farsçayı da iyi anlar. Google'ın kendi sayfası Gemini web uygulamasının 230'dan fazla ülke ve bölgede çalıştığını söylüyor ve İran o listede yok.
- Claude Code Bir parçayı değil bütün bir dosyayı değiştirmeniz gerektiğinde işe yarar, çünkü kendi düzenleyicinizde ve terminalinizde çalışır, dosyayı görür. Kurulumu ücretsizdir ama Anthropic aboneliği ister ve İran desteklenen ülkeler listesinde değil.
Nerede geri teper
Burada iki belirgin risk var ve ikisi de sessiz. Birincisi yön: model, siz söylemedikçe sayfanızın sağdan sola olduğunu bilmez; istemde talep etmezseniz margin-left yazmasını hiçbir şey engellemez ve çıktı İngilizcede doğru, Farsçada aynalanmış olur. Yukarıdaki tarif bu yüzden mantıksal özellikleri açıkça ister; tam listesi MDN belgelerinde. İkincisi kademe: model sayfanızı göremez, dolayısıyla bir stilin neden uygulanmadığına dair her yanıt bir tahmindir ve tutan tahminler seçici ağırlığını yükseltir ya da important ekler. İkisi de bir kez işe yarar ve sonraki değişikliği zorlaştırır. Konumumuz: yerleşim modelle, kademe tarayıcıyla. Her aracın İran'dan nasıl ödenebileceği için satın alma rehberine bakın.
Kaynaklar: MDN: CSS logical properties and values MDN: Handling conflicts, the cascade and specificity Anthropic: supported countries Google: where Gemini Apps are available
Bu tavsiyenin sınırı
CSS bir sayfanın nasıl göründüğünü kurar, bir siteyi değil. İçerik ve yapı HTML'in, davranış JavaScript'in işidir; sayfanın internette açılması ise barındırma ve alan adı işidir. Daha az söylenen bir nokta: sitenizi hazır bir temayla WordPress üzerinde yayına alacaksanız ihtiyacınız olan tüm CSS yirmi satır olabilir ve grid'de derinleşmek sizin hızlı yolunuz değildir. Bu ders, görünümü kendi denetlemek ya da temasının ne yaptığını anlamak isteyen biri için yazıldı. Mantıksal özellikler kuralı da aynı ölçüde koşulludur: sonsuza dek tek bir soldan sağa dili olacak bir sitede ona uymak, hiçbir şeyi kurtarmayan iyi bir alışkanlıktır.
Kendi işimizden
Bu sitenin kendisi bizim örneğimiz ve denetlenebilir. rgb.ir'in ana stil dosyası yaklaşık yüz otuz kilobayt ve dört dili birden servis ediyor: Farsça ile Arapça sağdan sola, İngilizce ile Türkçe soldan sağa, temada ayrı bir rtl dosyası olmadan. Bu dersin denetlendiği gün o dosya yetmiş yerde mantıksal özellik kullanıyordu ve içinde tek bir margin-left, padding-right ya da çıplak left ve right yoktu; text-align: left ve float da yoktu. Bir de gerekli bir dürüstlük: şekil stil dosyasında dört margin-left satırı kaldı ve bilerek kaldı, çünkü dördü de değeri simetrik olan aynı ortalama numarası ve orada left hiçbir yön taşımıyor. Kural şu: mantıksal özellikler, yerleşimin bir başı ve sonu olduğu yerde gerekir; left kelimesinin göründüğü her yerde değil.
Gerçek devam soruları
Önce HTML mi öğrenmeliyim, yoksa doğrudan CSS ile mi başlayabilirim?
Önce HTML, ama onu bitirene kadar beklemeyin. Bir CSS seçicisi öğeleri ve sınıfları işaret eder; temel öğelerin ne olduğunu bilmeden yazdığınız kuralların yarısı hiçbir şeyle eşleşmez. CSS'in anlam kazanması için bir öğleden sonralık HTML yeter.
Doğrudan Bootstrap ya da Tailwind ile mi başlamalıyım?
İlk hafta değil. Bir çerçeve, henüz öğrenmediğiniz kademeyi bir sınıf katmanının arkasına gizler ve bir şey olması gereken yere oturmadığı gün onu anlamak için elinizde araç kalmaz. Seçiciler, kademe ve grid oturduktan sonra çerçeve seçmek bir kestirme değil, makul bir proje kararıdır.
Sitem telefonda neden dağılıyor?
Çoğunlukla iki şeyden biri: head içinde viewport etiketi yoktur ya da bir yere telefon ekranından büyük sabit bir piksel genişliği yazmışsınızdır. Birincisi tek satırdır ve bu yolun HTML dersinde anlatıldı; ikincisi genelde max-width olması gereken bir width'tir. Duyarlı tasarım bu yolun bir sonraki dersi.