Yapısal Kontrol ve Mantık

CSS At-Kuralları (@rules)

CSS'te @ işareti, basit stil tanımlamalarının ötesine geçerek; tarayıcıya özel talimatlar, "koşullu komutlar" veya global yapısal tanımlamalar veren özel bir sözdizimidir.
Bu kurallar, CSS'in doğrudan bir öğeyi boyamak yerine, "belgeyi yönetmesini" ve stillerin hangi şartlar altında çalışacağını belirleyen bir kontrol mekanizmasıdır.
Aşağıda bu özel komutları inceleyeceğiz.

Ana Konu

CSS'e Kontrol ve Yapısal Emirler Meta-Komutlar ve Yönetim

Stil Ötesi: Talimat ve Emirler

CSS dünyasında @ işareti, yüzeyde görünen stil tanımlarının çok daha ötesinde bir anlam taşır.

CSS dünyasında @ Bu yapı, yalnızca bir görsellik tanımlama aracı değil; aynı zamanda tarayıcıya nasıl düşünmesi gerektiğini söyleyen bir komut sistemidir.

Tarayıcının rendering engine katmanında, At-Kuralları CSS'in yorumlanma sürecine dahil olur ve stil uygulanmadan önce izlenecek yolu belirler.

Bu yönüyle At-Kuralları, klasik "SeçiciÖzellikDeğer" üçlüsünden ayrılır ve CSS'e karar verme yeteneği kazandırır.

Artık CSS sadece "nasıl görünecek?" sorusunu değil, aynı zamanda "hangi şartlarda uygulanacak?" sorusunu da cevaplar.

Belge Düzeyinde Kontrol Mekanizması

At-Kuralları, tek tek elementlere stil vermek yerine, tüm stil sürecini yöneten bir üst kontrol katmanı gibi çalışır.

Bu katman, CSS'in uygulanma sırasını, kapsamını ve hatta hangi kaynakların yükleneceğini belirler.

Örneğin: Artık sadece "buton mavi olsun" demek yerine; "cihaz küçükse farklı stil uygula", "destekleniyorsa bu özelliği aktif et" veya

"önce bu dosyayı yükle" gibi çok daha stratejik kararlar alınabilir.

Bu yaklaşım, CSS'i pasif bir stil dili olmaktan çıkarır ve onu koşul bazlı çalışan dinamik bir sistem haline getirir.

Kapsam: Kaynaklar ve Koşullar

At-Kuralları'nın kapsadığı alan oldukça geniştir. Bu kurallar; yalnızca stil uygulamakla kalmaz, aynı zamanda projenin ihtiyaç duyduğu

harici kaynakları yönetir ve hangi koşullarda hangi stillerin aktif olacağını belirler.

Örneğin: Farklı ekran boyutları, kullanıcı tercihleri ( karanlık mod gibi ), cihaz yetenekleri veya tarayıcı desteği gibi faktörler, At-Kuralları sayesinde kontrol altına alınır.

Bu yüzden At-Kuralları, CSS'in yalnızca görünen kısmı değil; arka planda çalışan karar mekanizması olarak düşünülebilir.

Adeta CSS'in beyni gibi davranarak, hangi stilin ne zaman ve nasıl uygulanacağını yönetir.

Çalışma Mantığı: Yorumlama ve Uygulama Süreci

Tarayıcı, CSS dosyasını işlerken At-Kuralları'nı sıradan stil kuralları gibi ele almaz.

Öncelikle bu kuralları analiz eder ve hangi blokların aktif olacağına karar verir.

Bu süreçte bazı kurallar hemen uygulanırken, bazıları belirli koşullar gerçekleşene kadar bekletilir.

Bu da CSS içinde bir nevi koşullu yürütme mekanizması oluşturur.

Sonuç olarak At-Kuralları; sadece "stil yazmak" değil, aynı zamanda stilin ne zaman, nerede ve hangi şartlarda devreye gireceğini tasarlamak anlamına gelir.

@media (Medya Sorguları) Duyarlı Tasarımın Temeli ve Adaptasyon

Tanım: Koşullu Mantık Kapısı

@media kuralı, CSS içinde tanımlanan stillerin her durumda uygulanmasını engelleyerek, yalnızca belirli koşullar sağlandığında devreye giren

koşul tabanlı bir kontrol yapısı sunar.

Bu yapı sayesinde CSS, statik bir stil tanımlama dili olmaktan çıkar ve ortama duyarlı kararlar alabilen bir sistem haline gelir.

Tarayıcı, bir @media bloğunu değerlendirirken önce ortam özelliklerini ( ekran genişliği, çözünürlük, kullanıcı tercihi gibi ) analiz eder; ardından yalnızca koşul doğruysa ilgili stil bloklarını aktif hale getirir.

Bu durum, CSS içerisinde doğrudan bir if mantığı oluşturur: "Eğer şart sağlanıyorsa uygula, değilse yok say".

Duyarlı Tasarımın (Responsive) Temel Taşı

@media sorguları, modern web geliştirmede kritik bir rol oynayan Responsive Design yaklaşımının merkezinde yer alır.

Farklı cihazların farklı ekran boyutlarına sahip olması, tek bir sabit tasarım anlayışını yetersiz hale getirmiştir.

İşte bu noktada @media, arayüzün her ortamda uyumlu ve okunabilir kalmasını sağlar.

Aynı web sayfası; geniş bir masaüstü ekranda çok sütunlu ve ferah bir yapı sunarken, daha küçük mobil ekranlarda sadeleşerek tek sütunlu, dokunma odaklı bir düzene dönüşebilir.

Bu dönüşüm, manuel olarak farklı sayfalar yazmak yerine, tamamen @media kuralları ile dinamik olarak yönetilir.

Koşul Türleri: Sadece Ekran Değil

@media yalnızca ekran genişliği ile sınırlı değildir. Bu kural, çok daha geniş bir ortam bilgisini değerlendirebilir.

Örneğin: yükseklik, çözünürlük, orientation veya kullanıcı tercihleri gibi faktörler de kontrol edilebilir.

Özellikle "prefers-color-scheme" gibi özellikler sayesinde, kullanıcının sistem tercihlerine göre karanlık mod veya açık mod otomatik olarak uygulanabilir.

Çalışma Mantığı: Filtreleme ve Aktivasyon @media blokları, tarayıcı tarafından bir filtreleme sistemi gibi çalıştırılır.

Önce koşul değerlendirilir; eğer sonuç doğruysa içerideki tüm stil kuralları normal CSS kuralları gibi işlenir.

Eğer koşul sağlanmazsa, bu blok tamamen yok sayılır ve performans açısından herhangi bir yük oluşturmaz.

Bu da geliştiriciye, tek bir CSS dosyası içinde farklı senaryoları güvenli şekilde yönetme imkanı sunar.

Sözdizimi ve Medya Türleri Koşullu Mantık ve Hedefleme

Mantık: Statik Diktadan Kurtuluş

@media kuralı, CSS içinde yer alan en güçlü koşullu kontrol yapılarından biridir ve stil kurallarını her durumda uygulamak yerine

ortama göre filtreleyen bir sistem kurar.

Bu yaklaşım sayesinde CSS, tek tip bir görünüm dayatmak yerine; bulunduğu ortamın fiziksel ve teknik özelliklerine göre uyum sağlayan esnek bir yapı haline gelir.

Tarayıcı, @media ifadesini işlerken önce ortam bilgisini analiz eder ( cihaz türü, ekran boyutu, çözünürlük gibi ) ve yalnızca eşleşme sağlanıyorsa ilgili stil bloğunu devreye alır.

Bu yapı, CSS içerisinde görünmeyen ama güçlü bir mantıksal kontrol katmanı oluşturur.

Sözdizimi Yapısı: Tür + Koşul

@media kuralı temelde iki parçadan oluşur: medya türü ve medya özellikleri.

Medya türü, stilin hangi ortamda geçerli olacağını belirlerken; medya özellikleri bu ortamın hangi şartlarda geçerli sayılacağını tanımlar.

Bu yapı sayesinde, yalnızca "nerede?" değil, aynı zamanda "hangi şartlarda?" sorusu da cevaplanmış olur.

Örneğin: Bir stil bloğu sadece geniş ekranlarda aktif edilirken, başka bir blok yalnızca düşük çözünürlüklü veya baskı ortamlarında çalışacak şekilde tanımlanabilir.

Bu sayede aynı tasarım, farklı bağlamlarda tamamen farklı davranışlar sergileyebilir.

Medya Türleri: Screen, Print ve All

Screen: Işık yayan tüm dijital ekranları kapsar.

Masaüstü bilgisayarlar, tabletler ve mobil cihazlar bu kategoriye girer ve modern web uygulamalarının büyük çoğunluğu bu ortam için optimize edilir.

Print: İçeriğin fiziksel çıktıya dönüştüğü senaryoları hedefler.

Bu modda amaç görsellikten çok okunabilirlik ve sadelik olduğu için, gereksiz arayüz bileşenleri kaldırılır ve içerik ön plana çıkarılır.

All: Tüm medya türlerini kapsayan varsayılan davranıştır.

Eğer bir medya türü belirtilmezse, stil kuralları otomatik olarak tüm ortamlarda geçerli kabul edilir.

Tek Kaynak, Çoklu Deneyim @media yapısının en büyük avantajı, tek bir stil dosyası üzerinden farklı cihazlara özel deneyimler sunabilmesidir.

Örneğin: Bir navigasyon menüsü, mobil cihazlarda dar alanı verimli kullanmak için gizlenip açılır hale gelirken, masaüstünde geniş bir yatay menü olarak gösterilebilir.

Bu yaklaşım, farklı platformlar için ayrı ayrı tasarım üretmek yerine, tek bir sistem üzerinden çoklu deneyim üretme imkanı sağlar.

Sonuç olarak @media, sadece bir stil kuralı değil; modern web arayüzlerinin adaptasyon yeteneğini sağlayan stratejik bir yapı taşıdır.

</>
@media (Duyarlı Tasarım) Giriş Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@media (Duyarlı Tasarım) Giriş Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="kutu">
        Ekran genişliğine göre rengim değişir.
    </div>
</body>

</html>
.kutu {
    background-color: lightblue;
    width: 100%;
}

@media screen and (min-width: 768px) {
    .kutu {
        background-color: lightgreen;
        width: 50%;
    }
}

Orta Seviye: Koşullar ve Eşik Noktaları Stratejik Planlama ve Breakpoints

Duyarlı Tasarımın Akıllı Uygulanışı

Orta seviye @media kullanımı, yalnızca ekran boyutlarına tepki vermek değil; tasarımın nerede kırılması gerektiğini bilinçli şekilde planlamak anlamına gelir.

Bu yaklaşımda amaç, stil kurallarını rastgele değil; tam olarak ihtiyaç duyulduğu anda devreye girecek şekilde zamanlamaktır.

Tarayıcı açısından bakıldığında bu, gereksiz stil hesaplamalarını azaltır ve yalnızca aktif olan senaryoların render sürecine dahil edilmesini sağlar.

Breakpoints: Tasarımın Kırılma Anları

Breakpoint, bir arayüzün mevcut düzeninin artık verimli çalışmadığı ve yeni bir yerleşime ihtiyaç duyduğu kritik geçiş anıdır.

Bu noktalar sabit cihazlara göre değil, içeriğin davranışına göre belirlenmelidir.

Örneğin: Bir kart yapısı sıkışmaya başladığında veya metin okunamaz hale geldiğinde, bu durum bir breakpoint ihtiyacını işaret eder.

Bu nedenle modern yaklaşım, "tablet = 768px" gibi ezbere değerlerden ziyade, içeriğe duyarlı breakpoint tasarımı önerir.

Doktrin 1: Mobil Öncelikli (min-width) - Modern Yaklaşım Mobil öncelikli yaklaşımda, temel stil en küçük ekranlar için yazılır ve daha büyük ekranlar için min-width kullanılarak kademeli olarak genişletilir.

Bu model, aşamalı geliştirme prensibine dayanır.

Küçük cihazlar sadece gerekli minimum stili yüklerken, daha güçlü cihazlar ekstra özellikleri alır.

Bu da performans açısından daha optimize ve sürdürülebilir bir yapı sağlar.

Doktrin 2: Masaüstü Öncelikli (max-width) - Azalan Kullanım Masaüstü öncelikli yaklaşımda, büyük ekranlar için yazılan stil daha sonra max-width ile küçültülmeye çalışılır.

Bu yöntem, küçük cihazların gereksiz yere fazla stil yüklemesine ve sonrasında bu stillerin override edilmesine neden olur.

Bu da hem performans hem de bakım açısından dezavantaj oluşturur.

Aralık Tanımlama (Range Thinking) Modern medya sorgularında önemli bir diğer yaklaşım, tek bir eşik yerine belirli bir aralığı hedeflemektir.

Bu sayede yalnızca tek bir cihaz değil, benzer davranış gösteren cihaz grupları kontrol altına alınabilir.

Örneğin: Bir tasarım, belirli bir genişlik aralığında farklı bir layout kullanacak şekilde planlanabilir.

Mantıksal Operatörler: and, not, only

And (Koşul Zinciri): Birden fazla koşulu birleştirerek daha hassas hedefleme yapılmasını sağlar.

Bu operatör ile, birden fazla şartın aynı anda sağlanması zorunlu hale getirilir.

Örneğin: Belirli bir genişlik aralığı ve yön (orientation) birlikte kontrol edilerek çok daha spesifik senaryolar oluşturulabilir.

Not (Negatif Mantık): Belirli bir koşulun dışındaki tüm durumları hedefler.

Bu operatör, özellikle istisna durumları tanımlamak için kullanışlıdır.

Only (Uyumluluk Katmanı): Modern CSS'te nadiren ihtiyaç duyulan, daha çok eski tarayıcı davranışlarını kontrol etmek için kullanılan bir yapıdır.

Günümüzde çoğu modern tarayıcı medya sorgularını doğru yorumladığı için, bu operatörün kullanım alanı oldukça sınırlıdır.

</>
@media Stratejik Planlama ve Breakpoints Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@media Stratejik Planlama ve Breakpoints Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="layout-test">
        <div class="sidebar">Sidebar</div>
        <div class="content">Ana İçerik</div>
    </div>
</body>

</html>
.layout-test {
    display: block;
}

.sidebar {
    background-color: #f1c40f;
    padding: 20px;
}

.content {
    background-color: #ecf0f1;
    padding: 20px;
}

@media screen and (min-width: 600px) and (max-width: 1024px) {
    .sidebar {
        border: 5px solid #d35400;
    }
}

@media screen and (min-width: 1025px) {
    .layout-test {
        display: flex;
    }

    .sidebar {
        width: 30%;
    }

    .content {
        width: 70%;
    }
}

İleri ve Akademik Seviye: Bağlam ve Modern Kullanım Kullanıcı Tercihleri ve Performans Mühendisliği

Duyarlı Tasarım Felsefesi (İçerik Odaklı Yaklaşım)

İleri seviyede @media kullanımı, belirli cihazları hedeflemekten ziyade, içeriğin davranışını analiz etmeye dayanır.

Cihaz isimlerine veya sabit piksel değerlerine bağlı kalmak, zamanla kırılgan ve sürdürülemez bir yapı oluşturur.

Bunun yerine modern yaklaşım, "içerik ne zaman bozuluyor?" sorusunu merkeze alır ve breakpoint'leri bu davranışa göre belirler.

Bu bakış açısı, duyarlı tasarımı cihaz bağımlı bir çözüm olmaktan çıkarır ve evrensel, adaptif bir sistem haline getirir.

Çevre Özellikleri: Cihaz ve Kullanıcı Empatisi

Modern medya sorguları, yalnızca ekran boyutlarını değil; kullanıcının tercihlerini ve cihazın çalışma koşullarını da dikkate alır.

Bu durum, CSS'i yalnızca bir stil dili olmaktan çıkarıp, kullanıcı deneyimi mühendisliği aracına dönüştürür.

Örneğin: prefers-color-scheme özelliği, kullanıcının sistem genelinde seçtiği tema tercihini algılayarak arayüzü otomatik olarak uyumlu hale getirir.

prefers-reduced-motion ise animasyon yoğunluğunu azaltarak, hem performansı artırır hem de hassas kullanıcılar için daha konforlu bir deneyim sunar.

Benzer şekilde, orientation ve resolution gibi özellikler, arayüzün fiziksel ve görsel bağlama göre optimize edilmesini sağlar.

Bu sayede aynı tasarım, farklı kullanıcı ihtiyaçlarına göre davranış değiştirebilen akıllı bir sistem haline gelir.

Render Süreci: Style → Layout → Paint

Tarayıcı, bir sayfayı işlerken belirli bir pipeline ( işlem hattı ) izler: stil hesaplama ( style ), yerleşim ( layout ) ve boyama ( paint ).

@media sorguları, bu sürecin en başında devreye girerek hangi stil bloklarının aktif olacağını belirler.

Bu sayede gereksiz stil kuralları, hesaplama sürecine dahil edilmeden elenir.

Mühendislik Detayı: Performans ve Optimizasyon Önemli bir teknik detay: @media sorguları CSS dosyasının indirilmesini engellemez.

Ancak koşul sağlanmadığı sürece ilgili stil blokları aktif hale getirilmez ve layout hesaplamalarına dahil edilmez.

Bu durum, özellikle karmaşık arayüzlerde reflow ve repaint maliyetlerini azaltır.

