Селекторы
Базовые селекторы
CSS-селекторы нацеливают HTML-элементы для стилизации. Type-селекторы сопоставляют имена элементов (p, div). Class-селекторы (.) сопоставляют атрибуты class и могут переиспользоваться. ID-селекторы (#) сопоставляют один элемент и должны быть уникальными. Универсальный селектор (*) сопоставляет всё. Группируйте селекторы запятыми для совместного использования стилей.
/* Type selector - all <p> elements */
p { color: #333; }
/* Class selector - elements with class="btn" */
.btn { padding: 8px 16px; }
/* ID selector - element with id="header" */
#header { background: #fff; }
/* Universal selector - all elements */
* { box-sizing: border-box; }
/* Grouping selector */
h1, h2, h3 { font-family: Arial, sans-serif; }Комбинаторы
Комбинаторы определяют отношения между элементами. Descendant (пробел) сопоставляет любой вложенный элемент. Child (>) сопоставляет только прямых потомков. Adjacent sibling (+) сопоставляет элемент сразу после. General sibling (~) сопоставляет всех siblings после. Понимание комбинаторов необходимо для точной стилизации без лишних классов.
/* Descendant - any <a> inside .nav */
.nav a { text-decoration: none; }
/* Child - direct <li> children of <ul> */
ul > li { list-style: none; }
/* Adjacent sibling - <p> right after <h1> */
h1 + p { font-size: 1.2em; }
/* General sibling - all <p> after <h1> */
h1 ~ p { color: gray; }Атрибутные селекторы
Атрибутные селекторы сопоставляют элементы по значениям атрибутов. [attr] проверяет наличие. [attr=val] точное значение. ^= префикс, $= суффикс, *= подстрока. Мощно для стилизации инпутов, ссылок по типу или элементов с data-атрибутами без добавления лишних классов.
/* Elements with type attribute */
[type] { border: 1px solid #ccc; }
/* Exact match */
[type="text"] { padding: 4px; }
/* Starts with */
a[href^="https"] { color: green; }
/* Ends with */
a[href$=".pdf"] { color: red; }
/* Contains */
a[href*="example"] { font-weight: bold; }Псевдоклассы
Псевдоклассы выбирают элементы по состоянию или позиции. Интерактивные: :hover, :focus, :active, :visited, :disabled. Структурные: :first-child, :last-child, :nth-child(n), :nth-of-type(n). :not() отрицает селектор. :nth-child(odd/even) создаёт зебра-полосы. :nth-child(3n) выбирает каждый 3-й элемент. Снижают потребность в лишних классах.
/* Interactive states */
a:hover { color: red; }
a:visited { color: purple; }
input:focus { border-color: blue; }
input:disabled { background: #eee; }
button:active { transform: scale(0.98); }
/* Structural */
li:first-child { font-weight: bold; }
li:last-child { border: none; }
li:nth-child(odd) { background: #f9f9f9; }
li:nth-child(3n) { color: blue; }
p:not(.highlight) { color: #333; }Псевдоэлементы
Псевдоэлементы (::double-colon) стилизуют конкретные части элементов. ::before и ::after вставляют сгенерированный контент (требуется свойство content). ::first-letter и ::first-line стилизуют части текста. ::selection стилизует выделенный текст. ::placeholder стилизует placeholder'ы инпутов. Примечание: ::before/::after по умолчанию inline — установите display:block для блочного поведения.
/* First line of a paragraph */
p::first-line { font-weight: bold; }
/* First letter (drop cap) */
p::first-letter { font-size: 3em; float: left; }
/* Insert content before/after */
.quote::before { content: "\201C"; }
.quote::after { content: "\201D"; }
/* Selection styling */
::selection { background: yellow; color: black; }
/* Placeholder styling */
input::placeholder { color: #999; }Специфичность и !important
Специфичность определяет, какое правило применяется при ко нфликте селекторов. Инлайновые стили > ID > классы > типы. При равной специфичности побеждает последнее правило. !important переопределяет всё, но ломает каскад — избегайте. Используйте DevTools для проверки специфичности. Предпочитайте селекторы на основе классов для поддерживаемости. Увеличение специфичности повторением классов (.btn.btn) — хак — избегайте.
/* Specificity hierarchy (low to high):
1. Type selectors (p, div) = 0,0,0,1
2. Class selectors (.btn) = 0,0,1,0
3. ID selectors (#header) = 0,1,0,0
4. Inline styles (style="...") = 1,0,0,0
5. !important = overrides all
*/
/* ID beats class */
#nav .link { color: red; } /* wins */
.nav .link { color: blue; }
/* Avoid !important unless necessary */
.critical { color: red !important; }Блочная модель
Margin и Padding
Каждый элемент — коробка с контентом, padding, border и margin. Padding внутри border (влияет на фон), margin снаружи (прозрачный). Shorthand: 1 значение = все стороны, 2 = верх/низ лево/право, 3 = верх лево/право низ, 4 = верх право низ лево (по часовой). margin: 0 auto центрирует блочные элементы с определённой шириной.
.box {
/* TRBL: top right bottom left */
margin: 10px 20px 10px 20px;
/* Shorthand: top/bottom left/right */
margin: 10px 20px;
/* All sides */
padding: 15px;
/* Individual sides */
margin-top: 0;
padding-left: 24px;
/* Center horizontally (block) */
margin: 0 auto;
}Border и Outline
border добавляет линию вокруг padding, влияя на макет. outline рисует снаружи border, не влияя на макет — полезно для индикаторов фокуса. border-radius скругляет углы (одно значение или по углам: верх-левый верх-правый низ-правый низ-левый). outline-offset добавляет пространство между border и outline. Всегда предоставляйте видимые стили фокуса для доступности.
.box {
/* Shorthand: width style color */
border: 2px solid #333;
/* Individual sides */
border-bottom: 3px dashed red;
border-radius: 8px;
/* Outline (doesn't affect layout) */
outline: 2px solid blue;
outline-offset: 4px;
}
/* Remove default focus, add custom */
button:focus {
outline: none;
box-shadow: 0 0 0 3px rgba(0,123,255,0.5);
}Box Sizing
box-sizing: content-box (по умолчанию) означает, что width/height применяются только к контенту — padding и border добавляются к общему размеру. box-sizing: border-box включает padding и border в width/height, делая размер предсказуемым. Всегда устанавливайте border-box глобально для согласованных макетов. Это один из важнейших CSS-reset'ов.
/* Default: width = content only */
.content-box {
box-sizing: content-box;
width: 200px;
padding: 20px;
border: 5px solid;
/* Total width: 200 + 40 + 10 = 250px */
}
/* Recommended: width includes padding+border */
.border-box {
box-sizing: border-box;
width: 200px;
padding: 20px;
border: 5px solid;
/* Total width: 200px */
}
/* Apply globally */
*, *::before, *::after {
box-sizing: border-box;
}Box Shadow
box-shadow добавляет эффекты тени: offset-x offset-y blur-radius spread-radius color. Положительные смещения двигают тень вправо/вниз. inset создаёт внутреннюю тень. Несколько теней наслаиваются (первая = сверху). Используйте rgba для полупрозрачных теней, которые смешиваются естественно. Тени хороши для глубины, но избыток вредит производительности — предпочитайте тонкие тени.
/* offset-x offset-y blur spread color */
.card {
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}
/* Multiple shadows */
.button {
box-shadow:
0 1px 2px rgba(0,0,0,0.1),
0 4px 8px rgba(0,0,0,0.05);
}
/* Inset shadow */
.input:focus {
box-shadow: inset 0 1px 3px rgba(0,0,0,0.1);
}
/* No shadow */
.no-shadow { box-shadow: none; }Display и Visibility
display: none удаляет элемент из макета полностью (без места). visibility: hidden скрывает, но сохраняет место. opacity: 0 делает прозрачным, но всё ещё интерактивным. block-элементы занимают полную ширину и переносят строку. inline-элементы текут с текстом. inline-block объединяет inline-поток с блочными размерами (width, height). Используйте display: none для переключения контента.
/* Display types */
div { display: block; } /* full width, line break */
span { display: inline; } /* content width, no break */
.inline-block { display: inline-block; } /* inline but block props */
.flex { display: flex; } /* flex container */
.grid { display: grid; } /* grid container */
.none { display: none; } /* removed from layout */
/* Visibility (keeps space) */
.hidden { visibility: hidden; }
/* Opacity (keeps space, can interact) */
.fade { opacity: 0; }Цвета и единицы
Форматы цвета
CSS поддерживает несколько форматов цвета. Hex (#rrggbb) наиболее распространён. RGB/RGBA добавляет alpha-прозрачность. HSL (Hue 0-360, Saturation%, Lightness%) интуитивен — меняйте hue для сдвига цвета, lightness для оттенков. currentColor наследует свойство color элемента. Современный CSS также поддерживает oklch() и color() для более широких gamut'ов. Используйте rgba/hsla для прозрачности.
/* Named colors */
.color { color: red; background: tomato; }
/* Hexadecimal */
.hex { color: #ff6600; } /* 6-digit */
.hex-short { color: #f60; } /* 3-digit shorthand */
/* RGB / RGBA */
.rgb { color: rgb(255, 102, 0); }
.rgba { background: rgba(0, 0, 0, 0.5); }
/* HSL / HSLA (hue, saturation, lightness) */
.hsl { color: hsl(20, 100%, 50%); }
.hsla { background: hsla(120, 100%, 50%, 0.3); }
/* Current color keyword */
.box { color: blue; border: 2px solid currentColor; }Единицы длины
px абсолютный и предсказуемый. em относителен к font-size родителя (компаундируется при вложении). rem относителен к font-size корня (html) — консистентный и предпочтительный для доступности. % относителен к родителю. vh/vw относительны к viewport (100vh = полная высота). Используйте rem для размеров шрифтов, % для макетов, px для границ/тонких деталей.
/* Absolute units */
.px { font-size: 16px; } /* 1px = 1/96 inch */
.pt { font-size: 12pt; } /* 1pt = 1/72 inch */
/* Relative to parent font-size */
.em { font-size: 1.5em; } /* 1.5x parent */
/* Relative to root font-size (html) */
.rem { font-size: 1.2rem; } /* 1.2x root (usually 16px) */
/* Relative to parent dimensions */
.pct { width: 50%; } /* 50% of parent */
/* Viewport units */
.vh { height: 100vh; } /* 100% of viewport height */
.vw { width: 50vw; } /* 50% of viewport width */
.vmin { font-size: 2vmin; } /* 2% of smaller dimension */CSS-функции
calc() выполняет математику со смешанными единицами (например, 100% - 250px). min() выбирает наименьшее значение (отлично для адаптивных max-width). max() выбирает наибольшее. clamp(min, preferred, max) создаёт текучие значения, масштабирующиеся в границах — идеально для адаптивной типографики. var() ссылается на custom properties с опциональным fallback. Эти функции делают CSS динамичным без media query.
/* calc() - mathematical calculations */
.sidebar { width: calc(100% - 250px); }
.gap { margin: calc(1rem + 10px); }
/* min() / max() - choose smaller/larger */
.responsive { width: min(90%, 1200px); }
.min-width { width: max(300px, 50%); }
/* clamp() - fluid sizing with bounds */
.title { font-size: clamp(1.5rem, 4vw, 3rem); }
/* var() - use custom properties */
.btn { color: var(--primary, #007bff); }Градиенты
Градиенты создают плавные цветовые переходы. linear-gradient(direction, color1, color2) идёт в направлении (to right, 45deg). radial-gradient расширяется из центральной точки. conic-gradient вращается вокруг центра. Можно добавить color stop с позициями: linear-gradient(to right, red 0%, blue 50%, green 100%). Градиенты — изображения, а не цвета, и могут использоваться везде, где принимается background-image.
/* Linear gradient */
.bg1 {
background: linear-gradient(to right, #ff0000, #0000ff);
}
/* Diagonal with angle */
.bg2 {
background: linear-gradient(45deg, #ff0000, #00ff00, #0000ff);
}
/* Radial gradient */
.bg3 {
background: radial-gradient(circle, #ff0000, #0000ff);
}
/* Conic gradient */
.bg4 {
background: conic-gradient(red, yellow, green, blue, red);
}Фильтры и blend-режимы
filter применяет визуальные эффекты: blur(), brightness(), contrast(), grayscale(), sepia(), hue-rotate(), invert(), opacity(), saturate(). Несколько фильтров цепочкой. mix-blend-mode смешивает элемент с тем, что позади (multiply, screen, overlay и т.д.). backdrop-filter применяет фильтры к области позади элемента (отлично для glassmorphism). Фильтры могут влиять на производительность — используйте умеренно.
/* Filters */
img.bw { filter: grayscale(100%); }
img.blur { filter: blur(5px); }
img.bright { filter: brightness(1.5); }
img.sepia { filter: sepia(0.8); }
/* Multiple filters */
img.vintage {
filter: sepia(0.5) contrast(1.2) brightness(0.9);
}
/* Blend mode */
.overlay {
background: rgba(255,0,0,0.5);
mix-blend-mode: multiply;
}