Html & Css İle Özelleştirilebilir Bir Gece-Gündüz Geçiş Anahtarı Nasıl Yapılır?

Html & Css İle Özelleştirilebilir Bir Gece-Gündüz Geçiş Anahtarı Nasıl Yapılır?
Html & Css İle Özelleştirilebilir Bir Gece-Gündüz Geçiş Anahtarı Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Bu projeyi hayata geçirmek için özel bir kurulum gerekmemektedir. Modern bir kod editörü (VS Code gibi) ve güncel bir web tarayıcısı yeterlidir. CSS değişkenleri, günümüzde tüm modern tarayıcılar tarafından desteklenmektedir, bu nedenle ek bir polyfill ihtiyacınız olmayacaktır.

  • Kod Editörü: Visual Studio Code önerilir.
  • Tarayıcı: Chrome, Firefox, Edge veya Safari'nin güncel sürümleri.
  • Temel Bilgi: HTML etiketleri ve CSS seçicileri hakkında temel düzeyde bilgi.

Adım 1: HTML Yapısını Oluşturma

Gece-gündüz geçiş anahtarının temelini bir input (girdi) etiketi oluşturur. Bu etiketi gizleyip, bir label etiketi ile tetikleyeceğiz. Bu yöntem, erişilebilirlik açısından en sağlıklı yoldur.

Burada input elemanımız durumu tutan anahtarımızdır. label etiketi ise kullanıcıya görsel olarak sunulan kaydırıcıyı (slider) temsil eder.

Adım 2: CSS Değişkenleri ile Temayı Tanımlama

CSS değişkenleri, renk paletini tek bir yerden yönetmemizi sağlar. :root seçicisi ile varsayılan (gündüz) renklerimizi tanımlayalım.

:root {
  --bg-color: #ffffff;
  --text-color: #333333;
  --toggle-bg: #cccccc;
  --slider-color: #ffffff;
}

[data-theme="dark"] {
  --bg-color: #121212;
  --text-color: #f0f0f0;
  --toggle-bg: #4caf50;
  --slider-color: #ffffff;
}

Bu tanımlamalar sayesinde, data-theme="dark" özniteliği eklendiğinde tüm sayfa renkleri otomatik olarak güncellenecektir. Bu yöntem, kod tekrarını önleyen en temiz yaklaşımdır.

Adım 3: Geçiş Anahtarını Stilize Etme

Şimdi anahtarın görsel tasarımını oluşturalım. input etiketini gizleyip, label ve span elemanlarını bir buton gibi göstereceğiz.

#theme-toggle { display: none; }

.toggle-label {
  cursor: pointer;
  width: 60px;
  height: 30px;
  background: var(--toggle-bg);
  display: block;
  border-radius: 30px;
  position: relative;
  transition: 0.3s;
}

.slider {
  position: absolute;
  width: 26px;
  height: 26px;
  background: var(--slider-color);
  border-radius: 50%;
  top: 2px;
  left: 2px;
  transition: 0.3s;
}

Burada kullanılan transition özelliği, anahtarın yumuşak bir şekilde hareket etmesini sağlar. cursor: pointer ise kullanıcıya bunun tıklanabilir olduğunu hissettirir.

Adım 4: JavaScript ile Dinamik Geçişi Sağlama

CSS tek başına bir durumu (tıklamayı) kalıcı olarak değiştiremez. Bu yüzden küçük bir JavaScript fonksiyonu kullanarak data-theme özniteliğini değiştireceğiz.

const toggle = document.getElementById('theme-toggle');

toggle.addEventListener('change', () => {
  if (toggle.checked) {
    document.documentElement.setAttribute('data-theme', 'dark');
  } else {
    document.documentElement.removeAttribute('data-theme');
  }
});

Bu kod, checkbox işaretlendiğinde HTML etiketine data-theme="dark" ekler. İşaret kaldırıldığında ise bu özniteliği temizleyerek varsayılan temaya döner.

Adım 5: Gelişmiş Özelleştirme ve Test

Anahtarın aktif olduğunda kaydırıcının sağa geçmesi için CSS tarafında bir kural daha eklememiz gerekir. Ayrıca, sayfa arka planını da değişkenlerimize bağlamalıyız.

body {
  background-color: var(--bg-color);
  color: var(--text-color);
  transition: background-color 0.3s, color 0.3s;
}

#theme-toggle:checked + .toggle-label .slider {
  transform: translateX(30px);
}

Bu kod bloğu, checkbox işaretlendiğinde slider elemanını 30 piksel sağa kaydırır. body etiketindeki transition ise renk değişiminin gözü yormadan gerçekleşmesini sağlar.

Kritik Güvenlik Uyarısı: Web arayüzlerinde kullanıcı tercihlerini saklarken localStorage kullanabilirsiniz. Ancak, bu verinin asla hassas kullanıcı bilgileri içermemesi gerektiğini unutmayın. XSS (Cross-Site Scripting) saldırılarına karşı, kullanıcı girdilerini doğrudan DOM'a yazarken her zaman dikkatli olun.

Karşılaştırmalı Yöntemler Tablosu

Yöntem Avantajı Dezavantajı
CSS Değişkenleri Hızlı ve performanslı Eski tarayıcı desteği yok
Sınıf Değiştirme (JS) Tam kontrol sağlar Daha fazla kod gerektirir

Sıkça Sorulan Sorular

Gece modu tercihi sayfa yenilenince neden gidiyor?

Bu durum, tercihin tarayıcı hafızasında tutulmamasından kaynaklanır. localStorage.setItem('theme', 'dark') kullanarak kullanıcının tercihini kaydedebilir ve sayfa yüklendiğinde bu değeri kontrol edebilirsiniz.

Bu yöntem mobil cihazlarda çalışır mı?

