Son gün! Modern CSS’in 2026’ya yaraşan özelliklerine bakıyoruz. Custom properties, container queries, dark mode… eski CSS’le yeniyi ayıran her şey.

1. CSS Değişkenleri (Custom Properties)

Tek bir yerden değer değiştirip tüm siteyi etkilemek? CSS değişkenleri:

:root {
    --bg: #000;
    --text: #ededed;
    --accent: #a6e22e;
    --radius: 8px;
    --space-sm: 8px;
    --space-md: 16px;
    --space-lg: 32px;
}

.card {
    background: var(--bg);
    color: var(--text);
    padding: var(--space-md);
    border-radius: var(--radius);
}

.btn {
    background: var(--accent);
    border-radius: var(--radius);
}

Fallback Değer

Değişken tanımlanmamışsa fallback:

.box {
    color: var(--text-color, #333);  /* yoksa #333 kullan */
}

Scope (Kapsam)

Custom properties scoped — bir elementte tanımlı, alt elementlerde geçerli:

.theme-dark {
    --bg: #000;
    --text: #ededed;
}

.theme-light {
    --bg: #fff;
    --text: #1a1a1a;
}

.card {
    background: var(--bg);  /* parent tema'ya göre değişir */
    color: var(--text);
}

JavaScript ile Erişim

// Oku
const accent = getComputedStyle(document.documentElement)
    .getPropertyValue('--accent');

// Yaz
document.documentElement.style.setProperty('--accent', '#7C9CFF');

Tema geçişi, dinamik özelleştirme — bu yöntemle.

2. Media Query Stratejileri

Mobile-First

Önce mobil, sonra büyük ekran için override. Modern best practice:

/* Mobile (default) */
.container { padding: 16px; }
.nav-links { display: none; }

/* Tablet */
@media (min-width: 768px) {
    .container { padding: 32px; }
    .nav-links { display: flex; }
}

/* Desktop */
@media (min-width: 1280px) {
    .container { padding: 48px; }
}

Neden mobile-first?

Yatay/Dikey Yönelim

@media (orientation: portrait) { /* dikey */ }
@media (orientation: landscape) { /* yatay */ }

Renk Şeması & Tema

@media (prefers-color-scheme: dark) {
    :root {
        --bg: #000;
        --text: #ededed;
    }
}

@media (prefers-color-scheme: light) {
    :root {
        --bg: #fff;
        --text: #1a1a1a;
    }
}

Hareket Tercihi

@media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
        animation-duration: 0.01ms !important;
        transition-duration: 0.01ms !important;
    }
}

3. Container Queries — Yeni Çağ

Media query viewport boyutuna bakar. Container query ise parent container’ın boyutuna. Component-relative responsive!

.card-container {
    container-type: inline-size;
    container-name: card;
}

@container card (min-width: 400px) {
    .card {
        display: flex;
        gap: 16px;
    }
}

Aynı .card component’i:

Tek bir component, iki farklı yerde kullanıldığında kendi boyutuna göre davranır. Reusable component’ler için devrim.

4. Dark Mode Stratejisi

Otomatik (Sistem Tercihi)

:root {
    color-scheme: light dark;  /* tarayıcı UI'ı (scrollbar vs) de değişir */
    --bg: #fff;
    --text: #1a1a1a;
}

@media (prefers-color-scheme: dark) {
    :root {
        --bg: #000;
        --text: #ededed;
    }
}

Manuel Toggle (Kullanıcı Kontrolü)

HTML’de data-theme attribute kullan:

:root,
[data-theme="light"] {
    --bg: #fff;
    --text: #1a1a1a;
}

[data-theme="dark"] {
    --bg: #000;
    --text: #ededed;
}
// Toggle
const toggle = () => {
    const current = document.documentElement.dataset.theme;
    document.documentElement.dataset.theme = current === 'dark' ? 'light' : 'dark';
    localStorage.setItem('theme', document.documentElement.dataset.theme);
};

// İlk yükleme
document.documentElement.dataset.theme = localStorage.getItem('theme') || 'dark';

5. Modern CSS Özellikleri

aspect-ratio

Boyut oranını direkt tanımla — padding-bottom hack’i tarihe karıştı:

.video {
    aspect-ratio: 16 / 9;
    width: 100%;
}

.avatar {
    aspect-ratio: 1 / 1;
    width: 64px;
    border-radius: 50%;
}

clamp(min, ideal, max)

Responsive değer tek satırda:

.hero h1 {
    font-size: clamp(32px, 5vw, 64px);
    /* en az 32px, ideal 5vw, en fazla 64px */
}

.container {
    width: clamp(300px, 90%, 1200px);
}

Bu, fluid typography ve responsive layout’un büyük kısmını çözer.

color-mix()

Renkleri CSS’ten karıştır:

.btn-soft {
    background: color-mix(in srgb, var(--accent) 12%, transparent);
    /* %12 accent + %88 şeffaf */
}

.btn:hover {
    background: color-mix(in srgb, var(--accent) 80%, black);
}

:has() — Parent Selector

CSS tarihinin en beklediği özelliği: parent’ı child’a göre seç.

/* İçinde img olan kart farklı padding */
.card:has(img) {
    padding: 0;
}