Doğru yapılandırılmış bir medya sorgusu stratejisi, tarayıcının daha az hesaplama yapmasını sağlar ve sayfanın etkileşime girme süresini

doğrudan iyileştirir.

Özellikle mobil öncelikli yaklaşım ile birlikte, gereksiz stil yükünün küçük cihazlarda işlenmemesi, performans açısından kritik bir avantaj sağlar.

</>
@media Kullanıcı Empatisi (Karanlık Mod) Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@media Kullanıcı Empatisi (Karanlık Mod) Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="akademik-kart">
        <div class="kart-gorsel">
            <div class="simge">◈</div>
        </div>
        <div class="kart-icerik">
            <div class="ust-bilgi">
                <span class="durum-badge">İleri Seviye Analiz</span>
            </div>
            <h3>@media Sorgu Mimarisi</h3>
            <p>Ekran genişledikçe bu kart sadece renk değiştirmez; yapısal bir dönüşüm geçirerek içerik odaklı bir
                deneyim
                sunar.</p>
            <button class="aksiyon-btn">
                <span>Keşfet</span>
                <i class="ok-simgesi">→</i>
            </button>
        </div>
    </div>
</body>

</html>
:root {
    --primary: #6366f1;
    --primary-hover: #4f46e5;
    --bg-card: #ffffff;
    --text-main: #1e293b;
    --text-sub: #64748b;
    --shadow: rgba(0, 0, 0, 0.05);
    --transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
}

body {
    background-color: #f8fafc;
    margin: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
    font-family: 'Inter', system-ui, sans-serif;
}

.akademik-kart {
    display: flex;
    flex-direction: column;
    gap: 24px;
    background: var(--bg-card);
    padding: 32px;
    border-radius: 20px;
    box-shadow: 0 10px 25px -5px var(--shadow);
    max-width: 380px;
    margin: 20px;
    transition: var(--transition);
    border: 1px solid rgba(255, 255, 255, 0.1);
}

.aksiyon-btn {
    background-color: var(--primary);
    color: white;
    border: none;
    padding: 12px 24px;
    border-radius: 12px;
    font-weight: 600;
    cursor: pointer;
    display: inline-flex;
    align-items: center;
    gap: 8px;
    transition: var(--transition);
}

.aksiyon-btn:hover {
    background-color: var(--primary-hover);
    transform: translateY(-2px);
    box-shadow: 0 4px 12px rgba(99, 102, 241, 0.4);
}

.durum-badge {
    background: rgba(99, 102, 241, 0.1);
    color: var(--primary);
    padding: 4px 12px;
    border-radius: 99px;
    font-size: 12px;
    font-weight: 700;
    text-transform: uppercase;
}

@media screen and (min-width: 600px) {
    .akademik-kart {
        flex-direction: row;
        max-width: 700px;
        padding: 40px;
    }

    .kart-gorsel {
        flex: 0 0 120px;
        height: 120px;
        background: #f1f5f9;
        display: flex;
        justify-content: center;
        align-items: center;
        border-radius: 16px;
    }
}

@media (prefers-color-scheme: dark) {
    :root {
        --bg-card: #1e293b;
        --text-main: #f8fafc;
        --text-sub: #94a3b8;
        --shadow: rgba(0, 0, 0, 0.3);
    }

    body {
        background-color: #0f172a;
    }

    .kart-gorsel {
        background: #334155;
    }
}

@media (prefers-reduced-motion: reduce) {

    .akademik-kart,
    .aksiyon-btn,
    body {
        transition: none !important;
        transform: none !important;
        animation: none !important;
    }
}
</>
@media Donanım Duyarlılığı (Yüksek Çözünürlük) Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@media @media Donanım Duyarlılığı (Yüksek Çözünürlük) Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="donanim-sahnesi">
        <div class="urun-kart">
            <div class="urun-gorsel"></div>
            <div class="urun-detay">
                <span class="cozunurluk-etiket">Donanım Algılandı</span>
                <h3>Profesyonel Lens Serisi</h3>
                <p>Ekranınızın <strong>DPI (Nokta Yoğunluğu)</strong> kapasitesine göre en uygun veri yükü otomatik
                    olarak
                    seçilir.</p>
            </div>
        </div>
    </div>
</body>

</html>
:root {
    --card-bg: #ffffff;
    --text-primary: #1e293b;
    --accent: #0ea5e9;
    --border: #e2e8f0;
}

body {
    background-color: #f1f5f9;
    font-family: 'Inter', system-ui, sans-serif;
    margin: 0;
    display: flex;
    justify-content: center;
    align-items: center;
    min-height: 100vh;
}

.urun-kart {
    background: var(--card-bg);
    border: 1px solid var(--border);
    border-radius: 20px;
    overflow: hidden;
    max-width: 320px;
    box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05);
}

.urun-gorsel {
    width: 100%;
    height: 200px;
    background-image: url('example-image.png');
    background-size: cover;
    background-position: center;
}

.urun-detay {
    padding: 24px;
}

.cozunurluk-etiket {
    background-color: #f0f9ff;
    color: var(--accent);
    padding: 4px 10px;
    font-size: 11px;
    font-weight: 700;
    border-radius: 6px;
    text-transform: uppercase;
}

h3 {
    margin: 12px 0 8px 0;
    color: var(--text-primary);
}

p {
    color: #64748b;
    font-size: 14px;
    line-height: 1.6;
    margin: 0;
}

@media (min-resolution: 2dppx) {
    .urun-gorsel {
        background-image: url('example-image.png');
    }

    .cozunurluk-etiket::after {
        content: " (Ultra HD Aktif)";
    }

    .urun-kart {
        border-color: var(--accent);
    }
}

@container (Kapsayıcı Sorguları) Bileşen Tabanlı Duyarlılık ve Mikro-Düzen

Tanım: Global Bakıştan Yerel Farkındalığa

@container kuralı, web tasarımının on yılı aşkın süredir dayandığı "ekran boyutuna bağımlılık" paradigmasını kökünden değiştirerek; bir öğenin stillerini global görüntü alanının ( viewport ) anlık genişliğine göre değil, doğrudan içinde barındığı en yakın ebeveyn konteynerinin fiziksel boyutlarına göre değiştirmeyi sağlayan devrim niteliğinde bir At-Kuralıdır.

Bu mekanizma, öğelerin "Dünya ne kadar büyük?" ( Ekran boyutu ) sorusunu sormayı bırakıp, "Evim ne kadar geniş?" ( Kapsayıcı boyutu ) sorusuna odaklanmasını sağlayarak, CSS'e gerçek anlamda bir bağlam farkındalığı (context-awareness) kazandırır.

Mimari: Sayfadan Bileşene Geçiş

Bu özellik, duyarlı tasarımı klasik "sayfa seviyesi" ( Macro Layout ) yönetiminden çıkarıp atomik "bileşen seviyesine" ( Micro Layout ) taşıyarak modern mimariyi yeniden tanımlar.

Bu sayede, aynı modülün ( bir ürün kartı veya haber bileşeninin ); hem dar bir yan menüde ( sidebar ) hem de geniş bir ana içerik alanında ( main content ), hiçbir ekstra sınıf isimlendirmesine veya karmaşık medya sorgusuna ihtiyaç duymadan, otomatik olarak bulunduğu yere adapte olmasını ve farklı görünmesini mümkün kılar.

Basit Seviye: @media ve @container Farkı Viewport Sınırı ve Bağlam Devrimi

@media Sınırı: Viewport Odaklı Körlük

Geleneksel @media sorguları, tasarım kararlarını verirken her zaman ve sadece tarayıcı penceresinin toplam genişliğini referans alır; bu durum bileşenlerin içinde bulundukları dar alanları görmezden gelmesine, tabiri caizse bir "mekansal körlük" yaşamasına neden olur.

Düşünün ki mükemmel tasarlanmış bir "Kart Bileşeni"niz var, eğer bu kart, geniş bir masaüstü ekranında

( viewport > 1200 piksel ) dururken, tasarım gereği dar bir kenar çubuğuna yerleştirilirse; @media sorgusu ekranın hala büyük olduğunu algıladığı için karta ısrarla "geniş ekran stilini" ( yan yana üç sütunlu düzen ) uygulamaya çalışır.

Sonuç olarak, kart kendisine ayrılan dar alana sığmaz, düzen patlar ve içerik okunamaz hale gelir; çünkü @media, bileşenin sıkıştığı dar hücreye bakmaz, sadece ekranın ( dünyanın ) ne kadar büyük olduğuna bakar.

@container Çözümü: Bileşen Odaklı Özgürlük

Kapsayıcı sorguları (@container), bu paradoksu çözmek için odağı global ekrandan alıp, doğrudan bileşenin kendisine ev sahipliği yapan kapsayıcının fiziksel alanına kilitler.

Aynı kart örneğinde; kart bir kenar çubuğunda dar bir alanda duruyorsa, bu alanın genişliği az olduğu için (ekran 4K bile olsa) kart otomatik olarak "Mobil Stilini" aktif eder ve içeriğini alt alta dizer.

Eğer aynı kart, kenar çubuğundan çıkarılıp geniş ana içerik alanına taşınırsa, alanı genişlediği için anında ve otomatik olarak "Masaüstü Stilini" geri kazanır; bu da bileşenin sayfadaki konumundan bağımsız olarak her yerde doğru çalışmasını sağlayan maksimum taşınabilirliği (portability) garanti eder.

</>
@media ve @container Arasındaki Fark Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@media ve @container Arasındaki Fark Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="sidebar-kapsayici">
        <div class="urun-kart">
            <div class="kart-gorsel">📸</div>
            <div class="kart-icerik">
                <h3>Modern Kahve Makinesi</h3>
                <p>Kısıtlı alanlarda bile düzenini bozmaz.</p>
            </div>
        </div>
    </div>
</body>

</html>
.sidebar-kapsayici {
    width: 300px;
    container-type: inline-size;
    border: 2px dashed #ccc;
}

.urun-kart {
    display: flex;
    flex-direction: column;
    gap: 10px;
    padding: 10px;
}

@container (min-width: 400px) {
    .urun-kart {
        flex-direction: row;
        background-color: #f0fdf4;
    }
}

Orta Seviye: Sözdizimi ve Tanımlama Aktivasyon ve Koşullu Mantık

Adım 1: Kapsayıcıyı Kayıt Etmek (Activation)

Kapsayıcı sorgularını kullanmak için zorunlu olan ilk adım; bir HTML öğesini sıradan, pasif bir kutu olmaktan çıkarıp, kendi sınırları içinde gerçekleşen değişiklikleri izleyen ve raporlayan aktif bir "kapsayıcıya" dönüştürmektir.

Bu işlem, sorgulanacak ebeveyn öğeye container-type özelliği atanarak yapılır; bu özellik tarayıcı motoruna

"Dikkat, bu element artık sadece bir kutu değil, altındaki çocukları için bir referans ve sorgulama noktasıdır" talimatını veren resmi bir deklarasyondur.

/* Kapsayıcıyı Tanımlama */
.sidebar {
    container-type: inline-size; /* Genişliği izle */
    container-name: sidebar-area; /* (İsteğe bağlı) İsim ver */
}
Parametreler: inline-size ve container-name

container-type: inline-size; En yaygın ve pratik kullanılan değerdir.

Kapsayıcının "mantıksal genişliğine" ( yazı akış yönündeki boyuta) göre sorgulama yapılacağını belirtir.

Bu sayede, kapsayıcının width değeri değiştiğinde, içindeki elementlerin buna tepki vermesi sağlanır.

container-name: isim; Bu özellik teknik olarak isteğe bağlı olsa da, sayfada birden fazla sorgulanabilir alanın iç içe geçtiği

( bir sidebar ve onun içindeki bir widget ) karmaşık mimarilerde karışıklığı önlemek ve spesifik bir ata öğeyi hedeflemek için mantıklıdır.

Adım 2: Koşullu Stil Uygulama (The Query)

Kapsayıcı tanımlandıktan sonra, alt öğelerin stilleri @container kuralı kullanılarak koşullandırılır.

Sözdizimi yapısal olarak @media ile neredeyse aynıdır; ancak buradaki kritik fark, genişlik referansının ( min-width ) global viewport değil, az önce tanımladığımız kapsayıcının kendisi olmasıdır.

/* Kullanımı: Eğer 'sidebar-area' 300px'den büyükse */
@container sidebar-area (min-width: 300px) {
    .card {
        display: flex; /* Yan yana diz */
    }
}

Bu sayede, stil kuralları varsayımlara değil, bileşenin içinde bulunduğu alanın gerçek fiziksel ihtiyacına göre uygulanır.

</>
@containerSözdizimi ve İsimlendirilmiş Sorgular Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@containerSözdizimi ve İsimlendirilmiş Sorgular Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <section class="ana-izgara">
        <aside class="widget-alani">
            <div class="hava-durumu-widget">
                <h4>İstanbul</h4>
                <span class="derece">22°C</span>
                <p class="detay">Parçalı Bulutlu</p>
            </div>
        </aside>
    </section>
</body>

</html>
.widget-alani {
    container-type: inline-size;
    container-name: bilesen-yuvasi;
}

@container bilesen-yuvasi (min-width: 250px) {
    .hava-durumu-widget {
        display: grid;
        grid-template-columns: 1fr auto;
        align-items: center;
    }

    .derece {
        font-size: 2rem;
        color: #2563eb;
    }
}

@container bilesen-yuvasi (max-width: 249px) {
    .hava-durumu-widget {
        text-align: center;
        border-top: 4px solid #fbbf24;
    }
}

İleri ve Akademik Seviye: Yeni Birimler ve Mimari Etki CQ Birimleri, Taşınabilirlik ve Kısıtlamalar

Bileşen Kapsamlı Birimler (CQ Units)

Kapsayıcı sorguları, sadece stil değiştirme yeteneğiyle kalmaz; aynı zamanda boşluk ve boyutlandırma matematiğini global ekrandan koparıp yerelleştiren yeni, kapsamlanmış (scoped) göreceli birimler sunar (cqw, cqh, cqi, cqb).

cqw (Container Query Width): Tanımlı kapsayıcının genişliğinin %1'ine eşittir.

Bu birimler sayesinde, bir font boyutu veya padding değeri, viewport'tan tamamen bağımsız olarak, sadece ve sadece ait olduğu

bileşenin boyutuna göre ölçeklenir.

Bu yerel matematik, bir bileşenin iç fontlarının, büyük bir ekranda bile dar bir kutuya ( sidebar ) sığarken orantılı olarak küçülmesini sağlayarak, klasik vw biriminin yol açtığı "dar alanda devasa font" ( aşırı ölçeklenme) sorunlarını kökten ortadan kaldırır.

Mimari Etki: Maksimum Taşınabilirlik

@container özelliği, modern Bileşen Tabanlı Tasarım (Component-Based Design) felsefesini CSS seviyesinde tam ve yerel olarak destekleyen ilk özelliktir.

Bir bileşen, sitenin herhangi bir yerine ( üstbilgiye, altbilgiye veya bir modal pencereye ) taşındığında; tüm duyarlı stil kurallarını ve adaptasyon zekasını kendi içinde taşıdığı için, dışarıdan hiçbir müdahaleye veya "override" koduna gerek kalmadan her zaman doğru görünür.

Bu durum, kodun yeniden kullanılabilirliğini ( reusability ) ve sürdürülebilirliğini radikal bir şekilde artırarak, "Bir kere yaz, her yerde kullan" prensibini gerçeğe dönüştürür.

Akademik Zorunluluk: Kapsülleme ve Döngü Yasağı

Teknik bir kısıtlama olarak; bir kapsayıcı, kurallar koyduğu kendi alt öğelerinin ( çocuklarının ) stillerini değiştirebilir, ancak kendi stillerini sorgulayarak değiştiremez.

Bu kural (kendini sorgulama yasağı), tarayıcı motorunda oluşabilecek sonsuz döngüleri (circular dependency) engellemek için getirilmiş kritik bir spesifikasyon kısıtlamasıdır.

Eğer bir öğe kendi genişliğini sorgulayıp buna göre kendi genişliğini değiştirebilseydi ( padding ekleyerek), bu durum genişliğin değişmesine, değişen genişliğin sorguyu tekrar tetiklemesine ve tarayıcının sonsuza kadar boyut hesaplamasına yol açardı.

</>
@container CQ Birimleri ve Yerel Matematik Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@container CQ Birimleri ve Yerel Matematik Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="dinamik-cerceve">
        <div class="duyarli-metin">
            <h2>Geleceğin Tipografisi</h2>
            <p>Bu başlık, içinde bulunduğu kutu büyüdükçe otomatik olarak ölçeklenir.</p>
        </div>
    </div>
</body>

</html>
.dinamik-cerceve {
    width: 50%;
    container-type: inline-size;
    resize: horizontal;
    overflow: auto;
    padding: 20px;
    background: #f8fafc;
}

.duyarli-metin h2 {
    font-size: clamp(1.5rem, 10cqw, 4rem);
    line-height: 1.1;
    color: #1e293b;
}

.duyarli-metin p {
    font-size: 4cqw;
    margin-top: 1cqh;
}

Media Query Level 5 Yenilikleri Cihazdan İnsana: Tercihlerin Yönetimi

Felsefi Kırılma: Pikselden Tercihe

Media Queries Level 5 spesifikasyonu, CSS'in yıllardır süregelen tasarım felsefesini sadece

"cihazın fiziksel boyutunu sorgulamaktan" radikal bir şekilde ayırıp; tasarımın merkezine "kullanıcının kişisel deneyim tercihini" yerleştiren tarihi bir dönüm noktasıdır.

