Jump to content
  • entries
    21
  • comments
    0
  • views
    418

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:

  1. Border width - border: 1px solid
  2. Box shadow - box-shadow: 0 2px 8px
  3. Sabit boyutlu elementler - Icons, avatars, logos
  4. Max-width constraints - Container limits
  5. Media query breakpoints - (EM de OK)
  6. Transform offset - translateY(-2px)
  7. Çok küçük değerler - gap: 4px (ama REM daha iyi)

PX Kullanma:

  1. Font-size - ASLA!
  2. Line-height - Unitless kullan
  3. Padding/Margin - REM veya EM kullan
  4. Width/Height (layout için) - Flexible units kullan
  5. Root font-size - % kullan (100%)

⚠️ Dikkatli Kullan:

  1. Border-radius - Küçükse PX OK, büyükse REM
  2. Gap - REM daha iyi ama PX de çalışır
  3. 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.

×
×
  • Create New...

Important Information