Takip et

JavaScript ile Geri Sayım Sayacı Nasıl Oluşturulur?

JavaScript ile Geri Sayım Sayacı Nasıl Oluşturulur? Geri sayım sayaçları, web sitelerinde ve uygulamalarda kullanıcıları belirli bir etkinl

JavaScript ile Geri Sayım Sayacı Nasıl Oluşturulur?

Geri sayım sayaçları, web sitelerinde ve uygulamalarda kullanıcıları belirli bir etkinliğe hazırlamak, bir teklifin süresinin dolduğunu belirtmek veya bir lansman tarihini duyurmak için yaygın olarak kullanılan dinamik arayüz öğeleridir. Etkinlik biletlerinin satışa çıkışına kalan süreden, yılbaşına kalan gün sayısına kadar birçok farklı senaryoda karşımıza çıkarlar. Bu makalede, JavaScript kullanarak sıfırdan kapsamlı bir geri sayım sayacı oluşturmanın tüm adımlarını, temel mantıktan gelişmiş özelliklere kadar detaylı bir şekilde inceleyeceğiz.

Giriş: Geri Sayım Sayaçları ve Kullanım Alanları

Geri sayım sayaçları, web geliştirmenin temel ve oldukça pratik bir parçasıdır. Kullanıcıların dikkatini çekme, aciliyet hissi yaratma ve önemli tarihleri vurgulama konusunda etkilidirler.

Kullanım Alanları:

* E-ticaret Siteleri: Flaş indirimlerin bitiş süresi, kampanyaların son günü.
* Etkinlik ve Lansman Sayfaları: Bir ürün lansmanı, konser veya konferans başlangıç tarihi.
* Webinar ve Canlı Yayın Duyuruları: Bir sonraki canlı yayının başlangıcına kalan süre.
* Oyunlar ve Yarışmalar: Bir turun bitimine veya bir görevin tamamlanmasına kalan süre.
* Bakım Modu Sayfaları: Bir web sitesinin tekrar aktif olacağı zamana kalan süre.

Bu sayaçları oluşturmak için JavaScript’in Date nesnesi, zamanlayıcı fonksiyonları (setInterval) ve temel matematiksel işlemlerden faydalanacağız.

Temel Kavramlar: Zaman ve JavaScript

Geri sayım sayacı oluşturmanın ilk adımı, JavaScript’in zamanla nasıl başa çıktığını anlamaktır. JavaScript’te zamanı yönetmek için ana araç Date nesnesidir.

Date Nesnesi

Date nesnesi, tarih ve saat bilgilerini depolamak ve manipüle etmek için kullanılır. Yeni bir Date nesnesi oluşturmanın birkaç yolu vardır:

* new Date(): Mevcut tarih ve saati içeren bir Date nesnesi oluşturur.
* new Date(year, month, day, hours, minutes, seconds, milliseconds): Belirli bir tarih ve saatle bir Date nesnesi oluşturur. Ay (month) 0’dan başlar (Ocak 0, Şubat 1 vb.).
* new Date(milliseconds): 1 Ocak 1970 UTC’den (Unix Epoch) itibaren geçen milisaniye sayısını kullanarak bir Date nesnesi oluşturur.
* new Date(dateString): Bir tarih dizesini (örn. “2023-12-31T23:59:59”) ayrıştırarak bir Date nesnesi oluşturur.

Geri sayım sayaçları için genellikle hedef tarihi belirli bir dize veya yıl, ay, gün formatında tanımlayacağız.

Zaman Dilimleri ve UTC

Zaman dilimleri, özellikle global uygulamalar geliştirirken önemli bir faktördür. JavaScript’in Date nesnesi, genellikle yerel zaman dilimini kullanır, ancak UTC (Coordinated Universal Time) değerlerini de alabilir ve ayarlayabiliriz.

* getTime(): 1 Ocak 1970 UTC’den bu yana geçen milisaniye sayısını döndürür. Bu, iki tarih arasındaki farkı hesaplamak için en güvenilir yöntemdir, çünkü zaman diliminden bağımsızdır.
* getUTCHours(), getUTCMinutes() vb.: UTC zamanına göre saat, dakika gibi değerleri döndürür.

