JSFiddle - React, Tailwind, and code Playground
HTML
<table id="calendarBig">
<thead>
<tr><td><td><td>
<tbody>
<tr>
<td>
<table data-m="0">
<thead>
<tr><td colspan="7">Январь
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<td>
<table data-m="1">
<thead>
<tr><td colspan="7">Февраль
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<td>
<table data-m="2">
<thead>
<tr><td colspan="7">Март
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<tr>
<td>
<table data-m="3">
<thead>
<tr><td colspan="7">Апрель
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<td>
<table data-m="4">
<thead>
<tr><td colspan="7">Май
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<td>
<table data-m="5">
<thead>
<tr><td colspan="7">Июнь
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<tr>
<td>
<table data-m="6">
<thead>
<tr><td colspan="7">Июль
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<td>
<table data-m="7">
<thead>
<tr><td colspan="7">Август
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<td>
<table data-m="8">
<thead>
<tr><td colspan="7">Сентябрь
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<tr>
<td>
<table data-m="9">
<thead>
<tr><td colspan="7">Октябрь
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
</table>
<td>
<table data-m="10">
<thead>
<tr><td colspan="7">Ноябрь
<tr><td>Пн<td>Вт<td>Ср<td>Чт<td>Пт<td>Сб<td>Вс
<tbody>
...
CSS
.click {
background: red;
}
#calendarBig { /* весь календарь */
width: 100%;
max-width: 700px;
margin: 0 auto;
border-spacing: 0 1.5em;
}
#calendarBig td {
vertical-align: top;
}
#calendarBig > thead td:not(:nth-child(2)) { /* предыдущий-следующий года */
text-decoration: underline;
color: rgb(0, 119, 204);
cursor: pointer;
}
#calendarBig > thead td:not(:nth-child(2)):hover { /* если наведён курсор на предыдущий-следующий года */
color: #ff3200;
}
#calendarBig > thead td:nth-child(2) { /* текущий год */
font-size: 150%;
font-weight: 700;
color: rgb(140, 61, 2);
}
#calendarBig, #calendarBig table {
font: monospace;
line-height: 1.2em;
font-size: 15px;
text-align: center;
}
#calendarBig table { /* таблицы с месяцами выравнены по верхней границе, горизонтально — по центру */
display: inline-table;
}
#calendarBig table thead tr:nth-child(1) { /* названия месяцев */
font-size: 110%;
font-weight: 700;
}
#calendarBig table thead tr:last-child { /* название дней недели */
font-size: small;
font-weight: 700;
color: rgb(103, 103, 103);
}
#calendarBig table tbody td { /* дни */
color: rgb(44, 86, 122);
}
#calendarBig table tbody td:nth-child(n+6), #calendarBig .holiday { /* выходные и праздники */
color: rgb(231, 140, 92);
}
#calendarBig table tbody td.today { /* сегодня */
outline: 3px solid red;
}
#calendarBig table tbody td[title] { /* выделенные даты */
outline: 3px solid green;
background: yellow;
cursor: help;
}
#calendarBig table tbody td[title] a { /* выделенные даты-ссылки */
display: block;
text-decoration: none;
}
#calendarBig table tbody td[title] a:hover { /* выделенные даты-ссылки под курсором */
background: #fde910;
color: red;
}
JavaScript
$('table').on('click', 'td.days', function () {
var index = $(this).index();
$('td.days').not(this).filter(function() {
return $(this).index() == index;
}).removeClass('click');
$(this).toggleClass('click');
var day = $(this).html();
var your_url = 'send.php';
var your_uid = 17;
$.ajax({
type: "POST",
url: your_url,
data: "uid=" + your_uid + "&day="+day,
success: function(data) {
if (data) {
$('td').not(this).filter(function() {
return $(this).index() == index;
}).removeClass('click');
$(this).toggleClass('click');
} else {
// обработка ошибки соединения или еще что-либо
}
}
});
alert($(this).html())
});
function calendarBig(year) {
for (var m = 0; m <= 11; m++) {
var D = new Date(year,[m],new Date().getDate()),
Dlast = new Date(D.getFullYear(),D.getMonth()+1,0).getDate(),
DNlast = new Date(D.getFullYear(),D.getMonth(),Dlast).getDay(),
DNfirst = new Date(D.getFullYear(),D.getMonth(),1).getDay(),
calendar = '<tr>';
if (DNfirst != 0) {
for(var i = 1; i < DNfirst; i++) calendar += '<td>';
}else{
for(var i = 0; i < 6; i++) calendar += '<td>';
}
for(var i = 1; i <= Dlast; i++) {
if (i == D.getDate() && D.getFullYear() == new Date().getFullYear() && D.getMonth() == new Date().getMonth()) {
calendar += '<td class="today">' + i;
}else{
if (
(i == 1 && D.getMonth() == 0 && ((D.getFullYear() > 1897 && D.getFullYear() < 1930) || D.getFullYear() > 1947)) ||
(i == 2 && D.getMonth() == 0 && D.getFullYear() > 1992) ||
((i == 3 || i == 4 || i == 5 || i == 6 || i == 8) && D.getMonth() == 0 && D.getFullYear() > 2004) ||
(i == 7 && D.getMonth() == 0 && D.getFullYear() > 1990) ||
(i == 23 && D.getMonth() == 1 && D.getFullYear() > 2001) ||
(i == 8 && D.getMonth() == 2 && D.getFullYear() > 1965) ||
...