Anasayfa » Kodlama » JavaScript'te Basit Bir Advent Takvimi Nasıl Oluşturulur

    JavaScript'te Basit Bir Advent Takvimi Nasıl Oluşturulur

    Advent, Noel arifesinden dört pazar önce başlayan Noel için bekleme ve hazırlık dönemidir. Advent zamanının geçmesi geleneksel olarak bir Advent Calendar veya Advent Çelenk yardımı ile ölçülür. Advent başlangıcı sabit bir tarih olmasa da, Advent Takvimleri genellikle 1 Aralık'ta başlar..

    Yerel geleneklere göre, Advent Takvimleri farklı tasarımlara sahip olabilir, ancak en sık olarak 24 pencere veya kapı ile büyük dikdörtgen kartlar 1 ve 24 Aralık arasındaki günleri işaretler. Kapılar mesajları, şiirleri, duaları veya küçük sürprizleri gizler..

    Bu yazıda size nasıl yapılacağını göstereceğim Nesneye dayalı JavaScript'te bir Advent takvimi yapmak. Vanilya JavaScript’inde yapıldığı için kodu kolayca kendi web sitenize yerleştirebilirsiniz..

    • gösteri
    • Kaynak İndir

    JavaScript Takvim Tasarımı

    Noel Takvimi’niz Noel temalı arka plan görüntüsünde 24 kapılı olacak. Her kapı, Noel’le ilgili bir teklifi gizleyecektir. kullanıcı kapıyı tıkladığında uyarı mesajı şeklinde açılır. Kapılar belirli bir gün gelene kadar kapalı kalır, gerçek Advent Takvimi'nde olduğu gibi; kapılar doğru günden önce açılamaz.

    Zaten etkin olan kapılar, engelli olanlardan (açık yeşil) farklı bir kenarlık ve arka plan rengine (beyaz) sahip olacaktır. Bu gibi görünen Advent Takvimimizi hazırlamak için HTML5, CSS3 ve JavaScript kullanacağız:

    Adım 1 - Dosya Yapısı ve Kaynakları Yaratın

    Her şeyden önce güzel bir arka plan görüntüsü seçmemiz gerekiyor. Takvimden dikey yönlendirmeli bir tane seçtim, bu nedenle takvimim içerecek 4 sütun ve 6 satır.

    Bir yatay yönlendirmeyi tercih ediyorsanız sorun değil. Kapılarınızın konumunu JavaScript kodunda değiştirin; 6 sütun ve 4 satır. Resminiz varsa, adında bir klasör oluşturun. /Görüntüler, ve kaydet.

    Bu, bu proje için tek resim kaynağımız olacak.

    JavaScript dosyaları için /senaryo kök klasörünüzün içindeki klasör. İki boş metin dosyasını içine yerleştirin ve adlandırın calendar.js ve messages.js. Calendar.js işlevsellik tutacak messages.js Kullanıcı açıldığında açılan bir dizi mesaj içerecektir. “açılan” (tıklar) kapılar.

    Ayrıca bir HTML ve CSS dosyasına ihtiyacımız olacak, bu nedenle kök klasörünüzde iki boş dosya oluşturun ve onlara isimleri verin index.html ve style.css.

    Hazır olduğunuzda, bu projeyi başarmanız için gereken kaynaklara ve dosya yapısına sahip olursunuz ve kök klasörünüz şuna benzer:

    2. Adım - HTML'yi oluşturun

    Kullandığımız HTML kodu oldukça basittir. CSS stil sayfası bölüm, iken iki JavaScript dosyası Bölüm. İkincisi gereklidir, çünkü komut dosyalarını içine koyarsak bölümünde, kod olduğu gibi yürütülmez yüklenen HTML sayfasının öğelerini kullanır.

    Advent Takvimi kendisi içinde yerleştirilir

    anlam etiketi. Noel görüntüsünü bir HTML öğesi ve CSS arka plan özelliği değil, bu şekilde DOM'a bir öğe olarak kolayca erişebiliriz..

    Resmin altına, boş bir sıralanmamış liste koyarız. “adventDoors” scriptler tarafından doldurulacak id seçici. Kullanıcı, tarayıcısında JavaScript’i etkinleştirmediyse, basit bir Noel resmi göreceklerdir..

         Advent Takvimi       

    Advent Takvimi

      Adım 3 - doldurun “Mesajlar” Dizi

      Doldurmak için 24 Noel fiyatına ihtiyacımız var. “mesajları” dizi. GoodReads’tan benimkini seçtim.

      komut / messages.js dosya; teklifleri işlevsellikten ayrı tutmak için buraya koyacağız. mesajları dizi, bir dizinin içindeki bir dizidir, dış dizinin her öğesi iki öğeli başka bir dizi içerir: bir alıntı ve yazarı.

      Diziyi, aşağıdaki sözdizimine göre en sevdiğiniz alıntılarla doldurun:

       var messages = [["Alıntı 1", "Yazar 1"], ["Alıntı 2", "Yazar 2"],… ["Alıntı 24", "Yazar 24"]];

      Adım 4 - Kapılar İçin Temel CSS Stilleri Ekleme

      Kapılar için gerekli CSS stillerini oluşturmak için, kapının kendisi aşağıdaki adımlarda JavaScript ile oluşturulacağından son tasarımı düşünmeliyiz..

      Doğru şekilde 4 sütun ve 6 sıra dikdörtgen oluşturmamız gerekiyor. Bunun için kullanacağız pozisyon: göreceli ve pozisyon: mutlak CSS kuralları Kesin konum kapıdan kapıya değişeceği için, üst, alt, ayrıldı, ve sağ JavaScript’teki özellikler, CSS’de kabına göreceli bir konum (HTML’deki sıralanmamış liste) ve liste öğeleri için mutlak pozisyonlar (JS’ye de eklenecektir) eklememiz yeterli.

      Stil sayfası dosyasındaki diğer önemli şey ise engelliler ve etkin durumlar için farklı bir tasarım oluşturun. .engelli JavaScript tarafından engellilere seçici eklenecek.

      Demo Takvimim için, gezinip taşırken şeffaf bir beyaz arka plana sahip etkin kapılar için düz beyaz bir kenarlık ve beyaz yazı tipleri belirledim; ve açık yeşil kenarlık, yazı tipleri ve engelli olanlar için şeffaf açık yeşil arka plan. Bu tasarımı beğenmediyseniz, renkleri ve stilleri isteğinize göre değiştirebilirsiniz.

      Aşağıdaki kodu (veya değiştirilmiş stil kurallarınızı) telefonunuza yerleştirin. style.css dosya.

       ul # adventDoors position: relatif; liste tarzı: yok; dolgu maddesi: 0; marj: 0;  #adventDoors li position: absolute;  #adventDoors li a color: #fff; genişlik:% 100; yükseklik:% 100; yazı tipi boyutu: 24 piksel; metin hizalama: orta; ekran: esnek; esnek yön: sütun; haklı içerik: merkez; metin dekorasyon: yok; sınır: 1px #fff katı;  #adventDoors li a: not (.disabled): hover color: #fff; arka plan rengi: saydam; arkaplan rengi: rgba (255,255,255,0.15);  #adventDoors li a.disabled border-color: # b6fe98; arkaplan rengi: rgba (196,254,171,0.15); renk: # b6fe98; imleç: varsayılan; 

      Adım 5 - Global Değişkenleri Yaratın

      Bu adımdan sonra, yalnızca komut / calendar.js dosya, öyleyse şimdi açalım şunu. Advent Takvimimiz iki global değişken kullanacak.

      myCal değişkeni, Takvim görüntüsünü bir JS nesnesi olarak tutar. Resim zaten eklenmiş index.html Adım 2'deki dosya. 7. kapıdaki bu görüntünün kapısını koyacağız. İlgili HTML'yi yakalayacağız ile işaretlenmiş öğeyi “adventCal” tanımlayıcısı getElementById () DOM yöntemini kullanarak. myCal değişkeni bir HTMLImageElement DOM nesnesi olacak.

      Geçerli tarih değişkeni geçerli tarihi tutar, böylece komut dosyası bir kapının etkin mi yoksa devre dışı mı olması gerektiğine kolayca karar verebilir. Yaratmak Geçerli tarih Date JavaScript sınıfının yeni bir nesnesini başlattık.

      Aşağıdaki kod parçacığını calendar.js dosya.

       var myCal = document.getElementById ("adventCal"); var currentDate = yeni Tarih ();

      Adım 6 - Oluştur “Kapı” Sınıf

      24 kapıya ihtiyaç duyduğumuzda, bunu yapmanın en kolay yolu “Kapı” sınıf ve daha sonra 24 kez başlat.

      Kapı sınıfımızın iki parametresi vardır, takvim ve gün. İçin takvim parametre arka plan olarak işlev görecek Noel görüntüsünü geçmemiz gerekecek. İçin gün parametrenin Aralık ayının gününü tam sayı biçiminde geçirmemiz gerekecek.

      24 Kapı nesnesinin somutlaştırılması sırasında, son adımdaki (Adım 8) parametrelerin tam değerlerini geçeceğiz..

      Door sınıfı için 5 özellik ve 1 yöntem yapacağız. Bu adımda sadece 5 özellikten geçeceğiz ve İçerik () Bir sonraki adımda yöntem.

      “Genişlik” & “yükseklik” özellikleri

      Genişlik ve yükseklik özellikler, her bir kapının genişliğini ve yüksekliğini dinamik olarak hesaplar (arka plan görüntüsünün genişliğine ve yüksekliğine göre değişir).

      0.1 ve 0.95 çarpanları, kenar boşlukları için, her bir kapı arasında ve Takvim'in yanlarında da boşluk bırakma denklemindedir..

      “adventMessage” özellik

      adventMessage özelliği, mesajların içeriğini, yani alıntıları ve eşleşen yazarları içeriyor. messages.js dosya tutar. adventMessage mülk bir alıntı alır ve yazar mesajları [] geçerli tarihe bağlı olarak dizi.

      1 Aralık için adventMessage özellik, dış dizinin ilk öğesini alır. mesajları [0], JavaScript'te sıfır tabanlı olduğundan.

      Aynı sebepten, 1 Aralık’taki fiyat teklifi mesajları [0] [0] (iç dizinin ilk elemanı) ve eşleşen yazara, mesajları [0] [1] (iç dizinin ikinci elemanı).

      “x”&”y” özellikleri

      Özellikleri x ve y ayarlamak için bir sonraki adımda kullanacağımız her bir kapının uygun pozisyonlarını tutun. üst ve ayrıldı CSS özellikleri Bunlar tamamlayacak pozisyon: göreceli ve pozisyon: mutlak Kapı konteyneri (ul # adventDoors) ve kapılar için kendileri (#adventDoors li) için 4. Adımda belirlediğimiz CSS kuralları. Hesaplamalar biraz korkutucu görünebilir, ama hadi hızlıca geçelim.

      x mülkiyet tarafından kullanılacak ayrıldı Bir sonraki adımda CSS konumlandırma özelliği (Adım 7). Tek bir Kapının x eksenine yerleştirilmesi gereken piksel cinsinden belirler.

      Arka plan görüntüsünün genişliğini alır ve bunun için küçük bir kenar boşluğu bırakır (% 4). Daha sonra kalan operatör yardımıyla, hangi sütunun içine yerleştirileceğini değerlendirir (unutmayın, 4 sütun olacak) ve nihayet 1.1 çarpanı kullanarak her bir Kapıya bir miktar (% 10) marj ekler..

      Aynı şekilde, y mülkiyet tarafından kullanılacak üst CSS konumlandırma özelliği ve aynı şekilde tek bir Kapının y eksenine yerleştirilmesi gereken piksel cinsinden belirler.

      Geçişin height özelliği ile arka plan görüntüsünün yüksekliğini alırız. takvim parametresini (bir DOM nesnesini tutar) ve Takvim'in dikey kenarlarında% 4 kenar boşluğu bırakın.

      Daha sonra, Math.floor () yönteminin yardımıyla, belirli bir Door nesnesinin hangi satırda olacağını (6 satır olacak) hesaplarız..

      Sonunda, 1.1 çarpıcı kullanarak yüksekliğini çarparak her Door nesnesi için% 10 marj ekleriz..

       işlev Kapı (takvim, gün) this.width = ((calendar.width - 0.1 * calendar.width) / 4) * 0.95; this.height = ((calendar.height - 0.1 * calendar.height) / 6) * 0.95; this.adventMessage = 'Gün' + gün + ', Advent \ n \ n' + '"' + mesajları [gün - 1] [0] + '" \ n \ n \ t' + '-' + ileti [gün - 1] [1] + '\ n \ n'; this.x = (0.04 * calendar.width + ((gün - 1)% 4) * (1.1 * bu genişlik)); this.y = - (0.96 * calendar.height - Math.floor ((gün - 1) / 4) * (1.1 * this.height)); this.content = function () …; 

      Adım 7 - Doldurun “İçerik ()” Yöntem

      O İçerik () Kapılarımızı tarayıcıda gösterecek yöntem. Öncelikle, değişkenin yardımıyla yeni bir DOM düğümü yaratıyoruz. düğüm Bu yaratacak

    • HTML dosyasındaki şu andaki boş sırasız listemizdeki öğeler (ul # adventDoors).

      Door sınıfı, bir sonraki Adımda (Adım 8) bir for döngüsünde 24 kez başlatılacağından, bunun anlamı 24 olacaktır.

    • elemanları, her kapı için bir li. Bir sonraki satırda yeni düğümü #adventDoors appendChild () DOM yöntemini kullanarak bir alt öğe olarak sıralanmamış liste.

      Bir sonraki satırdaki node.id özelliği, her liste öğesine (kapı) benzersiz bir kimlik seçici ekler. Bir sonraki adımda günler arasında düzgün şekilde dolaşabilmek için buna ihtiyacımız olacak (Adım 8). Bu sayede Kapı 1’in id =”door1", Kapı 2 olacak id =”door2" seçici, vb.

      Bir sonraki satırdaki node.style.cssText özelliği, her liste öğesine (kapıya) bazı CSS kuralları ekleyerek style =”... ” HTML dosyalarına satır içi CSS eklemek için kullanılan HTML özelliği. node.style.cssText özellik önceki adımda belirlediğimiz Kapı sınıfının özelliklerini kullanır (Adım 6).

      Door nesnesini tıklanabilir hale getirmek için ayrıca bir liste öğeleri içindeki etiketi. Bunu da yardımı ile yapıyoruz. innerNode alt öğe olarak tanımladığımız uygun liste öğesine bağladığımız değişken id =”Kapı [i]” seçici ([i] ile gün sayısıdır), önceki gibi appendChild () DOM yöntemini kullanarak.

      Bir sonraki satırdaki innerHTML özelliği şu anki günü (1-24) tarayıcıdaki kapının üstünde görüntüler ve ayrıca href =”#” href DOM özelliği aracılığıyla bağlantı etiketlerimizin niteliği.

      Son olarak, if-else ifadesinde, bir Door nesnesinin etkinleştirilmesi veya devre dışı bırakılması gerekip gerekmediğini değerlendiririz. İlk olarak, Date nesnesinin getMonth () yöntemini kullanarak yılın 12. ayında (Aralık) olup olmadığımızı inceliyoruz. 1 eklemeliyiz, çünkü getMonth () sıfır tabanlıdır (Ocak ay 0, vb.).

      Bundan sonra, tarihte tutulan tarihin olup olmadığını kontrol ederiz. Geçerli tarih 5. adımda belirlediğimiz global değişken gün geçerli Door nesnesinin temsil ettiği.

      Aralık değilse veya verilen Kapının temsil ettiği gün geçerli tarihten daha büyükse, kullanıcıların devre dışı bırakılması ve ilgili Advent mesajını görebilmesi için diğer durumlarda Etkinleştirilmesi gereken şekilde Kapı devre dışı bırakılmalıdır..

      Kapı devre dışıysa, bir class =”engelli” className özelliğinin yardımı ile verilen bağlantı etiketine seçici. Unutma, biz zaten tarz yarattık .engelli 4. Adımda CSS içeren sınıf. Ayrıca false döndürmek için onclick HTML olay özelliğini de ayarlamamız gerekiyor..

      Kapı etkin durumdaysa, adventMessage özelliği bir uyarı iletisine ekleyin ve onclick HTML olayı özelliğinin içine yerleştirin..

       this.content = function () var node = document.createElement ("li"); document.getElementById ( "adventDoors") appendChild (düğüm).; node.id = "kapı" + gün; node.style.cssText = "width:" + this.width + "px; height:" + this.height + "px; top:" + this.y + "px; sol:" + this.x + "px ; '; var innerNode = document.createElement ("a"); document.getElementById ("kapı" + gün) .appendChild (innerNode); innerNode.innerHTML = gün; innerNode.href = "#"; if ((currentDate.getMonth () + 1) < 12 || currentDate.getDate() < day )  innerNode.className = "disabled"; innerNode.onclick = function()  return false;   else  var adventMessage = this.adventMessage; innerNode.onclick = function()  alert(adventMessage); return false;   ;

      Adım 8 - Başlat “Kapı” Nesneler

      Son olarak, Door sınıfını 24 kez başlatmamız gerekiyor..

      Bunu yapmak için, burada oldukça yararlı olan bir Hemen Çağrılan İşlev İfadesi kullanıyoruz, çünkü fonksiyonun içindeki kodu yalnızca bir kez çalıştırmak istediğimiz için bir değişkene ihtiyacımız yok.

      Biz oluştururuz Kapılar [] 24 Door nesnesini tutacak dizi. 1'den 24'e kadar olan günler arasında dolaşıyoruz (diziler sıfır temelli olduğu için kapılar [] dizisinin 0-23. Öğeleri olacaklar) ve sonunda tüme geri dönüyoruz. Kapılar [] tarayıcıda görüntülemek üzere 24 kapı nesnesi içeren dizi.

       (function () var doors = []; for (var i = 0; i < 24; i++)  doors[i] = new Door(myCal, i + 1); doors[i].content();  return doors; )();
      • gösteri
      • Kaynak İndir