Geri sayım sayaçlarında, genellikle hedef tarihi UTC olarak tanımlamak ve hesaplamaları da UTC üzerinden yapmak, farklı zaman dilimlerindeki kullanıcılar için tutarlılık sağlamanın iyi bir yoludur. Ancak, eğer sayaç belirli bir yerel etkinlik içinse, yerel zaman dilimini kullanmak daha uygun olabilir. Bu makalede, basitleştirmek adına genellikle yerel zaman dilimi üzerinden işlem yapacağız, ancak zaman dilimi farklılıklarının potansiyel bir sorun olduğunu unutmamak önemlidir.

Milisaniye Cinsinden Zaman

JavaScript’te zaman hesaplamalarının çoğu milisaniyeler üzerinden yapılır. Bir saniye 1000 milisaniyedir. Bu, bize zamanı çok hassas bir şekilde ölçme ve manipüle etme imkanı sunar.

* 1 saniye = 1000 milisaniye
1 dakika = 60 saniye = 60 1000 milisaniye
1 saat = 60 dakika = 60 60 * 1000 milisaniye
1 gün = 24 saat = 24 60 60 1000 milisaniye

Bu dönüşüm faktörleri, iki tarih arasındaki milisaniye farkını gün, saat, dakika ve saniyeye çevirirken kritik öneme sahip olacaktır.

Geri Sayım Mantığı: Hedef Tarih ve Fark

Geri sayım sayacının temel mantığı, bir hedef tarih ile mevcut tarih arasındaki farkı sürekli olarak hesaplamaktır.

Hedef Tarih Belirleme

Öncelikle, geri sayımın biteceği bir hedef tarih belirlememiz gerekiyor. Bu, gelecekteki herhangi bir tarih ve saat olabilir.

// Yıl, Ay (0-11), Gün, Saat, Dakika, Saniye formatında
const hedefTarih = new Date(2024, 11, 31, 23, 59, 59); // 31 Aralık 2024, 23:59:59

// Veya bir tarih dizesi olarak (daha esnek)
// const hedefTarih = new Date("Dec 31, 2024 23:59:59");

// Veya ISO formatında
// const hedefTarih = new Date("2024-12-31T23:59:59");

Date nesnesinin ay parametresinin 0’dan başladığını unutmamak önemlidir (Ocak 0, Aralık 11).

Güncel Tarih Alma

Geri sayımın her güncellemesinde, o anki güncel tarihi ve saati almamız gerekecek.

const simdi = new Date(); // Mevcut tarih ve saat

İki Tarih Arasındaki Farkı Hesaplama

Hedef tarih ile güncel tarih arasındaki farkı milisaniye cinsinden hesaplamak için getTime() metodunu kullanırız. Bu metod, 1 Ocak 1970 UTC’den bu yana geçen milisaniye sayısını döndürür.

const farkMilisaniye = hedefTarih.getTime() - simdi.getTime();

Eğer farkMilisaniye pozitifse, hedef tarihe daha zaman var demektir. Eğer sıfır veya negatifse, hedef tarih geçmiş demektir ve geri sayım bitmiştir.

Farkı Bileşenlerine Ayırma: Gün, Saat, Dakika, Saniye

Milisaniye cinsinden elde ettiğimiz farkı, kullanıcıların anlayabileceği gün, saat, dakika ve saniye birimlerine çevirmemiz gerekiyor. Bu, temel matematiksel bölme ve modulo (kalan) operatörleri ile yapılır.

Matematiksel İşlemler

Yukarıda bahsettiğimiz dönüşüm faktörlerini kullanarak hesaplamaları yapacağız:

const birSaniye = 1000;
const birDakika = birSaniye * 60;
const birSaat = birDakika * 60;
const birGun = birSaat * 24;

// Kalan günleri hesapla
const gunler = Math.floor(farkMilisaniye / birGun);

// Kalan saatleri hesapla (günlerden arta kalan milisaniyeler içinde)
const saatler = Math.floor((farkMilisaniye % birGun) / birSaat);

// Kalan dakikaları hesapla (saatlerden arta kalan milisaniyeler içinde)
const dakikalar = Math.floor((farkMilisaniye % birSaat) / birDakika);

// Kalan saniyeleri hesapla (dakikalardan arta kalan milisaniyeler içinde)
const saniyeler = Math.floor((farkMilisaniye % birDakika) / birSaniye);

Bu hesaplamalar, bize her bir zaman birimi için tam sayı değerlerini verecektir.

Sıfır Ön Eki Ekleme (Padding Zeroes)

