как сделать?
S O S
как выделить цветом в календарь сегодн число, сегодн день недели, текущий месяц, дни недели других месяцев, и сделать навигацию по годам? <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <style> #table_year { table-layout: fixed; width: 100%; border: 1px solid hsl(0, 0%, 66%); border-radius: 4px; } .td_month { width: 260px; height: 270px; border: 1px solid hsl(0, 0%, 66%); border-radius: 4px; } #num_year, #January, #February, #March, #April, #May, #June, #July, #August, #September, #October, #November, #December { background-color: hsl(210, 100%, 95%); color: hsl(210, 100%, 50%); font: bold 18px serif; text-align: center; border: 1px solid hsl(0,0%,66%); border-radius: 4px; padding: 5px; margin: 0 0 5px 0; } #num_year { font: bold 24px serif; width: 780px; border: 1px solid hsl(0, 0%, 66%); border-radius: 4px; padding: 5px; margin: 0 0 5px 0; } #month1, #month2, #month3, #month4, #month5, #month6, #month7, #month8, #month9, #month10, #month11, #month12 { display: inline-block; border: 1px solid hsl(0, 0%, 66%); border-radius: 4px; padding: 5px; width: auto; } .day { border: 1px solid hsl(0, 0%, 66%); width: auto; line-height: 30px; text-align: center; margin: 1px; background-color: hsl(210, 100%, 95%); color: hsl(210, 100%, 50%); } .table_month { table-layout: fixed; width: 100%; height: 220px; border: 1px solid hsl(0, 0%, 66%); border-radius: 4px; } .table_month tr td:nth-child(1) { width: 20%; font-weight: bold; } .table_month tr td.day:nth-child(1) { background-color: hsl(210, 100%, 88%); color: hsl(210, 100%, 60%); } .table_month tr:nth-child(n + 6) td.day:nth-child(1) { background-color: hsl(348, 100%, 88%); color: hsl(348, 100%, 60%); } .table_month tr:nth-child(n + 6) td.day { background-color: hsl(348, 100%, 95%); color: hsl(348, 100%, 50%); } #year_input { border: 1px solid hsl(0,0%,66%); display: inline-block; text-align: center; font: bold 24px serif; color: hsl(210,100%,50%); width: 100px; } </style> </head> <body> <div id="num_year"> Календарь на <button class="year_minus">◀</button> <input id="year_input" type="number" size="4" value="2021"/> <button class="year_plus">▶</button> год.</button><br/> <button id="presently">сегодня</button> </div> <table id="table_year"> <tr> <td class="td_month"> <div id="month1"> <div id="January"></div> <table class="table_month"></table> </div> </td> <td class="td_month"> <div id="month2"> <div id="February"></div> <table class="table_month"></table> </div> </td> <td class="td_month"> <div id="month3"> <div id="March"></div> <table class="table_month"></table> </div> </td> </tr> <tr> <td class="td_month"> <div id="month4"> <div id="April"></div> <table class="table_month"></table> </div> </td> <td class="td_month"> <div id="month5"> <div id="May"></div> <table class="table_month"></table> </div> </td> <td class="td_month"> <div id="month6"> <div id="June"></div> <table class="table_month"></table> </div> </td> </tr> <tr> <td class="td_month"> <div id="month7"> <div id="July"></div> <table class="table_month"></table> </div> </td> <td class="td_month"> <div id="month8"> <div id="August"></div> <table class="table_month"></table> </div> </td> <td class="td_month"> <div id="month9"> <div id="September"></div> <table class="table_month"></table> </div> </td> </tr> <tr> <td class="td_month"> <div id="month10"> <div id="October"></div> <table class="table_month"></table> </div> </td> <td class="td_month"> <div id="month11"> <div id="November"></div> <table class="table_month"></table> </div> </td> <td class="td_month"> <div id="month12"> <div id="December"></div> <table class="table_month"></table> </div> </td> </tr> </table> <script> var calendar = { update: function(year, month) { this.year = year; this.month = ['Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь'][month]; var startDay = new Date(year, month, 1); var offsetDay = (startDay.getDay() || 7) - 1; startDay.setDate(startDay.getDate() - offsetDay); var lastDay = new Date(startDay); var days = new Date(year, month + 1, 0).getDate(); days = Math.ceil((days + offsetDay) / 7) * 7; lastDay.setDate(lastDay.getDate() + days); this.data = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс']; while (startDay < lastDay) { this.data.push(startDay.getDate()); startDay.setHours(24); } }, render: function() { var html = ['<tr class="week_day">', '<tr>', '<tr>', '<tr>', '<tr>', '<tr>', '<tr>']; for (var i = 0; i < this.data.length; i++) { html[i % 7] += '<td class="day">' + this.data[i]; } this.monthName.textContent = this.month; this.element.innerHTML = html.join(''); }, }; var today = new Date(), thisYear = today.getFullYear(), thisMonth = today.getMonth(), months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; calendar.days = ['Пн', 'Вт', 'Ср', 'Чт', 'Пт', 'Сб', 'Вс']; calendar.numYear = document.querySelector('#num_year'); months.forEach((v,i) => { calendar.monthName = document.querySelector(`#${v}`); calendar.element = document.querySelectorAll('.table_month')[i]; calendar.update(thisYear, i); calendar.render(); }); </script> </body> </html> |
как в этом скрипте
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <title>Вертикальный календарь</title> <style type="text/css"> @import url('https://fonts.googleapis.com/css?family=Baumans&display=swap'); body { width: 1023px; } body, select, input { font: 14px serif; } #calendar { width: 330px; height: 375px; display: inline-block; border: 1px solid hsl(0,0%,66%); border-radius: 6px/4px; padding: 5px; margin: 0 0 5px 0; } #navigation_panel { background-color: hsl(210,100%,92%); min-height: 34px; max-height: 78px; border: 1px solid hsl(0,0%,66%); border-radius: 6px/4px; padding: 10px; margin-bottom: 5px; text-align: center; vertical-align: middle; display: -webkit-box; display: -webkit-flex; display: flex; -webkit-box-align: center; -webkit-align-items: center; align-items: center; -webkit-box-pack: center; -webkit-justify-content: center; justify-content: center; -webkit-flex-wrap: wrap; flex-wrap: wrap; } #navigation_panel button, #navigation_panel #calendar_year { background-color: hsl(210,100%,85%); color: hsl(210,100%,45%); font: 14px serif; border: 1px solid hsl(210,100%,45%); } #calendar_month { background-color: transparent; color: hsl(210,100%,45%); font: 14px serif; border: 1px solid hsl(210,100%,45%); } #navigation_panel button { height: 34px; vertical-align: middle; } #background_month { background-color: hsl(210,100%,85%); display: inline-block; } button.minus { width: 28px; text-align: center; border-radius: 12px 0 0 12px / 10px 0 0 10px; margin-right: -1px; } button.plus { width: 28px; text-align: center; border-radius: 0 12px 12px 0 / 0 10px 10px 0; margin-left: -1px; } .month_plus { margin-right: 35px; } .arrow { display: inline-block; line-height: 0.5; } #presently { width: 234px; margin-top: 10px; border-radius: 12px/10px; } #calendar_month { width: 89px; display: inline-block; } #calendar_year { width: 54px; display: inline-block; } select { height: 34px; } input { height: 30px; display: inline-block; text-align: center; } #table { font-family: 'Baumans', cursive; table-layout: fixed; width: 100%; height: 413px; padding: 2px; } #table, td { border: 1px solid hsl(0,0%,66%); border-radius: 6px/4px; } td { margin: 1px; text-align: center; } #table tbody td.prevMonth { background-color: hsl(210,100%,95%); color: hsl(210,100%,80%); border: 1px solid hsl(0,0%,80%); } /* будние дни предыдущего месяца */ #table tbody tr:nth-child(n + 6) td.prevMonth { background-color: hsl(348,100%,95%); color: hsl(348,100%,80%); border: 1px solid hsl(0,0%,80%); } /* выходные дни предыдущего месяца */ #table tbody td.nextMonth { background-color: hsl(210,100%,95%); color: hsl(210,100%,80%); border: 1px solid hsl(0,0%,80%); } /* будние дни следующего месяца */ #table tbody tr:nth-child(n + 6) td.nextMonth { background-color: hsl(348,100%,95%); color: hsl(348,100%,80%); border: 1px solid hsl(0,0%,80%); } /* выходные дни следующего месяца */ #presently.hide { display: none; } #table tbody tr td.week-day { background-color: hsl(210,100%,85%); color: hsl(210,100%,50%); border: 1px solid hsl(0,0%,60%); width: 20%; } /* день недели */ #table tbody tr:nth-child(n + 6) td.week-day { background-color: hsl(348,100%,85%); color: hsl(348,100%,50%); border: 1px solid hsl(0,0%,60%); } /* день недели выходной*/ #table tbody tr td.week-day.curDay { border: 1px solid hsl(210,100%,50%); background-color: hsl(210,100%,75%); color: hsl(210,100%,98%); font-weight: bold; text-shadow: 1px 1px hsl(210,100%,50%), -1px 1px hsl(210,100%,50%), 1px -1px hsl(210,100%,50%), -1px -1px hsl(210,100%,50%), 1px 0 hsl(210,100%,50%), 0 1px hsl(210,100%,50%), -1px 0 hsl(210,100%,50%), 0 -1px hsl(210,100%,50%); letter-spacing: 2px; } /* сегодн день недели */ #table tbody tr:nth-child(n + 6) td.week-day.curDay { border: 1px solid hsl(348,100%,50%); background-color: hsl(348,100%,75%); color: hsl(348,100%,98%); font-weight: bold; text-shadow: 1px 1px hsl(348,100%,50%), 1px -1px hsl(348,100%,50%), -1px 1px hsl(348,100%,50%), -1px -1px hsl(348,100%,50%), 1px 0 hsl(348,100%,50%), -1px 0 hsl(348,100%,50%), 0 1px hsl(348,100%,50%), 0 -1px hsl(348,100%,50%); letter-spacing: 2px; } /* сегодн день недели выходной */ #table tbody td { background-color: hsl(210,100%,90%); color: hsl(210,100%,50%); } /* будние дни текущего месяца */ #table tbody tr:nth-child(n + 6) td{ background-color: hsl(348,100%,90%); color: hsl(348,100%,50%); } /* выходные дни текущего месяца */ #table tbody tr td.curMonth.curDay { background-color: hsl(210,100%,80%); border: 1px solid hsl(210,100%,50%); font-weight: bold; color: hsl(210,100%,100%); text-shadow: 1px 1px hsl(210,100%,50%), -1px 1px hsl(210,100%,50%), 1px -1px hsl(210,100%,50%), -1px -1px hsl(210,100%,50%), 1px 0 hsl(210,100%,50%), 0 1px hsl(210,100%,50%), -1px 0 hsl(210,100%,50%), 0 -1px hsl(210,100%,50%); letter-spacing: 3px; } /* сегодня будний */ #table tbody tr:nth-child(n + 6) td.curMonth.curDay { background-color: hsl(348,100%,80%); border: 1px solid hsl(348,100%,50%); color: hsl(348,100%,100%); text-shadow: 1px 1px hsl(348,100%,50%), 1px -1px hsl(348,100%,50%), -1px 1px hsl(348,100%,50%), -1px -1px hsl(348,100%,50%), 1px 0 hsl(348,100%,50%), -1px 0 hsl(348,100%,50%), 0 1px hsl(348,100%,50%), 0 -1px hsl(348,100%,50%); letter-spacing: 3px; } /* сегодня выходной */ #calendar { display: flex; flex-direction: column; } .content_month { flex: 1; } #table { height:100%; } button, select, input { outline: none; } </style> </head> <body> <div id="calendar"> <div id="navigation_panel"> <button class="month_minus minus"><span class="arrow">◀</span></button> <span id="background_month"><select id="calendar_month"></select></span> <button class="month_plus plus"><span class="arrow">▶</span></button> <button class="year_minus minus"><span class="arrow">◀</span></button> <input type="number" size="4" id="calendar_year"/> <button class="year_plus plus"><span class="arrow">▶</span></button><br/> <button id="presently">сегодня</button> </div> <div class="content_month"> <table id="table"> <tbody></tbody> </table></div> </div> <script> Date.prototype.reduce = function(callback, value) { var year = this.getFullYear(); var month = this.getMonth(); var step = new Date(year, month, 1); var last = new Date(year, month + 1, 0); step.setHours(24 * (0 - ((step.getDay() + 6) % 7))); last.setHours(24 * (6 - ((last.getDay() + 6) % 7))); for (var i = 0; step <= last; i++) { value = callback(value, new Date(+step), i, this); step.setHours(24); } return value; }; var data = new Date(); var selectMonth = document.querySelector('#calendar_month'); var monthNames = [ 'Январь', 'Февраль', 'Март', 'Апрель', 'Май', 'Июнь', 'Июль', 'Август', 'Сентябрь', 'Октябрь', 'Ноябрь', 'Декабрь',]; monthNames.forEach(function(monthName, i) { selectMonth.options[i] = new Option(monthName, i); }); selectMonth.addEventListener('change', function() { data.setMonth(this.value); createCalendar(data); }); var minusMonth = document.querySelector('.month_minus'); minusMonth.addEventListener('click', function() { data.setMonth(data.getMonth() - 1); createCalendar(data); }); var plusMonth = document.querySelector('.month_plus'); plusMonth.addEventListener('click', function() { data.setMonth(data.getMonth() + 1); createCalendar(data); }); var minusYear = document.querySelector('.year_minus'); minusYear.addEventListener('click', function() { data.setYear(data.getFullYear() - 1); createCalendar(data); }); var plusYear = document.querySelector('.year_plus'); plusYear.addEventListener('click', function() { data.setYear(data.getFullYear() + 1); createCalendar(data); }); var inputYear = document.querySelector('#calendar_year'); inputYear.addEventListener('input', function() { if (/^\d{4}$/.test(this.value)) { data.setYear(this.value); createCalendar(data); } }); var currentButton = document.querySelector('#presently'); currentButton.addEventListener('click', function() { data = new Date(); createCalendar(data); }); function createCalendar(data) { var now = new Date().setHours(0, 0, 0, 0); var year = data.getFullYear(); inputYear.value = year; var month = data.getMonth(); selectMonth.selectedIndex = month; currentButton.classList.remove('hide'); var indexcurDay; var cls = ['prevMonth', 'curMonth', 'nextMonth'], indexCls = 0; var html = data.reduce(function(value, current, index, source) { var date = current.getDate(); if (date == 1) indexCls++; var className = cls[indexCls]; if (+now == +current && indexCls == 1) { className += ' curDay'; currentButton.classList.add('hide'); indexcurDay = index % 7; } value[index % 7] += '<td class="' + className + '">' + date; return value }, ['<tr><td class="week-day">Пн.', '<tr><td class="week-day">Вт.', '<tr><td class="week-day">Ср.', '<tr><td class="week-day">Чт.', '<tr><td class="week-day">Пт.', '<tr><td class="week-day">Сб.', '<tr><td class="week-day">Вс.']); document.querySelector('#table tbody').innerHTML = html.join(''); var daysTd = document.querySelectorAll('.week-day'); if(indexcurDay !== void 0) daysTd[indexcurDay].classList.add('curDay'); } createCalendar(data); var timer; function refresh() { window.clearTimeout(timer); var finish = new Date().setHours(24, 0, 0, 0); finish -= data; timer = window.setTimeout(function() { createCalendar(data); refresh(); }, finish); } refresh(); </script> </body> </html> при попытках вставить скриптом год в поле ввода, декабрь перестал отображать числа, только дни недели были растянуты на ширину таблицы... |
Часовой пояс GMT +3, время: 18:32. |