CSS: Web Sayfalarına Stil Kazandırma Sanatı

Web'in görsel dünyasını şekillendiren temel teknolojilerden biri olan CSS (Cascading Style Sheets - Basamaklı Stil Şablonları), HTML ile yapılandırılmış içeriğin nasıl görüneceğini tanımlayan bir stil dilidir. HTML, bir web sayfasının iskeletini ve içeriğini oluştururken, CSS bu iskeletin üzerine giydirilen elbiseler gibidir; renkleri, yazı tiplerini, yerleşimi, boyutları ve hatta animasyonları kontrol ederek kullanıcı deneyimini zenginleştirir. Modern web tasarımının ayrılmaz bir parçası olan CSS, web sitelerine estetik bir görünüm kazandırmanın yanı sıra, farklı cihazlarda tutarlı ve erişilebilir bir deneyim sunmak için de kritik bir rol oynar.

CSS olmadan web, büyük ölçüde siyah-beyaz metinlerden ve temel bağlantılardan ibaret kalırdı. CSS'in gücü, içeriği (HTML) sunumdan (stil) ayırmasından gelir. Bu ayrım, kodun daha temiz, yönetilebilir ve esnek olmasını sağlar. Bir web sitesinin tüm sayfalarının görünümünü tek bir CSS dosyasından kontrol etmek, tasarım değişikliklerini kolaylaştırır ve bakım maliyetlerini düşürür. Ayrıca, aynı HTML içeriği farklı cihazlar veya kullanıcı tercihleri için farklı CSS kuralları ile biçimlendirilebilir (örneğin, ekranlar için farklı, yazıcılar için farklı bir görünüm).

CSS'in tarihi, HTML gibi web'in ilk günlerine dayanır. İlk olarak 1996'da W3C tarafından standartlaştırılan CSS1'den bu yana, dil önemli ölçüde gelişti. CSS2 ve ardından CSS3 ile birlikte seçiciler, yerleşim modelleri (Flexbox, Grid), geçişler, animasyonlar, özel yazı tipleri ve daha birçok güçlü özellik eklendi. Günümüzde CSS, modüler bir yapıya sahip olup sürekli olarak yeni özellikler ve iyileştirmelerle güncellenmektedir. Bu rehber, CSS'in temel sözdiziminden başlayarak modern yerleşim tekniklerine, duyarlı tasarıma ve ileri seviye konulara kadar geniş bir yelpazede bilgi sunarak, web sayfalarınıza profesyonel bir görünüm kazandırmanız için size yol gösterecektir.

CSS Temelleri: Sözdizimi ve Uygulama Yöntemleri

CSS'in temelini anlamak, stil kurallarının nasıl yazıldığını ve HTML belgelerine nasıl entegre edildiğini öğrenmekle başlar. Temel sözdizimi oldukça basittir ancak CSS'in gücü, bu basit kuralların birleşerek karmaşık tasarımlar oluşturmasından gelir.

CSS Kural Yapısı (Sözdizimi) Nasıldır?

Bir CSS kuralı temel olarak iki bölümden oluşur: Seçici (Selector) ve Bildirim Bloğu (Declaration Block).


secici {
  ozellik: deger;
  baska-ozellik: baska-deger;
}
                    
  • Seçici (Selector): Hangi HTML eleman(lar)ına stil uygulanacağını hedefler. Örneğin, tüm paragrafları (p), belirli bir sınıfa (.uyari) sahip elemanları veya benzersiz bir ID'ye (#logo) sahip elemanı seçebilir. Seçiciler oldukça çeşitlidir ve güçlü hedefleme yetenekleri sunar (daha sonra detaylandırılacaktır).
  • Bildirim Bloğu (Declaration Block): Süslü parantezler ({ }) içine alınmış bir veya daha fazla bildirimden oluşur.
  • Bildirim (Declaration): Seçilen elemanlara uygulanacak stil kuralını tanımlar. Bir özellik (property) ve bir değerden (value) oluşur, aralarına iki nokta üst üste (:) konur ve bildirim noktalı virgül (;) ile sonlandırılır.
    • Özellik (Property): Değiştirilmek istenen stil özelliğidir (örn: color, font-size, background-color).
    • Değer (Value): Özelliğe atanacak değerdir (örn: red, 16px, #ffffff).

Örnek:


/* Tüm paragraf metinlerini mavi yapar */
p {
  color: blue;
  font-size: 14px; /* Yazı tipi boyutunu 14 piksel yapar */
}

/* 'baslik' ID'sine sahip elemanın arka planını gri yapar */
#baslik {
  background-color: lightgray;
}

/* 'vurgu' sınıfına sahip elemanları kalın yapar */
.vurgu {
  font-weight: bold;
}
                    

CSS'te yorumlar /* ile başlar ve */ ile biter. Çok satırlı olabilirler.

CSS HTML'e Nasıl Eklenir? (Uygulama Yöntemleri)

CSS kurallarını bir HTML belgesine uygulamanın üç temel yolu vardır:

  1. Harici Stil Şablonu (External Style Sheet): En yaygın ve tavsiye edilen yöntemdir. CSS kuralları ayrı bir .css dosyasına yazılır ve HTML belgesinin bölümü içine etiketi kullanılarak bağlanır.
    
    
    
    
      Harici CSS Örneği
      
    
    
      
    
    
                                

    stilim.css dosyası:

    
    body {
      font-family: Arial, sans-serif;
    }
    h1 {
      color: navy;
    }
                                

    Avantajları: İçeriği sunumdan tamamen ayırır, birden fazla HTML sayfasının aynı stil dosyasını kullanmasını sağlar (tutarlılık ve kolay bakım), tarayıcılar CSS dosyasını önbelleğe alarak sonraki sayfa yüklemelerini hızlandırabilir, kod daha temiz ve organize olur.

  2. Dahili Stil Şablonu (Internal Style Sheet): CSS kuralları, HTML belgesinin <head> bölümü içine açılan <style> etiketleri arasına yazılır.
    
    <!DOCTYPE html>
    <html>
    <head>
      <title>Dahili CSS Örneği
      <style>
        body {
          background-color: linen;
        }
        h1 {
          color: maroon;
          margin-left: 40px;
        }
      </style>
    </head>
    <body>
      <h1>Bu bir başlıktır
      <p>Bu bir paragraftır.

    </body> </html>

    Avantajları: Tek bir HTML sayfası için hızlı stil tanımlamaları yapılabilir. Dezavantajları: Stiller sadece o HTML sayfasına özgüdür, birden fazla sayfada aynı stilleri kullanmak için kopyala-yapıştır gerekir (bakımı zorlaştırır), içerik ve sunum aynı dosyada karışır.

  3. Satır İçi Stiller (Inline Styles): CSS kuralları doğrudan stil uygulanacak HTML elemanının style niteliği içine yazılır.
    
    
    
    
      

    Mavi ve Ortalanmış Başlık

    Kırmızı renkli paragraf.

    Avantajları: Çok spesifik ve tekil bir elemana hızlıca stil vermek için kullanılabilir (örneğin JavaScript ile dinamik olarak stil değiştirirken). Dezavantajları: En az tavsiye edilen yöntemdir. İçerik ve sunumu en fazla karıştıran yöntemdir, kodun okunabilirliğini ve bakımını çok zorlaştırır, CSS'in tekrar kullanılabilirlik avantajını ortadan kaldırır, özgüllüğü (specificity) çok yüksek olduğu için diğer stilleri ezmesi zordur.

Genel olarak, projelerinizde harici stil şablonları kullanmaya özen gösterin.

CSS Kademelenme, Özgüllük ve Kalıtım (Cascade, Specificity, Inheritance)