Bu yeni yaklaşım, tarayıcıya "Ekranın kaç piksel?" diye sormak yerine; "Kullanıcının ışığa duyarlılığı var mı?",

"Animasyonlardan rahatsız oluyor mu?" veya "Veri tasarrufu yapmak istiyor mu?" gibi, makineden çok insanı anlamaya yönelik sorular sorarak arayüzü şekillendirir.

Hedef: Kapsayıcılık ve Performans

Bu yeniliklerin çoğu, webin sadece "görünebilir" olmasını değil, herkes için "kullanılabilir" olmasını sağlayan erişilebilirliği artırmayı temel misyon edinmiştir.

Aynı zamanda, gereksiz görsel yükleri azaltarak veya kullanıcının sistem ayarlarına ( pil tasarrufu moduna ) saygı duyarak, donanım kaynaklarını verimli kullanan ve performansı optimize eden daha etik bir web tasarımı anlayışını mümkün kılar.

Modern Media Query Özellikleri Basit Anlatım ve Kullanım Alanları
Yeni Özellik
Ne İşe Yarar? (Basit Anlatım)
prefers-contrast
Kullanıcının işletim sisteminde (Windows Yüksek Kontrast modu, macOS Kontrast Artırma) renk kontrastını artırma veya azaltma isteği olup olmadığını algılar.
prefers-reduced-data
Kullanıcının mobil cihazında veya tarayıcı ayarlarında daha az internet verisi kullanma tercihi olup olmadığını sorgular.
prefers-reduced-transparency
Kullanıcının şeffaflık veya yarı saydam arayüz efektlerini (örneğin arka plan bulanıklığı) azaltma tercihi olup olmadığını sorgular.
forced-colors
Tarayıcının, Windows'taki "Yüksek Kontrast Modu" gibi, kullanıcı tarafından belirlenmiş zorunlu bir renk paleti kullanıp kullanmadığını algılar.
hover
Cihazın bir fare ile öğe üzerine gelebilme yeteneğini (hover) sorgular.
pointer
Birincil giriş cihazının hassasiyetini (parmakla dokunma mı, hassas fare mi) sorgular.
Yorumsal ve İleri Düzey Etkiler Erişilebilirlik, Performans ve Kullanıcı Deneyimi
Yeni Özellik
Yorumsal ve İleri Düzey Etki
prefers-contrast
Erişilebilirlik: Görme bozukluğu olan veya parlak/düşük kontrastlı ekranlarda zorlanan kullanıcılar için, sitenin renk paletini otomatik olarak yüksek kontrastlı (daha keskin siyah-beyaz) veya daha yumuşak, düşük kontrastlı bir şemaya geçirmeyi sağlar.
prefers-reduced-data
Performans: Bu tercih algılandığında, CSS; yüksek çözünürlüklü görselleri, büyük fontları, karmaşık gradyanları ve videoları otomatik olarak daha küçük, daha hafif veya statik versiyonlarıyla değiştirebilir.
Bu, özellikle sınırlı veri paketine sahip mobil kullanıcılar için maliyet ve hız optimizasyonudur.
prefers-reduced-transparency
Göz Yorgunluğu/Bilişsel Yük: Bazı şeffaflık efektleri hareketli içeriklerde göz yorgunluğuna veya bilişsel zorluğa neden olabilir.
Bu sorgu sayesinde, şeffaf katmanları (rgba veya backdrop-filter içeren) tam opak renklere dönüştürerek daha sağlam (solid) bir arayüz sunulur.
forced-colors
En Üst Düzey Erişilebilirlik: Bu moddayken, tasarımcı CSS ile belirlediği renklerin tarayıcı tarafından tamamen ezileceğini bilir.
Bu sorgu, bu moddayken arayüze, görselleri daha iyi göstermek için yalnızca minimal kenarlık veya gölge ekleme gibi iyileştirmeler yapılmasına izin verir.
hover
Kullanıcı Etkileşimi: Cihazın fare ile hover yapabilme yeteneğini sorgular. Sadece ekran boyutuna göre değil, kullanıcının nasıl etkileşim kurduğuna göre stilleri değiştirir.
Fare ile etkileşim kurabilen cihazlarda hover efektleri gösterilirken, dokunmatik cihazlarda bu efektler gizlenebilir.
pointer
Kullanıcı Etkileşimi: Birincil giriş cihazının hassasiyetini sorgular.
Parmakla dokunulan cihazlarda (coarse pointer), tıklama alanlarının (padding) daha büyük olmasını sağlamak gibi erişilebilirlik iyileştirmeleri yapılabilir.
Hassas fare (fine pointer) kullanılan cihazlarda ise daha kompakt arayüzler sunulabilir.
</>
@media Kullanıcı ve Cihaz Deneyimi Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@media Kullanıcı ve Cihaz Deneyimi Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="modern-etkilesim-kart">
        <div class="kart-ust">
            <span class="sensor-badge">Akıllı Denetim Aktif</span>
        </div>
        <h3>Duyarlı Etkileşim</h3>
        <p>Bu buton, cihazınızda fare mi yoksa dokunmatik ekran mı olduğunu algılayarak boyutunu ayarlar.</p>

        <button class="akilli-buton">Bana Tıkla</button>

        <div class="veri-tasarrufu-notu">
            Düşük veri modu algılandı. Arka plan görselleri kısıtlandı.
        </div>
    </div>
</body>

</html>
.modern-etkilesim-kart {
    padding: 30px;
    border: 2px solid #e2e8f0;
    border-radius: 15px;
    max-width: 400px;
    background-color: white;
}

.akilli-buton {
    background-color: #6366f1;
    color: white;
    border: none;
    border-radius: 8px;
    padding: 10px 20px;
    cursor: pointer;
}

.veri-tasarrufu-notu {
    display: none;
}

/* Varsayılan gizli */

/* --- 1. POINTER & HOVER: Cihaz Yeteneği Algılama --- */
/* Eğer kullanıcı parmakla dokunuyorsa (Coarse), tıklama alanını büyüt (Erişilebilirlik) */
@media (pointer: coarse) {
    .akilli-buton {
        padding: 20px 40px;
        /* Daha kolay dokunulması için dev buton */
        font-size: 1.2rem;
    }
}

/* Sadece fare kullanan cihazlarda (Hover yeteneği olan) hover efekti göster */
@media (hover: hover) {
    .akilli-buton:hover {
        background-color: #4f46e5;
        transform: scale(1.05);
    }
}

@media (prefers-reduced-data: reduce) {
    .modern-etkilesim-kart {
        background-image: none !important;
    }

    .veri-tasarrufu-notu {
        display: block;
        color: #b45309;
        font-size: 12px;
        margin-top: 10px;
    }
}

@media (prefers-contrast: more) {
    .modern-etkilesim-kart {
        border: 4px solid black;
    }

    .akilli-buton {
        background-color: black;
        font-weight: bold;
        outline: 2px solid gold;
    }
}

@keyframes (Animasyonların Tanımlanması) Zamanın Koreografisi ve Akış Kontrolü

Tanım: Statik Dünyadan Hareketli Evrene

@keyframes kuralı, CSS'in statik doğasını kıran ve bir elementin zaman içindeki değişimini yöneten; bir animasyon sekansının (dizisinin) tamamını, o hareketin en kritik anlarındaki (anahtar karelerdeki) stillerini tek tek tanımlayarak oluşturan temel yapı taşıdır.

Bu kural, tarayıcıya sadece "Başla" ve "Bitir" demekle kalmayıp; animasyonun başlangıcında, ortasında, bitişinde ve aradaki herhangi bir yüzdelik diliminde bir öğenin tam olarak hangi stile ( renk, konum, şeffaflık vb. ) sahip olması gerektiğini söyleyen ayrıntılı ve deterministik bir yol haritasıdır.

Ara Değerlerin Matematiği (Interpolation)

Teknik olarak @keyframes, animasyonun "dönüm noktalarını" belirler.

Siz sadece %0 ve %100 noktalarındaki durumları tanımlarsınız; tarayıcı motoru ise bu iki nokta arasındaki milyonlarca ara kareyi matematiksel olarak hesaplayarak (interpolation) akıcı ve kesintisiz bir hareket yanılsaması yaratır.

Basit Seviye: Başlangıç ve Bitiş Durumu A'dan B'ye Yolculuk ve Kimlik Tanımı

İşlev: Doğrusal Bir Dönüşüm Hattı

En temel kullanım senaryosunda @keyframes, bir öğenin var olduğu ilk durum ( başlangıç pozisyonu ) ile ulaşması gereken son durum

( bitiş pozisyonu ) arasındaki tek ve kesintisiz bir yumuşak dönüşümü tanımlar.

Bu mekanizma, basitçe "A noktasından B noktasına git" komutunu içerir ve tarayıcıya bu iki uç nokta arasındaki tüm fiziksel değişimleri hesaplama görevini yükler.

Sözdizimi ve Kimlik İnşası

Bir animasyonun teknik iskeleti, ona verilen isim ve zaman duraklarından oluşur:

/* Basit Fade-In Efekti */
@keyframes gorunur-ol {
    from { opacity: 0; } /* Başlangıç */
    to   { opacity: 1; } /* Bitiş */
}

[isim]: Animasyona geliştirici tarafından verilen ve daha sonra CSS'teki animation-name özelliği ile çağrılacak olan, o hareket dizisinin

benzersiz kimlik kartıdır (ID); Türkçe veya İngilizce olabilir ancak boşluk içermemelidir.

from ve to: Bu anahtar kelimeler, animasyonun zaman çizelgesindeki mutlak uçları temsil eder; from zamanın sıfır noktasını (%0), to ise zamanın tamamlandığı son noktayı (%100) ifade eden semantik takma adlardır.

Kullanım Amacı: Otonom Hareket

Bir düğmenin fare üzerine gelindiğinde rengini değiştiren reaktif (tepkisel) bir transition işleminden farklı olarak; @keyframes, öğeyi kullanıcı müdahalesi olmadan, sayfa yüklendiği anda veya bir sınıf eklendiğinde otomatik ve otonom olarak hareket ettiren bağımsız bir kurgu başlatır.

Örneğin:

Bir şirket logosunun sayfa açılışında opaklığını 0'dan 1'e getirerek yavaşça belirmesini sağlayan bir "Fade-in" efekti, bu yapının en klasik örneğidir.

</>
@keyframes Başlangıç ve Bitiş (A'dan B'ye) Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@keyframes Başlangıç ve Bitiş (A'dan B'ye) Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="sahne">
        <h1 class="fade-baslik">Hoş Geldiniz</h1>
    </div>
</body>

</html>
@keyframes gorunur-ol {
    from {
        opacity: 0;
    }

    to {
        opacity: 1;
    }

}

.fade-baslik {
    font-family: sans-serif;
    animation-name: gorunur-ol;
    animation-duration: 2s;
}

Orta Seviye: Zaman Dilimleri (Yüzdeler) Çoklu Adımlar ve Performans Mühendisliği

Timeline Yönetimi: İkili Sistemden Çıkış

Bu seviye, animasyon kurgusunu basit bir "başlangıç-bitiş" ikileminden çıkarıp; animasyonun toplam süresini hassas bir zaman çizelgesi (timeline) gibi yöneterek, yüzdelik dilimler ( %0, %25, %50, %100 ) aracılığıyla öğenin birden fazla ara durumdan geçmesini sağlayan sofistike bir yapı sunar.

from ve to anahtar kelimeleri yerine kullanılan bu yüzdelik değerler, geliştiriciye animasyonun akışı üzerinde milimetrik bir kontrol ve hikaye anlatımı gücü verir.

İşlev: Karmaşık Koreografi

Bu yapı, animasyonun tek bir nefeste değil, bir süreç boyunca farklı karakterlere bürünmesini sağlar.

Örneğin:

Karmaşık bir hareket senaryosunda; bir karenin %0 anında ekranın solunda sakince dururken, %50 anında yukarıya fırlayıp kendi ekseni etrafında dönmesi ve nihayet %100 anında sağ tarafa yumuşakça inmesi gibi çok aşamalı bir eylem dizisi tanımlanabilir.

Sizin tanımlamadığınız ara yüzdelik dilimler (örneğin %25 ile %50 arası) arasındaki geçişi, tarayıcı motoru yine otomatik matematiksel hesaplamalarla ( interpolasyon ) doldurarak akıcı ve kesintisiz bir hareket sağlar.

Performans: GPU ve Akışkanlık

Mühendislik açısından kritik bir detay olarak; @keyframes içinde tanımlanan özellikler rastgele seçilmemeli, tarayıcının ana işlemcisini (CPU) yormadan doğrudan Grafik İşlemci (GPU) üzerinde hızlandırılabilen (Hardware Acceleration) özellikler tercih edilmelidir.

Bu bağlamda en verimli özellikler; sayfa düzenini (layout) yeniden hesaplatıp pikselleri tekrar boyamayı gerektirmeyen transform (konum değiştirme, büyütme, döndürme) ve opacity (saydamlık) özellikleridir; bunlar "saniyede 60 kare" ( 60fps ) akıcılığına ulaşmanın anahtarıdır.

</>
@keyframes Zaman Dilimleri ve Karmaşık Koreografi Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@keyframes Zaman Dilimleri ve Karmaşık Koreografi Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="sahne-konteyner">
        <div class="hareketli-kutu"></div>
    </div>
</body>

</html>
.sahne-konteyner {
    width: 100%;
    height: 300px;
    background-color: #f8fafc;
    border: 2px dashed #e2e8f0;
    border-radius: 16px;
    margin: 20px auto;
    display: flex;
    justify-content: center;
    align-items: center;
}

@keyframes dans-et {
    0% {
        transform: translateY(0) rotate(0deg);
        background-color: #6366f1;
    }

    25% {
        background-color: #ec4899;
    }

    50% {
        transform: translateY(-50px) rotate(180deg);
        background-color: #f59e0b;
        border-radius: 50%;
    }

    100% {
        transform: translateY(0) rotate(360deg);
        background-color: #6366f1;
        border-radius: 12px;
    }
}

.hareketli-kutu {
    width: 80px;
    height: 80px;
    border-radius: 12px;
    box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
    animation: dans-et 4s infinite ease-in-out;
}

@media (prefers-reduced-motion: reduce) {
    .hareketli-kutu {
        animation: none;
        transform: none;
    }
}

İleri ve Akademik Seviye: Çağrı ve Kontrol Orkestrasyon, Döngü ve Performans Disiplini

Rejisörlük: Senaryoyu Sahneye Koymak

@keyframes ile animasyonun "ne yapacağı" ( senaryo ) tanımlandıktan sonra; bu pasif tanımın sayfadaki bir öğe üzerinde ne kadar süreyle, hangi sıklıkta, hangi hız eğrisiyle ve hangi yönde çalışacağını belirleyen CSS animation özellikleri (rejisör komutları) ile aktif edilerek kontrol edilmesi zorunludur.

Döngü ve Akış Kontrolü

Süreklilik (animation-iteration-count): Bir animasyonun tek seferlik bir olay mı yoksa sonsuz bir döngü mü olacağını belirler.

Özellikle infinite değeri, bir yükleme simgesinin (spinner) veya arka plan efektinin durmaksızın çalışmasını sağlayan "perpetual motion" (sürekli hareket) mekanizmasını kurar.

Yön Yönetimi (animation-direction): Animasyonun akış yönünü manipüle eder.

alternate değeri, animasyonun bir sarkaç gibi davranmasını sağlar; birinci döngüde A'dan B'ye giderken, ikinci döngüde B'den A'ya geri döner. Bu teknik, animasyonun bitiş ve başlangıç noktaları arasındaki o sert ve istenmeyen "zıplamayı" ( jump cut ) engelleyerek akıcı ve organik bir görünüm sunar.

Akademik Kısıt: CPU vs GPU Savaşı

Performans mühendisliği açısından hayati bir kural şudur: @keyframes ile bir stil değişimi tanımlandığında, tarayıcı bu değişimin her karesini ( frame ) saniyeler içinde defalarca yeniden çizmek zorundadır.

Bu nedenle, sayfa düzenini (Layout) değiştiren ve işlemciye (CPU) ağır yük bindiren width , height , margin , padding gibi özellikleri animasyon içinde kullanmaktan şiddetle kaçınılmalıdır.

Bunun yerine, doğrudan Grafik İşlemci (GPU) tarafından işlenen ve "Composite" katmanında gerçekleşen transform (translate, scale, rotate) özelliklerini kullanmak; tarayıcının iş yükünü hafifletir ve animasyonun takılmadan, yağ gibi akan 60 FPS ( saniyede 60 kare ) standardında olmasını garantiler.

İzolasyon Prensibi ve Bitiş Durumu

@keyframes kuralı, standart CSS öncelik savaşlarından bağımsız, izole bir alanda tanımlanır; yani diğer global stillerle doğrudan bir çakışma yaşamaz, sadece çağrıldığı isim üzerinden otonom bir bölge yaratır.

Önemli bir detay olarak; animasyon bittiğinde öğe, varsayılan olarak animasyonun son karesindeki stili korumaz ve aniden başlangıçtaki

"Normal Akış" stiline geri döner (bu davranışı değiştirmek ve son karede kalmasını sağlamak için animation-fill-mode: forwards; kullanılır).

