Как сделать календарь на js
Напишите функцию createCalendar(elem, year, month) .
Вызов функции должен создать календарь для заданного месяца month в году year и вставить его в elem .
Например, createCalendar(cal, 2012, 9) сгенерирует в cal следующий календарь:
P.S. В этой задаче достаточно сгенерировать календарь, кликабельным его делать не нужно.
Для решения задачи сгенерируем таблицу в виде строки: «
» , а затем присвоим в innerHTML .
Календарь-1 для сайта на JavaScript
Простой календарь для сайта на CSS и JavaScript.
Представленный календарь предназначен для просмотра ближайших дней плюс-минус месяц. Календарь можно листать до нужного года как вперед, так и назад.
Вид календаря на странеце сайта
- Разместить все три части на одной странице.
- Разместить часть 1 (стиль календаря) в отдельном файле.css.
- Разместить часть 3 (скрипт календаря) в отдельном файле.js и подключить к странице сайта.
1. Стиль календаря
.look-calendar < width:220px; border:1px solid #c0c0c0; padding:6px; margin: 0 auto; >#calendar < width: 100%; line-height: 1.2em; font-size: 15px; text-align: center; border-spacing:0px; >#calendar tr.dn td < font-size: 15px; >#calendar thead tr:last-child < font-size: small; color: #555555; >#calendar thead tr:nth-child(1) td:nth-child(2) < color: #323232; >#calendar thead tr:nth-child(1) td:nth-child(1):hover, #calendar thead tr:nth-child(1) td:nth-child(3):hover < cursor: pointer; >#calendar tbody td < color: #2c567a; >#calendar tbody td:nth-child(n+6), #calendar .holiday < color: #e78c5c; >#calendar tbody td.today
2. Код календаря на страние сайта.html
‹ › ПнВтСрЧтПтСбВс
3. Скрипт календаря
function calendar(id, year, month) < var Dlast = new Date(year, month + 1, 0).getDate(), D = new Date(year, month, Dlast), DNlast = new Date(D.getFullYear(), D.getMonth(), Dlast).getDay(), DNfirst = new Date(D.getFullYear(), D.getMonth(), 1).getDay(), calendar = '', month = ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"]; if (DNfirst != 0) < for (var i = 1; i < DNfirst; i++) calendar += ''; > else < for (var i = 0; i < 6; i++) calendar += ''; > for (var i = 1; i ‘ + i; > else < calendar += '' + i; > if (new Date(D.getFullYear(), D.getMonth(), i).getDay() == 0) < calendar += ''; > > for (var i = DNlast; i < 7; i++) calendar += ''; document.querySelector('#' + id + ' tbody').innerHTML = calendar; document.querySelector('#' + id + ' thead td:nth-child(2)').innerHTML = month[D.getMonth()] + ' ' + D.getFullYear(); document.querySelector('#' + id + ' thead td:nth-child(2)').dataset.month = D.getMonth(); document.querySelector('#' + id + ' thead td:nth-child(2)').dataset.year = D.getFullYear(); if (document.querySelectorAll('#' + id + ' tbody tr').length < 6) < // чтобы при перелистывании месяцев не "подпрыгивала" вся страница, добавляется ряд пустых клеток. Итог: всегда 6 строк для цифр document.querySelector('#' + id + ' tbody').innerHTML += ' '; > > calendar(«calendar», new Date().getFullYear(), new Date().getMonth()); // переключатель минус месяц document.querySelector(‘#calendar thead tr:nth-child(1) td:nth-child(1)’).onclick = function() < calendar("calendar", document.querySelector('#calendar thead td:nth-child(2)').dataset.year, parseFloat(document.querySelector('#calendar thead td:nth-child(2)').dataset.month) - 1); >// переключатель плюс месяц document.querySelector(‘#calendar thead tr:nth-child(1) td:nth-child(3)’).onclick = function() < calendar("calendar", document.querySelector('#calendar thead td:nth-child(2)').dataset.year, parseFloat(document.querySelector('#calendar thead td:nth-child(2)').dataset.month) + 1); >
Для этого календаря Примеры оформления (меняем только CSS).
doctor Brain
При создании различных веб-сервисов работа с датами и временем практически всегда занимает весомое место. Создание календаря — достаточно простая задача, которая, тем не менее, часто вызывает затруднения в реализации у начинающих разработчиков.
Сегодня мы создадим виджет простого месячного календаря, отвечающий следующим условиям:
- по умолчанию загружается текущий месяц,
- текущая дата выделяется,
- возможно смещение по календарю на месяц вперед или назад.
HTML
Создадим контейнер обертку month-calendar, в котором разместим три блока:
- month: содержит наименования месяца и года, а также элементы навигации,
- weekdays: наименования дней недели,
- days: собственно, сам календарь (табличная часть, содержит дни месяца).
Так выглядит html-разметка основных блоков календаря:
Обратите внимание: несмотря на визуальную реализацию виджета в виде таблицы, для каждого из вышеперечисленных дочерних элементов контейнера month-calendar мы используем немаркированный список ul . Соответственно, в дальнейшем мы будем манипулировать элементами списков li .
А вот и финальная верстка:
В данном случае для элементов навигации нужно подключить библиотеку Font Awesome (Web Font или SVG версию).
CSS
В основе позиционирования элементов календаря находится модель flexbox.
* < box-sizing: border-box; >body < font-family: sans-serif; >/* месяцы и годы */ #month-calendar < width: 100%; >.month < margin: 0; padding: 3rem 2rem 2rem; background: #555555; text-align: center; width: 100%; color: #ffffff; list-style: none; >.month li < padding: 0; margin: 0; font-size: 1.5rem; line-height: 1.4; letter-spacing: 0.1rem; text-transform: uppercase; font-weight: 700; >.month li.prev, .month li.next < cursor: pointer; >.month li.prev < float: left; >.month li.next < float: right; >.month li.year-name < font-size: 1.2rem; font-weight: 400; >/* дни недели */ .weekdays < margin: 0; padding: 1rem 0; background-color: #dddddd; width: 100%; display: flex; flex-direction: row; flex-wrap: nowrap; justify-content: left; >.weekdays li < display: inline-block; flex: 0 0 calc(100% / 7); text-align: center; >/* дни */ .days < margin: 0; padding: 1rem 0; background-color: #eeeeee; width: 100%; display: flex; flex-wrap: wrap; justify-content: left; align-content: flex-start; height: 14rem; >.days li < padding: 0.5rem; list-style: none; display: inline-block; flex: 0 0 calc(100% / 7); text-align: center; color: #999; font-size: 0.9rem; line-height: 1rem; >.days li.date-now
На что обратить внимание:
- ширина контейнера month-calendar равна 100%: width: 100% ,
- для элементов навигации prev и next используются свойства float: left и float-right ,
- блок days имеет фиксированную высоту height: 14rem , что позволяет избежать смещения или наложения элементов при динамической смене данных виджета,
- для табличной части календаря элементы li располагаются слева направо и сверху вниз: горизонтальное выравнивание — justify-content: left , вертикальное — align-content: flex-start ,
- в одном ряду табличной части находится семь элементов, это достигается за счет использования выражения calc: flex: 0 0 calc(100% / 7) ,
- для исключения влияния размеров отсутпов на расчетные значения для всех элементов установлено свойство box-sizing: border-box .
JS
Основу работы виджета составляют свойства и методы встроенного объекта Date.
Экземпляр объекта Date
создать новый экземпляр объекта Date можно только через конструктор:
let nowDate = new Date(); // создаем экземпляра объекта с текущей датой let curDate = new Date(year,month,day); // создаем экземпляр объекта для определенной календарной даты;
Вызов Date() как функции (без new) вернет не экземпляр объекта, а строку.
Как получить год, месяц, дату?
Чтобы получить год, месяц, дату экземпляра объетка Date, обратимся к встроенным методам:
nowDate.getFullYear(); // возвращает год в четырехзначном формате nowDate.getMonth(); // возвращает номер месяца (значение от 0 до 11. Январь равен 0) nowDate.getDate(); // возвращает текущую дату
Как получить название месяца?
Чтобы получить назавние месяца воспользуемся массивом:
let arrMonthName = ['январь','февраль','март','апрель','май','июнь','июль','август','сентябрь','октябрь','ноябрь','декабрь']; let monthName = arrMonthName[NowDate.getMonth()]; // получаем название месяца
Как получить текущий день недели?
Для определения текущего дня недели тоже существует встроенная функция:
nowDate.getDay() // возвращает номер дня недели
Обратие внимание: отсчет дней недели идет с воскресенья, которое равно 0.
Как получить количество дней в месяце?
Существует небольшая хитрость, основанная на способности методов объекта Date автоматически пересчитывать параметры, приводя их к корректному значению. Так, если мы установим дату экземпляра объекта равной 0, метод getDate() вернет дату последнего дня предыдущего месяца, то есть полученное значение будет равнятся количеству дней в предыдущем месяце:
monthDays = new Date(year, month + 1, 0).getDate(); // возвращает количество дней в выбранном месяце
Как получить количество дней недели до начала текущего месяца.
Если неделя стартует с воскресенья, для определения количества дней недели до начала текущего месяца достаточно получить номер первого дня текущего месяца:
new Date(year,month,1).getDay() // возвращает номер дня недели
В случае, когда неделя начинается с понедельника, нужно получит номер последнего дня недели предыдущего месяца:
new Date(year,month,0).getDay() // возвращает номер дня недели
Как корректно сместить дату на месяц назад или вперед?
Мы опять обращаемся к способности методов объекта Date автоматически корректировать дату:
curDate.setMonth(curDate.getMonth() + 1); // смещает дату на месяц вперед curDate.setMonth(curDate.getMonth() - 1); // смещает дату на месяц назад
Итоговый JS-файл
Опираясь на данные, полученные выше создадим итоговый код JavaScript:
Результат
А вот и пример на codepen:
Спасибо за внимание.
Новые публикации