Evet, CSS medya sorguları (media queries) ile birleştirildiğinde mobil cihazlarda mükemmel çalışır. Dokunmatik ekranlar için label boyutunu biraz artırmanız önerilir.

Erişilebilirlik için ne yapmalıyım?

label etiketi içerisinde aria-label="Gece moduna geç" özniteliğini kullanmak, ekran okuyucu kullanan kullanıcılar için deneyimi iyileştirir.

CSS değişkenleri yerine neden doğrudan renk kullanmıyoruz?

CSS değişkenleri, tüm temayı tek bir yerden güncellemenize olanak tanır. 100 farklı CSS dosyasını tek tek düzenlemek yerine sadece :root kısmını değiştirmek büyük bir zaman tasarrufudur.

Kodlarım neden çalışmıyor?

Genellikle JavaScript dosyasının HTML'in en altında ( öncesinde) çağrılmaması veya ID isimlerinin eşleşmemesi kaynaklıdır. Tarayıcı konsolunu (F12) kontrol ederek hataları görebilirsiniz.

Sistem Temasına Otomatik Uyum Sağlama (prefers-color-scheme)

Kullanıcıların manuel olarak anahtara tıklamasını beklemeden, işletim sistemi düzeyindeki tercihlerini algılayarak web sitenizin temasını otomatik olarak ayarlamak, kullanıcı deneyimini bir üst seviyeye taşır. CSS @media sorguları, kullanıcının sistem ayarlarını (karanlık veya aydınlık mod) doğrudan okumamıza olanak tanır.

Aşağıdaki CSS kodu, kullanıcının işletim sistemi "karanlık mod" olarak ayarlıysa, web sitenizin otomatik olarak karanlık temaya geçmesini sağlar:

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

@media (prefers-color-scheme: light) {
  :root {
    --bg-color: #ffffff;
    --text-color: #121212;
  }
}

Bu yaklaşımı JavaScript ile birleştirdiğinizde, kullanıcı kendi özel tercihini yapana kadar sistem ayarlarını takip eden, tercih yaptıktan sonra ise kendi seçtiği temayı koruyan hibrit bir yapı oluşturmuş olursunuz.

Performans Optimizasyonu ve Geçiş Efektleri

Tema geçişleri sırasında yaşanan "titreme" (flicker) veya ani renk değişimleri, kullanıcı deneyimini olumsuz etkileyebilir. Özellikle sayfa ilk yüklendiğinde JavaScript'in çalışmasıyla oluşan gecikmeyi önlemek için CSS transition özelliğini stratejik kullanmalısınız.

Tüm öğeler üzerinde yumuşak bir geçiş sağlamak için şu CSS kuralını eklemek oldukça etkilidir:

body {
  transition: background-color 0.3s ease, color 0.3s ease;
}

Ancak, sayfa ilk yüklendiğinde bu geçişin tetiklenmemesi için preload sınıfı kullanmak yaygın bir tekniktir. Sayfa tam yüklendiğinde JavaScript ile bu sınıfı kaldırarak animasyonları aktif edebilirsiniz:

/* CSS */
.preload * {
  transition: none !important;
}

// JavaScript
window.addEventListener('load', () => {
  document.body.classList.remove('preload');
});

Performans İçin İleri İpuçları

  • CSS Değişkenlerini Kök Dizinde Tutun: Değişkenleri :root içerisinde tanımlamak, tarayıcının yeniden hesaplama (reflow) maliyetini düşürür.
  • DOM Manipülasyonunu Azaltın: Tema değişikliği için tüm sayfayı yeniden oluşturmak yerine, sadece body veya html etiketine bir sınıf (class) ekleyip çıkararak CSS değişkenlerini güncelleyin.
  • Görsel Varlıklar: Karanlık modda görsellerin parlaklığını azaltmak için filter: brightness(.8) contrast(1.2); özelliğini kullanarak görsellerin göz yormasını engelleyebilirsiniz.

Bu optimizasyonlar, sitenizin sadece işlevsel değil, aynı zamanda profesyonel ve akıcı bir hisse sahip olmasını sağlar. Özellikle düşük donanımlı mobil cihazlarda, gereksiz yeniden boyama (repaint) işlemlerinden kaçınmak, pil ömrü ve tarayıcı performansı üzerinde doğrudan olumlu etki yaratacaktır.

Sonuç

Html & Css ile özelleştirilebilir bir gece-gündüz geçiş anahtarı yapmak, hem modern web standartlarına uyum sağlamanızı hem de kullanıcılarınıza daha konforlu bir deneyim sunmanızı sağlar. Bu rehberde öğrendiğiniz değişken yönetimi ve DOM manipülasyonu teknikleri, gelecekte geliştireceğiniz daha karmaşık arayüzler için sağlam bir temel oluşturacaktır. Bir sonraki adım olarak, bu anahtarı localStorage ile kalıcı hale getirmeyi ve sistem temasına (işletim sistemi ayarları) otomatik uyum sağlayan prefers-color-scheme sorgularını araştırmanızı öneririm.

Sorumluluk Reddi: Bu rehberde sunulan kod örnekleri eğitim amaçlıdır. Üretim ortamında kullanmadan önce güvenlik açıklarını (özellikle kullanıcı girdisi içeren alanlarda) kontrol etmeli ve tarayıcı uyumluluk testlerini tamamlamalısınız.

Bu yazıya tepkinizi paylaşın:
Mert Demir

Hobi projeleri, küçük tamirat işleri ve bahçe bakımı konusunda deneyimli bir editörüm. Adım adım rehberlerimle okuyucularımın özgüvenli bir şekilde yeni beceriler kazanmasını amaçlıyorum.

Yorumlar (0)

Yorum Yaz