Подключение стилей
Существует три способа подключить CSS к HTML-документу: inline-стили, внутренняя таблица стилей (
<style>) и внешний файл (<link>), плюс директива@import.
Зачем нужно
Правильный выбор способа подключения влияет на производительность, поддерживаемость и масштабируемость проекта. Внешние файлы кэшируются браузером, inline-стили удобны для динамических значений, а внутренние стили — для единичных страниц.
Где используется
- Внешние стили — основной способ в любом проекте
- Inline-стили — динамические стили через JavaScript, email-вёрстка
- Внутренние стили — быстрые прототипы, critical CSS
@import— организация CSS-файлов в крупных проектах
Предпосылки
- Что такое CSS
- _MOC HTML — элементы
<link>,<style>, атрибутstyle
1. Inline-стили (атрибут style)
Стили пишутся прямо в HTML-атрибуте style конкретного элемента.
<p style="color: red; font-size: 18px;">Красный текст</p>
<div style="
background-color: #f0f0f0;
padding: 20px;
border-radius: 8px;
">
Блок с серым фоном
</div>
Плюсы:
- Высший приоритет (кроме
!important) - Удобно для динамических стилей через JS
Минусы:
- Нельзя использовать псевдоклассы (
:hover) и медиа-запросы - Дублирование кода — нарушает DRY
- Сложно поддерживать
- Смешивает структуру и оформление
2. Внутренняя таблица стилей (<style>)
CSS пишется внутри тега <style> в <head> документа.
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Пример</title>
<style>
body {
font-family: Arial, sans-serif;
line-height: 1.6;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 20px;
}
h1 {
color: #333;
border-bottom: 2px solid #007bff;
padding-bottom: 10px;
}
</style>
</head>
<body>
<div class="container">
<h1>Заголовок</h1>
</div>
</body>
</html>
Плюсы:
- Все стили видны в одном файле
- Нет дополнительного HTTP-запроса
- Подходит для critical CSS (стили выше сгиба)
Минусы:
- Стили не кэшируются отдельно
- Увеличивает размер HTML
- Не переиспользуются между страницами
3. Внешний файл (<link>)
Основной и рекомендуемый способ. CSS хранится в отдельном .css-файле.
<!-- В <head> HTML-документа -->
<link rel="stylesheet" href="styles/main.css">
<!-- Можно подключить несколько файлов -->
<link rel="stylesheet" href="styles/reset.css">
<link rel="stylesheet" href="styles/layout.css">
<link rel="stylesheet" href="styles/components.css">
/* styles/main.css */
body {
font-family: 'Segoe UI', Tahoma, Geneva, sans-serif;
margin: 0;
padding: 0;
background-color: #fafafa;
}
.header {
background-color: #1a1a2e;
color: white;
padding: 20px;
}
Плюсы:
- Кэширование браузером — быстрая загрузка на повторных визитах
- Разделение ответственности (HTML — структура, CSS — оформление)
- Переиспользование между страницами
- Легко поддерживать
Минусы:
- Дополнительный HTTP-запрос при первой загрузке
Атрибуты <link>
<!-- Базовое подключение -->
<link rel="stylesheet" href="style.css">
<!-- С указанием media -->
<link rel="stylesheet" href="print.css" media="print">
<link rel="stylesheet" href="mobile.css" media="(max-width: 768px)">
<!-- Предзагрузка (preload) -->
<link rel="preload" href="critical.css" as="style">
4. Директива @import
Импортирует один CSS-файл внутри другого.
/* main.css */
@import url('reset.css');
@import url('variables.css');
@import url('layout.css');
@import url('components.css');
/* @import должен быть в начале файла (до остальных правил) */
body {
font-family: sans-serif;
}
/* С условием media */
@import url('print.css') print;
@import url('mobile.css') (max-width: 768px);
/* С layer */
@import url('vendor.css') layer(vendor);
Плюсы:
- Организация больших CSS-проектов
- Условный импорт по media
Минусы:
- Блокирует параллельную загрузку — каждый
@importсоздаёт последовательный запрос - Медленнее, чем несколько
<link> - В продакшене лучше объединять файлы бандлером
Сравнительная таблица
| Способ | Приоритет | Кэширование | Переиспользование | Рекомендация |
|---|---|---|---|---|
inline style="" |
Высший | Нет | Нет | Только для динамических стилей |
<style> |
Средний | Нет | Нет | Critical CSS, прототипы |
<link> |
Средний | Да | Да | Основной способ |
@import |
Средний | Да | Да | Только в dev, не в проде |
Порядок подключения имеет значение
<head>
<!-- 1. Сброс стилей -->
<link rel="stylesheet" href="reset.css">
<!-- 2. Библиотеки/фреймворки -->
<link rel="stylesheet" href="bootstrap.css">
<!-- 3. Основные стили проекта -->
<link rel="stylesheet" href="main.css">
<!-- 4. Переопределения -->
<link rel="stylesheet" href="overrides.css">
</head>
Последний подключённый файл перезаписывает предыдущие при одинаковой специфичности.
Частые ошибки
@importпосле обычных правил — будет проигнорирован:/* ОШИБКА */ body { color: black; } @import url('theme.css'); /* не сработает */- Использование
@importв продакшене — создаёт водопад загрузок, замедляет рендеринг - Забытый
rel="stylesheet"— без него файл не подключится как стили:<!-- ОШИБКА --> <link href="style.css"> <!-- ПРАВИЛЬНО --> <link rel="stylesheet" href="style.css"> - Неправильный путь к файлу — относительные пути считаются от HTML-файла, не от корня проекта
Практика
- Создать страницу с inline-стилями и переписать на внешний файл
- Подключить 3 внешних CSS-файла в правильном порядке
- Попробовать
@importи сравнить в DevTools (вкладка Network) с<link> - Подключить print-стили через
media="print" - Использовать
<style>для critical CSS
Связанные темы
- Что такое CSS — базовое определение CSS
- Каскад и специфичность — как порядок подключения влияет на приоритет
- CSS Layers (@layer) — современный способ управления приоритетом стилей