</>
@keyframes Yükleme Sahnesi ve Performans Disiplini Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@keyframes Yükleme Sahnesi ve Performans Disiplini Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="yukleme-ekrani">
        <div class="spinner-merkezi">
            <div class="spinner"></div>
            <div class="spinner-halka"></div>
        </div>
        <p class="yukleme-metni">Sistem Optimize Ediliyor...</p>
    </div>
</body>

</html>
.yukleme-ekrani {
    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    height: 300px;
    background-color: #0f172a;
    border-radius: 20px;
    gap: 20px;
}

.spinner-merkezi {
    position: relative;
    width: 80px;
    height: 80px;
}

.spinner {
    width: 100%;
    height: 100%;
    border: 4px solid rgba(99, 102, 241, 0.1);
    border-top: 4px solid #6366f1;
    border-radius: 50%;
    animation: rotate-spinner 1s linear infinite;
}

.spinner-halka {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
    border: 2px solid #818cf8;
    border-radius: 50%;
    opacity: 0;
    animation: pulse-ring 1.5s ease-out infinite;
}

@keyframes rotate-spinner {
    from {
        transform: rotate(0deg);
    }

    to {
        transform: rotate(360deg);
    }
}

@keyframes pulse-ring {
    0% {
        transform: scale(0.7);
        opacity: 0.5;
    }

    100% {
        transform: scale(1.3);
        opacity: 0;
    }
}

.yukleme-metni {
    color: #94a3b8;
    font-family: 'Inter', sans-serif;
    font-size: 14px;
    letter-spacing: 1px;
    animation: text-glow 2s ease-in-out infinite alternate;
}

@keyframes text-glow {
    from {
        opacity: 0.4;
    }

    to {
        opacity: 1;
    }
}

@media (prefers-reduced-motion: reduce) {

    .spinner,
    .spinner-halka,
    .yukleme-metni {
        animation: none !important;
        opacity: 1 !important;
        transform: none !important;
    }
}

@font-face (Özel Yazı Tipleri) Dijital Tipografi ve Kimlik İnşası

Tanım: Sistem Fontlarından Özgürleşme

@font-face kuralı, web tasarımının ilk yıllarındaki kısıtlayıcı "güvenli yazı tipleri" (web-safe fonts) dönemini kapatan; tarayıcıya, kullanıcının yerel işletim sisteminde fiziksel olarak yüklü olmayan özel bir yazı tipi dosyasını (web font) uzak sunucudan indirip, siteye dahil etme (embed) talimatını veren kritik bir yönergedir.

Bu kural sayesinde, bir web sitesi artık kullanıcının bilgisayarında "Helvetica" veya "Arial" olup olmadığına bağımlı kalmadan; tasarımcının vizyonunda belirlediği o spesifik ve özgün yazı karakterini, tıpkı bir görseli yükler gibi ağ üzerinden kullanıcıya sunarak tipografik bağımsızlığını ilan eder.

Tutarlılık ve Görsel Kimlik

Bu mekanizma, bir markanın görsel kimliğinin en önemli parçası olan tipografinin; Windows, macOS, Android veya Linux gibi farklı font kütüphanelerine sahip ekosistemlerde bile tutarlı ve bozulmadan görünmesini sağlayan CSS'in birincil estetik aracıdır.

@font-face, sadece bir dosya yükleme işlemi değil; sitenin karakterini oluşturan harf yapılarının (gliflerin), kullanıcının cihazına geçici olarak ödünç verilmesi ve tarayıcı motoru tarafından doğru şekilde render edilmesi (çizilmesi) sürecini başlatan teknik bir köprüdür.

Basit Seviye: Kayıt ve Tanımlama Protokolü İsimlendirme, Kaynak ve Çağrı

İşlev: Sessiz Tescil İşlemi

Bu seviye, tarayıcıya özel bir yazı tipini yüklemesi ve tanıması için gereken asgari teknik bilgileri sağlayan bir "kayıt protokolüdür".

Kritik bir ayrım olarak; @font-face kuralının kendisi doğrudan hiçbir HTML öğesine stil uygulamaz veya sayfayı boyamaz; sadece yeni bir font kaynağını sisteme tanıtır, onu bir isimle tesciller ve tarayıcının kullanımına hazır bir "rezerv" olarak sunar.

Sözdizimi: İsim ve Adres (Name & Address)

Bir fontu sisteme tanıtmak için iki zorunlu bileşene ihtiyaç vardır: Ona vereceğimiz bir "iç isim" ve dosyanın bulunduğu "fiziksel adres".

/* Fontu Sisteme Tanıtma */
@font-face {
    font-family: 'MarkaFontum'; /* Bizim verdiğimiz takma ad */
    src: url('fonts/marka-bold.woff2') format('woff2'); /* Dosya konumu */
}

font-family (İsim Atama): Bu özellik, fontun orijinal dosya adından bağımsız, CSS evreninde geçerli olacak benzersiz kimliğidir. Buraya atadığınız isim (örneğin 'MarkaFontum'), tamamen geliştiricinin inisiyatifindedir ve daha sonraki stil tanımlarında bu varlığı çağırmak için kullanılacak olan

anahtar kelimedir.

src (Kaynak Belirtme): Tarayıcıya font dosyasının sunucudaki tam konumunu (url()) ve dosyanın teknolojik formatını (format()) bildiren zorunlu yol haritasıdır.

Aktivasyon ve Yedekleme (Fallback)

Tanımlanan font, ancak sayfanın herhangi bir yerinde font-family: 'MarkaFontum', Arial, sans-serif; şeklinde çağrıldığında aktifleşir ve indirme işlemi başlar.

Yedek Stratejisi: Font listesinde özel ismin hemen ardından virgülle ayrılmış standart sistem fontlarını (Arial, sans-serif) eklemek, web tipografisinin emniyet kemeridir.

Eğer özel font dosyası sunucu hatası veya yavaş bağlantı nedeniyle yüklenemezse, tarayıcı paniklemeden sıradaki yedeği devreye sokar ve içeriğin

okunabilir kalmasını garanti eder.

</>
@keyframes Yükleme Sahnesi ve Performans Disiplini Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@font-face Yükleme Kayıt ve Tescil Protokolü Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="tipografi-sahnesi">
        <h1 class="ozel-baslik">Dijital Kimlik ve Tipografi</h1>
        <p>Bu başlık, sunucudaki özel font dosyası başarıyla tescil edildiğinde aktifleşir.</p>
    </div>
</body>

</html>
SS
/* --- 1. ADIM: FONTU SİSTEME TANITMA (TESCİL) --- */
@font-face {
    /* Geliştirici tarafından atanan benzersiz kimlik */
    font-family: 'MarkaFontum';
    /* Dosyanın fiziksel adresi */
    /* ÖNEMLİ NOT: Bu kodun çalışması için 'fonts' adında bir klasör oluşturmalı 
       ve içine indirdiğiniz 'marka-bold.woff2' dosyasını eklemelisiniz. */
    src: url('fonts/marka-bold.woff2') format('woff2');
    font-weight: bold;
    font-style: normal;
}

/* --- 2. ADIM: FONTU ÇAĞIRMA VE YEDEKLEME (AKTİVASYON) --- */
.ozel-baslik {
    /* 'MarkaFontum' yüklenene kadar veya yüklenemezse 
       Arial 'emniyet kemeri' (Fallback) görevi görür. */
    font-family: 'MarkaFontum', Arial, sans-serif;

    font-size: 2.5rem;
    color: #1e293b;
    line-height: 1.2;
}

/* Sahne tasarımı */
.tipografi-sahnesi {
    padding: 40px;
    background-color: #f8fafc;
    border-radius: 12px;
    border: 1px solid #e2e8f0;
    text-align: center;
}
                            

Orta Seviye: Uyumluluk ve Format Savaşları Bulletproof Syntax ve Tarihsel Yük

Tarihsel Kaos: Formatların Babil Kulesi

Erken CSS döneminde ve özellikle web tipografisinin emekleme aşamasında, tarayıcı ekosistemi adeta dilleri birbirine karışmış bir Babil Kulesi gibiydi; Internet Explorer sadece kendi tescilli formatını (.eot) tanırken, diğer modern tarayıcılar (Firefox, Safari) farklı standartları (.ttf, .otf, .svg) benimsiyordu.

Bu teknolojik bölünme, bir fontun "tek bir dosya" ile tüm kullanıcılarda çalışmasını imkansız kılıyor ve geliştiricileri her tarayıcı motorunun anlayacağı dilden konuşmaya zorluyordu.

Çözüm: Kurşun Geçirmez Sözdizimi (Bulletproof Syntax)

Bu kaosu yönetmek ve fontun yüklenmeme riskini sıfıra indirmek için geliştiriciler, literatüre "Bulletproof Syntax" (Kurşun Geçirmez Sözdizimi) olarak geçen defansif bir kodlama stratejisi geliştirmek zorunda kaldılar.

Bu yöntem, bir fontu web'e yüklemenin son derece karmaşık, şişkin ve yönetilmesi zor bir yolu olsa da; o dönemin parçalı pazarında %100 uyumluluğu sağlamak için tek bir font ailesi altında birden fazla dosya formatını sırayla ve yedekli olarak yığmayı gerektiren kaçınılmaz bir mühendislik zorunluluğuydu.

/* Tarihsel "Bulletproof" Yöntem */
@font-face {
    font-family: 'Fontum';
    src: url('font.eot'); /* IE9 Uyumluluk Modu */
    src: url('font.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
         url('font.woff') format('woff'), /* Modern Tarayıcılar */
         url('font.ttf')  format('truetype'), /* Safari, Android, iOS */
         url('font.svg#svgFontName') format('svg'); /* Eski iOS */
}
</>
@font-face Uyumluluk ve Yerel Kaynak Optimizasyonu Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@font-face Uyumluluk ve Yerel Kaynak Optimizasyonu Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="tipografi-deney-merkezi">
        <section class="font-test">
            <h2>Tipografik Performans Analizi</h2>
            <p>Bu metin, önce yerel sisteminizde <strong>Open Sans</strong> olup olmadığını denetler.
                Eğer bulunamazsa, sunucudan sadece 15-20 KB boyutundaki WOFF2 dosyasını indirerek
                sayfa yükleme hızını optimize eder.</p>
        </section>
    </div>
</body>

</html>
@font-face {
    font-family: 'AnaFont';

    /* 1. ÖNCE YEREL KONTROL: Kullanıcının cihazında varsa indirmeyi pas geçer */
    /* Bu, veri tasarrufu ve anlık yükleme sağlar */
    src: local('Open Sans'),
        local('OpenSans-Regular'),

        /* 2. MODERN FORMAT: %30 daha iyi sıkıştırma sunan WOFF2 */
        url('fonts/opensans-regular.woff2') format('woff2'),

        /* 3. YEDEK FORMAT: WOFF2 desteklemeyen eski modern tarayıcılar için */
        url('fonts/opensans-regular.woff') format('woff');

    font-weight: 400;
    font-style: normal;
    font-display: swap;
}

/* --- UYGULAMA --- */
.tipografi-deney-merkezi {
    padding: 40px;
    background-color: #ffffff;
    border-radius: 12px;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.08);
}

.font-test {
    /* Tanımladığımız 'AnaFont' ismini çağırıyoruz */
    font-family: 'AnaFont', sans-serif;
    color: #334155;
    line-height: 1.7;
}

.font-test h2 {
    font-weight: 400;
    /* @font-face'de tanımladığımız ağırlıkla eşleşmeli */
    color: #0f172a;
    margin-bottom: 1rem;
}
Font Formatları ve Kullanım Alanları Web Font Formatları ve Optimizasyon Teknikleri
Font Formatı
Açıklama ve Kullanım Alanı
WOFF2
(Web Open Font Format 2)
En çok önerilen formattır. Bu format, font dosyasını WOFF'a göre \(\%30\)'a kadar daha etkili sıkıştırır. Bu yüksek sıkıştırma, indirme süresini kısaltır ve modern tarayıcılar tarafından mükemmel desteklendiği için, çoğu güncel projede genellikle tek başına yeterli kabul edilir.
WOFF
(Web Open Font Format)
WOFF2 öncesi standartlaşmış format ve web fontlarının ilk güvenilir çözümüdür. İyi sıkıştırma ve geniş tarayıcı desteği sağlar, bu yüzden WOFF2'yi desteklemeyen ancak modern sayılan eski tarayıcılar için birinci yedek olarak tutulur.
TTF / OTF
(TrueType / OpenType)
Bunlar web'den çok, masaüstü bilgisayarlarda kullanılan standart font formatlarıdır. Web'e özel sıkıştırmadan yoksun oldukları için daha büyük dosya boyutlarına sahiptirler. Nadiren, WOFF/WOFF2'yi desteklemeyen çok eski mobil tarayıcılar için son çare yedek olarak listeye eklenirler.
local()
Fonksiyonu
@font-face tanımı içindeki bu fonksiyon, tarayıcıya harici sunucuya gitmeden önce, kullanıcının bilgisayarında bu fontun yüklü olup olmadığını kontrol etme emrini verir. Eğer font kullanıcının bilgisayarında zaten varsa (örneğin işletim sisteminin bir parçasıysa), harici indirme atlanır. Bu, sayfa yükleme hızını anında artırır ve kullanıcının veri tüketimini azaltır. Bu, akıllı ve performans odaklı bir optimizasyon tekniğidir.

İleri Seviye: Performans ve Görüntüleme Kontrolü Core Web Vitals, FOUT/FOIT ve Optimizasyon

UX İkilemi: FOUT ve FOIT Sorunu

Bu seviye, web fontlarının yalnızca görsel bir dekorasyon aracı olmadığını; aynı zamanda Core Web Vitals (CLS - Kümülatif Düzen Kayması) gibi modern performans metriklerini doğrudan etkileyen kritik bir yükleme süreci olduğunu kabul eder.

Font dosyası ağ üzerinden indirilirken tarayıcının metni kullanıcıya nasıl sunacağı, geliştiricileri iki zorlu senaryo arasında seçim yapmaya zorlar: Metnin font yüklenene kadar tamamen görünmez kalması ( FOIT: Flash of Invisible Text ) veya geçici olarak sistem fontuyla görünüp aniden değişerek düzeni kaydırması ( FOUT: Flash of Unstyled Text ).

Stratejik Kontrol: font-display

font-display özelliği, geliştiricilere bu kaotik yükleme sürecini yönetme ve tarayıcıya "bekleme toleransını" bildirme gücü veren bir kontrol mekanizmasıdır.

Swap (Kullanıcı Odaklı): En yaygın ve önerilen çözümdür; tarayıcıya bir talimat verir;

"Özel fontum yüklenene kadar kullanıcıyı bekletme, hemen yerel bir yedek fontla içeriği göster" bu talimat her koşulda okunabilir kalmasını (FOUT pahasına) garanti eder.

Block (Tasarım Odaklı): Font yüklenene kadar metni kısa bir süre görünmez kılar; bu, fontun aniden değişip dikkat dağıtmasını engeller ancak bağlantı yavaşsa kullanıcının boş bir sayfaya bakmasına (FOIT) neden olabilir.

Optional (Performans Odaklı): Eğer font milisaniyeler içinde çok hızlı yüklenmezse, tarayıcı özel fontu indirmekten tamamen vazgeçer ve performansı önceliklendirerek sonsuza kadar yedek fontu kullanır.

Mühendislik: Dosya Boyutu ve WOFF2 Devrimi

Font dosyaları genellikle sitenin açılışını geciktiren "render-blocking" kaynaklardır; bu nedenle dosya boyutunu küçültmek için fontun içindeki kullanılmayan binlerce karakteri ( Çince glifleri ) atıp, sadece hedef dildeki karakterleri barındıran Alt Kümeler oluşturmak hayati bir optimizasyondur.

Ayrıca, HTML tarafında <link rel="preload"> etiketi kullanarak, tarayıcının font dosyasını stil dosyasını beklemeden

erkenden indirmeye başlaması sağlanır, böylece fontlar ihtiyaç duyulduğu anda hazır olur.

Modern Strateji: Günümüzde tarayıcı pazarının %98'i üstün sıkıştırma teknolojisine sahip

WOFF2 formatını desteklediği için; artık eski TTF/EOT formatlarını içeren "Bulletproof" kod yığınlarını yazmak yerine, sadece tek bir WOFF2 dosyası sunmak ve eski tarayıcıları sistem fontuna ( fallback ) bırakmak, en verimli ve temiz mühendislik yaklaşımıdır.

</>
@font-face Performans Mühendisliği ve UX Kontrolü Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@font-face Performans Mühendisliği ve UX Kontrolü Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>

    <head>
        <link rel="preload" href="fonts/p-font.woff2" as="font" type="font/woff2" crossorigin>
    </head>

    <article class="makale-alani">
        <p class="makale-metni">
            Bu metin yüklendiğinde, özel font inene kadar kullanıcıyı bekletmez (FOIT önlenir),
            hemen sistem fontuyla içeriği sunar (swap stratejisi).
        </p>
    </article>  
</body>

</html>
/* --- İLERİ SEVİYE: TESCİL VE GÖRÜNTÜLEME --- */
@font-face {
    font-family: 'PerformansFontu';
    src: url('fonts/p-font.woff2') format('woff2');

    /* STRATEJİK KONTROL: Kullanıcı odaklı 'swap' çözümü */
    /* Özel font inene kadar yerel yedeği göstererek FOIT (görünmez metin) hatasını engeller */
    font-display: swap;

    font-weight: 400;
    font-style: normal;
}

