CSS'de PX (Pixel) Birimi
Pixel, CSS'in en eski ve en tartışmalı birimidir. "Absolute unit" olarak sınıflandırılsa da, aslında durum biraz daha karmaşık. Detaylı açıklayayım.
1. PX Nedir? (Teknik Gerçek)
CSS Pixel ≠ Fiziksel Pixel
CSS Pixel (Reference Pixel) ↓ Device Independent Pixel (DIP) ↓ Physical Pixel (gerçek ekran pikselleri)
Önemli: 1px CSS'de her zaman aynı fiziksel boyut DEĞİLDİR!
Pixel Density (DPR - Device Pixel Ratio)
// Tarayıcı konsolunda console.log(window.devicePixelRatio); // Sonuçlar: // - Normal ekran: 1 (1 CSS px = 1 fiziksel pixel) // - Retina/HiDPI: 2 (1 CSS px = 4 fiziksel pixel - 2×2) // - 4K ekran: 3 veya 4 (1 CSS px = 9 veya 16 fiziksel pixel)
Örnek:
.line { border: 1px solid black; }
- Normal ekran (DPR=1): 1 fiziksel pixel kalınlığında
- Retina (DPR=2): 2 fiziksel pixel kalınlığında
- 4K (DPR=3): 3 fiziksel pixel kalınlığında
Sonuç: 1px her cihazda yaklaşık aynı görsel boyutta görünür, ama farklı sayıda fiziksel pixel kullanır.
2. PX'in Tarihi ve Evolüsyonu
1990'lar - Mutlak Kontrol Dönemi
/* O zamanlar herkes 800×600 veya 1024×768 ekran kullanıyordu */ body { width: 960px; /* Sabit genişlik */ font-size: 12px; margin: 0; padding: 0; } .header { height: 80px; } .content { width: 720px; float: left; } .sidebar { width: 240px; float: right; }
✅ O dönem için avantajlar:
- Pixel-perfect tasarım
- Öngörülebilir görünüm
- Basit hesaplama
❌ Sorunlar:
- Farklı çözünürlüklerde bozulma
- Responsive değil
- Erişilebilirlik sıfır
2000'ler - Responsive Farkındalık
/* Media query'ler başladı */ .container { width: 960px; } @media (max-width: 768px) { .container { width: 100%; } }
2010'lar - Relative Units Yükselişi
/* REM/EM/% popüler oldu */ html { font-size: 16px; /* Base */ } body { font-size: 1rem; /* 16px */ } h1 { font-size: 2.5rem; /* 40px */ }
2020+ Modern Dönem - Hybrid Yaklaşım
/* PX hala kullanılıyor, ama doğru yerlerde */ .icon { width: 24px; /* Sabit boyut - OK */ } .container { max-width: 1200px; /* Maksimum sınır - OK */ padding: 2rem; /* Spacing - relative birim */ } h1 { font-size: clamp(2rem, 3vw + 1rem, 4rem); /* Fluid - relative */ }
3. PX Ne Zaman Kullanılmali? (Modern Yaklaşım)
✅ PX KULLAN - Doğru Kullanım Alanları
1. Border Width (Çerçeve Kalınlığı)
/* ✅ DOĞRU - Border için px ideal */ .card { border: 1px solid #ccc; border-bottom: 2px solid blue; } /* ❌ YANLIŞ - REM ile border garip durur */ .card { border: 0.0625rem solid #ccc; /* 1px ama karmaşık */ }
Neden px?
- Border her zaman keskin ve net olmalı
- 1px altı değerler anlamsız
- Kullanıcı font-size değiştirince border kalınlığı değişmemeli
2. Box Shadow (Gölgeler)
/* ✅ DOĞRU */ .card { box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } /* ✅ Daha büyük gölge */ .modal { box-shadow: 0 10px 40px rgba(0, 0, 0, 0.2); } /* ❌ YANLIŞ - rem ile gölge değişir */ .card { box-shadow: 0 0.125rem 0.5rem rgba(0, 0, 0, 0.1); /* Kullanıcı font büyütünce gölge de büyür - garip */ }
3. Sabit Boyutlu Elementler (Icons, Avatars)
/* ✅ İkonlar her zaman sabit boyut */ .icon { width: 24px; height: 24px; } .icon-small { width: 16px; height: 16px; } .icon-medium { width: 24px; height: 24px; } .icon-large { width: 32px; height: 32px; } .icon-xl { width: 48px; height: 48px; } /* ✅ Avatar'lar */ .avatar { width: 40px; height: 40px; border-radius: 50%; } /* ✅ Logo */ .logo { width: 180px; height: auto; }
Neden px?
- İkonlar text boyutundan bağımsız olmalı
- Grid sistemlerde düzenli hizalama için
- Tasarım sisteminde tutarlılık
4. Max-Width Constraints (Maksimum Genişlik Sınırları)
/* ✅ DOĞRU - Container max-width */ .container { width: 100%; /* Responsive */ max-width: 1200px; /* Ama çok büyük ekranlarda sınırla */ margin: 0 auto; } /* ✅ Content width */ .article { max-width: 65ch; /* Karakter bazlı (ideal) */ /* VEYA */ max-width: 700px; /* Pixel bazlı (da OK) */ } /* ✅ Modal width */ .modal { width: 90%; max-width: 600px; }
Neden px?
- Tasarım kontrolü için üst sınır
- Çok geniş ekranlarda okunabilirlik
- Layout'un bozulmasını önle
5. Media Query Breakpoints
/* ✅ DOĞRU - px breakpoint'ler yaygın */ /* Mobile first */ .grid { display: grid; grid-template-columns: 1fr; gap: 1rem; } @media (min-width: 640px) { /* sm */ .grid { grid-template-columns: repeat(2, 1fr); } } @media (min-width: 768px) { /* md */ .grid { grid-template-columns: repeat(3, 1fr); } } @media (min-width: 1024px) { /* lg */ .grid { grid-template-columns: repeat(4, 1fr); } } @media (min-width: 1280px) { /* xl */ .grid { grid-template-columns: repeat(5, 1fr); } }
Alternatif - EM breakpoints:
/* ✅ DA DOĞRU - em/rem daha erişilebilir */ @media (min-width: 40em) { /* 640px @ 16px base */ .grid { grid-template-columns: repeat(2, 1fr); } } @media (min-width: 48em) { /* 768px @ 16px base */ .grid { grid-template-columns: repeat(3, 1fr); } }
Tartışma:
- PX: Viewport genişliğine göre (daha yaygın)
- EM: Kullanıcı font-size'ına da duyarlı (daha erişilebilir)
6. Çok Küçük Spacing Değerleri
/* ✅ Çok küçük değerler için px daha net */ .divider { margin: 0; padding: 0; border-top: 1px solid #e0e0e0; } .tag { padding: 4px 8px; /* 0.25rem 0.5rem yerine */ border-radius: 3px; font-size: 0.75rem; } /* Grid gap çok küçükse */ .tight-grid { display: grid; gap: 8px; /* 0.5rem = 8px, ama px daha direkt */ }
❌ PX KULLANMA - Yanlış Kullanım Alanları
1. Font-Size (En Kritik Hata!)
/* ❌ YANLIŞ - Erişilebilirlik ihlali */ html { font-size: 16px; } body { font-size: 14px; } h1 { font-size: 32px; } p { font-size: 16px; }
Sorun:
- Kullanıcı tarayıcısında "Large fonts" seçse de değişmez
- Zoom yapınca oran bozulabilir
- WCAG erişilebilirlik kriterlerini ihlal eder
/* ✅ DOĞRU - REM kullan */ html { font-size: 100%; /* 16px, ama kullanıcı ayarına saygılı */ } body { font-size: 1rem; /* 16px */ } h1 { font-size: 2rem; /* 32px */ /* VEYA fluid */ font-size: clamp(1.5rem, 3vw + 1rem, 3rem); } p { font-size: 1rem; }
2. Padding ve Margin (Spacing)
/* ❌ YANLIŞ - Sabit spacing */ .section { padding: 60px 20px; margin-bottom: 40px; } .button { padding: 12px 24px; margin-right: 16px; }
Sorun:
- Font-size değişince orantısız durur
- Responsive değil
- Komponentin iç tutarlılığı bozulur
/* ✅ DOĞRU - Relative spacing */ .section { padding: 3.75rem 1.25rem; /* REM - global scale */ margin-bottom: 2.5rem; } .button { padding: 0.75em 1.5em; /* EM - component scale */ margin-right: 1em; font-size: 1rem; }
EM vs REM Spacing:
/* REM - Global consistency */ .card { padding: 2rem; /* Her zaman aynı (root'a göre) */ margin-bottom: 1.5rem; } /* EM - Component-based scaling */ .button-small { font-size: 0.875rem; padding: 0.5em 1em; /* Font-size'a göre ölçeklenir */ } .button-large { font-size: 1.25rem; padding: 0.5em 1em; /* Aynı em değeri, ama daha büyük */ }
3. Width ve Height (Layout)
/* ❌ YANLIŞ - Sabit layout */ .sidebar { width: 300px; height: 600px; } .content { width: 900px; }
Sorun:
- Responsive değil
- Farklı ekranlarda bozulur
- İçerik taşar
/* ✅ DOĞRU - Flexible layout */ .layout { display: grid; grid-template-columns: 300px 1fr; /* Sidebar sabit OK, content flex */ gap: 2rem; } /* Veya tamamen flexible */ .layout { display: grid; grid-template-columns: minmax(250px, 300px) 1fr; gap: 2rem; } /* Mobil için responsive */ @media (max-width: 768px) { .layout { grid-template-columns: 1fr; } }
4. Line-Height
/* ❌ YANLIŞ - Sabit line-height */ p { font-size: 16px; line-height: 24px; } h1 { font-size: 32px; line-height: 40px; }
Sorun:
- Font-size değişince oran bozulur
- Responsive değil
/* ✅ DOĞRU - Unitless veya relative */ p { font-size: 1rem; line-height: 1.5; /* Unitless - en iyi */ } h1 { font-size: 2rem; line-height: 1.2; } /* Veya em */ p { font-size: 1rem; line-height: 1.5em; /* Font-size × 1.5 */ }
4. PX vs Diğer Birimler - Karşılaştırma
Font-Size Karşılaştırması
/* Senaryo: Kullanıcı tarayıcıda font-size'ı 20px'e çıkardı */ /* PX - Değişmez (kötü) */ body { font-size: 16px; /* Hala 16px - kullanıcı tercihi görmezden gelindi */ } /* % - Kullanıcı tercihine uyar (iyi) */ html { font-size: 100%; /* 20px olur - kullanıcı ayarına uydu */ } /* REM - Root'a göre (en iyi) */ html { font-size: 100%; /* 20px */ } body { font-size: 1rem; /* 20px - kullanıcı ayarına uydu */ } h1 { font-size: 2rem; /* 40px - orantılı ölçeklendi */ }
Spacing Karşılaştırması
.component { font-size: 1rem; /* 16px → 20px (kullanıcı değiştirdi) */ } /* PX - Sabit kalır */ .px-spacing { padding: 16px 24px; /* Hala 16px 24px - orantısız */ } /* REM - Global scale */ .rem-spacing { padding: 1rem 1.5rem; /* 20px 30px - global scale ile ölçeklendi */ } /* EM - Component scale */ .em-spacing { padding: 1em 1.5em; /* 20px 30px - component font-size'a göre */ }
Kullanıcı font-size artırınca: PX spacing: ┌────────────────┐ │ BUTTON │ ← Text büyük, padding küçük - sıkışık └────────────────┘ EM/REM spacing: ┌─────────────────────┐ │ BUTTON │ ← Her şey orantılı büyüdü └─────────────────────┘
5. Modern Hybrid Yaklaşım
Design System Örneği
/* ========================================== MODERN DESIGN SYSTEM - HYBRID APPROACH ========================================== */ :root { /* ============= Sabit Değerler (PX) ============= */ /* Breakpoints */ --breakpoint-sm: 640px; --breakpoint-md: 768px; --breakpoint-lg: 1024px; --breakpoint-xl: 1280px; --breakpoint-2xl: 1536px; /* Container max-widths */ --container-sm: 640px; --container-md: 768px; --container-lg: 1024px; --container-xl: 1280px; /* Border widths */ --border-thin: 1px; --border-medium: 2px; --border-thick: 4px; /* Icon sizes */ --icon-xs: 16px; --icon-sm: 20px; --icon-md: 24px; --icon-lg: 32px; --icon-xl: 48px; /* ============= Relative Değerler (REM) ============= */ /* Spacing scale */ --space-xs: 0.25rem; /* 4px */ --space-sm: 0.5rem; /* 8px */ --space-md: 1rem; /* 16px */ --space-lg: 1.5rem; /* 24px */ --space-xl: 2rem; /* 32px */ --space-2xl: 3rem; /* 48px */ --space-3xl: 4rem; /* 64px */ /* Font sizes - Fluid */ --font-xs: clamp(0.75rem, 0.7rem + 0.25vw, 0.875rem); --font-sm: clamp(0.875rem, 0.85rem + 0.13vw, 1rem); --font-base: clamp(1rem, 0.95rem + 0.25vw, 1.125rem); --font-lg: clamp(1.125rem, 1.05rem + 0.38vw, 1.313rem); --font-xl: clamp(1.25rem, 1.15rem + 0.5vw, 1.563rem); --font-2xl: clamp(1.5rem, 1.35rem + 0.75vw, 1.953rem); --font-3xl: clamp(1.875rem, 1.65rem + 1.13vw, 2.441rem); --font-4xl: clamp(2.25rem, 1.95rem + 1.5vw, 3.052rem); /* Border radius */ --radius-sm: 0.25rem; /* 4px */ --radius-md: 0.5rem; /* 8px */ --radius-lg: 1rem; /* 16px */ --radius-full: 9999px; } /* ============= Global Styles ============= */ html { font-size: 100%; /* Kullanıcı tercihine saygı */ } body { font-family: system-ui, -apple-system, sans-serif; font-size: var(--font-base); line-height: 1.6; color: #1a1a1a; } /* ============= Components ============= */ /* Button - EM ile component-based scaling */ .button { font-size: 1rem; padding: 0.5em 1em; /* EM - font-size'a göre */ border: var(--border-thin) solid; border-radius: var(--radius-md); /* REM */ cursor: pointer; transition: all 0.2s; } .button-sm { font-size: 0.875rem; padding: 0.5em 1em; /* Aynı em, ama küçük */ } .button-lg { font-size: 1.125rem; padding: 0.5em 1em; /* Aynı em, ama büyük */ } /* Card - REM ile global spacing */ .card { padding: var(--space-xl); /* REM - global scale */ border: var(--border-thin) solid #e0e0e0; /* PX - border */ border-radius: var(--radius-lg); box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); /* PX - shadow */ } /* Icon - PX ile sabit boyut */ .icon { width: var(--icon-md); /* PX - sabit */ height: var(--icon-md); display: inline-block; } /* Container - PX max-width, % width */ .container { width: 90%; /* % - responsive */ max-width: var(--container-xl); /* PX - üst sınır */ margin: 0 auto; padding: 0 var(--space-lg); /* REM - spacing */ } /* Grid - REM gap */ .grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(280px, 1fr)); gap: var(--space-xl); /* REM - consistent */ } /* Typography - Fluid + REM */ h1 { font-size: var(--font-4xl); /* Fluid clamp */ line-height: 1.1; /* Unitless */ margin-bottom: 0.5em; /* EM - font-size'a göre */ } h2 { font-size: var(--font-3xl); line-height: 1.2; margin-bottom: 0.5em; } p { font-size: var(--font-base); line-height: 1.6; margin-bottom: 1em; } /* ============= Utilities ============= */ /* Spacing utilities - REM */ .p-sm { padding: var(--space-sm); } .p-md { padding: var(--space-md); } .p-lg { padding: var(--space-lg); } .p-xl { padding: var(--space-xl); } .m-sm { margin: var(--space-sm); } .m-md { margin: var(--space-md); } .m-lg { margin: var(--space-lg); } .m-xl { margin: var(--space-xl); } /* Border utilities - PX */ .border { border: var(--border-thin) solid currentColor; } .border-2 { border: var(--border-medium) solid currentColor; } .border-4 { border: var(--border-thick) solid currentColor; } /* Icon sizes - PX */ .icon-sm { width: var(--icon-sm); height: var(--icon-sm); } .icon-md { width: var(--icon-md); height: var(--icon-md); } .icon-lg { width: var(--icon-lg); height: var(--icon-lg); }
6. PX Kullanımında Yaygın Hatalar
Hata 1: Root Font-Size'ı PX ile Ayarlama
/* ❌ EN BÜYÜK HATA */ html { font-size: 16px; }
Neden kötü:
- Kullanıcının tarayıcı ayarlarını ezer
- Erişilebilirlik ihlali
- WCAG başarısız
Bazı geliştiriciler bunu yapıyor:
/* ❌ 10px base trick - YAPMA! */ html { font-size: 62.5%; /* 10px - kolay hesaplama için */ } body { font-size: 1.6rem; /* 16px */ } h1 { font-size: 3.2rem; /* 32px */ }
Sorun:
- Tarayıcı varsayılanı 16px değilse bozulur
- Kullanıcı "Large fonts" seçmişse görmezden gelir
- Math zorlaştırma pahasına erişilebilirliği feda ediyorsun
/* ✅ DOĞRU YOL */ html { font-size: 100%; /* Kullanıcı ayarına saygı */ } body { font-size: 1rem; /* 16px @ default */ } h1 { font-size: 2rem; /* 32px @ default - ama ölçeklenebilir */ }
Hata 2: Her Yerde PX Kullanımı
/* ❌ 2000'ler tarzı - modern değil */ .header { height: 80px; padding: 20px 40px; margin-bottom: 30px; } .nav-item { font-size: 14px; padding: 10px 15px; margin-right: 20px; } .content { font-size: 16px; line-height: 24px; padding: 40px; max-width: 800px; }
Sorun:
- Hiçbir şey ölçeklenmiyor
- Responsive değil
- Bakımı zor
/* ✅ Modern yaklaşım - mix */ .header { height: auto; /* İçeriğe göre */ padding: var(--space-lg) var(--space-xl); /* REM */ margin-bottom: var(--space-xl); /* REM */ } .nav-item { font-size: var(--font-sm); /* Fluid */ padding: 0.625em 0.9375em; /* EM - font'a göre */ margin-right: var(--space-md); /* REM */ } .content { font-size: var(--font-base); /* Fluid */ line-height: 1.5; /* Unitless */ padding: var(--space-2xl); /* REM */ max-width: 800px; /* PX - max OK */ }
Hata 3: Media Query'lerde Sadece PX
/* ⚠️ Yaygın ama tartışmalı */ @media (max-width: 768px) { .nav { display: block; } }
Sorun:
- Kullanıcı font-size değiştirince layout kırılabilir
7. Özet - Modern PX Kullanım Rehberi
✅ PX Kullan:
-
Border width -
border: 1px solid -
Box shadow -
box-shadow: 0 2px 8px - Sabit boyutlu elementler - Icons, avatars, logos
- Max-width constraints - Container limits
- Media query breakpoints - (EM de OK)
-
Transform offset -
translateY(-2px) -
Çok küçük değerler -
gap: 4px(ama REM daha iyi)
❌ PX Kullanma:
- Font-size - ASLA!
- Line-height - Unitless kullan
- Padding/Margin - REM veya EM kullan
- Width/Height (layout için) - Flexible units kullan
- Root font-size - % kullan (100%)
⚠️ Dikkatli Kullan:
- Border-radius - Küçükse PX OK, büyükse REM
- Gap - REM daha iyi ama PX de çalışır
- Min/Max values - Context'e göre
🎯 Altın Kural:
"PX kullanacaksan, kendine sor: Bu değer kullanıcının font-size tercihinden etkilenmeli mi?"
- Evet ise → REM/EM/clamp() kullan
- Hayır ise → PX kullanabilirsin
Modern web'de PX hala değerli bir araç, ama doğru yerde kullanılmalı. Her birim kendi amacı için optimize edilmiştir!

0 Comments
Recommended Comments
There are no comments to display.