Tek haneli sayıları (örn. 5 saniye) “05” şeklinde çift haneli göstermek, sayacın daha estetik ve okunabilir olmasını sağlar. Bunu yapmak için basit bir koşullu ifade veya padStart() dize metodu kullanılabilir.

function ikiHaneYap(sayi) {
    return sayi < 10 ? '0' + sayi : sayi;
}

// Kullanımı:
// const gosterilecekSaat = ikiHaneYap(saatler);
// const gosterilecekDakika = ikiHaneYap(dakikalar);
// const gosterilecekSaniye = ikiHaneYap(saniyeler);

// Alternatif ve modern yol: String.prototype.padStart()
// const gosterilecekSaat = String(saatler).padStart(2, '0');

padStart(2, '0') metodu, sayıyı bir dizeye dönüştürür ve eğer dize 2 karakterden kısaysa başına '0' ekleyerek 2 karaktere tamamlar.

HTML Yapısı: Sayacın Görüntüleneceği Alan

Geri sayım sayacının değerlerini web sayfasında gösterebilmek için uygun bir HTML yapısına ihtiyacımız var. Genellikle, her zaman birimi için ayrı bir veya

elementi kullanmak ve bunlara benzersiz ID'ler atamak iyi bir yaklaşımdır.

Basit Bir HTML Şablonu

00
Gün
00
Saat
00
Dakika
00
Saniye
Geri sayım sona erdi!

Bu yapı, her bir zaman birimini ayrı ayrı güncelleyebilmemizi sağlar. geriSayimBittiMesaji elementi, sayaç bittiğinde gösterilecek bir mesaj için yer tutar.

CSS ile Stil Belirleme (Opsiyonel ama iyi olur)

Sayacın daha iyi görünmesi için basit bir CSS ekleyebiliriz. Bu, makalenin ana konusu olmasa da, kullanıcı deneyimi açısından önemlidir.

#geriSayimSayaci {
    display: flex;
    justify-content: center;
    align-items: center;
    gap: 20px;
    font-family: Arial, sans-serif;
    margin-top: 50px;
}

.zaman-birimi {
    text-align: center;
    background-color: #f0f0f0;
    padding: 15px 20px;
    border-radius: 8px;
    box-shadow: 0 2px 5px rgba(0,0,0,0.1);
}

.zaman-birimi span {
    display: block;
    font-size: 3em;
    font-weight: bold;
    color: #333;
}

.zaman-birimi .etiket {
    font-size: 0.9em;
    color: #666;
    margin-top: 5px;
}

#geriSayimBittiMesaji {
    text-align: center;
    margin-top: 30px;
    font-size: 1.5em;
    color: #e44d26;
    font-weight: bold;
}

JavaScript Kodu: Adım Adım Oluşturma

Şimdiye kadar öğrendiğimiz tüm parçaları bir araya getirerek JavaScript kodunu yazmaya başlayabiliriz.

Değişken Tanımlamaları

Öncelikle, hedef tarihi ve HTML elementlerini referans alacak değişkenleri tanımlayalım.

// Hedef tarihi belirle
const hedefTarih = new Date("Dec 31, 2024 23:59:59").getTime(); // Milisaniye cinsinden alıyoruz

// HTML elementlerini seç
const gunlerEl = document.getElementById('gunler');
const saatlerEl = document.getElementById('saatler');
const dakikalarEl = document.getElementById('dakikalar');
const saniyelerEl = document.getElementById('saniyeler');
const geriSayimBittiMesajiEl = document.getElementById('geriSayimBittiMesaji');
const geriSayimSayaciEl = document.getElementById('geriSayimSayaci');

// Zaman birimleri için milisaniye değerleri
const birSaniye = 1000;
const birDakika = birSaniye * 60;
const birSaat = birDakika * 60;
const birGun = birSaat * 24;

updateCountdown Fonksiyonu

Geri sayım mantığını içeren ana fonksiyonu oluşturalım. Bu fonksiyon, her saniye çağrılacak ve sayaç değerlerini güncelleyecektir.

function ikiHaneYap(sayi) {
    return String(sayi).padStart(2, '0');
}