.makale-metni {
    /* FONKSİYONEL YEDEKLEME: Fallback fontları seçilirken CLS kaymasını 
       minimize etmek için benzer yapıdaki Georgia tercih edildi */
    font-family: 'PerformansFontu', Georgia, serif;
    font-size: 1.1rem;
    line-height: 1.6;
    color: #334155;
}

@supports (Tarayıcı Özellik Kontrolü) Yerel Algılama ve Özellik Sorgulama

Tanım: CSS'in Yerel Dedektifi

@supports kuralı, modern web geliştirme süreçlerinde dışsal bir script'e veya JavaScript tabanlı kütüphanelere (örneğin Modernizr) ihtiyaç duymadan; tarayıcı motorunun belirli bir CSS özelliğini ve o özelliğe ait değeri teknik olarak destekleyip desteklemediğini, çalışma anında (runtime) kontrol etmenizi sağlayan koşullu ve yerel (native) bir At-Kuralıdır.

Bu mekanizma, CSS'in sadece stil tanımlayan pasif bir dil olmaktan çıkıp; kendi çalışma ortamını analiz eden, tarayıcının yetenek haritasını çıkaran ve bu yeteneklere göre kodun işleyişini dinamik olarak değiştiren "öz-farkındalığa" (self-awareness) sahip akıllı bir yapıya dönüşmesini temsil eder.

Güvenli İnovasyon Alanı

Geliştiriciler için bu kural, yeni ve deneysel CSS özelliklerini (örneğin subgrid veya yeni renk uzayları) kullanırken "Ya kullanıcının tarayıcısı bunu desteklemiyorsa?" endişesini ortadan kaldıran bir güvenlik ağıdır; çünkü desteklenmeyen kod bloğu tarayıcı tarafından tamamen görmezden gelinir ve bu sayede sitenin çökmesi veya bozulması engellenir.

Basit Seviye: Temel Kontrol ve Felsefesi Kapasite Sorgulama ve Aşamalı Geliştirme

İşlev: Kapasite Sorgulama Yeteneği

@supports kuralı, tarayıcının ekran boyutunu veya fiziksel yönünü sorgulayan @media kuralının aksine; tarayıcı motorunun (rendering engine) teknik kapasitesini ve kelime dağarcığını sorgulayan bir iç denetim mekanizmasıdır.

Çalışma prensibi oldukça nettir: Eğer tarayıcı, parantez içinde sorulan CSS özelliğini ve değerini tanıyor ve doğru buluyorsa, o bloğun içindeki stilleri işleme alır; aksi takdirde, tanımadığı bir komutu çalıştırmaya zorlanıp hata vermek yerine, tüm stil bloğunu güvenli bir şekilde yok sayar .

Sözdizimi: If-Then Mantığı

Bu basit yapı, CSS gibi deklaratif (bildirimsel) bir dile, programlama dillerinden aşina olduğumuz güçlü bir "Eğer-O zaman" (If-Then) mantığını entegre eder.

/* Eğer tarayıcı Grid'i destekliyorsa bu bloğu çalıştır */
@supports (display: grid) {
    .container {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
    }
}
Felsefe: Aşamalı Geliştirme (Progressive Enhancement)

Bu kuralın varoluş nedeni ve temel felsefesi Aşamalı Geliştirme prensibidir.

Geliştiriciler, önce eski-yeni tüm tarayıcıların sorunsuz çalıştıracağı temel, sağlam ve erişilebilir bir stil katmanı oluşturur; ardından @supports bloğu kullanarak modern ve ileri düzey özellikleri ( gölgeler, 3D dönüşümler, yeni düzen sistemleri ) bu temelin üzerine bir "makyaj katmanı" olarak eklerler.

Bu strateji, eski cihazları kullananların içeriğe sorunsuz erişmesini ( temel görünümle ) sağlarken, modern tarayıcı sahiplerinin

"ekstra görsel zenginlikleri" görmesini sağlar; böylece tasarım en kötü teknolojik koşulda bile asla bozulmaz.

</>
@supports Kapasite Sorgulama ve Aşamalı Geliştirme Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@supports Kapasite Sorgulama ve Aşamalı Geliştirme Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="ozellik-test">
        <p class="test-mesaj">Tarayıcı Yetenek Analizi: <strong>Grid Sistemi</strong></p>
        <div class="grid-konteyner">
            <div class="grid-kutu">1</div>
            <div class="grid-kutu">2</div>
            <div class="grid-kutu">3</div>
        </div>
    </div>
</body>

</html>
/* Temel ve Sağlam Katman: Her tarayıcıda çalışır */
.ozellik-test {
    padding: 20px;
    background: #f4f4f4;
}

/* @supports: Sadece Grid destekleyen modern tarayıcılar için "Makyaj Katmanı" */
@supports (display: grid) {
    .ozellik-test {
        display: grid;
        grid-template-columns: repeat(3, 1fr);
        gap: 15px;
    }
}

Orta Seviye: Mantıksal Operatörler ve Fallback Mantık Zinciri ve Güvenlik Ağları

Programatik Güç: CSS İçinde Mantık Yürütmek

@supports kuralı, tıpkı gelişmiş bir programlama dilindeki ( JavaScript veya Python gibi ) koşullu ifadeler gibi güçlü

mantıksal operatörler ( not, and, or ) kullanarak, en karmaşık tarayıcı uyumluluk senaryolarını bile tek bir CSS dosyası içinde yönetme imkanı sunar.

not Operatörü: Kritik "B Planı" (Fallback)

Bu operatör, @supports kuralının en stratejik ve hayati kullanım alanını oluşturur: Bir özelliğin desteklenip desteklenmediğini değil, desteklenmediği durumu (negatif koşulu) hedefleyerek, eski teknolojiler için güvenli bir geri dönüş mekanizması kurar.

Kullanım Senaryosu: Örneğin, modern display: grid düzenini kullanmak istediğimizde; @supports not (display: grid) ifadesi tarayıcıya "Eğer Grid sistemini teknik olarak desteklemiyorsan, o zaman eski usul float: left ve width: 33% stillerini devreye sok" talimatını vererek, eski tarayıcılarda dahi sayfa düzeninin çökmesini engelleyen güvenli ve temiz bir köprüleme sağlar.

/* Grid desteklemeyenler için B Planı */
@supports not (display: grid) {
    .kutu { float: left; width: 33.333%; }
}
and ve or: Zincirleme Koşullar

And (Zorunlu Birliktelik): Birden fazla özelliğin aynı anda desteklenmesini şart koşar.

Bu, bir görsel efektin ( hem backdrop-filter hem de transform) hatasız çalışması için iki farklı teknolojinin birlikte var olmasının zorunlu olduğu katı senaryolarda kullanılır.

Or (Esneklik ve Alternatif): İki veya daha fazla özellikten en az birinin desteklenmesini yeterli bulur. Özellikle tarayıcıların standart isimler ve vendor prefix'ler ( -webkit-, -moz- ) arasında gidip geldiği geçiş dönemlerinde, "Ya standart olanı ya da Webkit versiyonunu destekle" diyerek kapsama alanını genişletmek için son derece verimlidir.

</>
@supports Kapasite Sorgulama ve Aşamalı Geliştirme Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@supports Mantıksal Operatörler ve "B Planı" (Fallback) Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="sahne-alani">
        <div class="bulanik-kart">
            <h3>Modern Arayüz</h3>
            <p>Arka plan bulanıklığı desteklenmiyorsa düz renk kullanılır.</p>
        </div>
    </div>
</body>

</html>
/* Temel Sahne */
.sahne-alani {
    width: 100%;
    height: 300px;
    background-image: url('example-image.png');
    /* Arka plana bir resim ekleyelim ki bulanıklık belli olsun */
    background-size: cover;
    display: flex;
    justify-content: center;
    align-items: center;
}

.bulanik-kart {
    padding: 2rem;
    border-radius: 12px;
    max-width: 300px;
    font-family: sans-serif;
}

/* 1. DURUM: Tarayıcı Bulanıklığı DESTEKLİYORSA */
@supports (backdrop-filter: blur(10px)) {
    .bulanik-kart {
        background-color: rgba(255, 255, 255, 0.3);
        /* Yarı şeffaf beyaz */
        backdrop-filter: blur(10px);
        /* Bulanıklık efekti */
        border: 1px solid rgba(255, 255, 255, 0.5);
        color: #000;
    }
}

/* 2. DURUM: Tarayıcı Bulanıklığı DESTEKLEMİYORSA (B Planı) */
@supports not (backdrop-filter: blur(10px)) {
    .bulanik-kart {
        background-color: #ffffff;
        /* Düz beyaz arka plan */
        border: 1px solid #ddd;
        color: #333;
    }
}

İleri ve Akademik Seviye: Performans ve Kod Temizliği JS Bağımsızlığı ve Mimari Hijyen

JavaScript Alternatifi: Bağımlılıktan Kurtuluş

@supports kuralının modern web performansına en büyük stratejik katkısı; tarayıcı desteğini ve özellik yeteneklerini kontrol etmek için yıllardır endüstri standardı olarak kullanılan ve ek HTTP isteği yaratan Modernizr gibi harici JavaScript kütüphanelerine olan zorunlu bağımlılığı tamamen ortadan kaldırmasıdır.

Bu yapısal değişim, istemci tarafındaki ( client-side ) script ayrıştırma yükünü ve işlemci maliyetini radikal bir şekilde azaltarak sayfa açılışını hızlandırır; aynı zamanda CSS'i dışarıdan yardım bekleyen pasif bir dosya olmaktan çıkarıp, kendi mantığını yürütebilen kendine yeterli

( self-contained ) ve bağımsız bir dil haline getirir.

Kod Temizliği ve Mimari Diplomasi

Mimari açıdan bakıldığında bu kural; float tabanlı eski nesil düzenleme teknikleri ile grid gibi modern paradigmaların aynı CSS dosyasında, birbirlerinin ayağına basmadan, stil çatışması yaratmadan ve gereksiz tarayıcı önekleri ( prefixes ) kirliliği oluşturmadan barış içinde yaşamasını sağlayan diplomatik bir izolasyon katmanıdır.

Bu sayede, float gibi artık "yedek" olması gereken eski teknikler ana stil akışından ayrı tutularak kapsüllenir; kodun ana gövdesi her zaman okunaklı, modern ve amaca uygun kalırken, eski kodlar sadece ihtiyaç duyulduğunda ( fallback olarak ) devreye girer.

Gelişmiş Denetim: Değer Doğrulama

@supports kuralı, yüzeysel bir kontrolün ötesine geçerek; sadece özelliğin ( color veya display ) varlığını sorgulamakla yetinmez, aynı zamanda o özelliğe atanacak spesifik ve karmaşık bir değerin de tarayıcı motoru tarafından geçerli olup olmadığını derinlemesine denetler.

Örneğin:

@supports (color: oklch(50% 0.1 250)) ifadesi; tarayıcının sadece "renk" özelliğini değil, en yeni ve geniş renk uzayı olan

OkLCH fonksiyonunu ve sözdizimini anlayıp anlamadığını milimetrik olarak kontrol ederek, en güncel CSS yeteneklerinin "patlama riski olmadan" en üst düzeyde ve güvenle kullanılmasını sağlar.

</>
@supports Kapasite Sorgulama ve Aşamalı Geliştirme Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@supports Kapasite Sorgulama ve Aşamalı Geliştirme Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="ozellik-test">
        <p class="test-mesaj">Tarayıcı Yetenek Analizi: <strong>Grid Sistemi</strong></p>
        <div class="grid-konteyner">
            <div class="grid-kutu">1</div>
            <div class="grid-kutu">2</div>
            <div class="grid-kutu">3</div>
        </div>
    </div>
</body>

</html>
/* --- 1. TEMEL KATMAN (Tüm tarayıcılar için ortak yapı) --- */
.sahne-konteyner {
    padding: 50px;
    background-color: #f1f5f9;
    display: flex;
    justify-content: center;
}

.gelecek-tasarimi {
    max-width: 450px;
    padding: 40px;
    border-radius: 24px;
    font-family: 'Inter', system-ui, sans-serif;
    color: white;
    /* Varsayılan geçiş efekti */
    transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
}

/* --- 2. GELİŞMİŞ DENETİM: OKLCH DEĞER DOĞRULAMA --- */
/* Tarayıcının sadece 'color' özelliğini değil, oklch fonksiyonunu 
   anlayıp anlamadığını milimetrik olarak kontrol eder. */
@supports (color: oklch(50% 0.1 250)) {
    .gelecek-tasarimi {
        /* En güncel CSS yeteneği patlama riski olmadan kullanılır */
        background-color: oklch(60% 0.15 250);
        box-shadow: 0 20px 40px oklch(60% 0.15 250 / 0.25);
        border: 1px solid oklch(70% 0.1 250 / 0.5);
    }

    .kontrol-noktası::after {
        content: " (Mod: Ultra HD Renk)";
        color: #a5f3fc;
    }
}

/* --- 3. KRİTİK B PLANI: FALLBACK (Eski Tarayıcılar) --- */
/* OkLCH desteklenmiyorsa devreye giren mimari köprü */
@supports not (color: oklch(50% 0.1 250)) {
    .gelecek-tasarimi {
        background-color: #4a90e2;
        /* Standart RGB yedeği */
        box-shadow: 0 10px 25px rgba(74, 144, 226, 0.3);
    }

    .kontrol-noktası::after {
        content: " (Mod: Standart Renk)";
        color: #ffffff;
    }
}

/* Yardımcı Bileşenler */
.kontrol-noktası {
    font-size: 12px;
    font-weight: 700;
    text-transform: uppercase;
    letter-spacing: 1px;
}

h2 {
    margin: 15px 0;
    font-size: 24px;
}

p {
    opacity: 0.9;
    line-height: 1.6;
    font-size: 15px;
}

.renk-imzası {
    margin-top: 25px;
    font-size: 11px;
    opacity: 0.6;
    font-family: monospace;
}

@layer Katmanlama (Cascade Layers) ile Öncelik Kontrolü Hiyerarşik Düzen ve Özgüllük Yönetimi

Tanım: Kaostan Mimari Düzene

@layer kuralı, CSS'in en temel çalışma prensibi olan ancak büyük projelerde yönetilmesi en zor mekanizmaya dönüşen "Basamaklama" yapısını ehlileştirmek için; stil kodlarını rastgele yığınlar halinden çıkarıp, mantıksal ve yönetilebilir katmanlara (layers) ayıran, CSS'in en yeni ve devrim niteliğindeki At-Kuralıdır.

Bu özellik, stillerin çakıştığı durumlarda "Hangi stil kazanacak?" sorusunun cevabını, artık tarayıcının karmaşık matematiksel hesaplamalarına bırakmak yerine; doğrudan geliştiricinin belirlediği katman sıralamasına (önce "reset", sonra "framework", en son "tema" gibi) emanet eder.

Özgüllük (Specificity) Hegemonyasının Sonu

Cascade Layers, stillerin geleneksel özgüllük ( specificity ) hesaplamalarından ( ID , Class , Tag puanları ) bağımsız bir şekilde uygulanmasını sağlayan bir yalıtım katmanıdır.

Yani, alt katmandaki çok güçlü bir ID seçicisi (#header), üst katmandaki basit bir sınıf seçicisi (.header) tarafından -özgüllük puanı düşük olsa bile- ezilebilir; çünkü artık patron "seçicinin gücü" değil, "katmanın sırası"dır.

Basit Seviye: Öncelik Sırasını Tersine Çevirme Hiyerarşik Düzen ve Kural Yönetimi

Problem: Kaotik Özgüllük Savaşları

Geleneksel CSS mimarisinde, birbiriyle çakışan iki stil kuralından hangisinin ekranda görüneceğini belirleyen tek yargıç Özgüllük Puanı (Specificity) idi; bu sistemde eğer bir bileşen stili (.button-primary), çok düşük puanlı ama geniş kapsamlı genel bir stil kuralı tarafından yanlışlıkla ezilirse, geliştirici bu çatışmayı çözmek için genellikle ID seçicileri kullanmak veya en kötüsü koda !important bombası atmak gibi "nükleer seçeneklere" başvurmak zorunda kalırdı.

Bu durum, projenin ilerleyen aşamalarında kodu karmaşıklaştıran, yönetilemez hale getiren ve geliştiriciler arasında bitmek bilmeyen

"stil savaşlarına" neden olan kaotik bir sarmaldı.

İşlev: Kontrolü Geri Almak

@layer kuralı ile bu güç dengesi tamamen değişir; geliştirici artık hangi stil grubunun daha baskın olacağını, seçicilerin matematiksel puanlarına bakılmaksızın en baştan belirleme yetkisine sahiptir.

Bu yeni düzende "Özgüllük", katmanlar arasındaki mutlak önceliği belirlemekten çıkarılıp, sadece aynı katmanın içindeki küçük çatışmaları çözmeye yarayan ikincil ve zayıf bir kural haline indirgenmiştir.

Sözdizimi: Anayasal Sıralama

Katmanların hiyerarşisi, CSS dosyasının en başında tek bir satırla, bir "anayasa maddesi" gibi tanımlanır:

/* Öncelik Sıralaması (Soldan Sağa Artar) */
@layer reset, components, utilities;

Bu satır, tarayıcıya sadece üç farklı katman olduğunu söylemekle kalmaz, aynı zamanda bunların "kazanma sırasını" da belirler; bu sıralamada en soldaki reset en düşük ( ezilebilir ), en sağdaki utilities ise en yüksek (baskın) önceliğe sahiptir.

Kritik Kural: Son Kazanan İlkesi

@layer sisteminin temel kuralı şudur: Sıralamada veya kod akışında en sonda tanımlanan katman, kendisinden önce gelen tüm katmanları

-içeriklerinin özgüllük puanı ne kadar yüksek olursa olsun- geçersiz kılar ve her zaman kazanır.

Yani yukarıdaki örnekte, utilities katmanındaki basit bir sınıf, reset katmanındaki karmaşık ve yüksek puanlı bir ID seçicisini bile zahmetsizce ezer.

Kullanım Senaryosu: Temiz Müdahale

Bu özellik özellikle, Bootstrap veya Tailwind gibi bir kütüphaneden gelen varsayılan tema stili ile kendi yazdığınız özel stil çakıştığında hayat kurtarır.

!important karmaşasına girmek yerine; kütüphane stillerini alt katmana (@layer library;), kendi özel stillerinizi üst katmana (@layer custom;) yüklediğinizde, sizin kodunuz otomatik olarak kütüphaneyi ezer ve geliştirici olarak kontrolü CSS'in matematiksel kurallarından alıp

kendi mimari kararınıza bağlamış olursunuz.

</>
@layer Öncelik Sırasını Tersine Çevirme Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@layer Öncelik Sırasını Tersine Çevirme Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="sahne-katmani">
        <div id="ozel-kart" class="standart-kart">
            Katman Hiyerarşisi Testi
        </div>
    </div>
</body>

</html>
/* 1. ADIM: Anayasal Sıralama (Soldan sağa öncelik artar) */
@layer temel, bilesen;

/* 2. ADIM: Katmanların Tanımlanması */
@layer temel {

    /* Çok güçlü bir ID seçicisi */
    #ozel-kart {
        background-color: #ef4444;
        /* Kırmızı */
        padding: 20px;
        color: white;
    }
}

