Вёрстка: HTML, CSS, flexbox и адаптивность

Семантические теги HTML, блочная модель CSS, селекторы и их приоритет, flexbox и grid, адаптивность через медиазапросы, вёрстка формы.

Курсовая по веб-разработке начинается с вёрстки. Современный минимум — семантическая разметка, flexbox для строк, grid для сеток и медиазапросы для телефонов.

Семантическая структура

<!DOCTYPE html>
<html lang="ru">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Каталог комплектующих</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
  <header class="header">
    <nav>
      <a href="/">Главная</a>
      <a href="/catalog/">Каталог</a>
    </nav>
  </header>

  <main>
    <h1>Каталог</h1>
    <section class="cards">
      <article class="card">
        <h2>Резистор 10 кОм</h2>
        <p>Мощность 0,25 Вт, допуск 5 %.</p>
      </article>
    </section>
  </main>

  <footer>© 2026</footer>
  <script src="app.js" defer></script>
</body>
</html>
Тег viewport обязателен: без него телефон отрисует страницу как настольную и уменьшит масштаб — никакие медиазапросы не сработают. Это первая причина «адаптивность не работает».

Блочная модель

Ширина элемента по умолчанию:
  width + padding + border      (content-box)

С box-sizing: border-box:
  width включает padding и border — считать удобнее

Поэтому в начало таблицы стилей ставят:

  *, *::before, *::after { box-sizing: border-box; }

Селекторы и приоритет

СелекторПримерВес
Тегp, h11
Класс.card10
Атрибут[type="text"]10
Псевдокласс:hover, :nth-child(2)10
id#header100
Встроенный стильstyle="..."1000
!importantcolor: red !importantПеребивает всё

Правило с большим весом побеждает независимо от порядка в файле. При равном весе применяется последнее. Отсюда практический вывод: стройте стили на классах, id и !important оставьте на исключения — иначе переопределить что-либо станет невозможно.

Flexbox

.header {
  display: flex;
  justify-content: space-between;  /* по главной оси */
  align-items: center;             /* по поперечной */
  gap: 16px;
}

.cards {
  display: flex;
  flex-wrap: wrap;                 /* переносить на новую строку */
  gap: 20px;
}

.card {
  flex: 1 1 280px;   /* расти, сжиматься, базовая ширина 280px */
}

/* Центрирование чего угодно */
.modal {
  display: flex;
  justify-content: center;
  align-items: center;
  min-height: 100vh;
}
СвойствоЗначенияДействие
flex-directionrow, columnНаправление главной оси
justify-contentflex-start, center, space-between, space-aroundРаскладка по главной оси
align-itemsstretch, center, flex-start, baselineВыравнивание по поперечной
flex-wrapnowrap, wrapПеренос элементов
gapлюбая длинаОтступы между элементами
flexgrow shrink basisПоведение при изменении размера

Grid

.layout {
  display: grid;
  grid-template-columns: 250px 1fr;   /* сайдбар и основная часть */
  grid-template-rows: auto 1fr auto;
  min-height: 100vh;
  gap: 20px;
}

/* Автоматическая сетка карточек без медиазапросов */
.gallery {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
  gap: 16px;
}

/* Именованные области */
.page {
  display: grid;
  grid-template-areas:
    "header header"
    "sidebar content"
    "footer footer";
}
.page > header  { grid-area: header; }
.page > aside   { grid-area: sidebar; }
Приём repeat(auto-fill, minmax(240px, 1fr)) сам подбирает число колонок под ширину экрана — сетка становится адаптивной без единого медиазапроса. Это самый выигрышный трюк для курсовой.

Адаптивность

/* Мобильные стили — база, затем расширяем для крупных экранов */
.cards { grid-template-columns: 1fr; }

@media (min-width: 640px) {
  .cards { grid-template-columns: repeat(2, 1fr); }
}

@media (min-width: 1024px) {
  .cards { grid-template-columns: repeat(3, 1fr); }
  .layout { grid-template-columns: 250px 1fr; }
}

/* Гибкий шрифт без медиазапросов */
h1 { font-size: clamp(1.5rem, 4vw, 2.5rem); }

/* Изображения не должны вылезать за контейнер */
img { max-width: 100%; height: auto; display: block; }

Подход mobile first — сначала стили для узкого экрана, потом min-width для широких — даёт более короткий и предсказуемый CSS, чем обратный порядок с max-width.

Переменные и тёмная тема

:root {
  --accent: #0969da;
  --text: #1f2328;
  --bg: #ffffff;
  --border: #d0d7de;
}

body {
  color: var(--text);
  background: var(--bg);
  font: 16px/1.6 system-ui, -apple-system, 'Segoe UI', sans-serif;
}

@media (prefers-color-scheme: dark) {
  :root {
    --text: #e6edf3;
    --bg: #0d1117;
    --border: #30363d;
  }
}

Форма

<form class="form" novalidate>
  <label>
    Имя
    <input type="text" name="name" required minlength="2">
  </label>
  <label>
    E-mail
    <input type="email" name="email" required>
  </label>
  <label>
    Количество
    <input type="number" name="qty" min="1" step="1" value="1">
  </label>
  <button type="submit">Отправить</button>
</form>

Частые ошибки

Частые вопросы

Flexbox или Grid?

Flexbox для одномерных раскладок: строка кнопок, шапка, вертикальное меню. Grid для двумерных: сетка карточек, каркас страницы. Их спокойно комбинируют — grid для макета, flex внутри его ячеек.

Зачем семантические теги, если можно всё сделать на div?

Поисковики и скринридеры понимают структуру страницы по тегам header, nav, main, article. Кроме того, семантическая разметка читается людьми — через месяц вы сами разберётесь в своём коде быстрее.

Нужен ли Bootstrap для курсовой?

Он ускоряет работу, но многие кафедры требуют собственную вёрстку — иначе непонятно, что сделали вы. Уточните у руководителя; если фреймворк разрешён, обязательно объясните в отчёте, какие его возможности использованы.

Читайте также

Сделаем работу по этой теме

Опишите задачу — ответим в течение 15 минут в личных сообщениях ВКонтакте, назовём срок и цену. Предоплаты за оценку нет.

  • Оценка заявки бесплатно
  • Правки по замечаниям преподавателя
  • Работы по всем техническим и IT-дисциплинам

Нажимая кнопку, вы соглашаетесь на обработку указанных данных для ответа на заявку.