function updateCountdown() {
    const simdi = new Date().getTime(); // Mevcut zamanı milisaniye cinsinden al
    const farkMilisaniye = hedefTarih - simdi;

    // Geri sayım bittiyse
    if (farkMilisaniye < 0) {
        clearInterval(sayacInterval); // Zamanlayıcıyı durdur
        geriSayimSayaciEl.style.display = 'none'; // Sayacı gizle
        geriSayimBittiMesajiEl.style.display = 'block'; // Bitti mesajını göster
        return; // Fonksiyondan çık
    }

    // Zaman farkını hesapla
    const gunler = Math.floor(farkMilisaniye / birGun);
    const saatler = Math.floor((farkMilisaniye % birGun) / birSaat);
    const dakikalar = Math.floor((farkMilisaniye % birSaat) / birDakika);
    const saniyeler = Math.floor((farkMilisaniye % birDakika) / birSaniye);

    // HTML elementlerini güncelle
    gunlerEl.innerHTML = ikiHaneYap(gunler);
    saatlerEl.innerHTML = ikiHaneYap(saatler);
    dakikalarEl.innerHTML = ikiHaneYap(dakikalar);
    saniyelerEl.innerHTML = ikiHaneYap(saniyeler);
}

setInterval Kullanımı

updateCountdown fonksiyonunun her saniye çalışmasını sağlamak için setInterval metodunu kullanacağız. Bu metod, belirli bir aralıkta (milisaniye cinsinden) bir fonksiyonu tekrar tekrar yürütür.

// Sayacı hemen bir kere güncelle (ilk yüklemede doğru değerleri göstermek için)
updateCountdown();

// Her saniye güncellemek için setInterval kullan
const sayacInterval = setInterval(updateCountdown, 1000); // Her 1000 milisaniyede (1 saniye) bir çalıştır

setInterval'ın döndürdüğü değeri bir değişkende saklamak önemlidir, böylece geri sayım bittiğinde clearInterval() ile zamanlayıcıyı durdurabiliriz. Aksi takdirde, sayaç negatif değerlerle çalışmaya devam eder ve gereksiz kaynak tüketir.

Sayacın Bitmesi Durumu

updateCountdown fonksiyonunun içinde, farkMilisaniye değerinin sıfırın altına düşüp düşmediğini kontrol ediyoruz. Eğer düşerse, clearInterval ile zamanlayıcıyı durduruyor, sayaç elementini gizliyor ve "geri sayım sona erdi" mesajını görünür hale getiriyoruz.

Bu, temel bir geri sayım sayacının eksiksiz JavaScript kodudur.

Gelişmiş Özellikler ve İyileştirmeler

Temel sayacı oluşturduktan sonra, kullanıcı deneyimini ve işlevselliği artırmak için bazı gelişmiş özellikler ekleyebiliriz.

Dinamik Hedef Tarih Belirleme

Hedef tarihi sabit kodlamak yerine, kullanıcıdan girdi alarak, bir API'den çekerek veya URL parametrelerinden okuyarak dinamik hale getirebiliriz.

* Kullanıcı Girişi: Bir form aracılığıyla kullanıcıdan tarih ve saat girmesini isteyebiliriz.
* API Entegrasyonu: Bir etkinlik yönetim sistemi veya takvim API'sinden etkinlik tarihlerini çekebiliriz.
* URL Parametreleri: ?targetDate=2025-01-01T00:00:00 gibi URL parametreleri kullanarak hedef tarihi dinamik olarak ayarlayabiliriz.

// Örnek: URL'den hedef tarihi okuma
function getTargetDateFromUrl() {
    const urlParams = new URLSearchParams(window.location.search);
    const dateString = urlParams.get('targetDate');
    if (dateString) {
        const parsedDate = new Date(dateString);
        if (!isNaN(parsedDate.getTime())) { // Geçerli bir tarih mi kontrol et
            return parsedDate.getTime();
        }
    }
    return new Date("Dec 31, 2024 23:59:59").getTime(); // Varsayılan tarih
}

const hedefTarih = getTargetDateFromUrl();

Duraklatma ve Devam Ettirme

Bazı durumlarda, geri sayımı duraklatma ve daha sonra devam ettirme işlevselliği gerekebilir. Bu, clearInterval ve setInterval'ı doğru zamanda çağırarak yapılabilir.

let isPaused = false;
let kalanMilisaniye = 0; // Duraklatıldığında kalan süreyi saklamak için

function togglePause() {
    if (isPaused) {
        // Devam et
        isPaused = false;
        // Kalan süreden yeni hedef tarihi hesapla
        hedefTarih = new Date().getTime() + kalanMilisaniye;
        sayacInterval = setInterval(updateCountdown, 1000);
    } else {
        // Duraklat
        isPaused = true;
        clearInterval(sayacInterval);
        const simdi = new Date().getTime();
        kalanMilisaniye = hedefTarih - simdi; // Kalan süreyi kaydet
    }
}