JavaScript: сохраняем страницу в pdf

2021-07-12
HTML: Полезные примеры

2021-07-11
CSS: Ускоряем загрузку страницы

2021-07-10
JavaScript: 5 странностей

2021-07-10
JavaScript: конструктор сортировщиков
Категории
О нас
Frontend & Backend. Статьи, обзоры, заметки, код, уроки.
© 2021 dr.Brain .
мир глазами веб-разработчика
Как сделать календарь с помощью jQuery UI
Для ввода даты в поле на сайте было бы удобно использовать календарь. Писать свой календарь на JavaScript было бы трудоемко и не разумно. Гораздо проще использовать уже готовое решение. В этой статье я и расскажу как сделать jQuery календарь быстро и с минимумом кода.
Для создания календаря нам понадобится:
- Библиотека jQuery, которую можно скачать к себе на сайт, либо подключить, например, c Google CDN В этой статье я использовал версию 2.2.4.
- Библиотека jQuery UI. Можете скачать полный набор, как предлагается по-умолчанию на странице, либо выбрать лишь нужные компоненты, в частности, нам нужен компонент Datepicker. Еще можно выбрать тему отличную от стандартной. Кроме того, библиотеку так же можно подключить с Google CDN
- Чтобы сделать календарь jQuery русским нам понадобится файл datepicker-ru.js который можно взять на GitHub или можете скачать готовый файл с нашего сайта.
Теперь всё необходимое есть, приведу код создания календаря Datepicker с помощью JQuery UI
Календарь
Обратите внимание : файл русского языка datepicker-ru.js нужно подключать после jquery-ui.min.js
Исходник примера со всеми необходимыми файлами можете скачать с нашего сайта.
В результате, на экране мы увидим поле для ввода даты и при клике в это поле появляется календарь. Для стандартной темы оформления это выглядит так:

Datepicker обладает различными настройками и имеет несколько методов. Настройку календаря jQuery UI можно сделать 3 способами: либо перед инициализацией, во время или после инициализации.
Например, сделать чтобы месяц и год выбирались из выпадающего списка (указание опций до инициализации Datepicker):
$.datepicker.setDefaults(< changeMonth: true, changeYear: true >); $("#datepicker").datepicker();
Следующий пример: отобразить кнопку-картинку рядом с полем для ввода даты по нажатии на которую происходит открытие календаря (указание опций во время инициализации Datepicker)
$("#datepicker").datepicker(< showOn: "both", buttonImageOnly: true, buttonImage: "calendar.gif" >);
Показать под календарем доп.панель кнопок (указание опций после инициализации Datepicker).
$("#datepicker").datepicker(); $("#datepicker").datepicker("option", "showButtonPanel", true);
Посмотреть все опции и методы, которые есть у виджета Datepicker можно на сайте библиотеки jQuery UI.