Как да се изгради прост Адвентен календар в JavaScript
Адвент е периодът на чакане и подготовка за Коледа, която започва четири неделя преди Бъдни вечер. Преминаването на Адвентното време традиционно се измерва с помощта на Адвентен календар или Адвентен венец. Въпреки че началото на Адвента не е фиксирана дата, Адвентните календари обикновено започват на 1 декември.
Базирайки се на местните обичаи, Адвентните календари могат да имат различен дизайн, но най-често те са под формата на големи правоъгълни карти с 24 прозорци или врати отбелязвайки дните между 1 и 24 декември. Вратите крият послания, стихове, молитви или малки изненади.
В този пост ще ви покажа как направете Адвентния календар в обектно-ориентирания JavaScript. Тъй като това е направено във ванилия JavaScript, можете лесно да поставите кода в собствения си уебсайт.
- Демонстрация
- Изтеглете Източник
Дизайн на календара на JavaScript
Нашият Адвент календар ще има 24 врати на фона на Коледа. Всяка врата ще скрие котировката, свързана с Коледа се появява под формата на предупредително съобщение, когато потребителят кликне на вратата. Вратите остават затворени до идването на дадения ден, какъвто е случаят с реалния живот Адвентния календар; вратите не могат да бъдат отворени преди подходящия ден.
Вратите, които вече са активирани, ще имат различна граница и цвят на фона (бял), отколкото тези с увреждания (светлозелени). Ще използваме HTML5, CSS3 и JavaScript, за да подготвим нашия Адвентен календар, който изглежда по следния начин:
Стъпка 1 - Създаване на файлова структура и ресурси
Първо, трябва да изберем хубаво фоново изображение. Избрах една с портретна ориентация от Pixabay, така че календарът ми ще съдържа 4 колони и 6 реда.
Добре е, ако предпочитате пейзажна ориентация. Просто променете позициите на вратите в JavaScript кода, както ще имате 6 колони и 4 реда. Ако имате изображение, създайте папка, наречена / изображения, и го запазете.
Това ще бъде единственият ни ресурс за този проект.
За JavaScript файловете създайте a / скриптове в папката ви. Поставете два празни текстови файла в него и ги кръстете calendar.js и messages.js. Calendar.js ще държи функционалността, докато messages.js ще съдържа масива от съобщения, които се появяват, когато потребителят “отваря” (щраква) вратите.
Ще ни трябва и HTML и CSS файл, така че създайте два празни файла в кореновата си папка и им дайте имената index.html и style.css.
Когато сте готови, имате ресурсите и файловата структура, които трябва да изпълните този проект, а кореновата ви папка изглежда по следния начин:
Стъпка 2 - Създайте HTML
HTML кодът, който използваме, е доста ясен. CSS стилът е свързан в
раздел, докато два дънни файла са включени в долната част на раздел. Последното е необходимо, защото ако сложим скриптовете в раздел, кодът няма да бъде изпълнен, тъй като използва елементите на заредената HTML страница.Самият Адвентски календар се поставя вътре
Под изображението поставяме празен неуправен списък с “adventDoors” Идентификатор за селекция, който ще бъде попълнен от скриптовете. Ако потребителят не е активирал JavaScript в браузъра си, те ще виждат просто коледен образ.
Адвентен календар Адвентен календар
Стъпка 3 - Попълнете “Съобщения” Array
Имаме нужда от 24 коледни котировки, за да запълним “съобщения” масив. Избрах моята от GoodReads.
Отвори скриптове / messages.js файл; ще поставим кавичките тук, за да ги държим отделно от функционалността. Най- съобщения масив е масив в масив, всеки елемент от външния масив съдържа друг масив с два елемента: цитат и неговия автор.
Попълнете масива с любимите си цитати според следния синтаксис:
var messages = [["Цитат 1", "Автор 1"], ["Цитат 2", "Автор 2"],… ["Цитат 24", "Автор 24"]];
Стъпка 4 - Добавете CSS стилове за вратите
За да създадем необходимите CSS стилове за вратите, трябва да си представим окончателния дизайн, тъй като самите врати ще бъдат създадени с JavaScript в следните стъпки:.
Трябва да създадем 4 колони и 6 реда от правоъгълници в правилното подравняване. За това ще използваме позиция: относителна и позиция: абсолютна CSS правила. Тъй като точната позиция ще се промени вратата до вратата, ще добавим връх, дъно, наляво, и прав свойства в JavaScript, в CSS ние просто трябва да добавим относителна позиция към контейнера (нередовен списък в HTML), и абсолютни позиции за елементите на списъка (те ще бъдат добавени в JS, също).
Другото важно нещо в файла със стилове е създайте различен дизайн за състоянието на хората с увреждания и за активираните. Най- .хора с увреждания Селекторът ще бъде добавен към забранените от JavaScript.
За демо календара поставям бяла рамка и бели шрифтове за активираните врати с прозрачен бял фон при зависване; и светлозелена граница и шрифтове, както и прозрачен фон за инвалиди. Ако не ви харесва този дизайн, можете да промените цветовете и стиловете според желанието си.
Поставете следния код (или променените правила на стила) във вашия style.css досие.
ul # adventDoors position: relative; стил в списъка: няма; пълнеж: 0; марж: 0; #adventDoors li позиция: абсолютна; #adventDoors li a цвят: #fff; ширина: 100%; височина: 100%; размер на шрифта: 24px; text-align: center; дисплей: Flex; гъвкава посока: колона; justify-content: център; текст-декорация: няма; граница: 1px #fff твърдо; #adventDoors li a: not (.disabled): hover 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” идентификатор с помощта на метода getElementById () DOM. Най- myCal променлива ще бъде HTMLImageElement DOM обект.
Най- текуща дата променливата съдържа текущата дата, така че нашият скрипт да може лесно да реши дали дадена врата трябва да бъде активирана или забранена. Да създам текуща дата създаваме нов обект от класа Date JavaScript.
Поставете следния кодов фрагмент в горната част на calendar.js досие.
var myCal = document.getElementById ("adventCal"); var currentDate = new Дата ();
Стъпка 6 - Създайте “врата” клас
Тъй като имаме нужда от 24 врати, най-лесният начин да направите това е да създадете a “врата” клас, и по-късно да го инстанцирате 24 пъти.
Класът „Врата” има два параметъра, календар и ден. За календар параметър ще трябва да премине коледен образ, който ще функционира като фон. За ден параметър ще трябва да премине текущия ден на декември под формата на цяло число.
Ще преминем точните стойности на параметрите в последната стъпка (Стъпка 8), по време на инстанцирането на 24-те врати.
Ще направим 5 свойства и 1 метод за клас Врата. В тази стъпка ще преминем само през петте свойства и ще обясня съдържание () метод в следващата стъпка.
Най- “широчина” & “височина” Имоти
Най- широчина и височина свойства динамично изчисляват ширината и височината на всяка отделна врата (която се променя в зависимост от ширината и височината на фоновото изображение).
Умножителите с 0,1 и 0,95 са в уравнението, за да оставят пространство за полетата, между всяка врата и около страните на календара..
Най- “adventMessage” Имот
Най- adventMessage притежава съдържанието на предупредителните съобщения, а именно цитати и съответстващите им автори messages.js файлът се задържа. Най- adventMessage собственост взема цитат и автор от съобщения [] масив, в зависимост от текущата дата.
За 1 декември adventMessage свойството отнема първия елемент от външния масив, който е съобщения [0], като масиви са нулеви базирани в JavaScript.
По същата причина, котировката за 1 декември се позиционира като съобщения [0] [0] (първият елемент от вътрешния масив) и съответният автор може да бъде достигнат като съобщения [0] [1] (втори елемент от вътрешния масив).
Най- “х”&”ш” Имоти
Имоти х и ш дръжте правилните позиции на всяка врата, които ще използваме в следващата стъпка, за да настроите връх и наляво CSS свойства. Те ще допълват позиция: относителна и позиция: абсолютна CSS правила, които сме задали в Стъпка 4 за контейнера на вратата (ul # adventDoors) и самите врати (#adventDoors li). Изчисленията може да изглеждат малко смущаващи, но нека да преминем бързо през тях.
Най- х ще се използва от наляво Свойство за позициониране на CSS в следващата стъпка (стъпка 7). Той определя в пиксели, където отделна Врата трябва да бъде поставена на оста х.
Той заема ширината на фоновото изображение и оставя малко поле за него (4%). След това с помощта на остатъчния оператор оценява в коя колона ще бъде поставен (не забравяйте, че ще има 4 колони) и накрая добавя малко (10%) марж на всяка отделна Врата с помощта на 1.1.
По същия начин, ш ще се използва от връх Свойство за позициониране на CSS, и също така определя в пиксели, където трябва да бъде поставена отделна Врата на оста Y.
Вземаме височината на фоновото изображение с помощта на височината на предаваното календар параметър (който съдържа DOM-обект) и оставя 4% марж около вертикалните страни на календара.
След това, с помощта на метода Math.floor (), ние изчисляваме в кой ред ще бъде даден обект Door (ще има 6 реда).
Накрая добавяме 10% марж за всеки обект Door, като умножим неговата височина, използвайки 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' + '"' + съобщения [ден - 1] [0] + '" \ t - 1] [1] + '\ t 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 - Попълнете “Content ()” метод
Това е съдържание () метод, който ще покаже вратите ни в браузъра. Първо, създаваме нов DOM възел с помощта на променливата възел което ще създаде
Тъй като класът Door ще бъде инстанциран 24 пъти в цикъл for за следващата стъпка (стъпка 8), това означава, че ще имаме 24
Свойството node.id в следващия ред добавя уникален селектор за идентификация към всеки елемент от списъка (врата). Ние ще се нуждаем от това, за да можем правилно да преминем през дните в следващата стъпка (Стъпка 8). По този начин Door 1 ще има ИД =”door1 ", Вратата 2 ще има ИД =”door2 " селектор и т.н..
Свойството node.style.cssText в следващия ред добавя някои CSS правила към всеки елемент от списъка (врата) с помощта на стил =”... ” HTML атрибут, който се използва за включване на вграден CSS в HTML файлове. Най- node.style.cssText property използва свойствата на класа Door, който сме задали в предишната стъпка (Стъпка 6).
За да направим нашия обект Door clickable ние също трябва да добавим вътре в списъка елементи. Ние постигаме това с помощта на innerNode променлива, която обвързваме като подчинен елемент към съответния елемент от списъка, идентифициран от ИД =”врата [Ь]” селектор (с [i] е номерът на деня), като се използва методът appendChild () DOM точно както преди.
Свойството innerHTML в следващия ред показва текущия ден (1-24) в горната част на вратата в браузъра и също добавяме HREF =”#” атрибут към нашите котви етикети с помощта на собствеността на href DOM.
И накрая, в оператора if-else ние оценяваме дали обектът Door трябва да бъде активиран или деактивиран. Първо, проверяваме дали сме в 12-ия месец на годината (декември), като използваме метода getMonth () на обекта Date. Трябва да добавим 1, защото getMonth () е базиран на нула (януари е месец 0 и т.н.).
След това проверяваме дали текущата дата се намира в текуща дата глобалната променлива, която сме задали в Стъпка 5 е по-малка от ден който представлява текущият обект „Врата“.
Ако не е декември или денят, представен от дадената врата, е по-голям от текущата дата, вратата трябва да бъде деактивирана..
Ако вратата е изключена, добавяме a клас =”хора с увреждания” селектора към дадения anchor tag с помощта на свойството className. Не забравяйте, че вече сме оформили .хора с увреждания клас с CSS в Стъпка 4. Също така трябва да зададем атрибута на събитие onclick HTML да върне false.
Ако вратата е в разрешено състояние, добавяме adventMessage на собственост на предупредително съобщение и го поставете в атрибута на събитие onclick HTML.
this.content = function () var node = document.createElement ("li"); document.getElementById ( "adventDoors") appendChild (възел). node.id = "врата" + ден; node.style.cssText = "ширина:" + this.width + "px; height:" + this.height + "px; top:" + this.y + "px; left:" + this.x + "px "; var innerNode = document.createElement ("a"); document.getElementById ("врата" + ден) .appendChild (internalNode); innerNode.innerHTML = ден; innerNode.href = "#"; ако ((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 - Инициализирайте “врата” обекти
И накрая, трябва да инициализираме класа Door 24 пъти.
За да направим това, използваме незабавно извикано функционално изражение, което е много полезно тук, защото не се нуждаем от променлива, тъй като искаме само веднъж да изпълним кода във функцията веднъж.
Ние създаваме a врати [] масив, който ще държи 24-те врати. Прескачаме циклично през дните от 1 до 24 (те ще бъдат 0-23-те елементи на масива врати [], тъй като масивите са базирани на нула) и накрая връщат цялата врати [] масив, включително 24-те врати, за да ги покажете в браузъра.
(function () var doors = []; for (var i = 0; i < 24; i++) doors[i] = new Door(myCal, i + 1); doors[i].content(); return doors; )();
- Демонстрация
- Изтеглете Източник