Bu, duraklatma ve devam ettirme işlevselliğini eklemek için temel bir yaklaşımdır.

Geri Sayım Bittiğinde Yapılacaklar (Callback Fonksiyonları)

Geri sayım sona erdiğinde belirli bir eylemi tetiklemek (örn. bir pop-up göstermek, bir sayfayı yeniden yüklemek) için bir callback fonksiyonu kullanabiliriz.

function geriSayimBittiCallback() {
    console.log("Geri sayım sona erdi! Şimdi bir şeyler yapabiliriz.");
    // alert("Kampanya bitti!");
    // window.location.reload();
}

function updateCountdown() {
    // ... (önceki kod) ...

    if (farkMilisaniye < 0) {
        clearInterval(sayacInterval);
        geriSayimSayaciEl.style.display = 'none';
        geriSayimBittiMesajiEl.style.display = 'block';
        geriSayimBittiCallback(); // Callback fonksiyonunu çağır
        return;
    }
    // ... (kalan kod) ...
}

Kullanıcı Deneyimi İyileştirmeleri (Animasyonlar, Sesler)

Geri sayım sayacını daha çekici hale getirmek için animasyonlar veya ses efektleri eklenebilir.

* CSS Animasyonları: Sayılar değiştiğinde hafif bir geçiş veya büyüme/küçülme efekti eklenebilir.
* Ses Efektleri: Son saniyelerde bip sesi veya geri sayım bittiğinde bir zil sesi çalınabilir.
* Görsel Geri Bildirim: Son dakikalarda sayının rengini değiştirmek gibi görsel ipuçları kullanılabilir.

Farklı Formatlarda Görüntüleme

Bazı durumlarda sadece saat:dakika:saniye göstermek isteyebiliriz, veya günler yerine toplam saatleri göstermek isteyebiliriz. Hesaplama mantığını buna göre ayarlamak yeterlidir.

// Sadece saat:dakika:saniye gösterimi için
// gunler hesaplamasını atla
// saatler = Math.floor(farkMilisaniye / birSaat); // Toplam saatleri hesapla
// dakikalar = Math.floor((farkMilisaniye % birSaat) / birDakika);
// saniyeler = Math.floor((farkMilisaniye % birDakika) / birSaniye);

Mobil Uyumluluk ve Performans

Sayacın farklı ekran boyutlarında iyi görünmesini sağlamak için duyarlı CSS kullanmak önemlidir. Ayrıca, JavaScript kodunun performansı, özellikle çok sayıda sayaç veya karmaşık animasyonlar kullanılıyorsa, göz önünde bulundurulmalıdır. setInterval yerine requestAnimationFrame kullanmak daha akıcı animasyonlar sağlayabilir, ancak zamanlayıcılar için setInterval genellikle yeterlidir.

Potansiyel Sorunlar ve Çözümleri

Geri sayım sayaçları oluştururken karşılaşılabilecek bazı yaygın sorunlar ve bunların çözümleri şunlardır:

Zaman Dilimi Farklılıkları

* Sorun: Hedef tarih, geliştiricinin yerel zaman diliminde ayarlanır, ancak kullanıcı farklı bir zaman diliminde olduğunda sayaç yanlış görünür. Örneğin, Türkiye'de 1 Ocak 2025 00:00'a ayarlanan bir sayaç, ABD'deki bir kullanıcı için 31 Aralık 2024 akşamı bitebilir.
* Çözüm: Hedef tarihi her zaman UTC olarak tanımlayın ve hesaplamaları da UTC üzerinden yapın. new Date("2025-01-01T00:00:00Z") gibi ISO 8601 formatında 'Z' (Zulu time, yani UTC) belirteci kullanmak veya Date.UTC() metodunu kullanmak bu sorunu çözer. Ancak, eğer sayaç belirli bir yerel etkinlik içinse, hedef tarihi yerel olarak belirlemek ve kullanıcının tarayıcısının yerel zaman dilimini kullanmasına izin vermek daha uygun olabilir. Bu durumda, kullanıcılar arasındaki zaman dilimi farkının bilincinde olunmalıdır.

Sayfa Yenileme Sorunları (localStorage kullanımı)