Bir HTML elemanına birden fazla CSS kuralı uygulanmaya çalıştığında, tarayıcının hangi kuralın geçerli olacağını belirlemek için kullandığı mekanizmalar vardır:

  • Kademelenme (Cascade): Tarayıcı, bir eleman için geçerli olabilecek tüm CSS kurallarını farklı kaynaklardan (tarayıcı varsayılan stilleri, kullanıcı stil şablonları, harici/dahili/inline stiller) toplar. Ardından bu kuralları belirli bir öncelik sırasına göre uygular. Genel kural şudur:
    1. Satır İçi Stiller (Inline Styles): En yüksek önceliğe sahiptir.
    2. Harici ve Dahili Stil Şablonları: Öncelikleri özgüllüklerine (specificity) ve kod içindeki sıralarına göre belirlenir.
    3. Kullanıcı Stil Şablonları: Tarayıcıya kullanıcı tarafından eklenen özel stiller.
    4. Tarayıcı Varsayılan Stilleri: Tarayıcının HTML elemanlarına uyguladığı temel stiller.
    Aynı öncelik seviyesindeki kurallardan daha sonra tanımlanan kural, öncekini ezer. !important kuralı, bu sıralamayı bozmak için kullanılabilir (ancak genellikle kaçınılması önerilir).
    
    p { color: blue; }
    p { color: red; } /* Bu kural geçerli olur (daha sonra tanımlandı) */
    
    p { color: green !important; } /* Bu kural diğerlerini ezer */
    p { color: yellow; } /* !important olmadığı için green'i ezemez */
                                
  • Özgüllük (Specificity): Kademelenme sırasında aynı öncelik seviyesindeki kurallar arasında hangisinin uygulanacağını belirleyen bir ağırlıklandırma sistemidir. Daha özgül (spesifik) olan seçici, daha az özgül olanı ezer. Özgüllük genellikle şu sırayla hesaplanır (en yüksekten en düşüğe):
    1. Satır içi stiller (style="...")
    2. ID seçiciler (#id)
    3. Sınıf (.class), nitelik ([type="text"]) ve sözde sınıf (:hover) seçicileri
    4. Tür (eleman) seçicileri (p, div) ve sözde eleman (::before) seçicileri
    5. Evrensel seçici (*) ve kalıtım yoluyla gelen değerler en düşük özgüllüğe sahiptir.
    Tarayıcı, her kuralın seçicisindeki ID, sınıf/nitelik/sözde-sınıf ve tür/sözde-eleman sayısını sayarak bir özgüllük değeri hesaplar.
    
    p { color: blue; }                /* Özgüllük: 0,0,1 */
    .paragraf { color: green; }       /* Özgüllük: 0,1,0 (daha özgül, blue'yu ezer) */
    #giris p { color: red; }          /* Özgüllük: 1,0,1 (daha özgül, green'i ezer) */
    

    ...

    /* Satır içi stil (en özgül, red'i ezer) */
  • Kalıtım (Inheritance): Bazı CSS özellikleri (genellikle metinle ilgili olanlar: color, font-family, font-size, line-height vb.) üst elemanlardan alt elemanlara otomatik olarak aktarılır. Eğer bir alt eleman için o özellik doğrudan tanımlanmamışsa, üst elemanından bu değeri miras alır. Tüm özellikler kalıtılmaz (örn: border, padding, margin, background-color kalıtılmaz). Kalıtım, inherit değeri kullanılarak zorlanabilir veya initial (varsayılan değere dön) / unset (kalıtılıyorsa inherit, değilse initial) değerleri ile sıfırlanabilir.

Bu üç mekanizmayı anlamak, CSS'in neden bazen beklediğiniz gibi çalışmadığını anlamanıza ve stilleri daha etkili bir şekilde yönetmenize yardımcı olur.

CSS Seçicileri: HTML Elemanlarını Hedeflemek

Seçiciler, CSS'in hangi HTML elemanlarına stil uygulayacağını belirleyen güçlü desenlerdir. Doğru seçicileri kullanmak, istediğiniz elemanları hassas bir şekilde hedeflemenizi sağlar.

Temel Seçiciler: Tür, Sınıf, ID

  • Tür Seçici (Type Selector / Element Selector): Belirli bir HTML etiket adına sahip tüm elemanları seçer.
    
    /* Tüm 

    elemanları */ p { margin-bottom: 1em; } /* Tüm

    elemanları */ h2 { color: #333; } /* Tüm
  • elemanları */ li { list-style-type: square; }
  • Sınıf Seçici (Class Selector): Belirli bir class niteliğine sahip tüm elemanları seçer. Seçici, bir nokta (.) ile başlar ve ardından sınıf adı gelir. Bir eleman birden fazla sınıfa sahip olabilir (class="sinif1 sinif2") ve bir sınıf birden fazla elemana uygulanabilir. En yaygın kullanılan seçici türlerinden biridir.
    
    /* 'uyari' sınıfına sahip tüm elemanlar */
    .uyari {
      color: red;
      font-weight: bold;
      border: 1px solid red;
      padding: 10px;
    }
    
    /* 'buton' sınıfına sahip tüm elemanlar */
    .buton {
      display: inline-block;
      padding: 8px 15px;
      background-color: blue;
      color: white;
      text-decoration: none;
      border-radius: 4px;
    }
    
    /* Hem 'buton' hem de 'birincil' sınıfına sahip elemanlar (daha özgül) */
    .buton.birincil {
        background-color: green;
    }
                                
  • ID Seçici (ID Selector): Belirli bir id niteliğine sahip tek bir elemanı seçer. Seçici, bir diyez (#) işareti ile başlar ve ardından ID adı gelir. Bir HTML belgesinde her ID benzersiz olmalıdır (sadece bir eleman o ID'ye sahip olabilir). Yüksek özgüllüğe sahiptir, bu nedenle dikkatli kullanılmalıdır (genellikle sınıf seçiciler daha esnektir).
    
    /* 'ana-menu' ID'sine sahip eleman */
    #ana-menu {
      list-style: none;
      padding: 0;
    }
    
    /* 'logo' ID'sine sahip eleman */
    #logo {
      width: 150px;
      height: auto;
    }
                                

Birleştiriciler (Combinators)

İki veya daha fazla seçici arasındaki ilişkiyi tanımlayarak daha spesifik hedefleme yapmayı sağlarlar:

Nitelik Seçiciler (Attribute Selectors)

HTML elemanlarının sahip olduğu niteliklere veya nitelik değerlerine göre seçim yapmayı sağlar:

Nitelik seçicilere i bayrağı eklenerek büyük/küçük harf duyarsız eşleşme sağlanabilir (örn: [type="text" i]). Ancak bu özellik tüm tarayıcılarda henüz tam desteklenmeyebilir.

Sözde Sınıflar (Pseudo-classes)

Bir elemanın belirli bir durumda (state) olduğunu belirtmek veya belirli yapısal konumdaki elemanları seçmek için kullanılır. Seçicide iki nokta üst üste (:) ile başlarlar.

  • Durum (State) Sözde Sınıfları:
    • :link: Henüz ziyaret edilmemiş bağlantılar.
    • :visited: Daha önce ziyaret edilmiş bağlantılar.
    • :hover: Fare imleci üzerine getirilen elemanlar.
    • :active: Etkinleştirilen (genellikle tıklanma anındaki) elemanlar (özellikle bağlantılar ve düğmeler).
    • :focus: Odaklanılmış elemanlar (genellikle klavye ile gezinirken veya form elemanına tıklandığında).
    • :checked: Seçili olan veya elemanları.
    • :disabled: Devre dışı bırakılmış form elemanları (disabled niteliği olanlar).
    • :enabled: Etkin olan (devre dışı bırakılmamış) form elemanları.
    • :required: Doldurulması zorunlu (required niteliği olan) form elemanları.
    • :optional: Doldurulması isteğe bağlı form elemanları.
    • :valid / :invalid: Giriş değeri geçerli / geçersiz olan form elemanları (HTML5 doğrulamasına göre).
    • :target: URL'deki fragment identifier (#id) ile eşleşen ID'ye sahip eleman.
  • Yapısal (Structural) Sözde Sınıflar:
    • :root: Belgenin kök elemanını (genellikle <html>) seçer. CSS değişkenlerini tanımlamak için sıkça kullanılır.
    • :first-child: Üst elemanının ilk çocuğu olan elemanları seçer.
    • :last-child: Üst elemanının son çocuğu olan elemanları seçer.
    • :nth-child(n): Üst elemanının n'inci çocuğu olan elemanları seçer. n bir sayı (1, 2, ...), even (çift), odd (tek) veya bir formül (2n+1, 3n, -n+5) olabilir.
    • :nth-last-child(n): Sondan başlayarak n'inci çocuğu seçer.
    • :first-of-type: Üst elemanı içinde kendi türünün ilk örneği olan elemanları seçer.
    • :last-of-type: Üst elemanı içinde kendi türünün son örneği olan elemanları seçer.
    • :nth-of-type(n): Üst elemanı içinde kendi türünün n'inci örneği olan elemanları seçer.
    • :nth-last-of-type(n): Sondan başlayarak kendi türünün n'inci örneğini seçer.
    • :only-child: Üst elemanının tek çocuğu olan elemanları seçer.
    • :only-of-type: Üst elemanı içinde kendi türünün tek örneği olan elemanları seçer.
    • :empty: Hiçbir çocuğu (metin düğümleri dahil) olmayan elemanları seçer.
  • Diğer Sözde Sınıflar:
    • :not(selector): Belirtilen seçiciye uymayan elemanları seçer.
    • :lang(language-code): Belirtilen dildeki (lang niteliği) elemanları seçer.

/* Bağlantı stilleri */
a:link { color: blue; }
a:visited { color: purple; }
a:hover { text-decoration: underline; color: orange; }
a:active { color: red; }

/* Odaklanmış input alanı */
input:focus {
  outline: 2px solid skyblue;
  border-color: skyblue;
}

/* İşaretli checkbox'tan sonra gelen label */
input[type="checkbox"]:checked + label {
  font-weight: bold;
  color: green;
}

/* Tablodaki çift satırlar */
tbody tr:nth-child(even) {
  background-color: #f2f2f2;
}

/* Bir listenin ilk ve son elemanı */
ul li:first-child { padding-top: 0; }
ul li:last-child { border-bottom: none; }

/* 'uyari' sınıfına sahip olmayan paragraflar */
p:not(.uyari) {
  color: #555;
}
                    

Sözde Elemanlar (Pseudo-elements)

Bir elemanın belirli bir bölümüne stil vermek için kullanılır. Seçicide çift iki nokta üst üste (::) ile başlarlar (eski CSS sürümleri tek : kabul etse de, sözde sınıflardan ayırmak için :: kullanmak standarttır).

  • ::before: Seçilen elemanın içeriğinden hemen önce sanal bir eleman oluşturur. Genellikle content özelliği ile birlikte ikon veya metin eklemek için kullanılır.
  • ::after: Seçilen elemanın içeriğinden hemen sonra sanal bir eleman oluşturur. ::before gibi, content özelliği gereklidir.
  • ::first-line: Bir blok seviyesi elemanın yalnızca ilk satırına stil uygular.
  • ::first-letter: Bir blok seviyesi elemanın yalnızca ilk harfine stil uygular (büyük harf efekti gibi).
  • ::marker: Bir liste öğesinin (
  • ) madde işaretine veya numarasına stil uygular.
  • ::selection: Kullanıcının fare veya klavye ile seçtiği metin bölümüne stil uygular.
  • ::placeholder: Form elemanlarındaki (, <textarea>) yer tutucu metne (placeholder) stil uygular.

/* Dış bağlantılardan sonra bir ikon ekleme */
a[target="_blank"]::after {
  content: " ↗"; /* Veya bir resim: content: url(ikon.png); */
  font-size: 0.8em;
}

/* Paragrafların ilk harfini büyütme ve renklendirme */
p::first-letter {
  font-size: 2em;
  color: maroon;
  float: left; /* Metnin etrafında akmasını sağlar */
  margin-right: 4px;
}

/* Liste madde işaretlerini değiştirme */
ul li::marker {
  content: "► ";
  color: green;
}

/* Seçilen metnin arka planını ve rengini değiştirme */
::selection {
  background-color: yellow;
  color: black;
}

/* Input placeholder rengini değiştirme */
input::placeholder {
  color: lightgray;
  font-style: italic;
}
                    

CSS Kutu Modeli (Box Model)

Web sayfasındaki her HTML elemanı, tarayıcı tarafından dikdörtgen bir kutu olarak temsil edilir. CSS Kutu Modeli, bu kutuların yapısını ve boyutlarını nasıl kontrol edeceğimizi tanımlar. Her kutu dört temel bölümden oluşur (içten dışa):

  1. İçerik (Content): Elemanın metin, resim veya diğer iç içe geçmiş kutuları içeren asıl alanıdır. Boyutları width ve height özellikleri ile belirlenir.
  2. Dolgu (Padding): İçerik alanı ile kenarlık (border) arasındaki boşluktur. Elemanın arka plan rengi padding alanını da kapsar. padding-top, padding-right, padding-bottom, padding-left veya kısayol padding özelliği ile kontrol edilir.
  3. Kenarlık (Border): Dolgu alanını çevreleyen çizgidir. Kalınlığı (border-width), stili (border-style: solid, dashed, dotted vb.) ve rengi (border-color) veya kısayol border özelliği ile kontrol edilir.
  4. Dış Boşluk (Margin): Kenarlığın dışındaki, elemanı diğer elemanlardan ayıran şeffaf boşluktur. margin-top, margin-right, margin-bottom, margin-left veya kısayol margin özelliği ile kontrol edilir. Dikey margin'ler bazı durumlarda "çökebilir" (margin collapsing).

width, height, padding, border, margin Özellikleri

Bu özellikler kutu modelinin temelini oluşturur:


.kutu {
  /* İçerik Alanı Boyutları */
  width: 300px;       /* Kutu içeriğinin genişliği */
  height: 150px;      /* Kutu içeriğinin yüksekliği */

  /* Dolgu (İç Boşluk) */
  padding-top: 10px;
  padding-right: 20px;
  padding-bottom: 10px;
  padding-left: 20px;
  /* Padding Kısayolu (üst sağ alt sol) */
  padding: 10px 20px; /* üst/alt=10px, sağ/sol=20px */
  /* Padding Kısayolu (üst sağ alt sol) */
  /* padding: 10px 15px 20px 25px; */
  /* Padding Kısayolu (tüm kenarlar aynı) */
  /* padding: 15px; */

  /* Kenarlık */
  border-width: 2px;
  border-style: solid;
  border-color: black;
  /* Border Kısayolu */
  border: 2px solid black;
  /* Tek kenar için: border-left: 5px dotted blue; */
  border-radius: 5px; /* Kenarları yuvarlatma */

  /* Dış Boşluk */
  margin-top: 15px;
  margin-right: auto; /* Sağa doğru otomatik boşluk (ortalamada kullanılabilir) */
  margin-bottom: 30px;
  margin-left: auto;  /* Sola doğru otomatik boşluk (ortalamada kullanılabilir) */
  /* Margin Kısayolu (üst sağ alt sol) */
  margin: 15px auto 30px; /* üst=15px, sağ/sol=auto, alt=30px */
  /* Margin Kısayolu (üst/alt sağ/sol) */
  /* margin: 10px 20px; */
  /* Margin Kısayolu (tüm kenarlar aynı) */
  /* margin: 20px; */

  background-color: lightblue; /* İçerik ve Padding alanını kapsar */
}
                    

Önemli Not (Ortalama): Bir blok seviyesi elemanı (örn:

) yatayda ortalamak için genellikle width değeri belirlenir ve margin-left: auto; margin-right: auto; (veya kısayol margin: 0 auto; gibi) kullanılır.

box-sizing Özelliği

Varsayılan olarak (box-sizing: content-box;), bir elemana atanan width ve height özellikleri sadece içerik alanının boyutlarını belirler. Padding ve border bu boyutlara eklenir, bu da elemanın toplam kapladığı alanın beklenenden büyük olmasına neden olabilir.

box-sizing: border-box; değeri ise width ve height özelliklerinin padding ve border'ı dahil ederek toplam kutu boyutunu belirlemesini sağlar. Bu, yerleşimi ve boyutlandırmayı çok daha sezgisel ve yönetilebilir hale getirir.


.kutu-content {
  width: 200px;
  padding: 20px;
  border: 5px solid red;
  box-sizing: content-box; /* Varsayılan */
  /* Toplam genişlik = 200px (içerik) + 20px*2 (padding) + 5px*2 (border) = 250px */
  background-color: lightcoral;
  margin-bottom: 10px;
}

.kutu-border {
  width: 200px;
  padding: 20px;
  border: 5px solid green;
  box-sizing: border-box; /* Önerilen */
  /* Toplam genişlik = 200px (width ile belirlenen) */
  /* İçerik genişliği = 200px - 20px*2 (padding) - 5px*2 (border) = 150px */
  background-color: lightgreen;
}

/* Genel olarak tüm elemanlara border-box uygulamak yaygın bir pratiktir: */
*,
*::before,
*::after {
  box-sizing: border-box;
}
                    

Modern CSS geliştirmede, projenin başında tüm elemanlar için box-sizing: border-box; ayarlamak yaygın ve önerilen bir pratiktir.

CSS Yerleşim (Layout) Teknikleri

Web sayfalarındaki elemanların konumlandırılması ve düzenlenmesi CSS'in en önemli görevlerinden biridir. Zaman içinde farklı teknikler gelişmiştir ve modern CSS, Flexbox ve Grid gibi güçlü ve esnek yerleşim modülleri sunar.

display Özelliği

Bir elemanın sayfa akışında nasıl davranacağını ve nasıl bir kutu türü oluşturacağını belirler. En yaygın değerleri:

position Özelliği

Bir elemanın sayfa üzerindeki konumlandırma yöntemini belirler.

  • static: Varsayılan değerdir. Eleman normal sayfa akışına göre konumlanır. top, right, bottom, left ve z-index özellikleri bu eleman üzerinde etkili olmaz.
  • relative: Eleman normal sayfa akışına göre konumlanır, ancak ardından top, right, bottom, left özellikleri kullanılarak normal konumuna göre kaydırılabilir. Diğer elemanlar, eleman kaydırılmamış gibi davranır (yani elemanın orijinal yeri boş kalmaz). Genellikle mutlak konumlandırılmış (absolute) çocuk elemanlar için bir referans noktası (containing block) oluşturmak amacıyla kullanılır.
  • absolute: Elemanı normal sayfa akışından tamamen çıkarır. Konumu, position değeri static olmayan en yakın üst elemanına (containing block) göre belirlenir. Eğer böyle bir üst eleman yoksa, ilk containing block <html> elemanı olur. Konumu top, right, bottom, left ile ayarlanır. Diğer elemanlar, bu eleman hiç yokmuş gibi davranır.
  • fixed: Elemanı normal sayfa akışından çıkarır ve tarayıcı penceresine (viewport) göre sabitler. Sayfa kaydırılsa bile eleman aynı konumda kalır. Konumu top, right, bottom, left ile ayarlanır. Genellikle sabit başlıklar, alt bilgiler veya "üste dön" butonları için kullanılır.
  • sticky: Eleman, normal sayfa akışı içinde (relative gibi) davranır, ancak kullanıcı sayfayı kaydırdığında belirli bir eşik noktasına (top, right, bottom, left ile tanımlanır) ulaştığında, o noktada sabitlenir (fixed gibi). Eşik noktası geçildiğinde tekrar normal akışa dönebilir. Modern tarayıcı desteği iyidir. Genellikle kaydırılan listedeki başlıkları sabitlemek için kullanılır.

relative, absolute, fixed, ve sticky konumlandırma yöntemleri ile birlikte top, right, bottom, left özellikleri kullanılarak elemanın kenarlara olan mesafesi belirlenir. z-index özelliği ise üst üste binen konumlandırılmış elemanların yığın sırasını (hangisinin üstte görüneceğini) belirler (daha büyük z-index değeri daha üstte görünür).


.konteyner {
  position: relative; /* Absolute konumlu çocuk için referans */
  width: 400px;
  height: 300px;
  border: 1px solid black;
}

.mutlak-kutu {
  position: absolute;
  top: 20px;
  right: 20px;
  width: 100px;
  height: 100px;
  background-color: rgba(255, 0, 0, 0.5); /* Yarı şeffaf kırmızı */
}

.sabit-kutu {
  position: fixed;
  bottom: 10px;
  right: 10px;
  padding: 10px;
  background-color: lightblue;
  z-index: 100; /* Diğer elemanların üzerinde görünmesi için */
}

.yapışkan-başlık {
  position: sticky;
  top: 0; /* Sayfanın en üstüne yapışır */
  background-color: white;
  padding: 10px;
  border-bottom: 1px solid #ccc;
  z-index: 50;
}
                    

float Özelliği ve clear

float özelliği, bir elemanı normal akıştan çıkarıp sola (left) veya sağa (right) yaslayarak diğer içeriklerin etrafında akmasını sağlar. Eskiden çok sütunlu yerleşimler için sıkça kullanılırdı, ancak modern yerleşimler için Flexbox ve Grid daha uygundur. float hala resimleri metin içinde sola/sağa yaslamak gibi durumlar için kullanışlıdır.

float kullanılan elemanlar, çevreleyen konteynerin yüksekliğini etkilemez (konteyner çökebilir). Bu sorunu çözmek için çeşitli "clearfix" teknikleri kullanılır veya modern yöntemde konteynere display: flow-root; verilebilir.

clear özelliği, bir elemanın hangi taraftaki (left, right, both) float'lı elemanların altına ineceğini belirler. Genellikle float'lardan sonra gelen elemanların normal akışa dönmesi için kullanılır.


.resim-sola {
  float: left;
  margin-right: 15px; /* Resimle metin arasına boşluk */
  margin-bottom: 5px;
}

.resim-saga {
  float: right;
  margin-left: 15px;
  margin-bottom: 5px;
}

.footer-bolumu {
  clear: both; /* Hem sol hem de sağ float'lardan sonra başlar */
  border-top: 1px solid gray;
  margin-top: 20px;
  padding-top: 10px;
}

/* Konteynerin float'lı elemanları sarması için */
.clearfix::after { /* Klasik clearfix hack */
  content: "";
  display: table;
  clear: both;
}
/* VEYA Modern Yöntem */
.konteyner-flow-root {
    display: flow-root;
}
                    

Profil Resmi

Bu metin, sola yaslanmış resmin etrafında akacaktır. Float özelliği, elemanı normal akıştan çıkarır ve belirtilen yöne yaslar...

Alt bilgi içeriği...

Flexbox (Esnek Kutu Modeli)

Flexbox, bir konteyner içindeki elemanları (öğeleri) tek bir boyut (satır veya sütun) boyunca hizalamak, dağıtmak ve sıralamak için tasarlanmış güçlü bir yerleşim modülüdür. Özellikle bileşenleri (menüler, kart listeleri vb.) ve basit yerleşimleri oluşturmak için idealdir.

Flexbox kullanmak için:

  1. Üst elemana (konteyner) display: flex; veya display: inline-flex; uygulanır.
  2. Konteyner özellikleri (flex-direction, justify-content, align-items, flex-wrap, align-content) ile öğelerin ana eksen ve çapraz eksendeki davranışları kontrol edilir.
  3. Gerekirse, içindeki öğelere (flex item) özel özellikler (flex-grow, flex-shrink, flex-basis, order, align-self) uygulanır.

Konteyner Özellikleri:

  • flex-direction: Öğelerin dizilim yönünü belirler (row (varsayılan - yatay), row-reverse, column (dikey), column-reverse). Bu, ana ekseni (main axis) tanımlar.
  • justify-content: Öğeleri ana eksen boyunca nasıl hizalayacağını/dağıtacağını belirler (flex-start (varsayılan), flex-end, center, space-between, space-around, space-evenly).
  • align-items: Öğeleri çapraz eksen (cross axis - ana eksene dik olan eksen) boyunca nasıl hizalayacağını belirler (stretch (varsayılan - konteyner boyutuna uzatır), flex-start, flex-end, center, baseline).
  • flex-wrap: Öğeler konteynere sığmadığında alt satıra/sütuna geçip geçmeyeceğini belirler (nowrap (varsayılan - sığdırmaya çalışır), wrap, wrap-reverse).
  • align-content: Birden fazla satır/sütun oluştuğunda (flex-wrap: wrap; kullanıldığında) bu satırların/sütunların çapraz eksen boyunca nasıl hizalanacağını/dağıtılacağını belirler (stretch (varsayılan), flex-start, flex-end, center, space-between, space-around). align-items'dan farklıdır, bu tüm satırları bir bütün olarak hizalar.
  • gap (veya row-gap, column-gap): Flex öğeleri arasındaki boşluğu belirler.

Öğe (Item) Özellikleri:

  • order: Öğelerin varsayılan sıralamasını değiştirir (küçük değer önce gelir, varsayılan 0).
  • flex-grow: Konteynerde boş alan varsa, öğenin bu alanı diğer öğelere göre ne kadar büyüyeceğini belirler (varsayılan 0 - büyümez). Pozitif bir sayı alır.
  • flex-shrink: Öğeler konteynere sığmadığında, öğenin diğer öğelere göre ne kadar küçüleceğini belirler (varsayılan 1 - küçülür). 0 verilirse küçülmez.
  • flex-basis: Öğenin ana eksendeki varsayılan boyutunu belirler (auto (varsayılan) veya bir uzunluk değeri 100px, 30% gibi).
  • flex (Kısayol): flex-grow, flex-shrink ve flex-basis özelliklerini sırayla tek bir özellikte birleştirir (örn: flex: 0 1 auto; (varsayılan), flex: 1; (1 1 0% anlamına gelir), flex: auto; (1 1 auto)).
  • align-self: Tek bir öğenin çapraz eksendeki hizalamasını, konteynerin align-items ayarını geçersiz kılarak belirler (auto (varsayılan - konteynerden alır), stretch, flex-start, flex-end, center, baseline).

.flex-konteyner {
  display: flex;
  flex-direction: row; /* Yatay dizilim (varsayılan) */
  justify-content: space-around; /* Ana eksende aralıklı dağıt */
  align-items: center; /* Çapraz eksende ortala */
  flex-wrap: wrap; /* Sığmazsa alt satıra geç */
  gap: 10px; /* Öğeler arası boşluk */
  height: 200px; /* align-items'ı görmek için */
  background-color: lightgray;
  padding: 10px;
}

.flex-oge {
  background-color: dodgerblue;
  color: white;
  padding: 15px;
  text-align: center;
  border-radius: 4px;
  /* flex: 1; */ /* Öğelerin boş alanı eşit paylaşmasını sağlar */
}

.oge-farkli {
  flex-grow: 2; /* Diğerlerinden 2 kat fazla büyür */
  align-self: flex-start; /* Konteynerin align-items'ını ezer, yukarı hizalar */
  order: -1; /* En başa alır */
  background-color: tomato;
}
                    

Öğe 1
Öğe 2 (Farklı)
Öğe 3
Öğe 4

CSS Grid Layout

CSS Grid, hem satırları hem de sütunları tanımlayarak iki boyutlu karmaşık web sayfası yerleşimleri oluşturmak için tasarlanmış çok güçlü bir yerleşim sistemidir. Flexbox genellikle tek boyutlu yerleşimler için daha uygunken, Grid tüm sayfa düzenini veya karmaşık bileşenleri ızgara üzerinde hassas bir şekilde kontrol etmek için idealdir.

Grid kullanmak için:

  1. Üst elemana (konteyner) display: grid; veya display: inline-grid; uygulanır.
  2. grid-template-columns ve grid-template-rows özellikleri ile ızgaranın sütun ve satır yapısı (sayısı ve boyutları) tanımlanır. Yeni fr birimi (fraction - oran) esnek boyutlandırma sağlar.
  3. Öğeler (grid item) varsayılan olarak ızgaranın hücrelerine sırayla yerleşir.
  4. Gerekirse, öğelerin ızgara üzerindeki konumları ve yayılımları grid-column-start, grid-column-end, grid-row-start, grid-row-end (veya kısayolları grid-column, grid-row) veya grid-area özellikleri ile hassas bir şekilde belirlenir.
  5. Hizalama için justify-items, align-items (hücre içindeki öğe hizalaması) ve justify-content, align-content (tüm ızgaranın konteyner içindeki hizalaması) özellikleri kullanılır.
  6. gap (veya row-gap, column-gap) ile ızgara çizgileri arasındaki boşluk ayarlanır.

Temel Konteyner Özellikleri:

  • grid-template-columns: Sütunların genişliğini tanımlar (örn: 100px 1fr 2fr - ilk sütun 100px, ikinci sütun kalan alanın 1/3'ü, üçüncü sütun 2/3'ü). repeat() fonksiyonu kullanılabilir (örn: repeat(3, 1fr) - 3 eşit sütun).
  • grid-template-rows: Satırların yüksekliğini tanımlar (örn: auto 100px repeat(2, 50px)).
  • grid-template-areas: Izgara alanlarına isim vererek daha görsel bir yerleşim tanımı sağlar.
  • gap, row-gap, column-gap: Izgara çizgileri arasındaki boşluklar.
  • Hizalama: justify-items (satır ekseninde hücre içi), align-items (sütun ekseninde hücre içi), justify-content (satır ekseninde tüm grid), align-content (sütun ekseninde tüm grid). Değerler genellikle start, end, center, stretch, space-between, space-around, space-evenly olabilir.

Temel Öğe (Item) Özellikleri:

  • grid-column-start / grid-column-end: Öğenin hangi sütun çizgisinde başlayıp biteceğini belirler.
  • grid-row-start / grid-row-end: Öğenin hangi satır çizgisinde başlayıp biteceğini belirler.
  • grid-column (Kısayol): grid-column-start / grid-column-end (örn: 1 / 3, 1 / span 2 - 1. çizgiden başla, 2 sütun yayıl).
  • grid-row (Kısayol): grid-row-start / grid-row-end.
  • grid-area: Öğeyi isimlendirilmiş bir ızgara alanına yerleştirir (grid-template-areas ile kullanılır) VEYA dört çizgi değerini (row-start / col-start / row-end / col-end) tanımlar.
  • Hizalama: justify-self (hücre içinde yatay hizalama), align-self (hücre içinde dikey hizalama). Konteynerin justify-items/align-items ayarlarını geçersiz kılar.

.grid-konteyner {
  display: grid;
  /* 3 sütun: ilk 150px, diğer ikisi kalan alanı eşit paylaşır */
  grid-template-columns: 150px 1fr 1fr;
  /* 2 satır: ilki içeriğe göre, ikincisi 100px yükseklikte */
  grid-template-rows: auto 100px;
  gap: 15px; /* Satır ve sütun aralığı */
  width: 100%;
  background-color: #eee;
  padding: 10px;

  /* İsimlendirilmiş alanlarla alternatif tanım */
  /* grid-template-areas:
    "baslik baslik baslik"
    "menu icerik kenar"
    "altbilgi altbilgi altbilgi";
  grid-template-columns: 150px 1fr 200px;
  grid-template-rows: auto 1fr auto; */
}

.grid-oge {
  background-color: lightcoral;
  padding: 20px;
  border: 1px solid darkred;
  text-align: center;
}

.oge1 {
  grid-column-start: 1;
  grid-column-end: 4; /* 1. sütundan başla 4. çizgide bitir (3 sütun kapla) */
  /* Kısayol: grid-column: 1 / 4; */
  /* grid-area: baslik; */ /* İsimlendirilmiş alan kullanılıyorsa */
}

.oge2 {
  grid-row: 2 / 4; /* 2. satırdan başla 4. çizgide bitir (2 satır kapla) */
  /* Kısayol: grid-row: 2 / span 2; */
   /* grid-area: menu; */
}

.oge3 {
    grid-column: 2 / span 2; /* 2. sütundan başla, 2 sütun yayıl */
     /* grid-area: icerik; */
     align-self: start; /* Hücre içinde yukarı hizala */
}
                    

Başlık (1)
Menü (2)
İçerik (3)
Kenar (4)
Alt Bilgi (5)

Duyarlı Web Tasarımı (Responsive Web Design - RWD)

Duyarlı web tasarımı, bir web sitesinin düzeninin ve içeriğinin, kullanıldığı cihazın ekran boyutuna, yönlendirmesine ve çözünürlüğüne (masaüstü, tablet, telefon vb.) otomatik olarak uyum sağlaması yaklaşımıdır. Amaç, tüm cihazlarda optimum görüntüleme ve etkileşim deneyimi sunmaktır.

RWD'nin temel bileşenleri şunlardır:

  • Esnek Izgaralar (Fluid Grids): Sabit piksel değerleri yerine yüzdeler (%) veya esnek birimler (fr, vw, vh) kullanarak esnek ve orantılı yerleşimler oluşturmak.
  • Esnek Görseller (Flexible Images): Görsellerin ve diğer medya içeriklerinin, içinde bulundukları konteynerin boyutlarına uyum sağlaması (genellikle max-width: 100%; height: auto; ile).
  • Medya Sorguları (Media Queries): Farklı cihaz özellikleri (genişlik, yükseklik, yönlendirme, çözünürlük vb.) için farklı CSS kuralları uygulamayı sağlayan CSS3 özelliğidir.

Medya Sorguları (@media)

Medya sorguları, belirli koşullar sağlandığında uygulanacak CSS kurallarını tanımlar. Bu, RWD'nin temel taşıdır.

Sözdizimi:


@media media-türü and (özellik: değer) {
  /* Koşul sağlandığında uygulanacak CSS kuralları */
  secici {
    ozellik: deger;
  }
}
                    
  • @media: Medya sorgusu bloğunu başlatır.
  • media-türü (isteğe bağlı): Kuralın hangi medya türü için geçerli olduğunu belirtir (all (varsayılan), print (yazdırma), screen (ekranlar), speech (ekran okuyucular)).
  • and / not / only (isteğe bağlı): Mantıksal operatörlerle birden fazla koşul birleştirilebilir veya koşul tersine çevrilebilir. only eski tarayıcıların sorguyu yok saymasını sağlar.
  • (özellik: değer): Asıl koşuldur. Parantez içinde belirtilir. En yaygın kullanılan özellikler:
    • width / height: Tarayıcı penceresinin (viewport) genişliği/yüksekliği.
    • min-width / max-width: Minimum/maksimum genişlik.
    • min-height / max-height: Minimum/maksimum yükseklik.
    • orientation: Cihazın yönlendirmesi (portrait (dikey) veya landscape (yatay)).
    • aspect-ratio / min-aspect-ratio / max-aspect-ratio: Görüntü alanının en/boy oranı.
    • resolution / min-resolution / max-resolution: Cihazın piksel yoğunluğu (örn: dpi, dpcm).

Yaklaşımlar:

  • Desktop First: Önce masaüstü stilleri yazılır, ardından daha küçük ekranlar için max-width ile medya sorguları kullanılarak stiller uyarlanır.
  • Mobile First: Önce mobil cihaz stilleri yazılır, ardından daha büyük ekranlar için min-width ile medya sorguları kullanılarak stiller genişletilir. Modern web geliştirmede genellikle Mobile First yaklaşımı tercih edilir çünkü daha basit stillerle başlayıp gerektiğinde karmaşıklık eklemeyi sağlar ve mobil kullanıcı deneyimini önceliklendirir.

/* Mobile First Yaklaşımı Örneği */

/* Varsayılan stiller (Mobil için) */
body {
  font-size: 16px;
}
.konteyner {
  width: 95%;
  margin: 0 auto;
}
.menu {
  /* Mobil menü stilleri (belki gizli, butonla açılır) */
  display: none;
}
.kolon {
  width: 100%; /* Kolonlar alt alta */
  margin-bottom: 15px;
}

/* Tablet Boyutu (Örn: 600px ve üzeri) */
@media screen and (min-width: 600px) {
  .konteyner {
    width: 90%;
  }
  .menu {
     display: block; /* Menüyü göster */
     /* Belki yatay menü stilleri */
  }
  .kolon {
     width: 48%; /* İki kolon yan yana */
     display: inline-block; /* Veya Flexbox/Grid kullanılır */
     margin-right: 4%;
  }
  .kolon:last-child {
      margin-right: 0;
  }
}

/* Masaüstü Boyutu (Örn: 992px ve üzeri) */
@media screen and (min-width: 992px) {
  body {
    font-size: 18px;
  }
  .konteyner {
    width: 80%;
    max-width: 1200px; /* Maksimum genişlik */
  }
   /* Belki 3 veya 4 kolonlu yapı */
  .kolon {
     width: 30%;
     margin-right: 5%;
   }
  .kolon:nth-child(3n) { /* Her 3. kolondan sonra sağ boşluğu kaldır */
      margin-right: 0;
  }
   .kolon:last-child { /* Eğer 3'ün katı değilse son elemanın boşluğunu ayarla */
       margin-right: 0; /* Veya duruma göre ayarlanır */
   }
}

/* Sadece Yazdırma İçin Stiller */
@media print {
  body {
    font-family: 'Times New Roman', serif;
    color: black;
    background-color: white;
  }
  a::after {
    content: " (" attr(href) ")"; /* Bağlantı URL'lerini göster */
  }
  .menu, .reklamlar, .footer-nav {
    display: none; /* Yazdırmada gereksiz elemanları gizle */
  }
}
                    

Unutmayın, RWD için HTML'de etiketinin bulunması kritik öneme sahiptir.

İleri CSS Konuları

CSS'in temellerini ve yerleşim modellerini öğrendikten sonra, tasarımlarınıza daha fazla dinamizm katacak ve kodunuzu daha verimli hale getirecek ileri konulara geçebilirsiniz.

CSS Geçişleri (Transitions)

CSS geçişleri, bir CSS özelliğinin değeri değiştiğinde (örneğin :hover durumunda), bu değişikliğin ani olmak yerine belirli bir süre içinde yumuşak bir şekilde gerçekleşmesini sağlar. Basit animasyon efektleri oluşturmak için kullanılır.

Temel Özellikler:

  • transition-property: Geçiş efekti uygulanacak CSS özelliğini (veya özelliklerini all ile) belirtir.
  • transition-duration: Geçişin ne kadar süreceğini belirtir (örn: 0.5s, 300ms).
  • transition-timing-function: Geçişin hız eğrisini belirler (nasıl başlayıp nasıl biteceği) (ease (varsayılan), linear, ease-in, ease-out, ease-in-out, cubic-bezier(...)).
  • transition-delay: Geçişin başlamadan önce ne kadar bekleyeceğini belirtir.
  • transition (Kısayol): Yukarıdaki dört özelliği sırayla tek bir satırda tanımlar. En sık kullanılan sıra: property duration timing-function delay.

.buton {
  background-color: blue;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;

  /* Kısayol transition tanımı:
     Arka plan rengi 0.3 saniyede ease-out ile,
     transform 0.2 saniyede ease-in ile değişsin */
  transition: background-color 0.3s ease-out, transform 0.2s ease-in;

  /* Veya tüm özellikler için: */
  /* transition: all 0.3s ease; */
}

.buton:hover {
  background-color: darkblue;
  transform: scale(1.1); /* Butonu hafifçe büyüt */
}

.kutu {
    width: 100px;
    height: 100px;
    background-color: red;
    opacity: 1;
    transition: width 2s linear, height 1s ease-in 1s, opacity 0.5s; /* Birden fazla özellik farklı süre/zamanlama/gecikme ile */
}

.kutu:hover {
    width: 200px;
    height: 150px;
    opacity: 0.5;
}
                    

CSS Animasyonları (@keyframes ve animation)

CSS animasyonları, geçişlerden daha karmaşık ve kontrol edilebilir animasyonlar oluşturmayı sağlar. Animasyonlar, @keyframes kuralı ile tanımlanır ve ardından animation özellikleri ile bir elemana uygulanır.

@keyframes Kuralı: Animasyonun farklı aşamalarındaki (keyframe) stilleri tanımlar. Yüzdeler (0%'dan 100%'e) veya anahtar kelimeler (from (0% ile aynı), to (100% ile aynı)) kullanılır.


/* Basit bir renk değiştirme animasyonu */
@keyframes renkDegistir {
  from { background-color: red; }
  to { background-color: yellow; }
}

/* Daha karmaşık bir sallanma animasyonu */
@keyframes salla {
  0% { transform: translateX(0); }
  25% { transform: translateX(-10px) rotate(-5deg); }
  50% { transform: translateX(10px) rotate(5deg); }
  75% { transform: translateX(-5px) rotate(-3deg); }
  100% { transform: translateX(0) rotate(0); }
}
                    

animation Özellikleri:

  • animation-name: Uygulanacak @keyframes kuralının adını belirtir.
  • animation-duration: Animasyonun bir döngüsünün ne kadar süreceğini belirtir.
  • animation-timing-function: Animasyonun hız eğrisini belirler (transition-timing-function ile aynı değerleri alır).
  • animation-delay: Animasyonun başlamadan önce ne kadar bekleyeceğini belirtir.
  • animation-iteration-count: Animasyonun kaç kez tekrarlanacağını belirtir (bir sayı veya infinite (sonsuz)).
  • animation-direction: Animasyonun döngülerde tersine oynatılıp oynatılmayacağını belirler (normal (varsayılan), reverse, alternate (ileri-geri), alternate-reverse).
  • animation-fill-mode: Animasyon başlamadan önce veya bittikten sonra elemanın hangi stilleri alacağını belirler (none (varsayılan), forwards (son keyframe stilini korur), backwards (ilk keyframe stilini başlangıçta uygular), both).
  • animation-play-state: Animasyonun çalışıp (running - varsayılan) duraklatıldığını (paused) kontrol eder (genellikle JavaScript ile kullanılır).
  • animation (Kısayol): Yukarıdaki özellikleri (play-state hariç) tek satırda tanımlar. Sıra genellikle: name duration timing-function delay iteration-count direction fill-mode.

.animasyonlu-kutu {
  width: 100px;
  height: 100px;
  background-color: red; /* 'from' ile aynı olmalı (eğer fill-mode: backwards isteniyorsa) */

  /* Kısayol animation tanımı */
  animation: renkDegistir 3s ease-in-out 1s infinite alternate;
  /* İsim: renkDegistir, Süre: 3s, Zamanlama: ease-in-out, Gecikme: 1s, Tekrar: sonsuz, Yön: ileri-geri */
}

.sallanan-ikon {
    display: inline-block;
    animation: salla 1s ease-in-out infinite;
}

/* Hover durumunda animasyonu duraklatma */
.animasyonlu-kutu:hover {
  animation-play-state: paused;
}
                    

CSS Değişkenleri (Custom Properties)

CSS Değişkenleri (resmi adıyla Custom Properties for Cascading Variables), CSS içinde tekrar tekrar kullanılan değerleri (renkler, font boyutları, boşluklar vb.) tanımlamak ve yönetmek için güçlü bir mekanizmadır. Değişkenler, kod tekrarını azaltır, bakımı kolaylaştırır ve tema oluşturmayı basitleştirir.

Tanımlama: Değişkenler genellikle :root sözde sınıfı içinde (tüm belgeye uygulanması için) tanımlanır. İsimleri iki tire (--) ile başlar.

Kullanma: Değişken değeri, var() fonksiyonu kullanılarak çağrılır.


/* Değişkenleri :root içinde tanımlama */
:root {
  --ana-renk: #007bff;
  --ikincil-renk: #6c757d;
  --golge-rengi: rgba(0, 0, 0, 0.1);
  --ana-font: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
  --kenar-boslugu: 15px;
  --kutu-golgesi: 0 2px 5px var(--golge-rengi);
}

/* Değişkenleri kullanma */
body {
  font-family: var(--ana-font);
  color: var(--ikincil-renk);
}

.buton-birincil {
  background-color: var(--ana-renk);
  color: white;
  padding: var(--kenar-boslugu);
  border: none;
  box-shadow: var(--kutu-golgesi);
}

.kart {
  padding: var(--kenar-boslugu);
  margin-bottom: var(--kenar-boslugu);
  box-shadow: var(--kutu-golgesi);
  border-left: 5px solid var(--ana-renk);
}

/* Bir değişken için varsayılan (fallback) değer tanımlama */
.ozel-alan {
    color: var(--tanimsiz-degisken, black); /* Eğer --tanimsiz-degisken yoksa black kullanılır */
}

/* Değişkenler JavaScript ile değiştirilebilir (Tema değiştirme vb.) */
/* document.documentElement.style.setProperty('--ana-renk', 'darkred'); */
                    

CSS Değişkenleri, kademelenme ve kalıtım kurallarına uyar, yani belirli bir seçici içinde tanımlanarak sadece o kapsamdaki değeri geçersiz kılabilirler.

CSS Ön İşlemcileri (Preprocessors): Sass, Less, Stylus

CSS ön işlemcileri, standart CSS'in yeteneklerini artıran, daha verimli ve yönetilebilir stil dosyaları yazmayı sağlayan betik dilleridir. Yazılan özel sözdizimi (değişkenler, iç içe kurallar, mixin'ler, fonksiyonlar, kalıtım vb. özellikler içerir) derlenerek tarayıcıların anlayabileceği standart CSS koduna dönüştürülür.

