Cara Membangun Kalender Advent Sederhana dalam JavaScript
Advent adalah periode menunggu dan mempersiapkan Natal yang dimulai empat hari Minggu sebelum malam Natal. Berlalunya waktu Advent secara tradisional diukur dengan bantuan Kalender Advent atau Karangan Bunga Advent. Meskipun awal Advent bukan tanggal yang pasti, Kalender Advent biasanya dimulai pada 1 Desember.
Berdasarkan kebiasaan setempat, Kalender Advent dapat memiliki desain yang berbeda, tetapi paling sering berbentuk kartu persegi panjang besar dengan 24 jendela atau pintu menandai hari-hari antara 1 dan 24 Desember. Pintu-pintu menyembunyikan pesan, puisi, doa atau kejutan kecil.
Dalam posting ini saya akan menunjukkan caranya membuat Kalender Advent dalam JavaScript berorientasi objek. Karena dibuat dalam JavaScript vanilla, Anda dapat dengan mudah menempatkan kode ke situs web Anda sendiri.
- Demo
- Sumber Unduhan
Desain Kalender JavaScript
Kalender Advent kami akan memiliki 24 pintu dengan gambar latar belakang bertema Natal. Setiap pintu akan menyembunyikan kutipan terkait Natal yang akan muncul dalam bentuk pesan peringatan ketika pengguna mengklik pintu. Pintu-pintu tetap tertutup sampai hari tertentu tiba, seperti halnya dengan Kalender Advent kehidupan nyata; pintu tidak bisa dibuka sebelum hari yang tepat.
Pintu yang sudah diaktifkan akan memiliki batas dan warna latar belakang (putih) yang berbeda dari yang dinonaktifkan (hijau muda). Kami akan menggunakan HTML5, CSS3, dan JavaScript untuk menyiapkan Kalender Advent kami yang terlihat seperti ini:
Langkah 1 - Buat Struktur & Sumber Daya File
Pertama-tama, kita perlu memilih gambar latar belakang yang bagus. Saya memilih satu dengan orientasi potret dari Pixabay, jadi kalender saya akan berisi 4 kolom dan 6 baris.
Tidak apa-apa jika Anda lebih suka orientasi lanskap. Cukup ubah posisi pintu dalam kode JavaScript, seperti yang akan Anda lakukan 6 kolom dan 4 baris. Jika Anda memiliki gambar Anda, buat folder bernama / gambar, dan simpan itu.
Ini akan menjadi satu-satunya sumber gambar kami untuk proyek ini.
Untuk file JavaScript buat a / skrip folder di dalam folder root Anda. Tempatkan dua file teks kosong ke dalamnya, dan beri nama calendar.js dan messages.js. Calendar.js akan memegang fungsionalitas, sementara messages.js akan berisi berbagai pesan yang muncul ketika pengguna “terbuka” (klik pada) pintu.
Kami juga akan membutuhkan file HTML dan CSS, jadi buat dua file kosong di dalam folder root Anda dan beri mereka nama index.html dan style.css.
Ketika Anda siap, Anda memiliki sumber daya dan struktur file yang Anda perlukan untuk menyelesaikan proyek ini, dan folder root Anda terlihat seperti ini:
Langkah 2 - Buat HTML
Kode HTML yang kami gunakan cukup mudah. Lembar gaya CSS ditautkan di
bagian, sedangkan dua file JavaScript termasuk di bagian bawah bagian. Yang terakhir diperlukan, karena jika kita menempatkan skrip ke dalam bagian, kode tidak akan dieksekusi, karena itu menggunakan elemen halaman HTML yang dimuat.Kalender Advent itu sendiri ditempatkan di dalam
Di bawah gambar kami menempatkan daftar kosong berurutan dengan “adventDoors” pemilih id yang akan diisi oleh skrip. Jika pengguna tidak mengaktifkan JavaScript di browser mereka, mereka hanya akan melihat gambar Natal sederhana.
Kalender Advent Kalender Advent
Langkah 3 - Isi “Pesan” Array
Kami membutuhkan 24 kutipan Natal untuk mengisi “pesan” array Saya memilih milik saya dari GoodReads.
Buka skrip / messages.js mengajukan; kami akan menempatkan tanda kutip di sini untuk memisahkannya dari fungsi. Itu pesan array adalah array di dalam array, setiap elemen dari array luar berisi array lain dengan dua elemen: kutipan, dan pengarangnya.
Isi array dengan kutipan favorit Anda berdasarkan sintaks berikut:
var messages = [["Kutipan 1", "Penulis 1"], ["Kutipan 2", "Penulis 2"], ... ["Kutipan 24", "Penulis 24"]];
Langkah 4 - Tambahkan Gaya CSS Dasar untuk Pintu
Untuk membuat gaya CSS yang diperlukan untuk pintu kita perlu membayangkan desain akhir, karena pintu itu sendiri akan dibuat dengan JavaScript pada langkah-langkah berikut.
Kita perlu membuat 4 kolom dan 6 baris persegi panjang dalam perataan yang tepat. Untuk ini, kita akan menggunakan posisi: relatif dan posisi: absolut Aturan CSS. Karena posisi yang tepat akan berubah dari pintu ke pintu, kami akan menambahkan teratas, bawah, kiri, dan kanan properti di JavaScript, di CSS kita hanya perlu menambahkan posisi relatif ke wadah (daftar unordered dalam HTML), dan posisi absolut untuk elemen daftar (mereka akan ditambahkan dalam JS juga).
Hal penting lainnya dalam file stylesheet adalah buat desain yang berbeda untuk penyandang cacat dan negara yang diaktifkan. Itu .cacat pemilih akan ditambahkan ke dinonaktifkan oleh JavaScript.
Untuk Kalender demo saya, saya menetapkan batas putih solid dan font putih untuk pintu yang diaktifkan dengan latar belakang putih transparan saat melayang; dan perbatasan lampu hijau, dan font, dan latar belakang lampu hijau transparan untuk yang dinonaktifkan. Jika Anda tidak menyukai desain ini, Anda dapat mengubah warna dan gaya sesuai keinginan Anda.
Masukkan kode berikut (atau aturan gaya Anda yang dimodifikasi) ke dalam style.css mengajukan.
ul # adventDoors position: relative; daftar-gaya: tidak ada; bantalan: 0; margin: 0; #adventDoors li position: absolute; #adventDoors li a color: #fff; lebar: 100%; tinggi: 100%; ukuran font: 24px; perataan teks: tengah; display: flex; arah fleksibel: kolom; justify-content: center; teks-dekorasi: tidak ada; perbatasan: 1px #fff solid; #adventDoors li a: not (.disabled): hover color: #fff; warna latar belakang: transparan; background-color: rgba (255.255.255,0.15); #adventDoors li a.disabled border-color: # b6fe98; background-color: rgba (196.254.171,0.15); warna: # b6fe98; kursor: default;
Langkah 5 - Buat Variabel Global
Dari langkah ini, kami hanya akan bekerja dengan skrip / calendar.js file, jadi sekarang mari kita buka ini. Kalender Advent kami akan menggunakan dua variabel global.
Itu myCal variabel memegang gambar Kalender sebagai objek JS. Gambar sudah ditambahkan ke index.html file di Langkah 2. Kami akan menempatkan pintu ke gambar ini di Langkah 7. Kami menangkap HTML terkait elemen ditandai dengan “adventCal” identifier dengan menggunakan metode DOM getElementById (). Itu myCal variabel akan menjadi objek DOM HTMLImageElement.
Itu tanggal sekarang variabel memegang tanggal saat ini sehingga skrip kami dapat dengan mudah memutuskan apakah pintu harus diaktifkan atau dinonaktifkan. Untuk membuat tanggal sekarang kami instantiate objek baru dari kelas JavaScript Tanggal.
Masukkan potongan kode berikut ke atas Anda calendar.js mengajukan.
var myCal = document.getElementById ("adventCal"); var currentDate = Tanggal baru ();
Langkah 6 - Buat “Pintu” Kelas
Karena kita membutuhkan 24 pintu, cara paling mudah untuk melakukan ini adalah dengan membuat a “Pintu” kelas, dan kemudian instantiate 24 kali.
Kelas Door kami memiliki dua parameter, kalender dan hari. Untuk kalender parameter kita harus melewati gambar Natal yang akan berfungsi sebagai latar belakang. Untuk hari parameter kita harus melewati hari Desember dalam bentuk integer.
Kami akan melewati nilai yang tepat dari parameter pada langkah terakhir (Langkah 8), selama instantiasi objek 24 Pintu.
Kami akan membuat 5 properti dan 1 metode untuk kelas Door. Pada Langkah ini kita hanya akan membahas 5 properti, dan saya akan menjelaskan konten () metode pada Langkah selanjutnya.
Itu “lebar” & “tinggi” properti
Itu lebar dan tinggi properti secara dinamis menghitung lebar dan tinggi setiap pintu individu (yang berubah sesuai dengan lebar dan tinggi gambar latar belakang).
Pengganda 0,1 dan 0,95 berada dalam persamaan untuk menyisakan ruang untuk margin, antara setiap pintu, dan di sekitar sisi-sisi Kalender, juga.
Itu “adventMessage” milik
Itu adventMessage properti menyimpan konten pesan peringatan, yaitu kutipan dan penulis yang cocok yang kami miliki messages.js file memegang. Itu adventMessage properti mengambil penawaran dan penulis dari pesan [] array, tergantung pada tanggal saat ini.
Untuk 1 Des adventMessage properti mengambil elemen pertama dari array luar yaitu pesan [0], karena array berbasis nol di JavaScript.
Untuk alasan yang sama, penawaran untuk 1 Desember diposisikan sebagai pesan [0] [0] (elemen pertama dari array dalam), dan penulis yang cocok dapat dihubungi sebagai pesan [0] [1] (elemen kedua dari array dalam).
Itu “x”&”y” properti
Properti x dan y tahan posisi yang tepat dari setiap pintu yang akan kita gunakan pada langkah berikutnya untuk mengatur teratas dan kiri Properti CSS. Ini akan melengkapi posisi: relatif dan posisi: absolut Aturan CSS yang kami tetapkan di Langkah 4 untuk wadah pintu (ul # adventDoors), dan pintu itu sendiri (#adventDoors li). Perhitungannya mungkin terlihat agak mengintimidasi, tetapi mari kita telusuri lebih dalam.
Itu x properti akan digunakan oleh kiri Properti pemosisian CSS di Langkah berikutnya (Langkah 7). Ini menentukan dalam piksel di mana Pintu individu harus ditempatkan pada sumbu x.
Dibutuhkan lebar gambar latar belakang, dan menyisakan sedikit margin untuknya (4%). Kemudian dengan bantuan operator sisanya, ia menilai di kolom mana ia akan ditempatkan (ingat, akan ada 4 kolom), dan akhirnya menambahkan sedikit (10%) margin untuk setiap Pintu individu dengan menggunakan pengali 1,1.
Dengan cara yang sama, y properti akan digunakan oleh teratas Properti penentuan posisi CSS, dan juga menentukan dalam piksel di mana Pintu individual harus ditempatkan pada sumbu y.
Kami mengambil ketinggian gambar latar belakang dengan bantuan properti ketinggian yang dilewati kalender parameter (yang menampung objek-DOM), dan meninggalkan margin 4% di sekitar sisi vertikal Kalender.
Kemudian, dengan bantuan metode Math.floor () kita menghitung di baris mana objek Door akan diberikan (akan ada 6 baris).
Akhirnya kami menambahkan margin 10% untuk setiap objek Pintu dengan mengalikan ketinggiannya menggunakan pengali 1,1.
function Door (kalender, hari) this.width = ((calendar.width - 0.1 * calendar.width) / 4) * 0.95; this.height = ((calendar.height - 0.1 * calendar.height) / 6) * 0.95; this.adventMessage = 'Hari' + hari + 'dari Advent \ n \ n' + '"' + pesan [hari - 1] [0] + '" \ n \ n \ t' + 'oleh' + pesan [hari - 1] [1] + '\ n \ n'; this.x = (0,04 * calendar.width + ((hari - 1)% 4) * (1.1 * this.width)); this.y = - (0.96 * calendar.height - Math.floor ((hari - 1) / 4) * (1.1 * this.height)); this.content = function () ...;
Langkah 7 - Isi “Konten ()” metode
Ini adalah konten () metode yang akan menampilkan pintu kami di browser. Pertama-tama, kita membuat simpul DOM baru dengan bantuan variabel simpul yang akan membuat
Karena kelas Door akan dipakai 24 kali dalam for for di Langkah berikutnya (Langkah 8), ini berarti bahwa kita akan memiliki 24
Properti node.id di baris berikutnya menambahkan pemilih id unik untuk setiap elemen daftar (pintu). Kita membutuhkan ini untuk dapat dengan benar melewati hari-hari di langkah berikutnya (Langkah 8). Dengan cara ini Pintu 1 akan memiliki id =”pintu1 ", Pintu 2 akan memiliki id =”pintu2 " pemilih, dll.
Properti node.style.cssText di baris berikutnya menambahkan beberapa aturan CSS ke setiap elemen daftar (pintu) dengan bantuan style =”... ” Atribut HTML yang digunakan untuk memasukkan CSS sebaris dalam file HTML. Itu node.style.cssText properti menggunakan properti dari kelas Door yang kita atur di langkah sebelumnya (Langkah 6).
Untuk membuat objek Door kita dapat diklik kita juga perlu menambahkan tag di dalam elemen daftar. Kami mencapai ini dengan bantuan innerNode variabel yang kita ikat sebagai elemen turunan ke elemen daftar yang sesuai yang diidentifikasi oleh id =”pintu [i]” pemilih (dengan [i] menjadi nomor hari), dengan menggunakan metode appendChild () DOM seperti sebelumnya.
Properti innerHTML di baris berikutnya menampilkan hari ini (1-24) di atas pintu di browser, dan kami juga menambahkan href =”#” atribut ke tag anchor kami melalui properti DOM href.
Akhirnya, dalam pernyataan if-else, kami mengevaluasi apakah objek Door harus diaktifkan atau dinonaktifkan. Pertama, kami memeriksa apakah kami berada di bulan ke-12 tahun (Desember) dengan menggunakan metode getMonth () dari objek Date. Kita perlu menambahkan 1, karena getMonth () berbasiskan nol (Januari adalah bulan 0, dll.).
Setelah ini, kami memeriksa apakah tanggal saat ini diadakan di tanggal sekarang variabel global yang kita atur di Langkah 5 kurang dari hari yang diwakili objek Door saat ini.
Jika ini bukan Desember, atau hari yang diwakili oleh Pintu yang diberikan lebih besar dari tanggal saat ini, Pintu harus dinonaktifkan, dalam hal lain itu perlu diaktifkan sehingga pengguna dapat mengkliknya, dan melihat pesan Advent terkait.
Jika Pintu dinonaktifkan, kami menambahkan a class =”cacat” pilih tag anchor yang diberikan dengan bantuan properti className. Ingat, kami sudah menata .cacat kelas dengan CSS pada Langkah 4. Kita juga perlu mengatur atribut event HTML onclick untuk mengembalikan false.
Jika Pintu dalam keadaan aktif, kami menambahkan adventMessage properti ke pesan peringatan, dan letakkan di dalam atribut event HTML onclick.
this.content = function () var node = document.createElement ("li"); document.getElementById ("adventDoors"). appendChild (node); node.id = "pintu" + hari; node.style.cssText = "width:" + this.width + "px; height:" + this.height + "px; top:" + this.y + "px; kiri:" + this.x + "px ; "; var innerNode = document.createElement ("a"); document.getElementById ("door" + day) .appendChild (innerNode); innerNode.innerHTML = hari; 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; ;
Langkah 8 - Inisialisasi “Pintu” Benda
Akhirnya, kita perlu menginisialisasi kelas Door 24 kali.
Untuk melakukannya, kami menggunakan Ekspresi Fungsi Segera Dibatalkan yang cukup berguna di sini, karena kami tidak memerlukan variabel karena kami hanya ingin mengeksekusi kode di dalam fungsi sekali.
Kami membuat pintu [] array yang akan menampung objek 24 Pintu. Kami mengulang hari dari 1 hingga 24 (mereka akan menjadi elemen 0-23 dari array pintu [], karena array berbasiskan nol), dan akhirnya mengembalikan keseluruhan pintu [] array termasuk objek 24 Door untuk menampilkannya di browser.
(function () var doors = []; for (var i = 0; i < 24; i++) doors[i] = new Door(myCal, i + 1); doors[i].content(); return doors; )();
- Demo
- Sumber Unduhan