LEARN X · ЗА 14 МИН
CSS
CSS за 14 минут: селекторы, специфичность, блочная модель, flexbox, grid, переменные, медиазапросы и анимации — весь язык на одной странице в комментариях.
CSS (Cascading Style Sheets) описывает, как HTML-элементы выглядят на экране. Весь язык — на одной странице, объяснения внутри комментариев /* ... */.
1. Синтаксис и подключение
Правило состоит из селектора и блока объявлений.
/* Это комментарий. Однострочных // в CSS НЕТ — только такие. */
/* Структура правила:
селектор { свойство: значение; свойство: значение; } */
h1 {
color: red; /* свойство color, значение red */
font-size: 32px; /* каждое объявление завершается ; */
}
/* Подключают CSS тремя способами:
1. Внешний файл (рекомендуется):
<link rel="stylesheet" href="style.css">
2. Тег <style> в <head> HTML.
3. Inline-атрибут: <p style="color:blue"> — избегайте. */
/* Несколько селекторов через запятую — общие стили: */
h1, h2, h3 {
font-family: sans-serif;
}
2. Селекторы
/* По тегу */
p { color: #333; }
/* По классу — атрибут class="box" в HTML */
.box { padding: 10px; }
/* По id — атрибут id="main" (id уникален на странице) */
#main { width: 800px; }
/* По атрибуту */
a[target] { color: green; } /* есть атрибут target */
input[type="text"] { border: 1px solid; }/* точное значение */
a[href^="https"] { color: teal; } /* начинается с https */
a[href$=".pdf"] { color: red; } /* заканчивается на .pdf */
/* Универсальный селектор — все элементы */
* { margin: 0; }
/* Комбинаторы */
div p { color: blue; } /* p внутри div на ЛЮБОЙ глубине */
div > p { color: navy; } /* p — ПРЯМОЙ потомок div */
h2 + p { margin-top: 0; }/* p сразу ПОСЛЕ h2 (соседний) */
h2 ~ p { color: gray; } /* все p после h2 (общий родитель) */
/* Псевдоклассы — состояние/положение */
a:hover { color: orange; } /* наведение мыши */
a:visited { color: purple; } /* посещённая ссылка */
input:focus { outline: 2px solid; }/* элемент в фокусе */
button:disabled { opacity: .5; } /* отключённый */
li:first-child { font-weight: bold; } /* первый среди соседей */
li:last-child { border: none; } /* последний */
li:nth-child(2) { color: red; } /* второй */
li:nth-child(odd){ background: #eee; } /* нечётные (зебра) */
p:not(.skip) { color: black; } /* все p, кроме .skip */
/* Псевдоэлементы — создают/стилизуют часть элемента (двойное ::) */
p::first-line { font-weight: bold; } /* первая строка */
p::first-letter { font-size: 2em; } /* буквица */
.box::before { content: "→ "; } /* вставка ПЕРЕД */
.box::after { content: " ✓"; } /* вставка ПОСЛЕ */
::selection { background: yellow; } /* выделение мышью */
3. Специфичность и каскад
Когда несколько правил задают одно свойство, побеждает более специфичное.
/* Вес селектора считают как тройку (id, классы, теги):
тег / псевдоэлемент → 0,0,1
класс / атрибут / псевдокласс → 0,1,0
id → 1,0,0
inline style="..." → перебивает почти всё
!important → перебивает вообще всё (крайняя мера) */
p { color: black; } /* специфичность 0,0,1 */
.text { color: green; } /* 0,1,0 — победит над тегом */
#intro { color: red; } /* 1,0,0 — победит над классом */
/* При РАВНОЙ специфичности побеждает то, что НИЖЕ в коде (каскад): */
.btn { color: blue; }
.btn { color: teal; } /* применится именно это */
/* Крайняя мера — старайтесь не использовать: */
p { color: black !important; }
/* Наследование: некоторые свойства (color, font-*) дети получают
от родителя автоматически. Сбросить можно ключевыми словами: */
.child {
color: inherit; /* взять у родителя явно */
margin: initial; /* значение по умолчанию */
border: unset; /* inherit, если наследуется, иначе initial */
}
4. Цвета и единицы
.colors {
color: red; /* именованный цвет */
color: #ff0000; /* HEX, RRGGBB */
color: #f00; /* короткий HEX */
color: #ff000080; /* HEX с альфой (80 ≈ 50%) */
color: rgb(255, 0, 0); /* красный, зелёный, синий 0-255 */
color: rgba(255, 0, 0, 0.5); /* + прозрачность 0-1 */
color: hsl(0, 100%, 50%); /* тон°, насыщ.%, светлота% */
color: hsla(0, 100%, 50%, 0.5); /* + альфа */
color: transparent; /* полностью прозрачный */
}
.units {
/* Абсолютные */
width: 200px; /* пиксели — фиксированный размер */
/* Относительные к шрифту */
font-size: 1.5em; /* em — относительно шрифта РОДИТЕЛЯ */
font-size: 1.5rem;/* rem — относительно шрифта <html> (надёжнее) */
/* Относительные к контейнеру/экрану */
width: 50%; /* % от размера родителя */
width: 100vw; /* vw — 1% ШИРИНЫ окна (viewport width) */
height: 100vh; /* vh — 1% ВЫСОТЫ окна */
font-size: 5vmin; /* vmin/vmax — от меньшей/большей стороны окна */
}
5. Текст и шрифты
.text {
font-family: "Helvetica", Arial, sans-serif; /* список с запасными */
font-size: 16px;
font-weight: bold; /* или 100–900 (400 = normal, 700 = bold) */
font-style: italic; /* курсив */
line-height: 1.5; /* высота строки (множитель — лучший выбор) */
letter-spacing: 0.05em; /* трекинг между буквами */
text-align: center; /* left | right | center | justify */
text-decoration: underline; /* подчёркивание */
text-decoration: line-through; /* зачёркивание */
text-transform: uppercase;/* ВЕРХНИЙ регистр (lowercase/capitalize) */
text-indent: 2em; /* красная строка */
white-space: nowrap; /* запрет переноса строк */
overflow-wrap: break-word;/* разрыв длинных слов */
}
/* Подключение своего шрифта */
@font-face {
font-family: "MyFont";
src: url("myfont.woff2") format("woff2");
}
6. Блочная модель
Каждый элемент — это контент + padding + border + margin.
.box {
width: 300px;
height: 150px;
/* padding — ВНУТРЕННИЙ отступ (между контентом и рамкой) */
padding: 20px; /* со всех сторон */
padding: 10px 20px; /* верх/низ | лево/право */
padding: 5px 10px 15px 20px; /* верх право низ лево (по часовой) */
padding-top: 10px; /* отдельная сторона */
/* border — рамка: толщина | стиль | цвет */
border: 2px solid black; /* solid | dashed | dotted | none */
border-top: 1px solid #ccc; /* отдельная сторона */
/* margin — ВНЕШНИЙ отступ (между элементами) */
margin: 20px;
margin: 0 auto; /* верх/низ 0, лево/право auto — центрирование */
/* box-sizing — как считать width/height: */
box-sizing: border-box; /* width включает padding и border (удобнее!) */
/* content-box (по умолч.): width — только контент, padding добавляется */
}
/* Частый сброс: считать размеры по border-box для всего */
*, *::before, *::after { box-sizing: border-box; }
7. Display и position
/* display управляет типом отображения */
.block { display: block; } /* на всю ширину, с новой строки (div, p) */
.inline { display: inline; } /* в строку, width/height игнорируются (span) */
.ib { display: inline-block; } /* в строку, НО размеры работают */
.hidden { display: none; } /* убрать из потока (места не занимает) */
.invis { visibility: hidden; } /* спрятать, НО место остаётся */
/* position управляет позиционированием */
.static { position: static; } /* по умолчанию, в обычном потоке */
.relative {
position: relative; /* сдвиг ОТНОСИТЕЛЬНО своего места */
top: 10px; left: 20px; /* + якорь для absolute-потомков */
}
.absolute {
position: absolute; /* вырван из потока; координаты от ближайшего
позиционированного предка (или окна) */
top: 0; right: 0;
}
.fixed {
position: fixed; /* привязан к ОКНУ, не скроллится (шапки, кнопки) */
bottom: 20px; right: 20px;
}
.sticky {
position: sticky; /* обычный, пока не доскроллит до порога — потом
прилипает (липкие заголовки) */
top: 0;
}
.layer { z-index: 10; } /* порядок наложения (больше = выше) */
8. Flexbox
Одномерная раскладка — выстраивает элементы в ряд или колонку.
.flex {
display: flex; /* включает flex для ПРЯМЫХ детей */
flex-direction: row; /* row (→) | column (↓) | row-reverse */
flex-wrap: wrap; /* перенос на новую строку при нехватке места */
gap: 16px; /* промежуток между элементами */
/* выравнивание ВДОЛЬ главной оси (по горизонтали при row) */
justify-content: center;
/* flex-start | center | flex-end | space-between |
space-around | space-evenly */
/* выравнивание ПОПЕРЁК оси (по вертикали при row) */
align-items: center;
/* stretch | flex-start | center | flex-end | baseline */
}
/* Свойства детей */
.item {
flex-grow: 1; /* как делить свободное место (0 = не растягивать) */
flex-shrink: 1; /* как сжиматься при нехватке места */
flex-basis: 200px; /* базовый размер до распределения */
flex: 1 1 200px; /* шорткат: grow shrink basis */
align-self: flex-end; /* переопределить align-items для себя */
order: 2; /* изменить порядок (по умолчанию 0) */
}
9. Grid
Двумерная раскладка — строки и колонки одновременно.
.grid {
display: grid;
/* колонки: три по 100px */
grid-template-columns: 100px 100px 100px;
/* fr — доля свободного места. Ниже: 1 + 2 части (узкая и вдвое шире) */
grid-template-columns: 1fr 2fr;
/* repeat — повтор. auto-fit + minmax = адаптивная сетка без медиа: */
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
grid-template-rows: auto 1fr auto; /* строки: шапка, контент, подвал */
gap: 16px; /* промежутки (row-gap / column-gap отдельно) */
/* выравнивание ячеек */
justify-items: center; /* по горизонтали внутри ячейки */
align-items: center; /* по вертикали внутри ячейки */
}
/* Растягивание элемента на несколько ячеек */
.wide {
grid-column: 1 / 3; /* с линии 1 до линии 3 (две колонки) */
grid-column: span 2; /* или просто: занять 2 колонки */
grid-row: 1 / 3; /* на две строки */
}
/* Именованные области — наглядный макет */
.layout {
display: grid;
grid-template-areas:
"header header"
"sidebar main"
"footer footer";
}
.layout .head { grid-area: header; }
10. Фон, границы, тени
.bg {
background-color: #f0f0f0;
background-image: url("bg.jpg");
background-size: cover; /* cover (заполнить) | contain | 100% 50% */
background-position: center;
background-repeat: no-repeat;
/* шорткат для всего сразу: */
background: #fff url("bg.jpg") no-repeat center / cover;
/* градиент как фон */
background: linear-gradient(to right, red, orange);
background: radial-gradient(circle, white, gray);
}
.rounded {
border-radius: 8px; /* скругление всех углов */
border-radius: 50%; /* круг (для квадрата) */
border-radius: 8px 0 8px 0;/* по углам: верх-лево ... */
}
.shadow {
/* box-shadow: смещениеX смещениеY размытие растяжение цвет */
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
box-shadow: inset 0 0 5px gray; /* inset — тень ВНУТРЬ */
/* тень для текста: X Y размытие цвет */
text-shadow: 1px 1px 2px black;
opacity: 0.8; /* прозрачность всего элемента (0-1) */
}
11. Переменные и функции
/* Кастомные свойства (CSS-переменные). :root — корень документа */
:root {
--main-color: #3498db;
--gap: 16px;
--max-width: 1200px;
}
.button {
/* var() читает значение переменной; 2-й аргумент — запасное значение */
background: var(--main-color);
padding: var(--gap);
color: var(--text-color, white); /* white, если --text-color не задана */
}
/* Переменные наследуются и переопределяются локально */
.dark {
--main-color: #1a1a2e; /* внутри .dark все var(--main-color) — тёмные */
}
.calc {
/* calc() — вычисления, можно смешивать единицы */
width: calc(100% - 40px);
height: calc(100vh - var(--gap));
font-size: calc(1rem + 1vw); /* «резиновый» размер */
/* min / max / clamp — адаптив без медиазапросов */
width: min(600px, 100%); /* меньшее из двух */
width: max(300px, 50%); /* большее из двух */
font-size: clamp(1rem, 2vw, 2rem);/* мин, желаемое, макс */
}
12. Адаптивность и анимации
/* Медиазапросы — стили под размер экрана (mobile-first) */
@media (min-width: 768px) {
.container { width: 750px; } /* для экранов ШИРЕ 768px */
}
@media (max-width: 600px) {
.menu { display: none; } /* для экранов УЖЕ 600px */
}
@media (min-width: 600px) and (max-width: 900px) {
.box { font-size: 14px; } /* диапазон */
}
@media (prefers-color-scheme: dark) {
body { background: #111; color: #eee; } /* системная тёмная тема */
}
/* transition — плавный переход при изменении свойства */
.btn {
background: blue;
/* свойство длительность функция задержка */
transition: background 0.3s ease, transform 0.2s;
}
.btn:hover {
background: navy; /* изменится плавно благодаря transition */
transform: scale(1.1); /* увеличение на 10% */
}
/* transform — трансформации (не влияют на поток, быстрые) */
.fx {
transform: translate(10px, 20px); /* сдвиг */
transform: rotate(45deg); /* поворот */
transform: scale(1.5); /* масштаб */
transform: rotate(45deg) scale(1.2); /* несколько сразу */
}
/* @keyframes — покадровая анимация */
@keyframes pulse {
0% { transform: scale(1); opacity: 1; }
50% { transform: scale(1.2); opacity: 0.6; }
100% { transform: scale(1); opacity: 1; }
}
.heart {
/* имя длительность функция повторы направление */
animation: pulse 1.5s ease-in-out infinite;
}
/* Уважение к настройкам доступности */
@media (prefers-reduced-motion: reduce) {
* { animation: none; transition: none; }
}