@layer bilesen {

    /* Daha zayıf bir sınıf seçicisi olmasına rağmen, 
     katman sırası (bilesen) daha üstte olduğu için kazanır */
    .standart-kart {
        background-color: #10b981;
        /* Yeşil */
        border-radius: 8px;
    }
}

Orta Seviye: Modülerlik ve Bağımsızlık Sanal Klasörleme ve Özgüllük Devrimi

Modülerlik: CSS'in Klasörleme Sistemi

Orta seviye kullanım, @layer mekanizmasının CSS mimarisinde adeta sanal bir "klasörleme sistemi" gibi çalışarak; binlerce satırlık kaotik kodu tek bir monolitik dosya gibi değil, öncelikleri ve sınırları baştan belirlenmiş mantıksal bölümler (katmanlar) halinde yönetmemize olanak tanıyan mimari yüzünü gösterir.

Bu modüler yapı sayesinde, projenin en temel sıfırlama stillerini reset katmanına, buton veya kart gibi yapı taşlarını components katmanına ve tek amaçlı yardımcı sınıfları utilities katmanına izole ederek; hata ayıklama (debugging) sırasında arama alanını daraltır ve kodun bakım maliyetini radikal bir şekilde düşürürüz.

Devrim: Özgüllükten Bağımsız Öncelik

@layer kuralının en devrimci yanı; geleneksel CSS'in "kimin seçicisi daha güçlüyse o kazanır" ( ID > Class > Tag ) dogmasını yıkarak, stilin önceliğini seçicinin matematiksel gücünden koparıp tamamen katmanın sırasına bağlamasıdır.

Katmanlar Arası Üstünlük: Düşünün ki utilities katmanı components katmanından sonra (daha öncelikli) tanımlanmış olsun; bu durumda utilities içindeki çok basit bir etiket seçici (a), components içindeki çok karmaşık ve yüksek puanlı bir ID seçiciyi ( #menu .link ) dahi zahmetsizce ezip geçer, çünkü burada kral seçici puanı değil, katman hiyerarşisidir.

Katman İçi Kural: Kontrol Alanı

Ancak bu durum Özgüllük (Specificity) kavramının tamamen öldüğü anlamına gelmez; Özgüllük kuralları sadece

bir katmanın kendi sınırları içine hapsedilmiştir.

Yani, aynı katman içinde yer alan iki çakışan kuraldan hangisinin kazanacağına, yine geleneksel ID ve Class puanları karar verir; fakat bu puanların gücü asla katman duvarlarını aşıp diğer katmanları etkileyemez.

Senaryo: Kütüphane Yönetimi

Bu özellik, Bootstrap veya bir Reset CSS gibi harici kütüphaneleri kasıtlı olarak en düşük öncelikli katmana (@layer reset;) hapsederek yönetmeyi inanılmaz kolaylaştırır.

Böylece, kütüphanenin varsayılan stillerini değiştirmek (override) istediğimizde, kendi kodumuzda yapay olarak yüksek özgüllük (!important veya zincirleme sınıflar) kullanma zorunluluğu ortadan kalkar; çünkü bizim katmanımız hiyerarşik olarak üstte olduğu için doğal bir üstünlüğe sahiptir.

</>
@layer Kütüphane Yönetimi ve Modülerlik Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@layer Kütüphane Yönetimi ve Modülerlik Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="konteyner">
        <button class="framework-btn ozel-modifikasyon">
            Stratejik Müdahale
        </button>
    </div>
</body>

</html>
/* Katman hiyerarşisi: 'ozel' katmanı 'kutuphane' katmanını ezer */
@layer kutuphane, ozel;

@layer kutuphane {

    /* Kütüphaneden gelen varsayılan, yüksek özgüllüklü buton stili */
    .konteyner .framework-btn {
        background-color: #6366f1;
        color: white;
        padding: 10px 30px;
        border: none;
    }
}

@layer ozel {

    /* Özgüllük puanı düşük olsa da katman üstünlüğü ile kütüphaneyi ezer */
    .ozel-modifikasyon {
        background-color: #f59e0b;
        /* Turuncu */
        cursor: pointer;
    }
}

İleri ve Akademik Seviye: Cascade'in Yönetimi ve Sınırlamalar Mimari Dönüşüm ve Risk Yönetimi

Cascade Kontrolü: Mimari Dönüşüm

CSS mimarisinde Cascade (Basamaklama), stillerin kaynağına (kullanıcı, tarayıcı veya yazar), bağlamına ve özgüllük puanına göre uygulandığı katı bir öncelik sırasıdır; @layer özelliği, bu basamaklama kurallarının en kritik aşamalarından birini, yani özgüllük hesaplamasından hemen önceki "karar anını" ele geçirerek yeniden tanımlar.

Bu devrimsel özellik, geliştiricinin tarihte ilk kez, z-index gibi görsel bir katmanlama aracıyla değil, doğrudan bir At-Kuralıyla stil önceliğini programatik olarak yönetme yeteneği kazanması anlamına gelir; bu kontrol, kaotik ve büyük ölçekli uygulamaların karmaşıklığını yönetmek için mutlak bir gerekliliktir.

!important Tersine Dönüşü: Bir Disiplin Mekanizması

Geleneksel CSS'te !important kuralı, tüm Basamaklama kurallarını ezen ve genellikle çaresizlik anında kullanılan "nükleer bir buton" iken, uzun vadede projenin bakımını imkansız kılan bir karmaşa kaynağıydı; ancak @layer ekosistemi içinde bu güç dengesi şaşırtıcı bir şekilde tersine döner.

Zayıflayan Güç: Yeni katmanlı yapıda, !important kullanımı artık en üst düzey ve mutlak güce sahip değildir; bu durum geliştiricileri bu etiketi kullanırken iki kez düşünmeye zorlayan, kaotik kullanımı zorlaştıran ve daha temiz çözümlere yönlendiren yeni ve disipline edici bir kural setidir.

Anonim Katmanlar: Eski Kodun Güvenliği

@layer kuralı kullanılmadan, dosyanın herhangi bir yerine yazılan standart CSS kuralları, sistem tarafından otomatik olarak isimsiz ve en yüksek öncelikli bir katmana atanır.

Öncelik Güvencesi: Tarayıcı, bu isimsiz katmanları, açıkça tanımlanan ( @layer components; ) tüm katmanlardan daha sonra ve dolayısıyla

daha yüksek öncelikli olarak işler; bu kritik mekanizma, projenin eski kodlarının yeni katmanlı yapı kurulduktan sonra yanlışlıkla ezilmesini engelleyerek geriye dönük uyumluluğu garanti eder.

Mimari Etki: Risk Yönetimi

Modern Front-End mimarilerinde ve özellikle Bileşen Tabanlı Tasarım süreçlerinde, @layer kullanılarak stiller rastgele değil, risk seviyesine göre stratejik katmanlara ayrılır.

Örneğin; en zararsız ve temel olan "Sıfırlama" (reset) stilleri en alta, kararlı kalması gereken "Bileşenler" ortaya ve en agresif/değişken olan "Yardımcı Sınıflar" en üste yerleştirilerek; kodun uzun vadeli sürdürülebilirliği, hata ayıklama kolaylığı ve farklı ekiplerin aynı dosyada çalışabilmesi sağlanır.

</>
@layer Kütüphane Yönetimi ve Modülerlik Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@layer Mimari Risk Yönetimi Analizi Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="mimari-test">
        <p class="modern-metin">Mimari Risk Yönetimi</p>
    </div>
</body>

</html>
/* Stratejik Katman Planlaması */
@layer reset, framework, bilesen;

@layer bilesen {
    .modern-metin {
        color: #3b82f6;
        /* Mavi */
        font-weight: bold;
    }
}

/* ANONİM KATMAN (Katman Dışındaki Kodlar) */
/* Bu kural herhangi bir katman içinde olmadığı için, yukarıdaki 
   tüm katmanlardan daha yüksek önceliğe sahiptir */
.modern-metin {
    color: #1e293b;
    /* Koyu Gri (Bu renk kazanır) */
    font-size: 1.2rem;
}

@import (Harici Dosya Dahil Etme) Dosya Yönetimi ve Modülerlik

Tanım: CSS İçinde CSS Çağırmak

@import kuralı, web tasarımının monolitik (tek parça) yapısını kıran; CSS motoruna, işlenmekte olan mevcut stil sayfasının içine, sunucudaki başka bir harici CSS dosyasını getirip entegre etmesi (include) talimatını veren özel bir At-Kuralıdır.

Bu komut, HTML tarafında <link> etiketi kullanmaya gerek kalmadan, doğrudan CSS dosyasının kendi içinden başka stil kaynaklarını zincirleme bir şekilde yükleyerek bağlantı kurmasını sağlar.

Mantıksal Bölümleme ve Organizasyon

Bu yapısal mekanizma, binlerce satırlık yönetilemez ve devasa bir stil dosyasını tek bir blok halinde tutmak yerine; onu renkler, tipografi, düzen ve bileşenler gibi mantıksal olarak daha küçük parçalara bölmek için kullanılır.

Böylece geliştirici, projeyi küçük ve anlamlı modüller halinde (header.css, footer.css vb.) geliştirirken; tarayıcı tarafında bu parçalar tek bir ana dosya üzerinden birleştirilerek sunulur.

Basit Seviye: Temel Kullanım ve Modülerlik Dosya Organizasyonu ve Kritik Kurallar

İşlev: Modülerlik ve Yönetim Kolaylığı

@import kuralı, temel işlev olarak bir CSS dosyasının içinden, başka bir harici CSS dosyasının tüm içeriğini çağırıp dahil etmeye yarar.

Bu mekanizma, projeyi devasa ve okunması imkansız tek bir CSS dosyasına hapsetmek yerine; kodunuzu mantıksal olarak reset.css, typography.css, header.css gibi küçük, odaklanmış ve yönetilebilir parçalara bölmenizi ve ardından bu parçaları tek bir

"Ana Stil Dosyasında" birleştirmenizi sağlayarak bakım kolaylığı sunar.

Sözdizimi ve Yazım Formatı

Tarayıcı bu komutu gördüğünde, belirtilen yoldaki dosyayı ağ üzerinden indirir ve içeriğini sanki o satıra elle kopyalanıp yapıştırılmış gibi ana dosyaya işler.

/* İki farklı yazım da geçerlidir */
@import url("styles/reset.css");
@import "styles/layout.css";
Kritik Zorunluluk: En Üstte Olma Kuralı

@import kuralının ihlal edilemez en katı kuralı şudur: Çağrıldığı CSS dosyasındaki tüm diğer stil kurallarından (örneğin body { color: blue; } gibi seçicilerden) önce, dosyanın en tepesinde (karakter seti tanımı hariç) yer alması mutlak bir zorunluluktur.

Eğer masumane görünen tek bir stil tanımı bile @import satırından önce yazılırsa, tarayıcı güvenlik ve ayrıştırma kuralları gereği @import komutunu tamamen yoksayar ve harici dosyayı yüklemeyi reddeder.

Medya Sorgusu: Koşullu Yükleme

Bu kural aynı zamanda, yüklenecek stil dosyasının yalnızca belirli bir ortam koşulu altında uygulanmasını sağlamak için sonuna doğrudan bir medya sorgusu parametresi alabilir: @import url("print.css") print;.

Bu stratejik kullanım sayesinde, print.css dosyası sadece kullanıcı "Yazdır" komutunu verdiğinde veya baskı önizlemeye geçtiğinde devreye girer; böylece normal gezinti sırasında gereksiz bant genişliği kullanımı engellenmiş olur.

</>
@import Modüler Mimari ve Dosya Organizasyonu Örneği (+)
<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@import Modüler Tasarım</title>
    <link rel="stylesheet" href="main.css>
</head>
<body>
    <header>
        <h1>Modüler CSS Dünyası</h1>
    </header>
    <main>
        <p>Bu projedeki her stil grubu (reset, tipografi) kendi özel dosyasından @import ile dahil edilmiştir.</p>
    </main>
</body>
</html>
/* Tarayıcı varsayılanlarını temizler */
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    background-color: #f1f5f9;
    min-height: 100vh;
}
/* Yazı tipi ve metin hiyerarşisi */
body {
    font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
    color: #334155;
    line-height: 1.6;
}

h1 {
    color: #1e293b;
    font-size: 2.5rem;
    margin-bottom: 1rem;
}
/* --- 1. ADIM: HARİCİ DOSYALARI DAHİL ETME (MUTLAKA EN TEPEDE) --- */
@import url("styles/reset.css");
@import url("styles/typography.css");

/* --- 2. ADIM: PROJEYE ÖZGÜ ÖZEL STİLLER --- */
body {
    display: flex;
    flex-direction: column;
    align-items: center;
    justify-content: center;
    padding: 2rem;
}

header {
    text-align: center;
    border-bottom: 2px solid #cbd5e1;
    margin-bottom: 2rem;
    padding-bottom: 1rem;
}

Orta ve İleri Seviye: Performans Engeli İş Akışı Zinciri ve Modern Alternatifler

Kritik Sorun: Engellenen Yükleme Zinciri

Bu seviye, @import kuralının kağıt üzerinde mantıksal ve modüler bir çözüm sunmasına rağmen, teknik mimaride tarayıcı performansını ve sayfa hızını neden sabote ettiğini açıklayan kritik bir mühendislik uyarısıdır.

Modern tarayıcılar, bir web sayfasını oluştururken (rendering path), kaynakları olabildiğince hızlı, verimli ve paralel olarak (aynı anda çoklu indirme) işlemeyi hedefler; ancak @import kuralı bu doğal akışı zorla durdurur ve verimsiz bir "istek zinciri" (request chain) oluşturur.

Mekanizma: Şelale Etkisi (Waterfall)

Bir tarayıcı, HTML içinde standart <link> etiketini gördüğünde CSS dosyasını anında indirmeye başlar; ancak @import ile çağrılan dosyalar için süreç böyle işlemez.

Tarayıcı önce birinci CSS dosyasını (Dosya A) tamamen indirmeli, açmalı ve satır satır okumalıdır; ancak bu okuma bittikten sonra "Dosya B'nin" varlığından haberdar olur ve indirme işlemini o an başlatır.

Sonuç: Bu ardışık ve birbirini bekleyen yükleme modeli (sequential loading), sayfanın ilk anlamlı boyama süresini (First Contentful Paint - FCP) ve etkileşim hızını ciddi şekilde geciktirir; çünkü tarayıcı zincirin son halkasındaki stil gelene kadar ekranı oluşturmayı beklemek zorunda kalır.

Modern Çözüm: Paralellik ve Derleme

Performans ve hız optimizasyonunun en önemli öncelik olduğu günümüzde, çalışma zamanında @import kullanmak yerine iki ana yöntem endüstri standardı haline gelmiştir:

1. HTML <link> Kullanımı: Tüm CSS dosyalarını ayrı ayrı HTML <head> etiketi içinde standart <link> etiketiyle çağırmak, tarayıcının tüm dosyaları beklemeden paralel olarak indirmesini sağlar.

2. Ön İşlemci Derlemesi (Build Process): Geliştirme sırasında SASS veya LESS gibi ön işlemciler kullanarak, mantıksal olarak ayrılmış yüzlerce küçük CSS dosyasını, henüz sunucuya yüklemeden önce tek bir nihai (production) CSS dosyasına derlemek (compile) ve birleştirmektir.

Bu yöntem, hem kodun modülerliğini ve yönetim kolaylığını korur, hem de tarayıcıya sadece tek bir dosya sunarak performans için

en hızlı yüklemeyi garanti eder.

</>
@import Modüler Mimari ve Dosya Organizasyonu Örneği (+)
<!DOCTYPE html>
<html lang="tr">

