วิธีสร้างปฏิทินแบบง่ายใน JavaScript
แอดเวนต์คือช่วงเวลาของการรอและเตรียมพร้อมสำหรับคริสต์มาสซึ่งเริ่มต้นสี่วันอาทิตย์ก่อนวันคริสต์มาส เวลาที่ผ่านไปของการจุติถูกวัดตามธรรมเนียมด้วยความช่วยเหลือของ Advent Calendar หรือ Advent Wreath แม้ว่าการเริ่มต้นของการจุติจะไม่ใช่วันที่ที่กำหนด แต่ปฏิทินจุติมักจะเริ่มต้นในวันที่ 1 ธันวาคม.
ตามปฏิทินของท้องถิ่นปฏิทินจุติอาจมีรูปแบบที่แตกต่างกันไป แต่ส่วนใหญ่จะอยู่ในรูปแบบของ การ์ดสี่เหลี่ยมขนาดใหญ่ที่มี 24 หน้าต่างหรือประตู ทำเครื่องหมายวันระหว่าง 1 ธันวาคมถึง 24 ประตูปิดบังข้อความบทกวีคำอธิษฐานหรือความประหลาดใจเล็กน้อย.
ในโพสต์นี้ฉันจะแสดงวิธีการ ทำปฏิทินจุติใน JavaScript เชิงวัตถุ. เนื่องจากมันถูกสร้างขึ้นใน vanilla JavaScript คุณสามารถวางรหัสลงในเว็บไซต์ของคุณเอง.
- การสาธิต
- แหล่งดาวน์โหลด
การออกแบบปฏิทิน JavaScript
ปฏิทินจุติของเราจะมี 24 ประตูบนภาพพื้นหลังธีมคริสต์มาส แต่ละประตูจะซ่อนคำพูดที่เกี่ยวข้องกับคริสมาสต์ที่จะ ปรากฏขึ้นในรูปแบบของข้อความแจ้งเตือนเมื่อผู้ใช้คลิกที่ประตู. ประตูยังคงปิดให้บริการจนกว่าจะถึงวันที่กำหนดเนื่องจากเป็นกรณีที่มีปฏิทินจุติชีวิตจริง ประตูไม่สามารถเปิดได้ก่อนถึงวันที่เหมาะสม.
ประตูที่เปิดใช้งานแล้วจะมีเส้นขอบและสีพื้นหลัง (สีขาว) ที่แตกต่างจากสีที่ปิดใช้งาน (สีเขียวอ่อน) เราจะใช้ HTML5, CSS3 และ JavaScript เพื่อเตรียม Advent Calendar ของเราที่มีลักษณะดังนี้:
ขั้นตอนที่ 1 - สร้างโครงสร้างไฟล์ & ทรัพยากร
ก่อนอื่นเราต้องเลือกภาพพื้นหลังที่สวยงาม ฉันเลือกอันที่มีการวางแนวแนวตั้งจาก Pixabay ดังนั้นปฏิทินของฉันจะมี 4 คอลัมน์และ 6 แถว.
มันก็โอเคถ้าคุณชอบแนวนอน เพียงเปลี่ยนตำแหน่งของประตูในรหัส JavaScript ตามที่คุณมี 6 คอลัมน์และ 4 แถว. หากคุณมีภาพของคุณสร้างโฟลเดอร์ที่เรียกว่า / ภาพ, และบันทึก.
นี่จะเป็นทรัพยากรรูปภาพของเราสำหรับโครงการนี้.
สำหรับไฟล์ JavaScript ให้สร้าง / สคริปต์ โฟลเดอร์ภายในโฟลเดอร์รูทของคุณ วางไฟล์ข้อความเปล่าสองไฟล์ลงไปแล้วตั้งชื่อไฟล์ calendar.js และ messages.js. Calendar.js จะหยุดการทำงานในขณะที่ messages.js จะมีอาเรย์ของข้อความที่ปรากฏขึ้นเมื่อผู้ใช้ “เปิด” (คลิกที่) ประตู.
นอกจากนี้เรายังต้องการไฟล์ HTML และ CSS ดังนั้นสร้างไฟล์ว่างสองไฟล์ในโฟลเดอร์รูทของคุณและตั้งชื่อให้พวกเขา index.html และ style.css.
เมื่อคุณพร้อมคุณมีทรัพยากรและโครงสร้างไฟล์คุณจะต้องทำให้โครงการนี้สำเร็จและโฟลเดอร์รูทของคุณจะมีลักษณะดังนี้:
ขั้นตอนที่ 2 - สร้าง HTML
รหัส HTML ที่เราใช้นั้นค่อนข้างตรงไปตรงมา สไตล์ชีท CSS มีการเชื่อมโยงใน
ในขณะที่ ไฟล์ JavaScript สองไฟล์รวมอยู่ที่ด้านล่างของ มาตรา. สิ่งหลังมีความจำเป็นเพราะถ้าเราใส่สคริปต์เข้าไปใน ส่วนรหัสจะไม่ถูกดำเนินการตามที่มัน ใช้องค์ประกอบของหน้า HTML ที่โหลด.ปฏิทินจุตินั้นถูกวางไว้ภายใน
ด้านล่างของภาพเราวางรายการที่ไม่มีการเรียงลำดับที่ว่างเปล่าด้วย “adventDoors” id selector ที่จะถูกบรรจุโดยสคริปต์ หากผู้ใช้ไม่ได้เปิดใช้งาน JavaScript ในเบราว์เซอร์ของพวกเขาพวกเขาก็จะเห็นภาพคริสต์มาสง่ายๆ.
ปฏิทินจุติ ปฏิทินจุติ
ขั้นตอนที่ 3 - เติม “ข้อความ” แถว
เราต้องการใบเสนอราคาคริสต์มาส 24 ใบเพื่อเติมเต็ม “ข้อความ” แถว ฉันเลือกของฉันจาก GoodReads.
เปิด สคริปต์ / messages.js ไฟล์; เราจะใส่เครื่องหมายคำพูดไว้ที่นี่เพื่อให้แยกจากการทำงาน ข้อความ อาเรย์เป็นอาร์เรย์ภายในอาเรย์แต่ละองค์ประกอบของอาเรย์ด้านนอกจะมีอาเรย์อีกอันที่มีสองอิลิเมนต์: อัญประกาศและผู้แต่ง.
เติมอาร์เรย์ด้วยคำพูดที่คุณชื่นชอบตามไวยากรณ์ต่อไปนี้:
ข้อความ var = [["ใบเสนอราคา 1", "ผู้แต่ง 1"], ["ใบเสนอราคา 2", "ผู้แต่ง 2"], ... ["ใบเสนอราคา 24", "ผู้แต่ง 24"]];
ขั้นตอนที่ 4 - เพิ่มสไตล์ CSS พื้นฐานสำหรับประตู
ในการสร้างสไตล์ CSS ที่จำเป็นสำหรับประตูเราจำเป็นต้องจินตนาการถึงการออกแบบขั้นสุดท้ายเนื่องจากตัวประตูจะถูกสร้างขึ้นด้วย JavaScript ในขั้นตอนต่อไปนี้.
เราจำเป็นต้องสร้าง 4 คอลัมน์และ 6 แถวของสี่เหลี่ยมในการจัดตำแหน่งที่เหมาะสม สำหรับสิ่งนี้เราจะใช้ ตำแหน่ง: ญาติ และ ตำแหน่ง: แน่นอน กฎ CSS เนื่องจากตำแหน่งที่แน่นอนจะเปลี่ยนประตูเราจะเพิ่ม ด้านบน, ด้านล่าง, ซ้าย, และ ขวา คุณสมบัติใน JavaScript ใน CSS เราเพียงแค่ต้องเพิ่มตำแหน่งสัมพัทธ์ในคอนเทนเนอร์ (รายการที่ไม่ได้เรียงใน HTML) และตำแหน่งที่แน่นอนสำหรับองค์ประกอบรายการ.
สิ่งสำคัญอื่น ๆ ในไฟล์สไตล์ชีทคือ สร้างการออกแบบที่แตกต่างกันสำหรับคนพิการและสถานะที่เปิดใช้งาน. .พิการ ตัวเลือกจะถูกเพิ่มไปยัง JavaScript โดยปิดการใช้งาน.
สำหรับปฏิทินตัวอย่างของฉันฉันตั้งค่าเส้นขอบสีขาวทึบและสีขาวแบบอักษรสำหรับประตูที่เปิดใช้งานที่มีพื้นหลังสีขาวโปร่งใสในการวางเมาส์ไว้ และเส้นขอบสีเขียวอ่อนและแบบอักษรและพื้นหลังสีเขียวอ่อนสำหรับคนพิการ หากคุณไม่ชอบดีไซน์นี้คุณสามารถเปลี่ยนสีและสไตล์ตามความต้องการของคุณ.
วางรหัสต่อไปนี้ (หรือกฎสไตล์ของคุณ) ลงในของคุณ style.css ไฟล์.
ul # AdventDoors ตำแหน่ง: ญาติ; รายการสไตล์: ไม่มี; การเติมเต็ม: 0; กำไรขั้นต้น: 0; #adventDoors li position: absolute; #adventDoors li a color: #fff; ความกว้าง: 100%; ความสูง: 100%; ขนาดตัวอักษร: 24px; จัดข้อความ: ศูนย์; แสดงผล: ดิ้น; ดิ้นทิศทาง: คอลัมน์; ปรับเนื้อหา: ศูนย์; การตกแต่งข้อความ: ไม่มี; เส้นขอบ: 1px #fff solid; #adventDoors li a: not (.disabled): โฮเวอร์ color: #fff; สีพื้นหลัง: โปร่งใส สีพื้นหลัง: rgba (255,255,255,0.15); #adventDoors li a.disabled border-color: # b6fe98; สีพื้นหลัง: rgba (196,254,171,0.15); สี: # b6fe98; เคอร์เซอร์: เริ่มต้น;
ขั้นตอนที่ 5 - สร้างตัวแปรทั่วโลก
จากขั้นตอนนี้ไปเราจะทำงานกับ สคริปต์ / calendar.js ไฟล์ดังนั้นตอนนี้เรามาเปิดขึ้น ปฏิทินจุติของเราจะใช้ตัวแปรระดับโลกสองตัว.
myCal ตัวแปรเก็บภาพปฏิทินเป็นวัตถุ JS เพิ่มรูปภาพแล้วใน index.html ไฟล์ในขั้นตอนที่ 2 เราจะวางประตูบนภาพนี้ในขั้นตอนที่ 7 เราจับ HTML ที่เกี่ยวข้อง องค์ประกอบที่มีเครื่องหมาย “adventCal” identifier โดยใช้เมธอด getElementById () myCal ตัวแปรจะเป็นวัตถุ DOM ของ HTMLImageElement.
วันที่ปัจจุบัน ตัวแปรถือวันที่ปัจจุบันเพื่อให้สคริปต์ของเราสามารถตัดสินใจได้ง่ายว่าควรเปิดใช้งานหรือปิดการใช้งานประตูหรือไม่ เพื่อสร้าง วันที่ปัจจุบัน เรายกตัวอย่างวัตถุใหม่ของคลาส Date JavaScript.
วางข้อมูลโค้ดต่อไปนี้ไว้ด้านบนของคุณ calendar.js ไฟล์.
var myCal = document.getElementById ("AdventCal"); var currentDate = new Date ();
ขั้นตอนที่ 6 - สร้าง “ประตู” ชั้น
เนื่องจากเราต้องการประตู 24 บานวิธีที่ตรงไปตรงมาที่สุดในการสร้างคือ “ประตู” ชั้นเรียนและต่อมายกตัวอย่างมัน 24 ครั้ง.
คลาส Door ของเรามีสองพารามิเตอร์, ปฏิทิน และ วัน. สำหรับทาง ปฏิทิน พารามิเตอร์ที่เราจะต้องผ่านภาพคริสต์มาสที่จะทำหน้าที่เป็นพื้นหลัง สำหรับทาง วัน พารามิเตอร์เราจะต้องผ่านวันที่ปัจจุบันของเดือนธันวาคมในรูปแบบของจำนวนเต็ม.
เราจะส่งค่าที่แน่นอนของพารามิเตอร์ในขั้นตอนสุดท้าย (ขั้นตอนที่ 8) ในระหว่างการสร้างอินสแตนซ์ของวัตถุ 24 ประตู.
เราจะสร้าง 5 คุณสมบัติและ 1 วิธีสำหรับคลาส Door ในขั้นตอนนี้เราจะผ่าน 5 คุณสมบัติเท่านั้นและฉันจะอธิบาย เนื้อหา() วิธีการในขั้นตอนต่อไป.
“ความกว้าง” & “ความสูง” คุณสมบัติ
ความกว้าง และ ความสูง คุณสมบัติคำนวณความกว้างและความสูงของประตูแต่ละบานแบบไดนามิก (เปลี่ยนแปลงตามความกว้างและความสูงของภาพพื้นหลัง).
ตัวคูณ 0.1 และ 0.95 อยู่ในสมการเพื่อเว้นช่องว่างสำหรับระยะขอบระหว่างแต่ละประตูและรอบ ๆ ด้านข้างของปฏิทินเช่นกัน.
“adventMessage” คุณสมบัติ
adventMessage พร็อพเพอร์ตี้เก็บเนื้อหาของข้อความแจ้งเตือนคือราคาและผู้เขียนที่ตรงกันที่เรา messages.js ถือไฟล์ adventMessage สถานที่ให้บริการจะอ้างและผู้เขียนจาก ข้อความ [] อาร์เรย์ขึ้นอยู่กับวันที่ปัจจุบัน.
สำหรับวันที่ 1 ธันวาคม adventMessage คุณสมบัติใช้องค์ประกอบแรกของอาร์เรย์ด้านนอกซึ่งก็คือ ข้อความ [0], ในฐานะที่เป็นอาร์เรย์เป็นศูนย์ใน JavaScript.
ด้วยเหตุผลเดียวกันการเสนอราคาสำหรับวันที่ 1 ธันวาคมอยู่ในตำแหน่ง ข้อความ [0] [0] (องค์ประกอบแรกของอาร์เรย์ภายใน) และผู้เขียนที่ตรงกันสามารถเข้าถึงได้เป็น ข้อความ [0] [1] (องค์ประกอบที่สองของอาร์เรย์ภายใน).
“x”&”Y” คุณสมบัติ
คุณสมบัติ x และ Y ดำรงตำแหน่งที่เหมาะสมของแต่ละประตูที่เราจะใช้ในขั้นตอนถัดไปเพื่อตั้งค่า ด้านบน และ ซ้าย คุณสมบัติ CSS สิ่งเหล่านี้จะเสริม ตำแหน่ง: ญาติ และ ตำแหน่ง: แน่นอน กฎ CSS ที่เรากำหนดไว้ในขั้นตอนที่ 4 สำหรับที่เก็บประตู (ul # AdventDoors) และประตูตัวเอง (#adventDoors li) การคำนวณอาจดูค่อนข้างน่ากลัว แต่เรามาดูกันอย่างรวดเร็ว.
x คุณสมบัติจะถูกใช้โดย ซ้าย คุณสมบัติการวางตำแหน่ง CSS ในขั้นตอนถัดไป (ขั้นตอนที่ 7) มันกำหนดเป็นพิกเซลซึ่งต้องวางแต่ละประตูบนแกน x.
ใช้ความกว้างของภาพพื้นหลังและทำให้ระยะห่างเล็กน้อยสำหรับมัน (4%) จากนั้นด้วยความช่วยเหลือของผู้ปฏิบัติงานที่เหลือจะประเมินว่าจะวางคอลัมน์ใด (โปรดจำไว้ว่าจะมี 4 คอลัมน์) และในที่สุดก็เพิ่มระยะขอบเล็กน้อย (10%) ให้กับแต่ละประตูโดยใช้ตัวคูณ 1.1.
ในทำนองเดียวกัน Y คุณสมบัติจะถูกใช้โดย ด้านบน คุณสมบัติการวางตำแหน่ง CSS และในทำนองเดียวกันจะกำหนดเป็นพิกเซลซึ่งจะต้องวางแต่ละประตูบนแกน y.
เราใช้ความสูงของภาพพื้นหลังด้วยความช่วยเหลือของคุณสมบัติความสูงของที่ผ่านมา ปฏิทิน พารามิเตอร์ (ที่เก็บวัตถุ DOM) และเว้นระยะไว้ 4% รอบ ๆ แนวดิ่งของปฏิทิน.
จากนั้นด้วยความช่วยเหลือของวิธีการ Math.floor () เราจะคำนวณว่าแถวใดที่วัตถุประตูที่กำหนดจะเป็น (จะมี 6 แถว).
ในที่สุดเราก็เพิ่มมาร์จิ้น 10% สำหรับแต่ละวัตถุของประตูโดยการเพิ่มความสูงโดยใช้ตัวคูณ 1.1.
ฟังก์ชั่นประตู (ปฏิทิน, วัน) this.width = ((calendar.width - 0.1 * calendar.width) / 4) * 0.95; this.height = ((calendar.height - 0.1 * calendar.height) / 6) * 0.95; this.adventMessage = 'วัน' + วัน + 'จุติ \ n \ n' + '"+ ข้อความ [วัน - 1] [0] +'" \ n \ n \ t '+' โดย '+ ข้อความ [วัน - 1] [1] + '\ n \ n'; this.x = (0.04 * calendar.width + ((วัน - 1)% 4) * (1.1 * this.width)); this.y = - (0.96 * calendar.height - Math.floor ((วัน - 1) / 4) * (1.1 * this.height)); this.content = function () …;
ขั้นตอนที่ 7 - เติม “เนื้อหา()” วิธี
มันคือ เนื้อหา() วิธีการที่จะแสดงประตูของเราในเบราว์เซอร์ ก่อนอื่นเราสร้างโหนด DOM ใหม่ด้วยความช่วยเหลือของตัวแปร ปม ที่จะสร้าง
เนื่องจากคลาส Door จะถูกสร้างอินสแตนซ์ 24 ครั้งใน for for loop ในขั้นตอนถัดไป (ขั้นตอนที่ 8) ซึ่งหมายความว่าเราจะมี 24
คุณสมบัติ node.id ในบรรทัดถัดไปเพิ่มตัวเลือก id ที่ไม่ซ้ำกันให้กับแต่ละองค์ประกอบรายการ (ประตู) เราจะต้องใช้สิ่งนี้เพื่อให้สามารถวนซ้ำวันในขั้นตอนถัดไปได้อย่างถูกต้อง (ขั้นตอนที่ 8) วิธีนี้ประตู 1 จะมี id =”door1", ประตู 2 จะมี id =”door2" ตัวเลือก ฯลฯ.
คุณสมบัติ node.style.cssText ในบรรทัดถัดไปเพิ่มกฎ CSS บางอย่างให้กับองค์ประกอบรายการแต่ละรายการ (ประตู) ด้วยความช่วยเหลือของ style =”... ” คุณลักษณะ HTML ที่ใช้ในการรวม CSS แบบอินไลน์ในไฟล์ HTML node.style.cssText property ใช้คุณสมบัติของคลาส Door ที่เราตั้งไว้ในขั้นตอนก่อนหน้า (ขั้นตอนที่ 6).
ในการทำให้วัตถุของเราคลิกได้เราจำเป็นต้องเพิ่ม แท็กภายในองค์ประกอบรายการ เราบรรลุสิ่งนี้ด้วยความช่วยเหลือของ innerNode ตัวแปรที่เราผูกเป็นองค์ประกอบลูกกับองค์ประกอบรายการที่เหมาะสมที่ระบุโดย id =”ประตู [ผม]” selector (ด้วย [i] เป็นหมายเลขวัน) โดยใช้ appendChild () วิธี DOM เหมือนเมื่อก่อน.
คุณสมบัติ innerHTML ในบรรทัดถัดไปแสดงวันปัจจุบัน (1-24) ที่ด้านบนสุดของประตูในเบราว์เซอร์และเรายังเพิ่ม href =”#” แอตทริบิวต์กับแท็กสมอของเราโดยใช้คุณสมบัติ href DOM.
ในที่สุดในคำสั่ง if-else เราประเมินว่าควรเปิดใช้งานหรือปิดใช้งานวัตถุประตูหรือไม่ อันดับแรกเราตรวจสอบว่าเราอยู่ในเดือนที่ 12 ของปี (ธันวาคม) โดยใช้วิธี getMonth () ของวัตถุ Date เราจำเป็นต้องเพิ่ม 1 เนื่องจาก getMonth () เป็นศูนย์ (มกราคมคือเดือน 0 เป็นต้น).
หลังจากนี้เราจะตรวจสอบว่าวันที่ปัจจุบันที่ถืออยู่ใน วันที่ปัจจุบัน ตัวแปรทั่วโลกที่เราตั้งไว้ในขั้นตอนที่ 5 น้อยกว่า วัน วัตถุในปัจจุบันหมายถึง.
หากไม่ใช่ธันวาคมหรือวันที่แสดงโดยประตูที่กำหนดมีขนาดใหญ่กว่าวันที่ปัจจุบันประตูควรถูกปิดใช้งานในกรณีอื่น ๆ ที่จำเป็นต้องเปิดใช้งานเพื่อให้ผู้ใช้สามารถคลิกที่ประตูและดูข้อความ Advent ที่เกี่ยวข้อง.
หากปิดการใช้งานประตูเราจะเพิ่ม class =”พิการ” เลือกไปยังแท็ก anchor ที่กำหนดด้วยความช่วยเหลือของคุณสมบัติ className โปรดจำไว้ว่าเราได้จัดสไตล์ .พิการ คลาสที่มี CSS ในขั้นตอนที่ 4 นอกจากนี้เรายังต้องตั้งค่าคุณลักษณะเหตุการณ์ onclick HTML เพื่อส่งคืนค่าเท็จ.
หากประตูอยู่ในสถานะเปิดใช้งานเราจะเพิ่ม adventMessage คุณสมบัติไปยังข้อความแจ้งเตือนและวางไว้ภายในแอตทริบิวต์เหตุการณ์ onclick HTML.
this.content = function () var node = document.createElement ("li"); document.getElementById ( "adventDoors") appendChild (โหนด). node.id = "ประตู" + วัน; node.style.cssText = "width:" + this.width + "px; height:" + this.height + "px; top:" + this.y + "px ซ้าย:" + this.x + "px ; "; var innerNode = document.createElement ("a"); document.getElementById ("ประตู" + วัน). appendChild (innerNode); innerNode.innerHTML = วัน; 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; ;
ขั้นตอนที่ 8 - เริ่มต้น “ประตู” วัตถุ
ในที่สุดเราต้องเริ่มต้นคลาสของประตู 24 ครั้ง.
ในการทำเช่นนั้นเราใช้การแสดงออกของฟังก์ชันที่เรียกใช้ทันทีซึ่งค่อนข้างมีประโยชน์ที่นี่เพราะเราไม่ต้องการตัวแปรเนื่องจากเราต้องการเรียกใช้โค้ดภายในฟังก์ชันเพียงครั้งเดียว.
เราสร้าง ประตู [] อาร์เรย์ที่จะเก็บวัตถุ 24 ประตู เราวนซ้ำจากวันที่ 1 ถึง 24 (พวกมันจะเป็นองค์ประกอบที่ 0-23 ของอาร์เรย์ [] เนื่องจากอาร์เรย์มีค่าเป็นศูนย์) และในที่สุดก็คืนค่าทั้งหมด ประตู [] อาร์เรย์รวมถึงวัตถุ 24 ประตูเพื่อแสดงในเบราว์เซอร์.
(function () var doors = []; สำหรับ (var i = 0; i < 24; i++) doors[i] = new Door(myCal, i + 1); doors[i].content(); return doors; )();
- การสาธิต
- แหล่งดาวน์โหลด