* Sorun: Eğer geri sayım sayacı bir oturumla ilgiliyse (örn. bir quiz için kalan süre), sayfa yenilendiğinde sayaç sıfırlanabilir.
* Çözüm: localStorage veya sessionStorage kullanarak sayaç durumunu (başlangıç zamanı, kalan süre vb.) kaydedin. Sayfa yüklendiğinde, depolanan verileri kontrol edin ve geri sayımı kaldığı yerden devam ettirin.

// Örnek: Başlangıç zamanını kaydetme
const baslangicZamaniKey = 'quizBaslangicZamani';
let baslangicZamani = localStorage.getItem(baslangicZamaniKey);

if (!baslangicZamani) {
    baslangicZamani = new Date().getTime();
    localStorage.setItem(baslangicZamaniKey, baslangicZamani);
}

// Hedef tarihi buna göre ayarla (örn. 10 dakika sonra)
const hedefTarih = parseInt(baslangicZamani) + (10 * birDakika);

Performans Optimizasyonu

* Sorun: Çok sayıda geri sayım sayacı veya karmaşık animasyonlar, özellikle eski cihazlarda performansı düşürebilir.
* Çözüm:
* Sadece güncellenmesi gereken DOM elemanlarını güncelleyin.
* Gereksiz hesaplamalardan kaçının.
* requestAnimationFrame animasyonlar için daha akıcı bir deneyim sunsa da, saniyelik güncellemeler için setInterval genellikle yeterlidir.
* Sayfa dışına çıktığında zamanlayıcıyı duraklatmak için document.hidden veya visibilitychange olaylarını kullanabilirsiniz.

Kullanıcı Tarafındaki Saat Ayarları

* Sorun: Kullanıcı, bilgisayarının saatini manuel olarak değiştirirse, geri sayım sayacı yanlış çalışabilir.
* Çözüm: Bu, istemci tarafı JavaScript ile tamamen çözülemeyen bir sorundur. Önemli uygulamalarda, sunucu tarafında bir zaman damgası almak ve istemci tarafındaki hesaplamaları buna göre ayarlamak daha güvenilirdir. Ancak çoğu web tabanlı geri sayım sayacı için bu genellikle kabul edilebilir bir risktir.

Örnek Uygulama: Adım Adım Tam Bir Kod

Şimdiye kadar öğrendiklerimizi birleştirerek tam, çalışır bir örnek oluşturalım.

HTML Kodu (index.html)




    
    
    JavaScript Geri Sayım Sayacı
    


    

Yeni Yıla Kalan Süre

00
Gün
00
Saat
00
Dakika
00
Saniye
Mutlu Yıllar! Geri sayım sona erdi!

JavaScript Kodu (script.js)

// Hedef tarihi belirle (Örn: Bir sonraki yılbaşı)
// Yıl, Ay (0-11), Gün, Saat, Dakika, Saniye
// Yeni Yıl için bir sonraki 1 Ocak 00:00:00
function getNextNewYear() {
    const now = new Date();
    let year = now.getFullYear();
    if (now.getMonth() === 0 && now.getDate() === 1 && now.getHours() === 0 && now.getMinutes() === 0 && now.getSeconds() === 0) {
        // Eğer şu an tam yeni yıl ise, bir sonraki yılbaşını hedefle
        year++;
    } else if (now.getMonth() === 11 && now.getDate() === 31 && now.getHours() === 23 && now.getMinutes() === 59 && now.getSeconds() === 59) {
        // Eğer şu an tam yılbaşı gecesinin son saniyesi ise, bir sonraki yılbaşını hedefle
        year++;
    } else if (now.getMonth() === 0 && now.getDate() > 1) {
        // Eğer yeni yılın ilk günlerinden sonra isek, bir sonraki yılbaşını hedefle
        year++;
    }
    return new Date(year, 0, 1, 0, 0, 0).getTime();
}

const hedefTarih = getNextNewYear();

// HTML elementlerini seç
const gunlerEl = document.getElementById('gunler');
const saatlerEl = document.getElementById('saatler');
const dakikalarEl = document.getElementById('dakikalar');
const saniyelerEl = document.getElementById('saniyeler');
const geriSayimBittiMesajiEl = document.getElementById('geriSayimBittiMesaji');
const geriSayimSayaciEl = document.getElementById('geriSayimSayaci');

// Zaman birimleri için milisaniye değerleri
const birSaniye = 1000;
const birDakika = birSaniye * 60;
const birSaat = birDakika * 60;
const birGun = birSaat * 24;

