{"id":37423,"date":"2026-01-04T08:40:51","date_gmt":"2026-01-04T05:40:51","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37423"},"modified":"2026-01-04T08:40:51","modified_gmt":"2026-01-04T05:40:51","slug":"javascript-ile-geri-sayim-sayaci-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/","title":{"rendered":"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<p><body><\/p>\n<h2>JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Geri say\u0131m saya\u00e7lar\u0131, web sitelerinde ve uygulamalarda kullan\u0131c\u0131lar\u0131 belirli bir etkinli\u011fe haz\u0131rlamak, bir teklifin s\u00fcresinin doldu\u011funu belirtmek veya bir lansman tarihini duyurmak i\u00e7in yayg\u0131n olarak kullan\u0131lan dinamik aray\u00fcz \u00f6\u011feleridir. Etkinlik biletlerinin sat\u0131\u015fa \u00e7\u0131k\u0131\u015f\u0131na kalan s\u00fcreden, y\u0131lba\u015f\u0131na kalan g\u00fcn say\u0131s\u0131na kadar bir\u00e7ok farkl\u0131 senaryoda kar\u015f\u0131m\u0131za \u00e7\u0131karlar. Bu makalede, JavaScript kullanarak s\u0131f\u0131rdan kapsaml\u0131 bir geri say\u0131m sayac\u0131 olu\u015fturman\u0131n t\u00fcm ad\u0131mlar\u0131n\u0131, temel mant\u0131ktan geli\u015fmi\u015f \u00f6zelliklere kadar detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Giri\u015f: Geri Say\u0131m Saya\u00e7lar\u0131 ve Kullan\u0131m Alanlar\u0131<\/h3>\n<p>Geri say\u0131m saya\u00e7lar\u0131, web geli\u015ftirmenin temel ve olduk\u00e7a pratik bir par\u00e7as\u0131d\u0131r. Kullan\u0131c\u0131lar\u0131n dikkatini \u00e7ekme, aciliyet hissi yaratma ve \u00f6nemli tarihleri vurgulama konusunda etkilidirler.<\/p>\n<h4>Kullan\u0131m Alanlar\u0131:<\/h4>\n<p>*   <strong>E-ticaret Siteleri:<\/strong> Fla\u015f indirimlerin biti\u015f s\u00fcresi, kampanyalar\u0131n son g\u00fcn\u00fc.<br \/>\n*   <strong>Etkinlik ve Lansman Sayfalar\u0131:<\/strong> Bir \u00fcr\u00fcn lansman\u0131, konser veya konferans ba\u015flang\u0131\u00e7 tarihi.<br \/>\n*   <strong>Webinar ve Canl\u0131 Yay\u0131n Duyurular\u0131:<\/strong> Bir sonraki canl\u0131 yay\u0131n\u0131n ba\u015flang\u0131c\u0131na kalan s\u00fcre.<br \/>\n*   <strong>Oyunlar ve Yar\u0131\u015fmalar:<\/strong> Bir turun bitimine veya bir g\u00f6revin tamamlanmas\u0131na kalan s\u00fcre.<br \/>\n*   <strong>Bak\u0131m Modu Sayfalar\u0131:<\/strong> Bir web sitesinin tekrar aktif olaca\u011f\u0131 zamana kalan s\u00fcre.<\/p>\n<p>Bu saya\u00e7lar\u0131 olu\u015fturmak i\u00e7in JavaScript&#8217;in <code>Date<\/code> nesnesi, zamanlay\u0131c\u0131 fonksiyonlar\u0131 (<code>setInterval<\/code>) ve temel matematiksel i\u015flemlerden faydalanaca\u011f\u0131z.<\/p>\n<h3>Temel Kavramlar: Zaman ve JavaScript<\/h3>\n<p>Geri say\u0131m sayac\u0131 olu\u015fturman\u0131n ilk ad\u0131m\u0131, JavaScript&#8217;in zamanla nas\u0131l ba\u015fa \u00e7\u0131kt\u0131\u011f\u0131n\u0131 anlamakt\u0131r. JavaScript&#8217;te zaman\u0131 y\u00f6netmek i\u00e7in ana ara\u00e7 <code>Date<\/code> nesnesidir.<\/p>\n<h4><code>Date<\/code> Nesnesi<\/h4>\n<p><code>Date<\/code> nesnesi, tarih ve saat bilgilerini depolamak ve manip\u00fcle etmek i\u00e7in kullan\u0131l\u0131r. Yeni bir <code>Date<\/code> nesnesi olu\u015fturman\u0131n birka\u00e7 yolu vard\u0131r:<\/p>\n<p>*   <strong><code>new Date()<\/code>:<\/strong> Mevcut tarih ve saati i\u00e7eren bir <code>Date<\/code> nesnesi olu\u015fturur.<br \/>\n*   <strong><code>new Date(year, month, day, hours, minutes, seconds, milliseconds)<\/code>:<\/strong> Belirli bir tarih ve saatle bir <code>Date<\/code> nesnesi olu\u015fturur. Ay (month) 0&#8217;dan ba\u015flar (Ocak 0, \u015eubat 1 vb.).<br \/>\n*   <strong><code>new Date(milliseconds)<\/code>:<\/strong> 1 Ocak 1970 UTC&#8217;den (Unix Epoch) itibaren ge\u00e7en milisaniye say\u0131s\u0131n\u0131 kullanarak bir <code>Date<\/code> nesnesi olu\u015fturur.<br \/>\n*   <strong><code>new Date(dateString)<\/code>:<\/strong> Bir tarih dizesini (\u00f6rn. &#8220;2023-12-31T23:59:59&#8221;) ayr\u0131\u015ft\u0131rarak bir <code>Date<\/code> nesnesi olu\u015fturur.<\/p>\n<p>Geri say\u0131m saya\u00e7lar\u0131 i\u00e7in genellikle hedef tarihi belirli bir dize veya y\u0131l, ay, g\u00fcn format\u0131nda tan\u0131mlayaca\u011f\u0131z.<\/p>\n<h4>Zaman Dilimleri ve UTC<\/h4>\n<p>Zaman dilimleri, \u00f6zellikle global uygulamalar geli\u015ftirirken \u00f6nemli bir fakt\u00f6rd\u00fcr. JavaScript&#8217;in <code>Date<\/code> nesnesi, genellikle yerel zaman dilimini kullan\u0131r, ancak UTC (Coordinated Universal Time) de\u011ferlerini de alabilir ve ayarlayabiliriz.<\/p>\n<p>*   <strong><code>getTime()<\/code>:<\/strong> 1 Ocak 1970 UTC&#8217;den bu yana ge\u00e7en milisaniye say\u0131s\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr. Bu, iki tarih aras\u0131ndaki fark\u0131 hesaplamak i\u00e7in en g\u00fcvenilir y\u00f6ntemdir, \u00e7\u00fcnk\u00fc zaman diliminden ba\u011f\u0131ms\u0131zd\u0131r.<br \/>\n*   <strong><code>getUTCHours()<\/code>, <code>getUTCMinutes()<\/code> vb.:<\/strong> UTC zaman\u0131na g\u00f6re saat, dakika gibi de\u011ferleri d\u00f6nd\u00fcr\u00fcr.<\/p>\n<p>Geri say\u0131m saya\u00e7lar\u0131nda, genellikle hedef tarihi UTC olarak tan\u0131mlamak ve hesaplamalar\u0131 da UTC \u00fczerinden yapmak, farkl\u0131 zaman dilimlerindeki kullan\u0131c\u0131lar i\u00e7in tutarl\u0131l\u0131k sa\u011flaman\u0131n iyi bir yoludur. Ancak, e\u011fer saya\u00e7 belirli bir yerel etkinlik i\u00e7inse, yerel zaman dilimini kullanmak daha uygun olabilir. Bu makalede, basitle\u015ftirmek ad\u0131na genellikle yerel zaman dilimi \u00fczerinden i\u015flem yapaca\u011f\u0131z, ancak zaman dilimi farkl\u0131l\u0131klar\u0131n\u0131n potansiyel bir sorun oldu\u011funu unutmamak \u00f6nemlidir.<\/p>\n<h4>Milisaniye Cinsinden Zaman<\/h4>\n<p>JavaScript&#8217;te zaman hesaplamalar\u0131n\u0131n \u00e7o\u011fu milisaniyeler \u00fczerinden yap\u0131l\u0131r. Bir saniye 1000 milisaniyedir. Bu, bize zaman\u0131 \u00e7ok hassas bir \u015fekilde \u00f6l\u00e7me ve manip\u00fcle etme imkan\u0131 sunar.<\/p>\n<p>*   <strong>1 saniye = 1000 milisaniye<\/strong><br \/>\n<em>   <strong>1 dakika = 60 saniye = 60 <\/em> 1000 milisaniye<\/strong><br \/>\n<em>   <strong>1 saat = 60 dakika = 60 <\/em> 60 * 1000 milisaniye<\/strong><br \/>\n<em>   <strong>1 g\u00fcn = 24 saat = 24 <\/em> 60 <em> 60 <\/em> 1000 milisaniye<\/strong><\/p>\n<p>Bu d\u00f6n\u00fc\u015f\u00fcm fakt\u00f6rleri, iki tarih aras\u0131ndaki milisaniye fark\u0131n\u0131 g\u00fcn, saat, dakika ve saniyeye \u00e7evirirken kritik \u00f6neme sahip olacakt\u0131r.<\/p>\n<h3>Geri Say\u0131m Mant\u0131\u011f\u0131: Hedef Tarih ve Fark<\/h3>\n<p>Geri say\u0131m sayac\u0131n\u0131n temel mant\u0131\u011f\u0131, bir hedef tarih ile mevcut tarih aras\u0131ndaki fark\u0131 s\u00fcrekli olarak hesaplamakt\u0131r.<\/p>\n<h4>Hedef Tarih Belirleme<\/h4>\n<p>\u00d6ncelikle, geri say\u0131m\u0131n bitece\u011fi bir hedef tarih belirlememiz gerekiyor. Bu, gelecekteki herhangi bir tarih ve saat olabilir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Y\u0131l, Ay (0-11), G\u00fcn, Saat, Dakika, Saniye format\u0131nda\nconst hedefTarih = new Date(2024, 11, 31, 23, 59, 59); \/\/ 31 Aral\u0131k 2024, 23:59:59\n\n\/\/ Veya bir tarih dizesi olarak (daha esnek)\n\/\/ const hedefTarih = new Date(\"Dec 31, 2024 23:59:59\");\n\n\/\/ Veya ISO format\u0131nda\n\/\/ const hedefTarih = new Date(\"2024-12-31T23:59:59\");<\/code><\/pre>\n<p><code>Date<\/code> nesnesinin ay parametresinin 0&#8217;dan ba\u015flad\u0131\u011f\u0131n\u0131 unutmamak \u00f6nemlidir (Ocak 0, Aral\u0131k 11).<\/p>\n<h4>G\u00fcncel Tarih Alma<\/h4>\n<p>Geri say\u0131m\u0131n her g\u00fcncellemesinde, o anki g\u00fcncel tarihi ve saati almam\u0131z gerekecek.<\/p>\n<pre><code class=\"language-javascript\">const simdi = new Date(); \/\/ Mevcut tarih ve saat<\/code><\/pre>\n<h4>\u0130ki Tarih Aras\u0131ndaki Fark\u0131 Hesaplama<\/h4>\n<p>Hedef tarih ile g\u00fcncel tarih aras\u0131ndaki fark\u0131 milisaniye cinsinden hesaplamak i\u00e7in <code>getTime()<\/code> metodunu kullan\u0131r\u0131z. Bu metod, 1 Ocak 1970 UTC&#8217;den bu yana ge\u00e7en milisaniye say\u0131s\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">const farkMilisaniye = hedefTarih.getTime() - simdi.getTime();<\/code><\/pre>\n<p>E\u011fer <code>farkMilisaniye<\/code> pozitifse, hedef tarihe daha zaman var demektir. E\u011fer s\u0131f\u0131r veya negatifse, hedef tarih ge\u00e7mi\u015f demektir ve geri say\u0131m bitmi\u015ftir.<\/p>\n<h3>Fark\u0131 Bile\u015fenlerine Ay\u0131rma: G\u00fcn, Saat, Dakika, Saniye<\/h3>\n<p>Milisaniye cinsinden elde etti\u011fimiz fark\u0131, kullan\u0131c\u0131lar\u0131n anlayabilece\u011fi g\u00fcn, saat, dakika ve saniye birimlerine \u00e7evirmemiz gerekiyor. Bu, temel matematiksel b\u00f6lme ve modulo (kalan) operat\u00f6rleri ile yap\u0131l\u0131r.<\/p>\n<h4>Matematiksel \u0130\u015flemler<\/h4>\n<p>Yukar\u0131da bahsetti\u011fimiz d\u00f6n\u00fc\u015f\u00fcm fakt\u00f6rlerini kullanarak hesaplamalar\u0131 yapaca\u011f\u0131z:<\/p>\n<pre><code class=\"language-javascript\">const birSaniye = 1000;\nconst birDakika = birSaniye * 60;\nconst birSaat = birDakika * 60;\nconst birGun = birSaat * 24;\n\n\/\/ Kalan g\u00fcnleri hesapla\nconst gunler = Math.floor(farkMilisaniye \/ birGun);\n\n\/\/ Kalan saatleri hesapla (g\u00fcnlerden arta kalan milisaniyeler i\u00e7inde)\nconst saatler = Math.floor((farkMilisaniye % birGun) \/ birSaat);\n\n\/\/ Kalan dakikalar\u0131 hesapla (saatlerden arta kalan milisaniyeler i\u00e7inde)\nconst dakikalar = Math.floor((farkMilisaniye % birSaat) \/ birDakika);\n\n\/\/ Kalan saniyeleri hesapla (dakikalardan arta kalan milisaniyeler i\u00e7inde)\nconst saniyeler = Math.floor((farkMilisaniye % birDakika) \/ birSaniye);<\/code><\/pre>\n<p>Bu hesaplamalar, bize her bir zaman birimi i\u00e7in tam say\u0131 de\u011ferlerini verecektir.<\/p>\n<h4>S\u0131f\u0131r \u00d6n Eki Ekleme (Padding Zeroes)<\/h4>\n<p>Tek haneli say\u0131lar\u0131 (\u00f6rn. 5 saniye) &#8220;05&#8221; \u015feklinde \u00e7ift haneli g\u00f6stermek, sayac\u0131n daha estetik ve okunabilir olmas\u0131n\u0131 sa\u011flar. Bunu yapmak i\u00e7in basit bir ko\u015fullu ifade veya <code>padStart()<\/code> dize metodu kullan\u0131labilir.<\/p>\n<pre><code class=\"language-javascript\">function ikiHaneYap(sayi) {\n    return sayi < 10 ? '0' + sayi : sayi;\n}\n\n\/\/ Kullan\u0131m\u0131:\n\/\/ const gosterilecekSaat = ikiHaneYap(saatler);\n\/\/ const gosterilecekDakika = ikiHaneYap(dakikalar);\n\/\/ const gosterilecekSaniye = ikiHaneYap(saniyeler);\n\n\/\/ Alternatif ve modern yol: String.prototype.padStart()\n\/\/ const gosterilecekSaat = String(saatler).padStart(2, '0');<\/code><\/pre>\n<p><code>padStart(2, '0')<\/code> metodu, say\u0131y\u0131 bir dizeye d\u00f6n\u00fc\u015ft\u00fcr\u00fcr ve e\u011fer dize 2 karakterden k\u0131saysa ba\u015f\u0131na '0' ekleyerek 2 karaktere tamamlar.<\/p>\n<h3>HTML Yap\u0131s\u0131: Sayac\u0131n G\u00f6r\u00fcnt\u00fclenece\u011fi Alan<\/h3>\n<p>Geri say\u0131m sayac\u0131n\u0131n de\u011ferlerini web sayfas\u0131nda g\u00f6sterebilmek i\u00e7in uygun bir HTML yap\u0131s\u0131na ihtiyac\u0131m\u0131z var. Genellikle, her zaman birimi i\u00e7in ayr\u0131 bir <code><span><\/code> veya <code><\/p>\n<div><\/code> elementi kullanmak ve bunlara benzersiz ID'ler atamak iyi bir yakla\u015f\u0131md\u0131r.<\/p>\n<h4>Basit Bir HTML \u015eablonu<\/h4>\n<pre><code class=\"language-html\"><div id=\"geriSayimSayaci\">\n    <div class=\"zaman-birimi\">\n        <span id=\"gunler\">00<\/span>\n        <div class=\"etiket\">G\u00fcn<\/div>\n    <\/div>\n    <div class=\"zaman-birimi\">\n        <span id=\"saatler\">00<\/span>\n        <div class=\"etiket\">Saat<\/div>\n    <\/div>\n    <div class=\"zaman-birimi\">\n        <span id=\"dakikalar\">00<\/span>\n        <div class=\"etiket\">Dakika<\/div>\n    <\/div>\n    <div class=\"zaman-birimi\">\n        <span id=\"saniyeler\">00<\/span>\n        <div class=\"etiket\">Saniye<\/div>\n    <\/div>\n<\/div>\n<div id=\"geriSayimBittiMesaji\" style=\"display: none;\">\n    Geri say\u0131m sona erdi!\n<\/div><\/code><\/pre>\n<p>Bu yap\u0131, her bir zaman birimini ayr\u0131 ayr\u0131 g\u00fcncelleyebilmemizi sa\u011flar. <code>geriSayimBittiMesaji<\/code> elementi, saya\u00e7 bitti\u011finde g\u00f6sterilecek bir mesaj i\u00e7in yer tutar.<\/p>\n<h4>CSS ile Stil Belirleme (Opsiyonel ama iyi olur)<\/h4>\n<p>Sayac\u0131n daha iyi g\u00f6r\u00fcnmesi i\u00e7in basit bir CSS ekleyebiliriz. Bu, makalenin ana konusu olmasa da, kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan \u00f6nemlidir.<\/p>\n<pre><code class=\"language-css\">#geriSayimSayaci {\n    display: flex;\n    justify-content: center;\n    align-items: center;\n    gap: 20px;\n    font-family: Arial, sans-serif;\n    margin-top: 50px;\n}\n\n.zaman-birimi {\n    text-align: center;\n    background-color: #f0f0f0;\n    padding: 15px 20px;\n    border-radius: 8px;\n    box-shadow: 0 2px 5px rgba(0,0,0,0.1);\n}\n\n.zaman-birimi span {\n    display: block;\n    font-size: 3em;\n    font-weight: bold;\n    color: #333;\n}\n\n.zaman-birimi .etiket {\n    font-size: 0.9em;\n    color: #666;\n    margin-top: 5px;\n}\n\n#geriSayimBittiMesaji {\n    text-align: center;\n    margin-top: 30px;\n    font-size: 1.5em;\n    color: #e44d26;\n    font-weight: bold;\n}<\/code><\/pre>\n<h3>JavaScript Kodu: Ad\u0131m Ad\u0131m Olu\u015fturma<\/h3>\n<p>\u015eimdiye kadar \u00f6\u011frendi\u011fimiz t\u00fcm par\u00e7alar\u0131 bir araya getirerek JavaScript kodunu yazmaya ba\u015flayabiliriz.<\/p>\n<h4>De\u011fi\u015fken Tan\u0131mlamalar\u0131<\/h4>\n<p>\u00d6ncelikle, hedef tarihi ve HTML elementlerini referans alacak de\u011fi\u015fkenleri tan\u0131mlayal\u0131m.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Hedef tarihi belirle\nconst hedefTarih = new Date(\"Dec 31, 2024 23:59:59\").getTime(); \/\/ Milisaniye cinsinden al\u0131yoruz\n\n\/\/ HTML elementlerini se\u00e7\nconst gunlerEl = document.getElementById('gunler');\nconst saatlerEl = document.getElementById('saatler');\nconst dakikalarEl = document.getElementById('dakikalar');\nconst saniyelerEl = document.getElementById('saniyeler');\nconst geriSayimBittiMesajiEl = document.getElementById('geriSayimBittiMesaji');\nconst geriSayimSayaciEl = document.getElementById('geriSayimSayaci');\n\n\/\/ Zaman birimleri i\u00e7in milisaniye de\u011ferleri\nconst birSaniye = 1000;\nconst birDakika = birSaniye * 60;\nconst birSaat = birDakika * 60;\nconst birGun = birSaat * 24;<\/code><\/pre>\n<h4><code>updateCountdown<\/code> Fonksiyonu<\/h4>\n<p>Geri say\u0131m mant\u0131\u011f\u0131n\u0131 i\u00e7eren ana fonksiyonu olu\u015ftural\u0131m. Bu fonksiyon, her saniye \u00e7a\u011fr\u0131lacak ve saya\u00e7 de\u011ferlerini g\u00fcncelleyecektir.<\/p>\n<pre><code class=\"language-javascript\">function ikiHaneYap(sayi) {\n    return String(sayi).padStart(2, '0');\n}\n\nfunction updateCountdown() {\n    const simdi = new Date().getTime(); \/\/ Mevcut zaman\u0131 milisaniye cinsinden al\n    const farkMilisaniye = hedefTarih - simdi;\n\n    \/\/ Geri say\u0131m bittiyse\n    if (farkMilisaniye < 0) {\n        clearInterval(sayacInterval); \/\/ Zamanlay\u0131c\u0131y\u0131 durdur\n        geriSayimSayaciEl.style.display = 'none'; \/\/ Sayac\u0131 gizle\n        geriSayimBittiMesajiEl.style.display = 'block'; \/\/ Bitti mesaj\u0131n\u0131 g\u00f6ster\n        return; \/\/ Fonksiyondan \u00e7\u0131k\n    }\n\n    \/\/ Zaman fark\u0131n\u0131 hesapla\n    const gunler = Math.floor(farkMilisaniye \/ birGun);\n    const saatler = Math.floor((farkMilisaniye % birGun) \/ birSaat);\n    const dakikalar = Math.floor((farkMilisaniye % birSaat) \/ birDakika);\n    const saniyeler = Math.floor((farkMilisaniye % birDakika) \/ birSaniye);\n\n    \/\/ HTML elementlerini g\u00fcncelle\n    gunlerEl.innerHTML = ikiHaneYap(gunler);\n    saatlerEl.innerHTML = ikiHaneYap(saatler);\n    dakikalarEl.innerHTML = ikiHaneYap(dakikalar);\n    saniyelerEl.innerHTML = ikiHaneYap(saniyeler);\n}<\/code><\/pre>\n<h4><code>setInterval<\/code> Kullan\u0131m\u0131<\/h4>\n<p><code>updateCountdown<\/code> fonksiyonunun her saniye \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flamak i\u00e7in <code>setInterval<\/code> metodunu kullanaca\u011f\u0131z. Bu metod, belirli bir aral\u0131kta (milisaniye cinsinden) bir fonksiyonu tekrar tekrar y\u00fcr\u00fct\u00fcr.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Sayac\u0131 hemen bir kere g\u00fcncelle (ilk y\u00fcklemede do\u011fru de\u011ferleri g\u00f6stermek i\u00e7in)\nupdateCountdown();\n\n\/\/ Her saniye g\u00fcncellemek i\u00e7in setInterval kullan\nconst sayacInterval = setInterval(updateCountdown, 1000); \/\/ Her 1000 milisaniyede (1 saniye) bir \u00e7al\u0131\u015ft\u0131r<\/code><\/pre>\n<p><code>setInterval<\/code>'\u0131n d\u00f6nd\u00fcrd\u00fc\u011f\u00fc de\u011feri bir de\u011fi\u015fkende saklamak \u00f6nemlidir, b\u00f6ylece geri say\u0131m bitti\u011finde <code>clearInterval()<\/code> ile zamanlay\u0131c\u0131y\u0131 durdurabiliriz. Aksi takdirde, saya\u00e7 negatif de\u011ferlerle \u00e7al\u0131\u015fmaya devam eder ve gereksiz kaynak t\u00fcketir.<\/p>\n<h4>Sayac\u0131n Bitmesi Durumu<\/h4>\n<p><code>updateCountdown<\/code> fonksiyonunun i\u00e7inde, <code>farkMilisaniye<\/code> de\u011ferinin s\u0131f\u0131r\u0131n alt\u0131na d\u00fc\u015f\u00fcp d\u00fc\u015fmedi\u011fini kontrol ediyoruz. E\u011fer d\u00fc\u015ferse, <code>clearInterval<\/code> ile zamanlay\u0131c\u0131y\u0131 durduruyor, saya\u00e7 elementini gizliyor ve \"geri say\u0131m sona erdi\" mesaj\u0131n\u0131 g\u00f6r\u00fcn\u00fcr hale getiriyoruz.<\/p>\n<p>Bu, temel bir geri say\u0131m sayac\u0131n\u0131n eksiksiz JavaScript kodudur.<\/p>\n<h3>Geli\u015fmi\u015f \u00d6zellikler ve \u0130yile\u015ftirmeler<\/h3>\n<p>Temel sayac\u0131 olu\u015fturduktan sonra, kullan\u0131c\u0131 deneyimini ve i\u015flevselli\u011fi art\u0131rmak i\u00e7in baz\u0131 geli\u015fmi\u015f \u00f6zellikler ekleyebiliriz.<\/p>\n<h4>Dinamik Hedef Tarih Belirleme<\/h4>\n<p>Hedef tarihi sabit kodlamak yerine, kullan\u0131c\u0131dan girdi alarak, bir API'den \u00e7ekerek veya URL parametrelerinden okuyarak dinamik hale getirebiliriz.<\/p>\n<p>*   <strong>Kullan\u0131c\u0131 Giri\u015fi:<\/strong> Bir form arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131dan tarih ve saat girmesini isteyebiliriz.<br \/>\n*   <strong>API Entegrasyonu:<\/strong> Bir etkinlik y\u00f6netim sistemi veya takvim API'sinden etkinlik tarihlerini \u00e7ekebiliriz.<br \/>\n*   <strong>URL Parametreleri:<\/strong> <code>?targetDate=2025-01-01T00:00:00<\/code> gibi URL parametreleri kullanarak hedef tarihi dinamik olarak ayarlayabiliriz.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6rnek: URL'den hedef tarihi okuma\nfunction getTargetDateFromUrl() {\n    const urlParams = new URLSearchParams(window.location.search);\n    const dateString = urlParams.get('targetDate');\n    if (dateString) {\n        const parsedDate = new Date(dateString);\n        if (!isNaN(parsedDate.getTime())) { \/\/ Ge\u00e7erli bir tarih mi kontrol et\n            return parsedDate.getTime();\n        }\n    }\n    return new Date(\"Dec 31, 2024 23:59:59\").getTime(); \/\/ Varsay\u0131lan tarih\n}\n\nconst hedefTarih = getTargetDateFromUrl();<\/code><\/pre>\n<h4>Duraklatma ve Devam Ettirme<\/h4>\n<p>Baz\u0131 durumlarda, geri say\u0131m\u0131 duraklatma ve daha sonra devam ettirme i\u015flevselli\u011fi gerekebilir. Bu, <code>clearInterval<\/code> ve <code>setInterval<\/code>'\u0131 do\u011fru zamanda \u00e7a\u011f\u0131rarak yap\u0131labilir.<\/p>\n<pre><code class=\"language-javascript\">let isPaused = false;\nlet kalanMilisaniye = 0; \/\/ Duraklat\u0131ld\u0131\u011f\u0131nda kalan s\u00fcreyi saklamak i\u00e7in\n\nfunction togglePause() {\n    if (isPaused) {\n        \/\/ Devam et\n        isPaused = false;\n        \/\/ Kalan s\u00fcreden yeni hedef tarihi hesapla\n        hedefTarih = new Date().getTime() + kalanMilisaniye;\n        sayacInterval = setInterval(updateCountdown, 1000);\n    } else {\n        \/\/ Duraklat\n        isPaused = true;\n        clearInterval(sayacInterval);\n        const simdi = new Date().getTime();\n        kalanMilisaniye = hedefTarih - simdi; \/\/ Kalan s\u00fcreyi kaydet\n    }\n}<\/code><\/pre>\n<p>Bu, duraklatma ve devam ettirme i\u015flevselli\u011fini eklemek i\u00e7in temel bir yakla\u015f\u0131md\u0131r.<\/p>\n<h4>Geri Say\u0131m Bitti\u011finde Yap\u0131lacaklar (Callback Fonksiyonlar\u0131)<\/h4>\n<p>Geri say\u0131m sona erdi\u011finde belirli bir eylemi tetiklemek (\u00f6rn. bir pop-up g\u00f6stermek, bir sayfay\u0131 yeniden y\u00fcklemek) i\u00e7in bir callback fonksiyonu kullanabiliriz.<\/p>\n<pre><code class=\"language-javascript\">function geriSayimBittiCallback() {\n    console.log(\"Geri say\u0131m sona erdi! \u015eimdi bir \u015feyler yapabiliriz.\");\n    \/\/ alert(\"Kampanya bitti!\");\n    \/\/ window.location.reload();\n}\n\nfunction updateCountdown() {\n    \/\/ ... (\u00f6nceki kod) ...\n\n    if (farkMilisaniye < 0) {\n        clearInterval(sayacInterval);\n        geriSayimSayaciEl.style.display = 'none';\n        geriSayimBittiMesajiEl.style.display = 'block';\n        geriSayimBittiCallback(); \/\/ Callback fonksiyonunu \u00e7a\u011f\u0131r\n        return;\n    }\n    \/\/ ... (kalan kod) ...\n}<\/code><\/pre>\n<h4>Kullan\u0131c\u0131 Deneyimi \u0130yile\u015ftirmeleri (Animasyonlar, Sesler)<\/h4>\n<p>Geri say\u0131m sayac\u0131n\u0131 daha \u00e7ekici hale getirmek i\u00e7in animasyonlar veya ses efektleri eklenebilir.<\/p>\n<p>*   <strong>CSS Animasyonlar\u0131:<\/strong> Say\u0131lar de\u011fi\u015fti\u011finde hafif bir ge\u00e7i\u015f veya b\u00fcy\u00fcme\/k\u00fc\u00e7\u00fclme efekti eklenebilir.<br \/>\n*   <strong>Ses Efektleri:<\/strong> Son saniyelerde bip sesi veya geri say\u0131m bitti\u011finde bir zil sesi \u00e7al\u0131nabilir.<br \/>\n*   <strong>G\u00f6rsel Geri Bildirim:<\/strong> Son dakikalarda say\u0131n\u0131n rengini de\u011fi\u015ftirmek gibi g\u00f6rsel ipu\u00e7lar\u0131 kullan\u0131labilir.<\/p>\n<h4>Farkl\u0131 Formatlarda G\u00f6r\u00fcnt\u00fcleme<\/h4>\n<p>Baz\u0131 durumlarda sadece saat:dakika:saniye g\u00f6stermek isteyebiliriz, veya g\u00fcnler yerine toplam saatleri g\u00f6stermek isteyebiliriz. Hesaplama mant\u0131\u011f\u0131n\u0131 buna g\u00f6re ayarlamak yeterlidir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ Sadece saat:dakika:saniye g\u00f6sterimi i\u00e7in\n\/\/ gunler hesaplamas\u0131n\u0131 atla\n\/\/ saatler = Math.floor(farkMilisaniye \/ birSaat); \/\/ Toplam saatleri hesapla\n\/\/ dakikalar = Math.floor((farkMilisaniye % birSaat) \/ birDakika);\n\/\/ saniyeler = Math.floor((farkMilisaniye % birDakika) \/ birSaniye);<\/code><\/pre>\n<h4>Mobil Uyumluluk ve Performans<\/h4>\n<p>Sayac\u0131n farkl\u0131 ekran boyutlar\u0131nda iyi g\u00f6r\u00fcnmesini sa\u011flamak i\u00e7in duyarl\u0131 CSS kullanmak \u00f6nemlidir. Ayr\u0131ca, JavaScript kodunun performans\u0131, \u00f6zellikle \u00e7ok say\u0131da saya\u00e7 veya karma\u015f\u0131k animasyonlar kullan\u0131l\u0131yorsa, g\u00f6z \u00f6n\u00fcnde bulundurulmal\u0131d\u0131r. <code>setInterval<\/code> yerine <code>requestAnimationFrame<\/code> kullanmak daha ak\u0131c\u0131 animasyonlar sa\u011flayabilir, ancak zamanlay\u0131c\u0131lar i\u00e7in <code>setInterval<\/code> genellikle yeterlidir.<\/p>\n<h3>Potansiyel Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p>Geri say\u0131m saya\u00e7lar\u0131 olu\u015ftururken kar\u015f\u0131la\u015f\u0131labilecek baz\u0131 yayg\u0131n sorunlar ve bunlar\u0131n \u00e7\u00f6z\u00fcmleri \u015funlard\u0131r:<\/p>\n<h4>Zaman Dilimi Farkl\u0131l\u0131klar\u0131<\/h4>\n<p>*   <strong>Sorun:<\/strong> Hedef tarih, geli\u015ftiricinin yerel zaman diliminde ayarlan\u0131r, ancak kullan\u0131c\u0131 farkl\u0131 bir zaman diliminde oldu\u011funda saya\u00e7 yanl\u0131\u015f g\u00f6r\u00fcn\u00fcr. \u00d6rne\u011fin, T\u00fcrkiye'de 1 Ocak 2025 00:00'a ayarlanan bir saya\u00e7, ABD'deki bir kullan\u0131c\u0131 i\u00e7in 31 Aral\u0131k 2024 ak\u015fam\u0131 bitebilir.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong> Hedef tarihi her zaman UTC olarak tan\u0131mlay\u0131n ve hesaplamalar\u0131 da UTC \u00fczerinden yap\u0131n. <code>new Date(\"2025-01-01T00:00:00Z\")<\/code> gibi ISO 8601 format\u0131nda 'Z' (Zulu time, yani UTC) belirteci kullanmak veya <code>Date.UTC()<\/code> metodunu kullanmak bu sorunu \u00e7\u00f6zer. Ancak, e\u011fer saya\u00e7 belirli bir yerel etkinlik i\u00e7inse, hedef tarihi yerel olarak belirlemek ve kullan\u0131c\u0131n\u0131n taray\u0131c\u0131s\u0131n\u0131n yerel zaman dilimini kullanmas\u0131na izin vermek daha uygun olabilir. Bu durumda, kullan\u0131c\u0131lar aras\u0131ndaki zaman dilimi fark\u0131n\u0131n bilincinde olunmal\u0131d\u0131r.<\/p>\n<h4>Sayfa Yenileme Sorunlar\u0131 (localStorage kullan\u0131m\u0131)<\/h4>\n<p>*   <strong>Sorun:<\/strong> E\u011fer geri say\u0131m sayac\u0131 bir oturumla ilgiliyse (\u00f6rn. bir quiz i\u00e7in kalan s\u00fcre), sayfa yenilendi\u011finde saya\u00e7 s\u0131f\u0131rlanabilir.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong> <code>localStorage<\/code> veya <code>sessionStorage<\/code> kullanarak saya\u00e7 durumunu (ba\u015flang\u0131\u00e7 zaman\u0131, kalan s\u00fcre vb.) kaydedin. Sayfa y\u00fcklendi\u011finde, depolanan verileri kontrol edin ve geri say\u0131m\u0131 kald\u0131\u011f\u0131 yerden devam ettirin.<\/p>\n<pre><code class=\"language-javascript\">\/\/ \u00d6rnek: Ba\u015flang\u0131\u00e7 zaman\u0131n\u0131 kaydetme\nconst baslangicZamaniKey = 'quizBaslangicZamani';\nlet baslangicZamani = localStorage.getItem(baslangicZamaniKey);\n\nif (!baslangicZamani) {\n    baslangicZamani = new Date().getTime();\n    localStorage.setItem(baslangicZamaniKey, baslangicZamani);\n}\n\n\/\/ Hedef tarihi buna g\u00f6re ayarla (\u00f6rn. 10 dakika sonra)\nconst hedefTarih = parseInt(baslangicZamani) + (10 * birDakika);<\/code><\/pre>\n<h4>Performans Optimizasyonu<\/h4>\n<p>*   <strong>Sorun:<\/strong> \u00c7ok say\u0131da geri say\u0131m sayac\u0131 veya karma\u015f\u0131k animasyonlar, \u00f6zellikle eski cihazlarda performans\u0131 d\u00fc\u015f\u00fcrebilir.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong><br \/>\n    *   Sadece g\u00fcncellenmesi gereken DOM elemanlar\u0131n\u0131 g\u00fcncelleyin.<br \/>\n    *   Gereksiz hesaplamalardan ka\u00e7\u0131n\u0131n.<br \/>\n    *   <code>requestAnimationFrame<\/code> animasyonlar i\u00e7in daha ak\u0131c\u0131 bir deneyim sunsa da, saniyelik g\u00fcncellemeler i\u00e7in <code>setInterval<\/code> genellikle yeterlidir.<br \/>\n    *   Sayfa d\u0131\u015f\u0131na \u00e7\u0131kt\u0131\u011f\u0131nda zamanlay\u0131c\u0131y\u0131 duraklatmak i\u00e7in <code>document.hidden<\/code> veya <code>visibilitychange<\/code> olaylar\u0131n\u0131 kullanabilirsiniz.<\/p>\n<h4>Kullan\u0131c\u0131 Taraf\u0131ndaki Saat Ayarlar\u0131<\/h4>\n<p>*   <strong>Sorun:<\/strong> Kullan\u0131c\u0131, bilgisayar\u0131n\u0131n saatini manuel olarak de\u011fi\u015ftirirse, geri say\u0131m sayac\u0131 yanl\u0131\u015f \u00e7al\u0131\u015fabilir.<br \/>\n*   <strong>\u00c7\u00f6z\u00fcm:<\/strong> Bu, istemci taraf\u0131 JavaScript ile tamamen \u00e7\u00f6z\u00fclemeyen bir sorundur. \u00d6nemli uygulamalarda, sunucu taraf\u0131nda bir zaman damgas\u0131 almak ve istemci taraf\u0131ndaki hesaplamalar\u0131 buna g\u00f6re ayarlamak daha g\u00fcvenilirdir. Ancak \u00e7o\u011fu web tabanl\u0131 geri say\u0131m sayac\u0131 i\u00e7in bu genellikle kabul edilebilir bir risktir.<\/p>\n<h3>\u00d6rnek Uygulama: Ad\u0131m Ad\u0131m Tam Bir Kod<\/h3>\n<p>\u015eimdiye kadar \u00f6\u011frendiklerimizi birle\u015ftirerek tam, \u00e7al\u0131\u015f\u0131r bir \u00f6rnek olu\u015ftural\u0131m.<\/p>\n<h4>HTML Kodu (<code>index.html<\/code>)<\/h4>\n<pre><code class=\"language-html\"><!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>JavaScript Geri Say\u0131m Sayac\u0131<\/title>\n    <style>\n        body {\n            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;\n            display: flex;\n            flex-direction: column;\n            justify-content: center;\n            align-items: center;\n            min-height: 100vh;\n            margin: 0;\n            background-color: #f4f7f6;\n            color: #333;\n        }\n\n        h2 {\n            color: #2c3e50;\n            margin-bottom: 40px;\n            font-size: 2.5em;\n            text-align: center;\n        }\n\n        #geriSayimSayaci {\n            display: flex;\n            justify-content: center;\n            align-items: center;\n            gap: 25px;\n            margin-bottom: 30px;\n            padding: 20px;\n            background: linear-gradient(135deg, #a1c4fd 0%, #c2e9fb 100%);\n            border-radius: 15px;\n            box-shadow: 0 10px 20px rgba(0, 0, 0, 0.1);\n        }\n\n        .zaman-birimi {\n            text-align: center;\n            background-color: rgba(255, 255, 255, 0.9);\n            padding: 20px 25px;\n            border-radius: 10px;\n            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);\n            min-width: 90px;\n            transition: transform 0.2s ease-in-out;\n        }\n\n        .zaman-birimi:hover {\n            transform: translateY(-5px);\n        }\n\n        .zaman-birimi span {\n            display: block;\n            font-size: 3.5em;\n            font-weight: bold;\n            color: #34495e;\n            line-height: 1;\n        }\n\n        .zaman-birimi .etiket {\n            font-size: 1em;\n            color: #7f8c8d;\n            margin-top: 10px;\n            text-transform: uppercase;\n            letter-spacing: 1px;\n        }\n\n        #geriSayimBittiMesaji {\n            text-align: center;\n            margin-top: 30px;\n            font-size: 2em;\n            color: #e74c3c;\n            font-weight: bold;\n            display: none; \/<em> Ba\u015flang\u0131\u00e7ta gizli <\/em>\/\n            padding: 20px;\n            background-color: #fdd;\n            border-radius: 10px;\n            box-shadow: 0 4px 10px rgba(0, 0, 0, 0.1);\n        }\n\n        @media (max-width: 768px) {\n            #geriSayimSayaci {\n                flex-wrap: wrap;\n                gap: 15px;\n            }\n            .zaman-birimi {\n                padding: 15px 20px;\n                min-width: 70px;\n            }\n            .zaman-birimi span {\n                font-size: 2.5em;\n            }\n            .zaman-birimi .etiket {\n                font-size: 0.8em;\n            }\n            h2 {\n                font-size: 2em;\n            }\n            #geriSayimBittiMesaji {\n                font-size: 1.5em;\n            }\n        }\n    <\/style>\n<\/head>\n<body>\n    <h2>Yeni Y\u0131la Kalan S\u00fcre<\/h2>\n\n    <div id=\"geriSayimSayaci\">\n        <div class=\"zaman-birimi\">\n            <span id=\"gunler\">00<\/span>\n            <div class=\"etiket\">G\u00fcn<\/div>\n        <\/div>\n        <div class=\"zaman-birimi\">\n            <span id=\"saatler\">00<\/span>\n            <div class=\"etiket\">Saat<\/div>\n        <\/div>\n        <div class=\"zaman-birimi\">\n            <span id=\"dakikalar\">00<\/span>\n            <div class=\"etiket\">Dakika<\/div>\n        <\/div>\n        <div class=\"zaman-birimi\">\n            <span id=\"saniyeler\">00<\/span>\n            <div class=\"etiket\">Saniye<\/div>\n        <\/div>\n    <\/div>\n\n    <div id=\"geriSayimBittiMesaji\">\n        Mutlu Y\u0131llar! Geri say\u0131m sona erdi!\n    <\/div>\n\n    <script src=\"script.js\"><\/script>\n<\/body>\n<\/html><\/code><\/pre>\n<h4>JavaScript Kodu (<code>script.js<\/code>)<\/h4>\n<pre><code class=\"language-javascript\">\/\/ Hedef tarihi belirle (\u00d6rn: Bir sonraki y\u0131lba\u015f\u0131)\n\/\/ Y\u0131l, Ay (0-11), G\u00fcn, Saat, Dakika, Saniye\n\/\/ Yeni Y\u0131l i\u00e7in bir sonraki 1 Ocak 00:00:00\nfunction getNextNewYear() {\n    const now = new Date();\n    let year = now.getFullYear();\n    if (now.getMonth() === 0 && now.getDate() === 1 && now.getHours() === 0 && now.getMinutes() === 0 && now.getSeconds() === 0) {\n        \/\/ E\u011fer \u015fu an tam yeni y\u0131l ise, bir sonraki y\u0131lba\u015f\u0131n\u0131 hedefle\n        year++;\n    } else if (now.getMonth() === 11 && now.getDate() === 31 && now.getHours() === 23 && now.getMinutes() === 59 && now.getSeconds() === 59) {\n        \/\/ E\u011fer \u015fu an tam y\u0131lba\u015f\u0131 gecesinin son saniyesi ise, bir sonraki y\u0131lba\u015f\u0131n\u0131 hedefle\n        year++;\n    } else if (now.getMonth() === 0 && now.getDate() > 1) {\n        \/\/ E\u011fer yeni y\u0131l\u0131n ilk g\u00fcnlerinden sonra isek, bir sonraki y\u0131lba\u015f\u0131n\u0131 hedefle\n        year++;\n    }\n    return new Date(year, 0, 1, 0, 0, 0).getTime();\n}\n\nconst hedefTarih = getNextNewYear();\n\n\/\/ HTML elementlerini se\u00e7\nconst gunlerEl = document.getElementById('gunler');\nconst saatlerEl = document.getElementById('saatler');\nconst dakikalarEl = document.getElementById('dakikalar');\nconst saniyelerEl = document.getElementById('saniyeler');\nconst geriSayimBittiMesajiEl = document.getElementById('geriSayimBittiMesaji');\nconst geriSayimSayaciEl = document.getElementById('geriSayimSayaci');\n\n\/\/ Zaman birimleri i\u00e7in milisaniye de\u011ferleri\nconst birSaniye = 1000;\nconst birDakika = birSaniye * 60;\nconst birSaat = birDakika * 60;\nconst birGun = birSaat * 24;\n\n\/\/ Say\u0131lar\u0131 iki haneli formatta g\u00f6stermek i\u00e7in yard\u0131mc\u0131 fonksiyon\nfunction ikiHaneYap(sayi) {\n    return String(sayi).padStart(2, '0');\n}\n\n\/\/ Geri say\u0131m\u0131 g\u00fcncelleyen ana fonksiyon\nfunction updateCountdown() {\n    const simdi = new Date().getTime(); \/\/ Mevcut zaman\u0131 milisaniye cinsinden al\n    let farkMilisaniye = hedefTarih - simdi;\n\n    \/\/ Geri say\u0131m bittiyse\n    if (farkMilisaniye < 0) {\n        clearInterval(sayacInterval); \/\/ Zamanlay\u0131c\u0131y\u0131 durdur\n        geriSayimSayaciEl.style.display = 'none'; \/\/ Sayac\u0131 gizle\n        geriSayimBittiMesajiEl.style.display = 'block'; \/\/ Bitti mesaj\u0131n\u0131 g\u00f6ster\n        \/\/ \u0130ste\u011fe ba\u011fl\u0131: Geri say\u0131m bitti\u011finde yap\u0131lacak ek i\u015flemler\n        \/\/ console.log(\"Geri say\u0131m sona erdi!\");\n        return; \/\/ Fonksiyondan \u00e7\u0131k\n    }\n\n    \/\/ Zaman fark\u0131n\u0131 hesapla\n    const gunler = Math.floor(farkMilisaniye \/ birGun);\n    farkMilisaniye %= birGun; \/\/ Kalan milisaniyeleri g\u00fcncelle\n\n    const saatler = Math.floor(farkMilisaniye \/ birSaat);\n    farkMilisaniye %= birSaat;\n\n    const dakikalar = Math.floor(farkMilisaniye \/ birDakika);\n    farkMilisaniye %= birDakika;\n\n    const saniyeler = Math.floor(farkMilisaniye \/ birSaniye);\n\n    \/\/ HTML elementlerini g\u00fcncelle\n    gunlerEl.innerHTML = ikiHaneYap(gunler);\n    saatlerEl.innerHTML = ikiHaneYap(saatler);\n    dakikalarEl.innerHTML = ikiHaneYap(dakikalar);\n    saniyelerEl.innerHTML = ikiHaneYap(saniyeler);\n}\n\n\/\/ Sayac\u0131 hemen bir kere g\u00fcncelle (ilk y\u00fcklemede do\u011fru de\u011ferleri g\u00f6stermek i\u00e7in)\nupdateCountdown();\n\n\/\/ Her saniye g\u00fcncellemek i\u00e7in setInterval kullan\nconst sayacInterval = setInterval(updateCountdown, 1000); \/\/ Her 1000 milisaniyede (1 saniye) bir \u00e7al\u0131\u015ft\u0131r\n\n\/\/ Sayfa gizlendi\u011finde veya kapat\u0131ld\u0131\u011f\u0131nda performans\u0131 optimize etmek i\u00e7in\ndocument.addEventListener('visibilitychange', () => {\n    if (document.hidden) {\n        clearInterval(sayacInterval);\n    } else {\n        \/\/ Sayfa tekrar g\u00f6r\u00fcn\u00fcr oldu\u011funda, zaman\u0131 yeniden senkronize et ve devam et\n        \/\/ Bu, sekme de\u011fi\u015ftirildi\u011finde veya bilgisayar uykuya ge\u00e7ti\u011finde zaman\u0131n kaymas\u0131n\u0131 \u00f6nler.\n        updateCountdown();\n        clearInterval(sayacInterval); \/\/ Eski interval'\u0131 temizle\n        sayacInterval = setInterval(updateCountdown, 1000);\n    }\n});<\/code><\/pre>\n<p>Bu \u00f6rnek, CSS ile stil verilmi\u015f, dinamik olarak bir sonraki yeni y\u0131l\u0131 hedefleyen ve sayfa g\u00f6r\u00fcn\u00fcrl\u00fc\u011f\u00fc de\u011fi\u015fti\u011finde performans\u0131 optimize eden eksiksiz bir geri say\u0131m sayac\u0131 sunmaktad\u0131r. <code>getNextNewYear<\/code> fonksiyonu, mevcut tarihe g\u00f6re ak\u0131ll\u0131ca bir sonraki y\u0131lba\u015f\u0131n\u0131 bulur. <code>farkMilisaniye %= birGun;<\/code> gibi modulo atamalar\u0131, kalan milisaniyeler \u00fczerinden daha do\u011fru hesaplamalar yap\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>JavaScript ile geri say\u0131m sayac\u0131 olu\u015fturmak, <code>Date<\/code> nesnesinin g\u00fcc\u00fcn\u00fc, <code>setInterval<\/code> zamanlay\u0131c\u0131s\u0131n\u0131 ve temel matematiksel i\u015flemleri bir araya getiren nispeten basit ama olduk\u00e7a kullan\u0131\u015fl\u0131 bir beceridir. Bu makalede, bir geri say\u0131m sayac\u0131n\u0131n temel mant\u0131\u011f\u0131n\u0131 ad\u0131m ad\u0131m \u00f6\u011frendik, gerekli HTML ve CSS yap\u0131lar\u0131n\u0131 inceledik ve kapsaml\u0131 bir JavaScript \u00e7\u00f6z\u00fcm\u00fc olu\u015fturduk.<\/p>\n<p>Ayr\u0131ca, zaman dilimi farkl\u0131l\u0131klar\u0131, sayfa yenileme durumlar\u0131 ve performans gibi potansiyel sorunlara de\u011finerek ve dinamik hedef tarih belirleme, duraklatma\/devam ettirme ve callback fonksiyonlar\u0131 gibi geli\u015fmi\u015f \u00f6zellikleri tart\u0131\u015farak, daha sa\u011flam ve kullan\u0131c\u0131 dostu saya\u00e7lar in\u015fa etme yollar\u0131n\u0131 ke\u015ffettik.<\/p>\n<p>Art\u0131k bu bilgileri kullanarak kendi web projelerinizde etkili ve i\u015flevsel geri say\u0131m saya\u00e7lar\u0131 olu\u015fturmaya haz\u0131rs\u0131n\u0131z. Unutmay\u0131n, pratik yapmak ve farkl\u0131 senaryolar\u0131 denemek, JavaScript yeteneklerinizi geli\u015ftirmenin en iyi yoludur.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur?\nGeri say\u0131m saya\u00e7lar\u0131, web sitelerinde ve uygulamalarda kullan\u0131c\u0131lar\u0131 belirli bir etkinl","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[129],"tags":[],"class_list":{"0":"post-37423","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-javascript","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur? Geri say\u0131m saya\u00e7lar\u0131, web sitelerinde ve uygulamalarda kullan\u0131c\u0131lar\u0131 belirli bir etkinl\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-04T05:40:51+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2026-01-04T05:40:51+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/\"},\"wordCount\":2219,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Javascript\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/\",\"name\":\"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-04T05:40:51+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur?","og_description":"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur? Geri say\u0131m saya\u00e7lar\u0131, web sitelerinde ve uygulamalarda kullan\u0131c\u0131lar\u0131 belirli bir etkinl","og_url":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-04T05:40:51+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur?","datePublished":"2026-01-04T05:40:51+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/"},"wordCount":2219,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Javascript"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/","name":"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-04T05:40:51+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/javascript-ile-geri-sayim-sayaci-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"JavaScript ile Geri Say\u0131m Sayac\u0131 Nas\u0131l Olu\u015fturulur?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37423","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37423"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37423\/revisions"}],"predecessor-version":[{"id":37424,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37423\/revisions\/37424"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37423"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37423"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37423"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}