Сколько раз вы откладывали идею встроить свой календарь в корпоративную панель, потому что готовые плагины громоздки, а писать с нуля долго? За полчаса можно собрать лаконичный, но гибкий календарь только на HTML и CSS. Никаких тяжёлых библиотек — чистый код, который легко дополнить логикой расписания. Вместе пройдём путь от базовой разметки до тонкой стилизации и оставим в руках готовый фундамент для любого виджета.

Сразу по сути:

  • Семантичная разметка — без лишних div’ов.
  • CSS Grid превращает таблицу в адаптивную сетку.
  • Медиа‑запросы и logical‑properties дают мобильную отзывчивость.
  • Тематизация через CSS‑переменные за две строки.

Строим скелет: минимальная HTML‑структура

Начнём с самого простого. Представьте сервис бронирования переговорок: нужно показать месяц и дать пользователю кликать по ячейкам. Вместо тяжелой таблицы используем div’ы, чтобы позже легко переключаться между видами «месяц», «неделя» и «день». Оставим только значимые теги — header для навигации и section, в который лягут дни. Это скелет, на который мы нарастим стиль, а логика JS подключится позже.

  1. Создайте <div class=»calendar»> как корневой контейнер
  2. Внутри добавьте <header> с кнопками навигации
  3. Сделайте <div class=»calendar__grid»> для сетки дней
  4. Заполните аббревиатуры дней недели <abbr>
  5. Добавьте 42 ячейки — полный вид месяца

html
<div class="calendar">

  <header class="calendar__header">

    <button aria-label="Предыдущий месяц">‹</button>

    <h2>September 2025</h2>

    <button aria-label="Следующий месяц">›</button>

  </header>

  <div class="calendar__grid">

    <abbr title="Monday">Mon</abbr><abbr title="Tuesday">Tue</abbr><abbr title="Wednesday">Wed</abbr>

    <abbr title="Thursday">Thu</abbr><abbr title="Friday">Fri</abbr><abbr title="Saturday">Sat</abbr>

    <abbr title="Sunday">Sun</abbr>

    <!-- 42 day‑cells -->

    <button class="day">1</button>

    <!-- … -->

    <button class="day">30</button>

  </div>

</div>

Теперь у вас чистая, юзер‑френдли разметка, которую понимают и скрин‑ридеры.

 

ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК нейросети DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
  • Где и как применять? Потестируем модель после установки на разных задачах
  • Как дообучить модель под себя?

Живое расположение: подключаем CSS Grid

Чтобы превратить набор кнопок в аккуратную таблицу‑календарь, подключаем CSS Grid. Задаём семь равных колонок и автозаполнение строк. Преимущество: одна декларация покроет любую длину месяца, а gap создаст воздух между ячейками. Разметка остаётся неизменной — вся магия в стиле.

  • Определите grid-template-columns: repeat(7, 1fr)
  • Используйте grid-auto-rows для одинаковой высоты
  • Оставьте gap: 0.25rem для дыхания
  • Выровняйте заголовок через grid-column: 1 / -1

css
.calendar__grid {

  display: grid;

  grid-template-columns: repeat(7, 1fr);

  grid-auto-rows: minmax(44px, 1fr);

  gap: .25rem;

}

.calendar__header {

  display: grid;

  grid-template-columns: 1fr auto 1fr;

  align-items: center;

  margin-bottom: .5rem;

}

Grid даёт свободу: вы можете менять порядок элементов, не трогая HTML.

Календарь без лупы: делаем адаптивность

Половина трафика — мобильная. Мы уменьшаем размер ячейки, переключаемся на компактный шрифт и прячем аббревиатуры дней недели. Используем media‑queries на основе контейнера: календарь встроится в любой слой, хоть в боковую панель. Логические свойства inset‑block стартуют с CSS Logical Properties и помогут при RTL‑языках.

  1. @container (max-width: 480px) { .calendar__grid {grid-auto-rows: 32px} }
  2. Сократите font-size до 0.8rem для .day
  3. Скройте аббр при ширине < 400px через display:none
  4. Добавьте touch-friendly hit‑area padding-inline: .5rem

css
@media (max-width: 480px) {

  .calendar__grid {

    grid-auto-rows: 32px;

  }

  .calendar__grid abbr { display: none; }

  .day {

    font-size: .8rem;

    padding: 0;

  }

}

Адаптивные правила занимают три условия, но экономят десятки пикселей.

Мелочи решают: декоративные акценты

Пользователь проводит глазами секунды, и цветовое пятно решает, заметит ли он нужный день. Подсветите сегодня через accent‑color или radial‑gradient фон. Добавьте плавное изменение высоты ячейки при наведении — animation‑timeline покажет интерактивность, не требуя JS.

  • Включите :focus-visible стиль для клавиатуры
  • Используйте CSS variable —accent делает темизацию
  • Поставьте transition: background 120ms ease‑out
  • Добавьте data‑state=»busy» для зарезервированных слотов

css
:root {

  --accent: #3B82F6;

}

.day[today] {

  background: var(--accent);

  color: #fff;

  border-radius: .5rem;

}

.day:hover {

  background: color-mix(in srgb, var(--accent) 20%, #fff);

  cursor: pointer;

  transition: background .12s ease-out;

}

Минимум кода — максимум вовлечения: цвета и плавность удержат внимание.

Попробуйте внедрить базовый шаблон в свой pet‑проект прямо сейчас — первые результаты удивят.

Готовность к данным: слой для JavaScript

HTML и CSS закрывают визуальную часть, но календарь живёт данными. Сохраним чистоту: JS остаётся тонким слоем, подписывается на клики и меняет состояние через data‑атрибуты. Такой подход упрощает тестирование и кэширование стилей — логика и представление разделены.

  1. Подключите один модуль calendar.js
  2. Используйте addEventListener(‘click’, handler) на .calendar
  3. Манипулируйте data‑selected и aria-pressed
  4. Загружайте события fetch(‘/api/events?month=2025-09’)

javascript
document.querySelector('.calendar')

  .addEventListener('click', e => {

    if (!e.target.matches('.day')) return;

    const day = e.target;

    day.toggleAttribute('data-selected');

    day.setAttribute('aria-pressed', day.hasAttribute('data-selected'));

});

Календарь остаётся доступным, а JavaScript отвечает только за динамику.

 

Чек‑лист финальной сборки

Шаг Действие
HTML‑скелет Созданы header + grid‑контейнер
CSS Grid 7 колонок, автоматические строки
Медиа‑запросы Сетки уменьшаются до 32px
Декор Добавлены hover и accent‑color
JS‑слой События подключены к data‑state
Тест Проверена доступность клавиатурой

Следуя пунктам, вы получите производительный календарь, готовый к продакшену.

Большой практикум
ЗАМЕНИ ВСЕ НЕЙРОСЕТИ НА ОДНУ — PERPLEXITY
ПОКАЖЕМ НА КОНКРЕТНЫХ КЕЙСАХ
  • Освой нейросеть Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
  • УЧАСТВОВАТЬ ЗА 0 РУБ.
  • Расскажем, как получить подписку
Участвовать бесплатно
ОНЛАЙН-ПРАКТИКУМ
ЗАПУСК нейросети DEEPSEEK R1 ЛОКАЛЬНО НА СВОЕМ КОМПЬЮТЕРЕ
ЧТО БУДЕТ НА ОБУЧЕНИИ?
  • ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
Участвовать бесплатно