En popüler ön işlemciler:

  • Sass (Syntactically Awesome Style Sheets): En yaygın kullanılanlardan biridir. İki farklı sözdizimi sunar: SCSS (CSS'e çok benzer, { } ve ; kullanır) ve SASS (girintiye dayalı, daha kısa).
  • Less (Leaner Style Sheets): Sass'a benzer özellikler sunar, JavaScript tabanlıdır.
  • Stylus: Çok esnek bir sözdizimine sahiptir (süslü parantez, iki nokta üst üste, noktalı virgül kullanımı isteğe bağlıdır).

Sağladığı Avantajlar:

  • Değişkenler: Renkleri, fontları vb. merkezi olarak tanımlama (standart CSS değişkenlerinden önce popülerdi).
  • İç İçe Kurallar (Nesting): HTML yapısını yansıtan, daha okunabilir CSS kuralları yazma.
  • Mixin'ler: Tekrar kullanılabilir stil blokları oluşturma (parametre alabilirler).
  • Kalıtım (Inheritance / Extend): Bir seçicinin stillerini başka bir seçiciye kopyalama.
  • Fonksiyonlar: Değerleri hesaplamak veya dönüştürmek için özel fonksiyonlar tanımlama.
  • Parçalar (Partials) ve İçe Aktarma (Import): CSS kodunu daha küçük, yönetilebilir dosyalara bölme ve bunları ana dosyada birleştirme.
  • Operatörler: Matematiksel işlemler yapma.

Örnek SCSS Kodu:


$ana-renk: #3498db;
$kenarlik-rengi: darken($ana-renk, 10%);
$varsayilan-bosluk: 1rem;

@mixin kutu-stili($arka-plan: white, $kenarlik: 1px solid $kenarlik-rengi) {
  padding: $varsayilan-bosluk;
  background-color: $arka-plan;
  border: $kenarlik;
  border-radius: 4px;
}

.mesaj {
  @include kutu-stili;
  margin-bottom: $varsayilan-bosluk;
  color: #333;

  &.uyari { /* İç içe kural ve & (üst seçiciye referans) */
    border-left: 5px solid red;
    background-color: lighten(red, 40%);

    a { /* İç içe kural */
       color: darken(red, 10%);
       text-decoration: none;

       &:hover { /* İç içe kural */
           text-decoration: underline;
       }
    }
  }
}

.buton {
   @extend .mesaj; /* .mesaj stillerini miras al */
   display: inline-block;
   background-color: $ana-renk;
   color: white;
}
                    

Ön işlemciler, büyük projelerde CSS kodunu organize etmek ve yönetmek için oldukça faydalıdır, ancak bir derleme adımı gerektirirler.

CSS En İyi Uygulamaları ve İpuçları

Etkili, yönetilebilir ve performanslı CSS kodu yazmak için bazı en iyi uygulamaları takip etmek önemlidir.

Kod Organizasyonu ve Yönetimi

  • CSS'i Ayrı Dosyalarda Tutun: Harici stil şablonları (.css dosyaları) kullanın. Bu, içeriği sunumdan ayırır ve bakımı kolaylaştırır.
  • Mantıksal Gruplama: CSS dosyanızı mantıksal bölümlere ayırın (örn: temel stiller, yerleşim, bileşenler, yardımcı sınıflar) ve yorumlarla bu bölümleri belirtin.
  • İsimlendirme Kuralları (Naming Conventions): Tutarlı ve anlamlı sınıf isimleri kullanın. BEM (Block, Element, Modifier), SMACSS (Scalable and Modular Architecture for CSS) veya OOCSS (Object-Oriented CSS) gibi metodolojiler, büyük projelerde sınıf isimlerini organize etmek için faydalı olabilir.
    • BEM Örneği: .card__title--large (Blok: card, Eleman: title, Değiştirici: large)
  • Ön İşlemci Kullanımı: Büyük projeler için Sass veya Less gibi ön işlemciler kullanarak değişkenler, mixin'ler ve iç içe kurallar gibi özelliklerden yararlanın.
  • Kod Tekrarından Kaçının (DRY - Don't Repeat Yourself): Ortak stilleri tekrar tekrar yazmak yerine, bunları temel sınıflarda veya mixin'lerde tanımlayın ve gerektiğinde kullanın veya genişletin.
  • Stil Rehberi (Style Guide): Projenin tasarım dilini (renk paleti, tipografi, boşluklar, bileşenler) belgeleyen bir stil rehberi oluşturmak tutarlılığı artırır.

Performans İpuçları

  • Seçici Verimliliği: Tarayıcılar seçicileri sağdan sola doğru okur. Aşırı karmaşık veya gereksiz yere özgül seçiciler (örn: body #main ul li a.aktif) performansı düşürebilir. Mümkün olduğunca basit ve doğrudan seçiciler (özellikle sınıflar) kullanın. ID seçiciler hızlıdır ancak yeniden kullanılabilirliği sınırlar. Evrensel seçici (*) veya nitelik seçicileri (özellikle karmaşık olanlar) dikkatli kullanılmalıdır.
  • Dosya Boyutunu Küçültme (Minification): Üretim ortamına göndermeden önce CSS dosyalarındaki gereksiz boşlukları, yorumları ve satır sonlarını kaldırarak dosya boyutunu küçültün. Bunun için çeşitli online araçlar veya build araçları (Webpack, Gulp vb.) kullanılabilir.
  • CSS Dosyalarını Birleştirme: Çok sayıda küçük CSS dosyası yerine, mantıksal olarak gruplanmış daha az sayıda CSS dosyası kullanmak HTTP istek sayısını azaltır. Build araçları bu birleştirmeyi otomatik yapabilir.
  • Kritik CSS (Critical CSS): Sayfanın ilk yüklenmede görünen ("above the fold") bölümünü stilize etmek için gereken minimum CSS'i HTML içine (<style>) gömüp, geri kalan CSS'i asenkron olarak yüklemek ilk görüntülenme süresini (First Contentful Paint) iyileştirebilir. Bu genellikle otomatize edilmiş araçlarla yapılır.
  • Kullanılmayan CSS'i Kaldırma: Projede artık kullanılmayan CSS kurallarını tespit edip (tarayıcı geliştirici araçları veya özel araçlarla) kaldırmak dosya boyutunu azaltır.
  • @import Yerine Kullanın: CSS içinde @import kullanmak, dosyaların paralel olarak indirilmesini engelleyebilir ve performansı düşürebilir. Birden fazla CSS dosyasını HTML'deki etiketleri ile bağlamak daha iyidir (veya dosyaları birleştirmek).

Erişilebilirlik (Accessibility - a11y) İpuçları

  • Renk Kontrastı: Metin rengi ile arka plan rengi arasında yeterli kontrast olduğundan emin olun (WCAG yönergelerine göre). Görme zorluğu yaşayan kullanıcılar için bu çok önemlidir. Kontrast kontrol araçları kullanın.
  • Odak Stilleri (Focus Styles): Klavye ile gezinen kullanıcılar için hangi elemanın odaklanıldığını açıkça gösteren belirgin :focus stilleri sağlayın. Varsayılan odak stillerini tamamen kaldırmaktan (outline: none;) kaçının veya yerine daha belirgin özel bir stil ekleyin.
  • İçeriği Gizlerken Dikkat Edin: Elemanları görsel olarak gizlemek için display: none; veya visibility: hidden; kullanmak, genellikle ekran okuyucuların da içeriğe erişmesini engeller. Eğer içerik ekran okuyucular tarafından okunmalı ama görsel olarak gizlenmeliyse, özel "visually-hidden" veya "sr-only" (screen reader only) CSS teknikleri kullanılmalıdır (örn: elemanı ekran dışına konumlandırma).
  • CSS ile İçerik Eklemekten Kaçının: content özelliği ile (::before, ::after) önemli içerik veya işlevsellik eklemekten kaçının, çünkü bu içerik ekran okuyucular tarafından her zaman algılanmayabilir. Dekoratif amaçlar veya yardımcı ikonlar için daha uygundur.
  • Font Boyutları ve Okunabilirlik: Okunabilir font boyutları kullanın ve kullanıcıların metni yakınlaştırmasını engellemeyin (user-scalable=no kullanmaktan kaçının). Göreceli birimler (em, rem) kullanmak, kullanıcıların tarayıcı ayarlarıyla font boyutunu değiştirmesine olanak tanır.
  • Duyarlı Tasarım: Sayfanın farklı ekran boyutlarında kullanılabilir ve okunabilir olduğundan emin olun.

Sonuç: Sürekli Öğrenme ve Pratik

CSS, web tasarımının temelini oluşturan dinamik ve sürekli gelişen bir dildir. Bu rehber, temel kavramlardan modern tekniklere kadar geniş bir bakış sunmayı amaçlamıştır. Flexbox, Grid, CSS Değişkenleri, geçişler ve animasyonlar gibi modern özellikler, daha önce hiç olmadığı kadar esnek ve güçlü tasarımlar oluşturmamızı sağlıyor.

Ancak CSS dünyası sürekli yenileniyor. Yeni seçiciler, özellikler ve modüller ekleniyor. Bu nedenle, MDN Web Docs, CSS-Tricks, Smashing Magazine gibi güvenilir kaynakları takip etmek, yeni teknikleri denemek ve bolca pratik yapmak önemlidir. En iyi uygulamaları takip ederek, temiz, yönetilebilir, performanslı ve erişilebilir CSS kodları yazabilirsiniz.

Unutmayın, harika bir web sitesi sadece iyi bir yapıdan (HTML) ibaret değildir; aynı zamanda etkileyici bir sunum (CSS) ve akıcı bir davranış (JavaScript) gerektirir. Bu üç teknolojiyi uyum içinde kullanarak kullanıcılarınıza unutulmaz deneyimler sunabilirsiniz.