/* Hover'da olan menüye sahip nav */
.nav:has(.dropdown:hover) {
    z-index: 100;
}

/* Form'da hata varsa border */
form:has(input:invalid) {
    border-color: red;
}

scroll-behavior

html {
    scroll-behavior: smooth;  /* anchor link'ler smooth */
}

.section {
    scroll-margin-top: 80px;  /* sticky header için offset */
}

backdrop-filter

Frosted glass / buğulu arka plan:

.modal-backdrop {
    background: rgba(0, 0, 0, 0.5);
    backdrop-filter: blur(10px);
    -webkit-backdrop-filter: blur(10px);
}

gap (Flexbox + Grid)

Eskiden sadece Grid’de vardı, artık Flexbox’ta da çalışıyor:

.row {
    display: flex;
    gap: 16px;  /* artık desteklenir */
}

Mini Proje: Tam Responsive Landing Page

<header class="nav">
    <a href="/" class="brand">Logo</a>
    <nav class="nav-links">
        <a href="#">Home</a>
        <a href="#">Blog</a>
        <a href="#">About</a>
    </nav>
</header>

<section class="hero">
    <h1>Modern CSS ile inşa edildi</h1>
    <p>Container queries, custom properties, ve clamp() ile.</p>
    <a href="#" class="btn">Başla</a>
</section>

<section class="features">
    <article class="feature">…</article>
    <article class="feature">…</article>
    <article class="feature">…</article>
</section>
:root {
    color-scheme: dark;
    --bg: #000;
    --surface: #0a0a0a;
    --text: #ededed;
    --text-dim: #888;
    --accent: #a6e22e;
    --border: #1a1a1a;
    --radius: 8px;
    --space-xs: 4px;
    --space-sm: 8px;
    --space-md: 16px;
    --space-lg: 32px;
    --space-xl: 64px;
}

* { box-sizing: border-box; }

body {
    margin: 0;
    background: var(--bg);
    color: var(--text);
    font-family: 'Inter', sans-serif;
    line-height: 1.6;
}

.nav {
    display: flex;
    justify-content: space-between;
    align-items: center;
    padding: var(--space-md) clamp(16px, 5vw, 48px);
    border-bottom: 1px solid var(--border);
    background: rgba(0, 0, 0, 0.7);
    backdrop-filter: blur(10px);
    position: sticky;
    top: 0;
}

.nav-links {
    display: flex;
    gap: var(--space-md);
}

.nav-links a {
    color: var(--text-dim);
    text-decoration: none;
    transition: color 0.2s;
}

.nav-links a:hover { color: var(--accent); }

.hero {
    padding: clamp(48px, 10vw, 120px) clamp(16px, 5vw, 48px);
    max-width: 800px;
    margin: 0 auto;
}

.hero h1 {
    font-size: clamp(32px, 5vw, 56px);
    line-height: 1.1;
    margin: 0 0 var(--space-md);
}

.hero p {
    font-size: clamp(16px, 2vw, 20px);
    color: var(--text-dim);
    margin: 0 0 var(--space-lg);
}

.btn {
    display: inline-block;
    background: var(--accent);
    color: #000;
    padding: var(--space-sm) var(--space-lg);
    border-radius: var(--radius);
    text-decoration: none;
    font-weight: 600;
    transition: transform 0.2s, box-shadow 0.3s;
}

.btn:hover {
    transform: translateY(-2px);
    box-shadow: 0 8px 24px color-mix(in srgb, var(--accent) 30%, transparent);
}

.features {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
    gap: var(--space-md);
    padding: var(--space-xl) clamp(16px, 5vw, 48px);
    max-width: 1200px;
    margin: 0 auto;
}

.feature {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: var(--radius);
    padding: var(--space-lg);
    transition: border-color 0.2s, transform 0.2s;
}

.feature:hover {
    border-color: var(--accent);
    transform: translateY(-2px);
}

@media (prefers-reduced-motion: reduce) {
    * { transition-duration: 0.01ms !important; }
}

Sıfır media query, otomatik responsive, dark mode hazır, accessibility’ye saygılı. Modern CSS bu kadar temiz.

Pratik Sorular

Soru 1: Bir başlığın font-size’ı mobilde 24px, ideal 5vw, max 48px olsun. Tek satırda?

h1 { font-size: clamp(24px, 5vw, 48px); }

Soru 2: İçinde resim olan kartlara hiç padding, olmayan kartlara 24px padding. Tek selector ile.

.card { padding: 24px; }
.card:has(img) { padding: 0; }

Soru 3: Bir tema toggle’ı — kullanıcının tercihini hatırla, sayfa yenilense de tema kalsın.

const root = document.documentElement;
const stored = localStorage.getItem('theme');
root.dataset.theme = stored || (
    window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'
);

document.getElementById('toggle').addEventListener('click', () => {
    const newTheme = root.dataset.theme === 'dark' ? 'light' : 'dark';
    root.dataset.theme = newTheme;
    localStorage.setItem('theme', newTheme);
});

🎉 Tebrikler!

5 günlük CSS3 BootCamp’ini başarıyla tamamladın!

Artık:

Sonraki Adımlar

Modern CSS, sürekli evrilen bir alan. Yeni özellikleri takip et, denemekten korkma. Mutlu kodlamalar! 🎨