// Sayıları iki haneli formatta göstermek için yardımcı fonksiyon
function ikiHaneYap(sayi) {
    return String(sayi).padStart(2, '0');
}

// Geri sayımı güncelleyen ana fonksiyon
function updateCountdown() {
    const simdi = new Date().getTime(); // Mevcut zamanı milisaniye cinsinden al
    let farkMilisaniye = hedefTarih - simdi;

    // Geri sayım bittiyse
    if (farkMilisaniye < 0) {
        clearInterval(sayacInterval); // Zamanlayıcıyı durdur
        geriSayimSayaciEl.style.display = 'none'; // Sayacı gizle
        geriSayimBittiMesajiEl.style.display = 'block'; // Bitti mesajını göster
        // İsteğe bağlı: Geri sayım bittiğinde yapılacak ek işlemler
        // console.log("Geri sayım sona erdi!");
        return; // Fonksiyondan çık
    }

    // Zaman farkını hesapla
    const gunler = Math.floor(farkMilisaniye / birGun);
    farkMilisaniye %= birGun; // Kalan milisaniyeleri güncelle

    const saatler = Math.floor(farkMilisaniye / birSaat);
    farkMilisaniye %= birSaat;

    const dakikalar = Math.floor(farkMilisaniye / birDakika);
    farkMilisaniye %= birDakika;

    const saniyeler = Math.floor(farkMilisaniye / birSaniye);

    // HTML elementlerini güncelle
    gunlerEl.innerHTML = ikiHaneYap(gunler);
    saatlerEl.innerHTML = ikiHaneYap(saatler);
    dakikalarEl.innerHTML = ikiHaneYap(dakikalar);
    saniyelerEl.innerHTML = ikiHaneYap(saniyeler);
}

// Sayacı hemen bir kere güncelle (ilk yüklemede doğru değerleri göstermek için)
updateCountdown();

// Her saniye güncellemek için setInterval kullan
const sayacInterval = setInterval(updateCountdown, 1000); // Her 1000 milisaniyede (1 saniye) bir çalıştır

// Sayfa gizlendiğinde veya kapatıldığında performansı optimize etmek için
document.addEventListener('visibilitychange', () => {
    if (document.hidden) {
        clearInterval(sayacInterval);
    } else {
        // Sayfa tekrar görünür olduğunda, zamanı yeniden senkronize et ve devam et
        // Bu, sekme değiştirildiğinde veya bilgisayar uykuya geçtiğinde zamanın kaymasını önler.
        updateCountdown();
        clearInterval(sayacInterval); // Eski interval'ı temizle
        sayacInterval = setInterval(updateCountdown, 1000);
    }
});

Bu örnek, CSS ile stil verilmiş, dinamik olarak bir sonraki yeni yılı hedefleyen ve sayfa görünürlüğü değiştiğinde performansı optimize eden eksiksiz bir geri sayım sayacı sunmaktadır. getNextNewYear fonksiyonu, mevcut tarihe göre akıllıca bir sonraki yılbaşını bulur. farkMilisaniye %= birGun; gibi modulo atamaları, kalan milisaniyeler üzerinden daha doğru hesaplamalar yapılmasını sağlar.

Sonuç

JavaScript ile geri sayım sayacı oluşturmak, Date nesnesinin gücünü, setInterval zamanlayıcısını ve temel matematiksel işlemleri bir araya getiren nispeten basit ama oldukça kullanışlı bir beceridir. Bu makalede, bir geri sayım sayacının temel mantığını adım adım öğrendik, gerekli HTML ve CSS yapılarını inceledik ve kapsamlı bir JavaScript çözümü oluşturduk.

Ayrıca, zaman dilimi farklılıkları, sayfa yenileme durumları ve performans gibi potansiyel sorunlara değinerek ve dinamik hedef tarih belirleme, duraklatma/devam ettirme ve callback fonksiyonları gibi gelişmiş özellikleri tartışarak, daha sağlam ve kullanıcı dostu sayaçlar inşa etme yollarını keşfettik.

Artık bu bilgileri kullanarak kendi web projelerinizde etkili ve işlevsel geri sayım sayaçları oluşturmaya hazırsınız. Unutmayın, pratik yapmak ve farklı senaryoları denemek, JavaScript yeteneklerinizi geliştirmenin en iyi yoludur.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.