<head>
    <meta charset="UTF-8">
    <title>Performans Odaklı CSS Yönetimi</title>
    <link rel="stylesheet" href="styles/header.css?v=1.0.150">
    <link rel="stylesheet" href="styles/footer.css?v=1.0.150">
    <link rel="stylesheet" href="main.css?v=1.0.150">
</head>

<body>
    <header class="ust-bilgi">Header (Modül 1)</header>
    <main class="icerik">
        <h2>Şelale Etkisi Çözümü</h2>
        <p>Dosyaları HTML içinde çağırmak, istek zincirini kırar.</p>
    </main>
    <footer class="alt-bilgi">Footer (Modül 2)</footer>
</body>

</html>
@import url("styles/header.css");
@import url("styles/footer.css");

body {
    margin: 0;
    padding: 0;
    font-family: 'Inter', sans-serif;
    background-color: #ffffff;
    display: flex;
    flex-direction: column;
    min-height: 100vh;
}

.icerik {
    flex: 1;
    max-width: 800px;
    margin: 0 auto;
    padding: 60px 20px;
    text-align: center;
}

.icerik h2 {
    font-size: 2.5rem;
    color: #0f172a;
    margin-bottom: 20px;
}

.icerik p {
    font-size: 1.1rem;
    color: #475569;
    line-height: 1.8;
}
.ust-bilgi {
    background: linear-gradient(135deg, #1e293b 0%, #0f172a 100%);
    color: #f8fafc;
    padding: 40px 20px;
    text-align: center;
    border-bottom: 4px solid #6366f1;
    box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
    font-family: 'Inter', system-ui, sans-serif;
}

.ust-bilgi::before {
    content: "◈";
    display: block;
    font-size: 2rem;
    color: #6366f1;
    margin-bottom: 10px;
}
.alt-bilgi {
    background-color: #f1f5f9;
    color: #64748b;
    padding: 30px;
    text-align: center;
    font-size: 0.9rem;
    border-top: 1px solid #e2e8f0;
    margin-top: 60px;
    letter-spacing: 0.5px;
}

.alt-bilgi strong {
    color: #475569;
}

@namespace (İsim Uzayı Hedefleme) Çoklu Dil ve Entegrasyon

Tanım: Diller Arası Ayrımcılık

@namespace kuralı, CSS'in normalde standart ve basit HTML elementlerini hedeflerken karşılaşmadığı; ancak belge karmaşıklaşıp içine başka diller girdiğinde ortaya çıkan isim çakışmalarını (name collisions) önlemek ve yönetmek için kullanılan özel bir ayrıştırma protokolüdür.

Bu kural, tek bir HTML belgesi içine gömülmüş olan (embedded) XML tabanlı farklı işaretleme dillerinin (özellikle grafikler için SVG — Ölçeklenebilir Vektör Grafikleri ve bilimsel formüller için MathML — Matematiksel İşaretleme Dili) elementlerini, standart HTML etiketlerinden ayırarak benzersiz bir önek (prefix) veya varsayılan alan tanımı ile hedeflemeye yarar.

Neden Gerekli? (Çakışma Senaryosu)

Bir web sayfasında hem bir HTML metin linki (<a>) hem de bir SVG grafiğinin içindeki link (<a>) bulunabilir; CSS'e sadece

a { color: red; } dediğinizde her ikisi de etkilenir.

@namespace kuralı sayesinde, "Ben sadece SVG dünyasındaki <a> etiketini kastediyorum" diyerek, CSS seçicilerinin kapsamını daraltabilir ve yanlış elementlerin boyanmasını engelleyebilirsiniz.

Basit Seviye: İsim Çakışması Sorunu Poliglot Yapı ve Kimlik Krizi

Bağlam: HTML'in Poliglot Doğası

Bu kuralın varoluşsal nedeni, modern web sayfalarının artık saf ve homojen bir HTML yapısından ibaret olmayıp; içerisine XML tabanlı başka dillerden (SVG, MathML gibi) yabancı içeriklerin gömüldüğü "çok dilli" (poliglot) ve karmaşık bir yapıya evrilmiş olmasıdır.

Problem: Etiket İsimlerinin Çakışması

Standart HTML yapısında <h1> veya <div> gibi etiket isimleri benzersiz ve bellidir; ancak SVG (Ölçeklenebilir Vektör Grafikleri) veya MathML (Matematiksel İşaretleme Dili) gibi XML kökenli diller devreye girdiğinde, farklı standartların tesadüfen aynı etiket ismini kullanması kaçınılmaz bir mühendislik karmaşası yaratır.

Düşünün ki, aynı belgenin içinde hem tarayıcı sekmesinde görünen HTML <title> etiketi, hem de bir SVG grafiğinin açıklamasını içeren SVG <title> etiketi yan <title> etiketi yan yana yaşamaktadır.

Eğer siz CSS dosyanızda sadece kaba bir title { color: red; } kuralı yazarsanız; CSS motoru hangi başlığı hedeflediğinizi ayırt edemez ve her iki etiketi de boyayarak bir isim çakışması krizine yol açar.

Çözüm: Benzersiz Önek Atama

@namespace kuralı, tam bu noktada devreye girerek bu anlamsal belirsizliği ortadan kaldıran bir yargıç gibi davranır.

Bu mekanizma, farklı dillerden gelen elementlere benzersiz birer önek (prefix) atayarak; tarayıcıya

"Şu özel öneki gördüğünde ( svg|title ), sadece o dilin etiketlerini hedefle, diğer benzer isimli etiketlere dokunma" talimatını veren kesin bir ayrıştırma yöntemidir.

</>
@namespace İsim Çakışması Sorunu Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@namespace İsim Çakışması Sorunu Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="sahne">
        <a href="#">Ben bir HTML Linkiyim</a>

        <hr>

        <svg width="200" height="60" viewBox="0 0 200 60">
            <a xlink:href="#">
                <text x="10" y="40" font-family="Arial" font-size="20">Ben SVG Linkiyim</text>
            </a>
        </svg>
    </div>
</body>

</html>

                            /* 1. ADIM: İsim Uzayını Tanımla */
@namespace svgurl "http://www.w3.org/2000/svg";

/* 2. ADIM: Genel Stiller */
body {
    padding: 20px;
    font-family: sans-serif;
}

/* 3. ADIM: Kesin Hedefleme (Boru Karakteri Kullanımı) */
/* Sadece SVG içindeki linkleri kırmızı ve kalın yapar */
svgurl|a {
    fill: red;
    font-weight: bold;
}

/* Standart HTML linklerine dokunmaz */
a {
    color: purple;
    text-decoration: underline;
}
                        

Orta Seviye: Sözdizimi ve Kullanım URI Eşleşmesi ve Hedefleme Kuralları

Tanımlama Kuralı: En Üstte Olma Zorunluluğu

@namespace kuralının CSS mimarisindeki konumu rastgele değildir; dosyanın en tepesinde, yalnızca karakter seti kodlamasını belirleyen @charset kuralından hemen sonra ve diğer tüm stil tanımlarından, içe aktarmalardan önce tanımlanmak zorunda olan katı bir hiyerarşiye tabidir.

Bu kural, CSS motorunun ("parser") dosyayı okumaya başladığında, herhangi bir stil kuralını işlemeden önce bu özel uzay bilgisini tanımasını ve hafızasına almasını sağlamak için konulmuş mimari bir ön koşuldur.

Sözdizimi: Önek ve URI Eşleşmesi

Genel sözdizimi yapısı @namespace [önek] [URI]; şeklindedir; buradaki URI (Uniform Resource Identifier), o XML dilinin (örneğin SVG'nin) web'deki fiziksel adresi değil, uluslararası standartlarda belirlenmiş benzersiz ve resmi kimlik numarasıdır.

/* SVG Uzayını Tanımlama */
@namespace svg "http://www.w3.org/2000/svg";

/* Kullanımı: Sadece SVG içindeki rect'i boya */
svg|rect {
    fill: blue;
}

SVG Örneği: @namespace svg "http://www.w3.org/2000/svg"; satırı, tarayıcıya "Bundan sonra svg önekini gördüğün her yerde, bunu W3C'nin belirlediği bu resmi standartla eşleştir" talimatını vererek, tarayıcının SVG etiketlerini doğru şemayla tanımasını sağlar.

Hedefleme: Boru Karakteri (|) ile İzolasyon

Tanımlanan önek, stil kurallarında elementin hemen önüne eklenen boru karakteri (|) ile birleştirilerek kullanılır (Örneğin: svg|rect).

svg|rect { fill: blue; } kuralı, tarayıcıya sadece ve sadece SVG isim uzayına (namespace) ait olan rect (dikdörtgen) etiketlerini hedeflemesini emreder; böylece belgenizde tesadüfen HTML tabanlı bir etiketi veya sınıfı olsa bile, o stil bundan asla etkilenmez ve stilin sadece ait olduğu dile uygulanması garanti altına alınır.

</>
@namespace İsim Çakışması Sorunu Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@name-space İsim Çakışması Sorunu Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="grafik-alani">
        <svg width="100" height="100">
            <rect width="100" height="100" />
        </svg>

        <div class="rect">Ben bir HTML Div'iyim</div>
    </div>
</body>

</html>
/* 1. ADIM: İsim Uzayını Tanımla */
@namespace svgurl "http://www.w3.org/2000/svg";

/* 2. ADIM: Genel Stiller */
body {
    padding: 20px;
    font-family: sans-serif;
}

/* 3. ADIM: Kesin Hedefleme (Boru Karakteri Kullanımı) */
/* Sadece SVG içindeki linkleri kırmızı ve kalın yapar */
svgurl|a {
    fill: red;
    font-weight: bold;
}

/* Standart HTML linklerine dokunmaz */
a {
    color: purple;
    text-decoration: underline;
}

İleri ve Akademik Seviye: Kapsam ve İsim Uzayı Soyut Mantık ve Kesin Hedefleme

Kökeni: Programlama Dillerinden Miras

Bu kural, görsel bir CSS özelliğinden ziyade, web standartlarının daha derin, soyut ve mantıksal kavramlarını (Namespace, Cascade) yönetmek için kullanılan bir araçtır.

"İsim Uzayı" (Namespace), kökeni aslında C#, Java veya XML gibi katı kurallı programlama ve işaretleme dillerine dayanan; amacı, geniş bir kod elemanları kümesini (etiketler, sınıflar, fonksiyonlar) mantıksal olarak gruplayarak, onlara çakışmalardan uzak benzersiz bir kimlik ve soyad kazandırmak olan akademik bir kavramdır.

@namespace kuralı, bu resmi XML mantığını CSS dünyasına taşıyarak, özellikle farklı teknolojilerin iç içe geçtiği hibrit belgelerde kodun organizasyonunu, yalıtımını ve yönetilebilirliğini artırır.

Varsayılan Hedefleme: HTML'in Ayrıcalığı

Herhangi bir @namespace kuralı açıkça tanımlanmadığında, CSS seçicileri varsayılan ve örtük (implicit) olarak her zaman standart

HTML isim uzayını hedefler.

Bu nedenle, günlük hayatta sıradan div veya p etiketlerine stil verirken bu kurala asla ihtiyaç duymayız; çünkü CSS motoru varsayılan olarak onların HTML ailesine ait olduğunu bilir, ancak SVG veya MathML gibi "yabancı" diller belgeye dahil olduğunda bu kural bir zorunluluk haline gelir.

Öncelik Etkisi: Puan Değil, Kesinlik

Teknik açıdan önemli bir detay olarak; @namespace kuralının kendisi veya bir seçiciye önek eklenmesi (örneğin svg|a), o kuralın CSS Öncelik (Specificity) puanına matematiksel bir katkı sağlamaz veya ekstra puan kazandırmaz.

Bu mekanizma, seçiciyi yalnızca belirlenen isim uzayının sınırları içine hapsederek daha kesin, cerrahi ve hatasız bir hedefleme sağlar; bu hassasiyet, stilin yanlışlıkla başka bir dilden gelen aynı isimli öğeye uygulanmasını önleyen bir filtreleme yöntemidir.

</>
@name-space İsim Çakışması Sorunu Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@namespace Kesin Hedefleme Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="akademik-konteyner">
        <h2 class="baslik">Standart HTML Başlığı</h2>

        <svg width="100" height="100" viewBox="0 0 100 100">
            <title>SVG Grafik Başlığı</title>
            <circle cx="50" cy="50" r="40" stroke="black" stroke-width="3" fill="red" />
        </svg>

        <math xmlns="http://www.w3.org/1998/Math/MathML">
            <mrow>
                <msup>
                    <mi>a</mi>
                    <mn>2</mn>
                </msup>
                <mo>+</mo>
                <msup>
                    <mi>b</mi>
                    <mn>2</mn>
                </msup>
                <mo>=</mo>
                <msup>
                    <mi>c</mi>
                    <mn>2</mn>
                </msup>
            </mrow>
        </math>
    </div>
</body>

</html>
/* --- İLERİ SEVİYE TANIMLAMALAR --- */
@namespace html "http://www.w3.org/1999/xhtml";
@namespace svg "http://www.w3.org/2000/svg";
@namespace m "http://www.w3.org/1998/Math/MathML";

.akademik-konteyner { padding: 40px; }

/* 1. MİMARİ YALITIM: HTML <title> etkilenmez */
svg|title {
    fill: darkblue;
    font-size: 14px;
}

/* 2. KESİN HEDEFLEME: Sadece MathML içindeki formülün boyutunu ayarlar */
m|math {
    font-size: 1.8rem;
    display: block;
    margin-top: 20px;
    color: #1e293b;
}

/* 3. VARSAYILAN HEDEFLEME: Normal HTML etiketleri */
html|h2 {
    color: #6366f1;
    border-bottom: 2px solid #e2e8f0;
    padding-bottom: 10px;
}

@document (URL Bazlı Koşullu Stil) Tarihsel Not ve URL Hedefleme

Tanım: Adres Çubuğuna Bağlı Stiller

@document kuralı, CSS spesifikasyonlarının deneysel döneminde ortaya atılan; bir stil bloğunun tamamının, körü körüne her yerde değil, yalnızca tarayıcının o an görüntülediği sayfanın URL adresi (Uniform Resource Locator) belirli kriterleri ve koşulları sağladığında aktifleşip uygulanmasını hedefleyen özel bir At-Kuralıydı.

Bu kural, CSS'in normalde sadece HTML elementlerinin yapısına (DOM) bakan gözlerini; tarayıcının adres çubuğuna çevirmesini sağlayarak, stilin uygulanıp uygulanmayacağına bulunulan sayfanın adresine göre karar veren bir filtreleme mekanizması öneriyordu.

Amaç: Harici Müdahale Yeteneği

Bu mekanizmanın temel mühendislik amacı, CSS'e HTML belgesinin içeriğine veya sunucu taraflı kodlara (server-side code) fiziksel olarak müdahale etmeye gerek kalmadan; dışarıdan yüklenen tek bir dosya üzerinden, sadece belirli sayfalara (örneğin sadece "admin" paneline veya "iletişim" sayfasına) özgü URL bazlı koşullar ve stil özelleştirmeleri yapabilme yeteneği kazandırmaktı.

Basit Seviye: Amaç ve Sözdizimi Merkezi Yönetim ve URL Zekası

Amaç: Tek Dosyada Çoklu Davranış

Bu kuralın temel varoluş amacı, CSS kodunu statik bir liste olmaktan çıkarıp, tarayıcının adres çubuğundaki URL verisine duyarlı, akıllı bir yapıya dönüştürmekti.

Geliştiriciler, sitenin tüm tasarım kodlarını (Main CSS) tek bir büyük ve merkezi dosyada tutarken; aynı zamanda o dosyanın içindeki belirli stil bloklarının sitenin hangi alt sayfasında (/hakkimizda, /blog vb.) devreye gireceğine karar verme yeteneğine, yani yerel bir yönetim gücüne sahip olmak istiyordu.

Örneğin:

"Blog sayfasındayken yan çubuk mavi olsun, ancak İletişim sayfasına geçildiğinde aynı yan çubuk yeşile dönsün" gibi bağlama duyarlı bir komutu; HTML yapısını değiştirmeden veya sunucu taraflı kod yazmadan, sadece URL desenine bakarak vermeyi hedefliyordu.

Sözdizimi: Fonksiyonel Şart Bloğu

Bu yapının sözdizimi, @document [fonksiyon] { ... } şeklinde kurulan ve tarayıcıya "Eğer adres çubuğundaki metin, parantez içindeki bu şartı (fonksiyonu) sağlıyorsa, süslü parantezler içine yazdığım özel CSS kodlarını uygula" talimatını veren koşullu bir sarmalayıcıdır.

Filtreleme: url-prefix ve domain

url-prefix: Parantez içine yazılan değer ile başlayan tüm URL'leri hedefler (url-prefix("https://siteniz.com/blog/")). Bu fonksiyon, özellikle "Blog" kategorisi altındaki yüzlerce farklı makale sayfasının tamamı için geçerli olacak ortak bir stil şablonu oluşturmak adına ideal bir hiyerarşik filtreleme yöntemidir.

domain: Stilleri, sadece belirli bir alan adı (domain("siteniz.com")) ve onun tüm alt sayfalarıyla eşleştiğinde uygular; bu genellikle tarayıcı eklentileri veya kullanıcı stilleri (user styles) yazılırken, stilin yanlışlıkla başka sitelerde çalışmasını engellemek için kullanılır.

</>
@document Amaç ve Sözdizimi Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@document Amaç ve Sözdizimi Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="konteyner">
        <aside class="yan-panel">
            <h3>Hızlı Menü</h3>
            <p>Bu panelin rengi, bulunduğunuz sayfanın adresine göre değişir.</p>
        </aside>
    </div>
</body>

</html>
.yan-panel {
    padding: 20px;
    border-radius: 8px;
    color: white;
}

/* @document: URL Bazlı Koşul */
/* Sadece 'blog' dizini altındaki sayfalarda bu bloğu çalıştır */
@document url-prefix("https://siteniz.com/blog/") {
    .yan-panel {
        background-color: #3b82f6; /* Blog için Mavi */
    }
}

/* Sadece 'iletisim' sayfasında bu bloğu çalıştır */
@document url("https://siteniz.com/iletisim") {
    .yan-panel {
        background-color: #10b981; /* İletişim için Yeşil */
    }
}
                        

Akademik Not ve Tarihsel Durum (Önemli) Kullanımdan Kalkma ve Güvenlik Etiği

Statü: Terk Edilmiş Standart

Bu kural, kağıt üzerinde sunduğu büyüleyici mantıksal kolaylığa ve merkezi yönetim vaadine rağmen; modern web ekosisteminden tamamen kaldırılmış ve rafa kaldırılmış olmasının arkasında, göz ardı edilemeyecek kadar derin teknik ve etik nedenler yatar.

@document kuralı, W3C'nin çalışma taslaklarında bir süre umut vaat ederek yer almış olsa da; güncel ve büyük tarayıcı motorları tarafından, yarattığı riskler nedeniyle standart olarak hiçbir zaman tam, kararlı ve tutarlı bir destek görmemiş ve sonuç olarak resmi olarak terk edilmiştir (deprecated).

Kritik Risk: Güvenlik ve Gizlilik İhlali

Bu kuralın standartlardan aforoz edilmesinin ana ve en hayati nedeni, siber güvenlik uzmanlarının işaret ettiği

kullanıcı gizliliği (privacy) kaygılarıydı.

Harici ve potansiyel olarak zararlı bir CSS dosyasının, kullanıcının o anki URL'sinde yer alan son derece hassas bilgilere (örneğin bir oturum ID'si, şifre sıfırlama token'ı veya özel bir hash değeri) erişip buna göre stil uygulayabilmesi; kötü niyetli kişilerin "CSS Sniffing" yöntemleriyle kullanıcıların

tarayıcı geçmişini takip etmesine ve verilerini sızdırmasına olanak tanıyabilirdi ki bu, modern web güvenliği için kabul edilemez bir açıktır.

Modern Alternatif: Dinamik Sınıf Enjeksiyonu

Günümüzde URL bazlı stil koşulları, güvenli olmayan CSS filtreleriyle değil; daha güvenli, kontrollü ve sunucu tarafında çalışan dinamik dillerle çözülen bir mimari desendir.

Profesyonel geliştiriciler, sunucu taraflı kodlama (PHP, Node.js, Python) veya istemci taraflı güvenli JavaScript algoritmaları kullanarak; o anki URL rotasını analiz eder ve HTML'in en üst kapsayıcısına (genellikle <body> etiketine) duruma özel bir sınıf enjekte ederler (örneğin <body class="page-blog">); CSS ise daha sonra bu güvenli ve temiz sınıfları hedefleyerek stil uygular.

@page (Sayfa Yapılandırma ve Baskı Kontrolü) Kağıt Mimarisi ve Kenar Boşlukları

Tanım: Dijitalden Fiziksele Geçiş

@page kuralı, CSS'in sadece ekran piksellerini değil, gerçek dünya nesnelerini de yönetebildiğini gösteren; basılı çıktı (printed output) alınacağı zaman, belgenin her bir fiziksel kağıt sayfasının kenar boşluklarını (margin), kağıt boyutunu (size) ve yönünü (orientation) milimetrik hassasiyetle ayarlamasını sağlayan özel bir At-Kuralıdır.

Bu kural, web sayfasının o bildiğimiz "sürekli akan" yapısını bir kenara bırakıp, içeriği "sayfa kutusu" (page box) adı verilen dikdörtgen ve sonlu alanlara bölerek, tarayıcının yazdırma motoruna bir matbaa şablonu sunar.

Kapsam: Sadece Baskı Anı

Önemli bir detay olarak; bu kuralın etkileri normal ekran görünümünde asla fark edilmez, yalnızca ve sadece @media print (baskı medyası) bağlamı devreye girdiğinde veya kullanıcı "Yazdır" (Ctrl+P) komutunu verip önizleme ekranını açtığında aktifleşen bir arka plan mimarıdır.

Basit Seviye: Sayfa Boyutu ve Yönü Varsayılanı Geçersiz Kılma ve Mizanpaj

İşlev: Tarayıcı İnisiyatifini Devre Dışı Bırakmak

@page kuralı, web içeriği fiziksel kağıda aktarılırken; tarayıcının kendi algoritmasıyla atadığı varsayılan kenar boşluklarını ve standart sayfa boyutlarını geçersiz kılmaya (override) yarayan bir yetki devridir.

Genellikle tarayıcılar, baskı sırasında içeriğin kenarlardan taşmasını önlemek adına muhafazakar davranıp otomatik olarak gereğinden büyük (güvenli) boşluklar bırakırlar; bu kural sayesinde kontrolü ele alıp kağıdı uçtan uca yönetebilirsiniz.

Kullanım Amacı: Temiz ve Profesyonel Çıktı

Bu ayarların temel amacı; bir finansal rapor, resmi fatura veya teknik belge gibi ciddiyet gerektiren içeriklerin, kağıt üzerinde dağınık durmasını ve taşmasını engelleyerek, okunaklı ve profesyonel bir görünümle sunulmasını sağlamaktır.

Ayrıca, tarayıcıların varsayılan olarak sayfanın tepesine ve altına eklediği, genellikle istenmeyen "URL adresi" ve "Yazdırma Tarihi" gibi bilgileri, kenar boşluklarını sıfırlayarak veya yöneterek kaldırmak da bu seviyenin kritik bir kazanımıdır.

Sözdizimi ve Temel Ayarlar

Bu kural, genellikle @media print bloğu içinde çalıştırılır ve doğrudan kağıdın fiziksel özelliklerini hedefleyen size ve margin özelliklerini kullanır.

@media print {
  @page {
      size: A4 landscape; /* A4 Kağıt, Yatay Duruş */
      margin: 1cm;        /* Her kenardan 1cm boşluk */
  }
}

Size (Boyut ve Yön): Kağıdın uluslararası ebatlarını (A4, A5, Legal) ve duruş yönünü belirler. Örneğin geniş sütunlu bir tabloyu veya panoramik bir görsel galeriyi basarken kağıdı yatay (landscape) moda almak, içeriğin sıkışmasını önleyen en pratik çözümdür.

Margin (Güvenli Alan): Sayfanın dört bir yanındaki "ölü alanı" (yazdırılabilir alanın dışındaki beyaz boşluğu) ayarlar; bu değeri küçültmek kağıt yüzeyini daha verimli kullanmayı sağlarken, artırmak içeriğe odaklanan daha ferah bir okuma deneyimi sunar.

</>
@document Amaç ve Sözdizimi Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@page Sayfa Boyutu ve Yönü Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="rapor-konteyner">
        <h1>Yıllık Finansal Analiz Raporu</h1>
        <p>Bu belge, baskı sırasında otomatik olarak yatay (landscape) modda ve 1cm kenar boşluğuyla
            yapılandırılacaktır.
        </p>
    </div>
</body>

</html>

                        
/* Sadece baskı anında devreye giren mimari */
@media print {
    @page {
        /* A4 Kağıt, Yatay Duruş: Geniş tablolar için ideal */
        size: A4 landscape;
        /* Her kenardan 1cm boşluk: Kağıdı verimli kullanır */
        margin: 1cm;
    }

    .rapor-konteyner {
        font-family: serif;
        /* Baskı için daha okunaklı bir font */
        color: black;
    }
}

Orta Seviye: Sayfa Bölmelerini Yönetme Akış Denetimi ve Yayıncılık Düzeni

Amaç: İçerik Bütünlüğünü Korumak

Bu seviye, web tarayıcısının dikeyde sonsuza giden akışkan yapısı ile fiziksel kağıdın kesintili doğası arasındaki çatışmayı yöneterek; kritik içeriklerin (örneğin bir veri tablosunun başlığı ile verilerinin veya bir görsel ile açıklamasının) basılı sayfada istenmeyen ve rastgele bir noktadan bölünmesini engelleyip, geleneksel yayıncılık standartlarına uygun profesyonel bir düzeni taklit etmeyi hedefler.

Zorunlu Sayfa Sonu: Yeni Bölüm Mantığı

Zorunlu Kesme (break-before / break-after): Tıpkı bir kitaptaki bölümlerin daima temiz bir sayfadan başlaması gibi; h1 { break-before: page; } gibi kurallar, tarayıcıya

"Bu ana başlığı gördüğün anda, sayfanın ne kadar dolu olduğuna bakmaksızın, ne olursa olsun ondan hemen önce yeni bir sayfa başlat" talimatını vererek her bölümün başlangıcını garanti altına alır.

Bölünmeyi Engelleme: Atomik Bütünlük

İçerik Koruması (page-break-inside: avoid;): Bu, raporlamada en sık başvurulan "hayat kurtarıcı" özelliktir. Bir bilgi kartının veya bütünlüklü bir div bloğunun, sayfa sonuna denk geldiğinde tam ortadan ikiye bölünmesini yasaklar.

Tarayıcı bu komutu aldığında, eğer kart mevcut sayfanın kalan boşluğuna sığmıyorsa, onu bölmek yerine bir bütün halinde bir sonraki sayfanın en tepesine taşıyarak içeriğin okunabilirliğini ve bütünlüğünü korur.

Simetri: Tek ve Çift Sayfa Düzeni

@page :left ve :right: Kitap veya dergi mizanpajını dijitale taşımak için kullanılan bu sözde sınıflar çift numaralı ve tek numaralı sayfalara

farklı ve simetrik stiller uygulamanıza olanak tanır.

Örneğin:

Cilt payı bırakmak için sol sayfanın sağ kenar boşluğunu, sağ sayfanın ise sol kenar boşluğunu artırmak veya sayfa numaralarını her zaman sayfanın dış köşesine hizalamak bu yöntemle mümkündür.

</>
@document Amaç ve Sözdizimi Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@page Akış Denetimi ve Simetrik Düzen Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <article class="kitap-icerik">
        <section class="bolum">
            <h2>Bölüm 1: Giriş</h2>
            <p>Bu bölüm, mizanpaj gereği daima yeni ve temiz bir sayfadan başlar.</p>

            <div class="bilgi-karti">
                <h3>Önemli Not</h3>
                <p>Bu kartın sayfa sonunda bölünmesi engellenmiştir. Eğer sığmazsa, bütün halde sonraki sayfaya geçer.
                </p>
            </div>
        </section>

        <section class="bolum">
            <h2>Bölüm 2: Metodoloji</h2>
            <p>Yeni bir sayfa başlangıcı örneği.</p>
        </section>
    </article>
</body>

</html>
/* EKRAN GÖRÜNÜMÜ (Normal Tarayıcı Modu) */
body {
    font-family: 'Inter', system-ui, -apple-system, sans-serif;
    line-height: 1.6;
    color: #334155;
    background-color: #f8fafc;
    padding: 20px;
}

.bilgi-karti {
    background-color: #eff6ff;
    border-left: 5px solid #3b82f6;
    padding: 20px;
    margin: 20px 0;
}

/* --- BASKI MİMARİSİ (@media print) --- */
@media print {

    /* 1. SİMETRİK SAYFA DÜZENİ */
    @page :left {
        margin-right: 3cm;
        margin-left: 1cm;
    }

    /* Sol sayfa cilt payı */
    @page :right {
        margin-left: 3cm;
        margin-right: 1cm;
    }

    /* Sağ sayfa cilt payı */

    /* 2. ZORUNLU SAYFA SONLARI */
    h2 {
        break-before: page;
        /* Her h2 daima yeni sayfa başında başlar */
        color: #1e3a8a;
    }

    /* 3. ATOMİK BÜTÜNLÜK */
    .bilgi-karti {
        page-break-inside: avoid;
        /* Kartın ortadan ikiye bölünmesini yasaklar */
        border: 1px solid #bfdbfe;
        background-color: transparent;
        /* Baskıda mürekkep tasarrufu */
    }

    /* Baskıda istenmeyen öğeleri gizle */
    header,
    footer {
        display: none;
    }
}

İleri ve Akademik Seviye: Köşe Kutuları Dinamik Üstbilgi ve Yayıncılık Standartları

Sofistike Yetenek: Sayfa Kenarlarını Programlamak

Bu seviye, @page kuralının sunduğu en sofistike ve ileri düzey mizanpaj yeteneği olan; basılı sayfalara statik HTML içeriğinden bağımsız olarak dinamik içerik ekleme (Running Headers/Footers) mimarisini temsil eder.

Köşe Kutuları (Margin Boxes): Bu kural, sayfanın ana içerik akışının dışında kalan, kağıdın atıl durumdaki kenar boşluğu alanlarını (margin); @top-left, @bottom-center gibi isimlendirilmiş 16 farklı sanal kutuya bölerek, bu alanlarda sayfa numarası, belge başlığı veya güncel tarih gibi özel içerikleri göstermeyi sağlayan programlanabilir bir ızgara sistemi tanımlar.

İşlev: Dinamik Meta Veri Üretimi

Bu özelliğin en büyük devrimi otomasyondur; sayfa numaraları (content: counter(page)) veya bölüm başlıkları gibi sürekli değişen üstbilgi ve altbilgilerin (header/footer), HTML DOM yapısında manuel olarak yüzlerce kez tekrar edilmesine gerek kalmadan, CSS motoru tarafından

otomatik olarak ve her sayfanın kendi sırasına özel olarak üretilmesini sağlar.

Bu yetenek, web içeriğinin basit bir çıktı olmaktan çıkıp, numaralandırılmış ve düzenlenmiş profesyonel yayıncılık standartlarına

( kitap veya resmi rapor formatına ) yaklaşmasını mümkün kılar.

Sınırlamalar: Akademik Risk ve Destek

Kritik bir akademik not olarak; @page kuralının ve özellikle bu gelişmiş Köşe Kutularının tarayıcı desteği, modern ve güncel tarayıcılarda bile diğer standart CSS özelliklerine kıyasla çok daha düzensiz, parçalı ve eksiktir.

Bu nedenle profesyonel geliştiricilerin, karmaşık baskı stillerini tasarlarken bu teknik olgunluk riskini bilmesi; ve mizanpajın farklı tarayıcı motorlarında bozulmadan render edileceğinden emin olmak için çok kapsamlı fiziksel testler yapması zorunludur.

</>
@document Amaç ve Sözdizimi Örneği (+)
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>@page Köşe Kutuları ve Dinamik Üstbilgi/Altbilgi Örneği</title>
    <link rel="stylesheet" href="style.css?v=1.0.150">
</head>

<body>
    <div class="rapor-icerik">
        <header class="kapak">
            <h1>Resmi Araştırma Raporu</h1>
            <p>Sürüm v1.0 | Ocak 2026</p>
        </header>

        <section class="makale">
            <h2>Giriş ve Metodoloji</h2>
            <p>Bu belge, CSS Köşe Kutuları (Margin Boxes) kullanılarak otomatik olarak yapılandırılmıştır.</p>
            <div class="sayfa-sonu"></div>
            <h2>Veri Analizi</h2>
            <p>Sayfa numaraları ve üstbilgiler CSS motoru tarafından dinamik olarak üretilmektedir.</p>
        </section>
    </div>
</body>

</html>
/* --- GENEL EKRAN STİLLERİ --- */
body {
    font-family: 'Segoe UI', Tahoma, sans-serif;
    color: #1e293b;
    background-color: #f1f5f9;
    padding: 50px;
}

.rapor-icerik {
    background: white;
    max-width: 800px;
    margin: 0 auto;
    padding: 60px;
    box-shadow: 0 10px 25px rgba(0, 0, 0, 0.1);
}

/* --- BASKI VE YAYINCILIK MİMARİSİ (@media print) --- */
@media print {
    @page {
        size: A4;
        margin: 2.5cm;
        /* Köşe kutuları için yeterli alan bırakır */

        /* DİNAMİK ALT BİLGİ: Sayfa numarasını otomatik üretir */
        @bottom-center {
            content: "Sayfa " counter(page);
            font-size: 10pt;
            color: #64748b;
            border-top: 0.5pt solid #cbd5e1;
            width: 100%;
            padding-top: 5mm;
        }

        /* DİNAMİK ÜST BİLGİ: Sol köşeye sabit metin ekler */
        @top-left {
            content: "Resmi Rapor v1.0";
            font-style: italic;
            font-size: 9pt;
            color: #94a3b8;
        }

        /* SAĞ ÜST KÖŞE: Dinamik Tarih (Manuel metin olarak) */
        @top-right {
            content: "Ocak 2026";
            font-size: 9pt;
        }
    }

    body {
        background: none;
        padding: 0;
    }

    .rapor-icerik {
        box-shadow: none;
        width: 100%;
        padding: 0;
    }

    .sayfa-sonu {
        break-after: page;
    }

    /* Manuel sayfa sonu kontrolü */
}