You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
/* Селектор с несколькими условиями */input[type="text"][required] { border:2px solid red; }
/* Селекторы с частичным совпадением атрибутов */
[class^="btn-"] { /* начинается с "btn-" */padding:5px10px;
}
[class*="icon"] { /* содержит "icon" */background-repeat: no-repeat;
}
[class$="-primary"] { /* заканчивается на "-primary" */color: blue;
}
/* Селектор :is() для группировки */:is(h1,h2,h3) span { color: red; }
/* Эквивалентно: h1 span, h2 span, h3 span *//* Селектор :where() (как :is(), но с нулевой специфичностью) */:where(header,main,footer) p { line-height:1.5; }
Блочная модель
Размеры
/* Ширина и высота */width:300px;
height:200px;
min-width:100px;
max-width:100%;
min-height:50px;
max-height:500px;
/* Процентные значения */width:50%; /* 50% от родителя *//* Размер области просмотра */width:50vw; /* 50% ширины viewport */height:50vh; /* 50% высоты viewport */min-height:100vh; /* минимум на всю высоту экрана *//* Новые единицы измерения */width:50dvw; /* динамическая ширина viewport */height:50dvh; /* динамическая высота viewport */height:50lvh; /* наименьшая высота viewport */height:50svh; /* наибольшая высота viewport */
Отступы и границы
/* Внутренние отступы (padding) */padding:10px; /* все стороны */padding:10px20px; /* верх-низ право-лево */padding:10px20px15px25px; /* верх право низ лево (по часовой) */padding-top:10px;
padding-right:20px;
padding-bottom:15px;
padding-left:25px;
/* Границы (border) */border:1px solid black; /* ширина стиль цвет */border-width:1px;
border-style: solid; /* solid, dashed, dotted, double, groove, ridge, inset, outset */border-color: black;
/* Отдельные стороны */border-top:2px dashed red;
border-right:1px solid blue;
border-bottom:3px dotted green;
border-left:1px solid gray;
/* Радиус границы */border-radius:5px; /* все углы */border-radius:5px10px15px20px; /* верхний-левый, верхний-правый, нижний-правый, нижний-левый */border-radius:50%; /* круг (для квадратного элемента) *//* Эллиптические углы */border-radius:10px/20px; /* горизонтальный/вертикальный радиус *//* Внешние отступы (margin) */margin:10px; /* все стороны */margin:10px20px; /* верх-низ право-лево */margin:10px20px15px25px; /* верх право низ лево */margin-top:10px;
margin-right:20px;
margin-bottom:15px;
margin-left:25px;
margin:0 auto; /* горизонтальное центрирование */margin: auto; /* центрирование при абсолютном позиционировании *//* Отрицательные margin */margin-top:-20px; /* сдвиг вверх */
Box-sizing
/* Стандартная модель (размер = контент) */box-sizing: content-box;
/* Альтернативная модель (размер включает padding и border) */box-sizing: border-box;
/* Применение ко всем элементам (популярный сброс) */* {
box-sizing: border-box;
}
Тени
/* Тень блока */box-shadow:5px5px10pxrgba(0,0,0,0.3); /* смещение-x смещение-y размытие цвет */box-shadow:0010pxrgba(0,0,0,0.1); /* только размытие */box-shadow: inset 005px#000; /* внутренняя тень */box-shadow:3px3px5px#999,-3px-3px5px#f0f0f0; /* несколько теней *//* Тень текста */text-shadow:1px1px2px black; /* смещение-x смещение-y размытие цвет */text-shadow:005px blue; /* свечение */text-shadow:1px1px0 white,-1px-1px0 white; /* контур текста */
Переполнение
/* Управление переполнением */overflow: visible; /* содержимое может выходить за границы (по умолчанию) */overflow: hidden; /* обрезать выходящее содержимое */overflow: scroll; /* всегда показывать полосы прокрутки */overflow: auto; /* показывать полосы прокрутки при необходимости *//* Раздельное управление */overflow-x: hidden;
overflow-y: auto;
/* Обрезка текста */text-overflow: ellipsis; /* многоточие при обрезке */white-space: nowrap; /* запрет переноса строк */overflow: hidden; /* нужен для работы text-overflow */
Позиционирование
Типы позиционирования
/* Статическое (по умолчанию) */position: static;
/* Относительное (смещение от нормального положения) */position: relative;
top:10px;
left:20px;
/* Абсолютное (относительно ближайшего позиционированного предка) */position: absolute;
top:0;
right:0;
bottom:0;
left:0;
/* Фиксированное (относительно окна просмотра) */position: fixed;
top:0;
left:0;
/* Липкое (сочетание relative и fixed) */position: sticky;
top:20px; /* расстояние от верха окна, при котором элемент "прилипает" */
Порядок наложения (z-index)
/* Управление порядком наложения */z-index:1; /* выше элементов с меньшим z-index */z-index:-1; /* ниже родительского элемента */z-index:9999; /* очень высокий приоритет */
Обтекание
/* Обтекание элементов */float: left; /* обтекание справа */float: right; /* обтекание слева */float: none; /* отмена обтекания *//* Очистка обтекания */clear: left; /* очистка левого обтекания */clear: right; /* очистка правого обтекания */clear: both; /* очистка обоих обтеканий *//* Clearfix (предотвращение схлопывания родителя) */
.clearfix::after {
content:"";
display: table;
clear: both;
}
Отображение (display)
/* Базовые значения */display: block; /* блочный элемент */display: inline; /* строчный элемент */display: inline-block; /* строчно-блочный элемент */display: none; /* скрытие элемента *//* Таблицы */display: table;
display: table-row;
display: table-cell;
/* Flexbox и Grid */display: flex;
display: inline-flex;
display: grid;
display: inline-grid;
/* Новые значения */display: contents; /* "растворяет" элемент, сохраняя его содержимое */display: flow-root; /* создает новый контекст форматирования */
Видимость и прозрачность
/* Видимость (занимает место) */visibility: visible;
visibility: hidden;
/* Прозрачность */opacity:1; /* полностью непрозрачный */opacity:0.5; /* полупрозрачный */opacity:0; /* полностью прозрачный, но интерактивный */
Flexbox
Контейнер Flex
/* Объявление flex-контейнера */display: flex;
display: inline-flex;
/* Направление основной оси */flex-direction: row; /* слева направо (по умолчанию) */flex-direction: row-reverse; /* справа налево */flex-direction: column; /* сверху вниз */flex-direction: column-reverse; /* снизу вверх *//* Перенос элементов */flex-wrap: nowrap; /* без переноса (по умолчанию) */flex-wrap: wrap; /* перенос на новую строку */flex-wrap: wrap-reverse; /* перенос с обратным порядком строк *//* Сокращение для direction + wrap */flex-flow: row wrap;
/* Выравнивание по основной оси */justify-content: flex-start; /* в начале (по умолчанию) */justify-content: flex-end; /* в конце */justify-content: center; /* по центру */justify-content: space-between; /* равномерно, крайние элементы по краям */justify-content: space-around; /* равномерно с отступами вокруг */justify-content: space-evenly; /* равномерно с одинаковыми отступами *//* Выравнивание по поперечной оси */align-items: stretch; /* растягивание (по умолчанию) */align-items: flex-start; /* в начале */align-items: flex-end; /* в конце */align-items: center; /* по центру */align-items: baseline; /* по базовой линии текста *//* Выравнивание строк при переносе */align-content: flex-start; /* в начале */align-content: flex-end; /* в конце */align-content: center; /* по центру */align-content: space-between; /* равномерно, крайние строки по краям */align-content: space-around; /* равномерно с отступами вокруг */align-content: stretch; /* растягивание (по умолчанию) *//* Интервал между элементами */gap:10px; /* одинаковый по обеим осям */gap:10px20px; /* row-gap column-gap */row-gap:10px;
column-gap:20px;
Элементы Flex
/* Порядок элемента */order:0; /* по умолчанию */order:1; /* более высокий порядок */order:-1; /* более низкий порядок *//* Растяжение элемента */flex-grow:0; /* не растягивается (по умолчанию) */flex-grow:1; /* растягивается */flex-grow:2; /* растягивается в два раза сильнее, чем с flex-grow: 1 *//* Сжатие элемента */flex-shrink:1; /* сжимается (по умолчанию) */flex-shrink:0; /* не сжимается */flex-shrink:2; /* сжимается в два раза сильнее, чем с flex-shrink: 1 *//* Базовый размер */flex-basis: auto; /* по умолчанию */flex-basis:0; /* начинает с нуля перед применением flex-grow */flex-basis:200px; /* начальный размер 200px */flex-basis: content; /* размер на основе содержимого *//* Сокращение для grow, shrink и basis */flex:01 auto; /* значения по умолчанию */flex:1; /* flex: 1 1 0% - растягивается и сжимается */flex: auto; /* flex: 1 1 auto - растягивается и сжимается с учетом содержимого */flex: none; /* flex: 0 0 auto - не растягивается и не сжимается *//* Индивидуальное выравнивание */align-self: auto; /* наследует align-items контейнера */align-self: flex-start;
align-self: flex-end;
align-self: center;
align-self: baseline;
align-self: stretch;
/* Объявление grid-контейнера */display: grid;
display: inline-grid;
/* Определение колонок */grid-template-columns:100px200px100px; /* 3 колонки с фиксированными размерами */grid-template-columns:1fr2fr1fr; /* 3 колонки в пропорции 1:2:1 */grid-template-columns:repeat(3,1fr); /* 3 равные колонки */grid-template-columns:minmax(100px,1fr) 2fr; /* минимум 100px, максимум 1fr */grid-template-columns: auto 1fr auto; /* автоматический размер по содержимому *//* Определение строк */grid-template-rows:100px200px; /* 2 строки с фиксированными размерами */grid-template-rows:repeat(3,minmax(100px, auto)); /* минимум 100px, растягивается по содержимому */grid-template-rows:1fr2fr; /* пропорции 1:2 *//* Автоматические строки/колонки */grid-auto-columns:100px; /* для неявно созданных колонок */grid-auto-rows:minmax(100px, auto); /* для неявно созданных строк *//* Направление автоматического размещения */grid-auto-flow: row; /* по строкам (по умолчанию) */grid-auto-flow: column; /* по колонкам */grid-auto-flow: dense; /* плотное заполнение *//* Именованные линии */grid-template-columns: [start] 1fr [middle] 2fr [end];
grid-template-rows: [header-start] 100px [header-end content-start] 1fr [content-end];
/* Именованные области */grid-template-areas:"header header header""sidebar content content""footer footer footer";
/* Сокращение для всех template свойств */grid-template:
[header-start] "header header header"100px [header-end]
[content-start] "sidebar content content"1fr [content-end]
[footer-start] "footer footer footer"50px [footer-end]
/200px1fr1fr;
/* Интервалы между ячейками */gap:10px; /* одинаковый по обеим осям */gap:10px20px; /* row-gap column-gap */row-gap:10px;
column-gap:20px;
/* Выравнивание по горизонтали (колонки) */justify-content: start; /* в начале */justify-content: end; /* в конце */justify-content: center; /* по центру */justify-content: stretch; /* растягивание (по умолчанию) */justify-content: space-between; /* равномерно, крайние колонки по краям */justify-content: space-around; /* равномерно с отступами вокруг */justify-content: space-evenly; /* равномерно с одинаковыми отступами *//* Выравнивание по вертикали (строки) */align-content: start;
align-content: end;
align-content: center;
align-content: stretch;
align-content: space-between;
align-content: space-around;
align-content: space-evenly;
/* Выравнивание элементов внутри ячеек по горизонтали */justify-items: start;
justify-items: end;
justify-items: center;
justify-items: stretch; /* по умолчанию *//* Выравнивание элементов внутри ячеек по вертикали */align-items: start;
align-items: end;
align-items: center;
align-items: stretch; /* по умолчанию */
Элементы Grid
/* Размещение элемента по номерам линий */grid-column-start:1;
grid-column-end:3;
grid-row-start:2;
grid-row-end:4;
/* Сокращение для column-start/end */grid-column:1/3; /* от линии 1 до линии 3 */grid-column:1/ span 2; /* от линии 1, охватывает 2 ячейки */grid-column:2/-1; /* от линии 2 до последней линии *//* Сокращение для row-start/end */grid-row:2/4;
grid-row:2/ span 2;
grid-row:1/-1; /* на всю высоту *//* Сокращение для column и row */grid-area:2/1/4/3; /* row-start / column-start / row-end / column-end *//* Размещение в именованной области */grid-area: header;
/* Индивидуальное выравнивание по горизонтали */justify-self: start;
justify-self: end;
justify-self: center;
justify-self: stretch; /* по умолчанию *//* Индивидуальное выравнивание по вертикали */align-self: start;
align-self: end;
align-self: center;
align-self: stretch; /* по умолчанию */
/* Базовые трансформации */transform:translate(50px,20px); /* сдвиг по x и y */transform:translateX(50px); /* сдвиг по x */transform:translateY(20px); /* сдвиг по y */transform:translateZ(30px); /* сдвиг по z (требует perspective) */transform:translate3d(50px,20px,30px); /* сдвиг по x, y и z */transform:scale(1.5); /* масштаб по x и y */transform:scaleX(1.5); /* масштаб по x */transform:scaleY(0.8); /* масштаб по y */transform:scaleZ(2); /* масштаб по z */transform:scale3d(1.5,0.8,2); /* масштаб по x, y и z */transform:rotate(45deg); /* поворот в плоскости */transform:rotateX(45deg); /* поворот вокруг оси X */transform:rotateY(45deg); /* поворот вокруг оси Y */transform:rotateZ(45deg); /* поворот вокруг оси Z (эквивалент rotate) */transform:rotate3d(1,1,1,45deg); /* поворот вокруг произвольной оси */transform:skew(10deg,20deg); /* наклон по x и y */transform:skewX(10deg); /* наклон по x */transform:skewY(20deg); /* наклон по y *//* Комбинирование трансформаций */transform:translateX(50px) rotate(45deg) scale(1.5);
/* Точка трансформации */transform-origin: center; /* по умолчанию */transform-origin: top left;
transform-origin:50px30px;
transform-origin:50%50%0;
/* 3D-эффекты */perspective:1000px; /* глубина перспективы (на родителе) */perspective-origin: center; /* точка схода (на родителе) */transform-style: preserve-3d; /* сохранение 3D для дочерних элементов */backface-visibility: hidden; /* скрытие обратной стороны элемента */
Переходы
/* Базовый переход */transition: property duration timing-function delay;
/* Свойство перехода */transition-property: all; /* все анимируемые свойства */transition-property: transform; /* только трансформация */transition-property: opacity, transform; /* несколько свойств */transition-property: none; /* без переходов *//* Длительность перехода */transition-duration:0.3s;
transition-duration:300ms;
transition-duration:0.3s,0.5s; /* разная длительность для разных свойств *//* Функция времени */transition-timing-function: ease; /* по умолчанию */transition-timing-function: linear; /* линейно */transition-timing-function: ease-in; /* ускорение */transition-timing-function: ease-out; /* замедление */transition-timing-function: ease; /* по умолчанию */transition-timing-function: linear; /* линейно */transition-timing-function: ease-in; /* ускорение */transition-timing-function: ease-out; /* замедление */transition-timing-function: ease-in-out; /* ускорение и замедление */transition-timing-function:cubic-bezier(0.25,0.1,0.25,1); /* кривая Безье */transition-timing-function:steps(5, end); /* пошаговый переход *//* Задержка перехода */transition-delay:0s; /* без задержки (по умолчанию) */transition-delay:0.2s; /* задержка 0.2 секунды */transition-delay:0.2s,0.5s; /* разные задержки для разных свойств *//* Сокращенная запись */transition: all 0.3s ease; /* свойство длительность функция */transition: transform 0.3s ease-out 0.1s; /* с задержкой */transition: opacity 0.3s, transform 0.5s; /* несколько переходов *//* Пример использования */button {
background-color: blue;
transition: background-color 0.3s ease;
}
button:hover {
background-color: darkblue;
}
/* Базовое применение */
.element {
animation: name duration timing-function delay iteration-count direction fill-mode play-state;
}
/* Имя анимации */animation-name: slide-in;
animation-name: none; /* без анимации *//* Длительность */animation-duration:1s;
animation-duration:300ms;
/* Функция времени */animation-timing-function: ease;
animation-timing-function: linear;
animation-timing-function: ease-in;
animation-timing-function: ease-out;
animation-timing-function: ease-in-out;
animation-timing-function:cubic-bezier(0.25,0.1,0.25,1);
animation-timing-function:steps(10, end);
/* Задержка */animation-delay:0s;
animation-delay:0.5s;
animation-delay:-0.5s; /* начинается с середины *//* Количество повторений */animation-iteration-count:1; /* один раз (по умолчанию) */animation-iteration-count:3; /* три раза */animation-iteration-count: infinite; /* бесконечно *//* Направление */animation-direction: normal; /* от начала к концу (по умолчанию) */animation-direction: reverse; /* от конца к началу */animation-direction: alternate; /* туда и обратно */animation-direction: alternate-reverse; /* обратно и туда *//* Режим заполнения */animation-fill-mode: none; /* без сохранения стилей (по умолчанию) */animation-fill-mode: forwards; /* сохраняет конечное состояние */animation-fill-mode: backwards; /* применяет начальное состояние до начала */animation-fill-mode: both; /* сочетает forwards и backwards *//* Состояние воспроизведения */animation-play-state: running; /* воспроизведение (по умолчанию) */animation-play-state: paused; /* пауза *//* Сокращенная запись */animation: slide-in 0.5s ease-out;
animation: pulse 2s ease-in-out infinite;
animation: fancy-move 3s linear 0.5s infinite alternate forwards;
/* Несколько анимаций */animation: slide-in 0.5s ease-out, fade 1s linear;
Управление анимациями с помощью JavaScript
// Добавление/удаление класса с анимациейelement.classList.add('animated');element.classList.remove('animated');// Отслеживание событий анимацииelement.addEventListener('animationstart',function(){console.log('Анимация началась');});element.addEventListener('animationend',function(){console.log('Анимация закончилась');});element.addEventListener('animationiteration',function(){console.log('Начался новый цикл анимации');});
/* calc() - математические вычисления */width:calc(100%-40px);
margin:calc(var(--spacing) *2);
font-size:calc(1rem+1vw);
/* min() - минимальное из значений */width:min(800px,100%); /* адаптивная ширина с максимумом */font-size:min(5vw,3rem); /* адаптивный текст с максимумом *//* max() - максимальное из значений */width:max(400px,50%); /* адаптивная ширина с минимумом */padding:max(8px,1vw); /* адаптивные отступы с минимумом *//* clamp() - ограничение значения между min и max */font-size:clamp(1rem,5vw,3rem); /* адаптивный текст с ограничениями */width:clamp(300px,50%,800px); /* адаптивная ширина с ограничениями */
Функции для цветов
/* rgb() и rgba() */color:rgb(255,0,0); /* красный */color:rgba(255,0,0,0.5); /* полупрозрачный красный *//* Современный синтаксис с пробелами */color:rgb(25500/50%);
/* hsl() и hsla() */color:hsl(0,100%,50%); /* красный */color:hsla(0,100%,50%,0.5); /* полупрозрачный красный *//* Современный синтаксис с пробелами */color:hsl(0100%50%/50%);
/* hwb() - оттенок, белизна, чернота */color:hwb(00%0%); /* красный */color:hwb(020%0%); /* светло-красный */color:hwb(00%20%); /* темно-красный */color:hwb(020%20%); /* приглушенный красный */color:hwb(00%0%/50%); /* полупрозрачный красный *//* lab() - перцептивно-равномерное цветовое пространство */color:lab(50%4020);
color:lab(50%4020/0.5);
/* lch() - перцептивно-равномерное с полярными координатами */color:lch(50%4020);
color:lch(50%4020/0.5);
/* color-mix() - смешивание цветов */color:color-mix(in srgb, red, blue); /* по умолчанию 50/50 */color:color-mix(in srgb, red 30%, blue 70%);
color:color-mix(in hsl, red, blue);
color:color-mix(in lch, red, blue);
/* color-contrast() - выбор цвета с лучшим контрастом */color:color-contrast(var(--background-color) vs black, white,#aaa);
/* color() - определение цвета в произвольном цветовом пространстве */color:color(display-p3 100);
color:color(display-p3 100/0.5);
Адаптивный дизайн
Медиа-запросы
/* По ширине экрана */@media screen and (max-width:768px) {
/* Стили для экранов шириной до 768px */
}
@media screen and (min-width:769px) and (max-width:1024px) {
/* Стили для экранов от 769px до 1024px */
}
@media screen and (min-width:1025px) {
/* Стили для экранов от 1025px и шире */
}
/* По ориентации устройства */@media (orientation: portrait) {
/* Стили для портретной ориентации */
}
@media (orientation: landscape) {
/* Стили для альбомной ориентации */
}
/* По типу устройства */@media screen {
/* Стили для экранов */
}
@media print {
/* Стили для печати */
}
@media speech {
/* Стили для устройств чтения с экрана */
}
/* По соотношению сторон */@media (aspect-ratio:16/9) {
/* Стили для экранов с соотношением 16:9 */
}
@media (min-aspect-ratio:4/3) {
/* Стили для экранов с соотношением от 4:3 и шире */
}
/* По разрешению экрана */@media (resolution:2dppx) {
/* Стили для экранов с плотностью пикселей 2 и выше (Retina) */
}
/* По возможностям устройства */@media (hover: hover) {
/* Стили для устройств, поддерживающих наведение */
}
@media (hover: none) {
/* Стили для устройств без поддержки наведения (тачскрины) */
}
@media (pointer: fine) {
/* Стили для устройств с точным указателем (мышь) */
}
@media (pointer: coarse) {
/* Стили для устройств с грубым указателем (палец) */
}
@media (prefers-reduced-motion: reduce) {
/* Стили для пользователей, предпочитающих меньше анимации */* {
animation: none !important;
transition: none !important;
}
}
@media (prefers-color-scheme: dark) {
/* Стили для тёмной темы */
}
@media (prefers-color-scheme: light) {
/* Стили для светлой темы */
}
/* Комбинирование условий */@media screen and (min-width:768px) and (orientation: landscape) {
/* Стили для экранов от 768px в альбомной ориентации */
}
/* Логические операторы */@media (min-width:768px) and (max-width:1024px) {
/* И - оба условия должны выполняться */
}
@media (max-width:600px), (min-width:1200px) {
/* ИЛИ - должно выполняться хотя бы одно условие */
}
@medianot (color) {
/* НЕ - отрицание условия */
}
Адаптивные единицы измерения
/* Относительные единицы */font-size:1em; /* относительно размера шрифта родителя */line-height:1.5; /* множитель от размера шрифта элемента */margin:2rem; /* относительно размера шрифта корневого элемента */padding:1.5em; /* относительно размера шрифта самого элемента *//* Единицы области просмотра */width:50vw; /* 50% ширины viewport */height:100vh; /* 100% высоты viewport */font-size:calc(16px+1vw); /* адаптивный размер шрифта */padding:5vmin; /* 5% от минимального измерения viewport */margin:3vmax; /* 3% от максимального измерения viewport *//* Современные единицы viewport */height:100dvh; /* динамическая высота viewport (учитывает UI браузера) */height:100lvh; /* наименьшая высота viewport */height:100svh; /* наибольшая высота viewport */width:100dvw; /* динамическая ширина viewport *//* Единицы шрифта */font-size:2ex; /* относительно высоты строчной буквы 'x' */width:10ch; /* относительно ширины символа '0' */
/* Обрезка контента */
.clipped {
clip-path:circle(50% at center); /* круг */clip-path:ellipse(25%40% at 50%50%); /* эллипс */clip-path:polygon(50%0%,100%50%,50%100%,0%50%); /* многоугольник */clip-path:inset(10%20%10%20% round 10px); /* прямоугольник со скругленными углами */
}
/* Обтекание текста вокруг фигуры */
.shaped {
shape-outside:circle(50%);
shape-outside:ellipse(40%50%);
shape-outside:polygon(00,100%0,100%100%,0100%);
shape-outside:url('shape.png');
shape-margin:20px; /* отступ от фигуры */
}
Контейнерные запросы
Определение контейнеров
/* Объявление контейнера */
.container {
container-type: inline-size; /* размер только по горизонтали */container-type: size; /* размер по обеим осям */container-type: normal; /* не является контейнером (по умолчанию) */
}
/* Именование контейнера */
.layout {
container-type: size;
container-name: layout;
}
/* Сокращенная запись */
.sidebar {
container: sidebar inline-size; /* имя и тип */
}
Контейнерные медиа-запросы
/* Запрос по ширине контейнера */@container (min-width:400px) {
.card {
display: flex;
}
}
/* Запрос по высоте контейнера */@container (min-height:300px) {
.card-content {
max-height:250px;
}
}
/* Запрос к именованному контейнеру */@container sidebar (max-width:300px) {
.widget {
flex-direction: column;
}
}
/* Комбинирование условий */@container (min-width:400px) and (max-width:600px) {
.card-title {
font-size:1.2rem;
}
}
Логические свойства
Направление потока
/* Направление письма */writing-mode: horizontal-tb; /* сверху вниз, слева направо (по умолчанию) */writing-mode: vertical-rl; /* справа налево, сверху вниз */writing-mode: vertical-lr; /* слева направо, сверху вниз *//* Направление текста */direction: ltr; /* слева направо (по умолчанию) */direction: rtl; /* справа налево */
Логические размеры
/* Ширина и высота */width:100px; /* физическое свойство */height:200px; /* физическое свойство */inline-size:100px; /* логическая ширина (по направлению текста) */block-size:200px; /* логическая высота (перпендикулярно тексту) *//* Минимальные и максимальные размеры */min-inline-size:50px;
max-inline-size:300px;
min-block-size:100px;
max-block-size:500px;
Логические отступы
/* Внутренние отступы */padding-top:10px; /* физическое свойство */padding-right:20px; /* физическое свойство */padding-bottom:10px; /* физическое свойство */padding-left:20px; /* физическое свойство */padding-block-start:10px; /* верх для горизонтального текста */padding-inline-end:20px; /* право для LTR, лево для RTL */padding-block-end:10px; /* низ для горизонтального текста */padding-inline-start:20px; /* лево для LTR, право для RTL *//* Сокращения */padding-block:10px; /* верх и низ */padding-inline:20px; /* лево и право *//* Внешние отступы */margin-block-start:10px;
margin-inline-end:20px;
margin-block-end:10px;
margin-inline-start:20px;
margin-block:10px;
margin-inline:20px;
Логические границы
/* Границы */border-top:1px solid black; /* физическое свойство */border-right:1px solid black; /* физическое свойство */border-bottom:1px solid black; /* физическое свойство */border-left:1px solid black; /* физическое свойство */border-block-start:1px solid black; /* верх для горизонтального текста */border-inline-end:1px solid black; /* право для LTR, лево для RTL */border-block-end:1px solid black; /* низ для горизонтального текста */border-inline-start:1px solid black; /* лево для LTR, право для RTL *//* Сокращения */border-block:1px solid black;
border-inline:1px solid black;
/* Радиус границы */border-top-left-radius:5px; /* физическое свойство */border-top-right-radius:5px; /* физическое свойство */border-bottom-right-radius:5px; /* физическое свойство */border-bottom-left-radius:5px; /* физическое свойство */border-start-start-radius:5px; /* верхний левый для LTR, верхний правый для RTL */border-start-end-radius:5px; /* верхний правый для LTR, верхний левый для RTL */border-end-end-radius:5px; /* нижний правый для LTR, нижний левый для RTL */border-end-start-radius:5px; /* нижний левый для LTR, нижний правый для RTL */
Логическое позиционирование
/* Физические свойства */top:10px;
right:20px;
bottom:10px;
left:20px;
/* Логические свойства */inset-block-start:10px; /* верх для горизонтального текста */inset-inline-end:20px; /* право для LTR, лево для RTL */inset-block-end:10px; /* низ для горизонтального текста */inset-inline-start:20px; /* лево для LTR, право для RTL *//* Сокращения */inset-block:10px; /* верх и низ */inset-inline:20px; /* лево и право */inset:10px20px; /* block inline */inset:10px; /* со всех сторон */
Логическое выравнивание текста
/* Физическое свойство */text-align: left;
text-align: right;
/* Логическое свойство */text-align: start; /* лево для LTR, право для RTL */text-align: end; /* право для LTR, лево для RTL */
Субгриды
Основы субгридов
/* Родительская сетка */
.parent-grid {
display: grid;
grid-template-columns:repeat(12,1fr);
gap:20px;
}
/* Дочерний элемент как субгрид */
.child-grid {
grid-column:2/12; /* занимает с 2 по 12 колонки родителя */display: grid;
grid-template-columns: subgrid; /* использует колонки родителя */grid-template-rows: subgrid; /* использует строки родителя */
}
/* Только колонки как субгрид */
.columns-subgrid {
grid-column:3/9;
display: grid;
grid-template-columns: subgrid;
grid-template-rows:repeat(3,100px); /* собственные строки */
}
/* Только строки как субгрид */
.rows-subgrid {
grid-row:2/5;
display: grid;
grid-template-rows: subgrid;
grid-template-columns:repeat(3,1fr); /* собственные колонки */
}
Практические примеры субгридов
/* Форма с метками и полями ввода */
.form {
display: grid;
grid-template-columns: max-content 1fr;
gap:10px;
}
.fieldset {
grid-column:1/-1; /* занимает все колонки */display: grid;
grid-template-columns: subgrid;
padding:20px;
border:1px solid #ccc;
}
/* Карточки с заголовками на одной линии */
.cards {
display: grid;
grid-template-columns:repeat(3,1fr);
gap:20px;
}
.card {
display: grid;
grid-template-rows: auto 1fr auto;
}
.cards-aligned {
display: grid;
grid-template-columns:repeat(3,1fr);
grid-template-rows: auto 1fr auto;
gap:20px;
}
.card-aligned {
display: grid;
grid-template-rows: subgrid;
grid-row: span 3;
}
/* Порядок слоев (от низшего приоритета к высшему) */@layer base, components, utilities;
/* Стили вне слоев имеют более высокий приоритет */
.special-case {
color: red !important; /* наивысший приоритет */
}
/* Анонимный слой (имеет приоритет выше, чем именованные слои) */@layer {
.semi-important {
color: blue;
}
}
/* Оптимизация рендеринга */
.section {
content-visibility: auto; /* автоматически пропускает рендеринг вне экрана */contain-intrinsic-size:500px; /* примерный размер для резервирования места */
}
.offscreen {
content-visibility: hidden; /* скрывает содержимое, но сохраняет элемент в DOM */
}
Свойство overscroll-behavior
/* Управление поведением при прокрутке за пределы */
.modal {
overscroll-behavior: contain; /* предотвращает прокрутку родителя */
}
body {
overscroll-behavior: none; /* отключает эффект "отскока" на мобильных */
}
.scroll-container {
overscroll-behavior-x: auto; /* по умолчанию */overscroll-behavior-y: contain;
}
Свойство accent-color
/* Цвет акцента для элементов формы */:root {
accent-color:#0066cc; /* глобальный цвет акцента */
}
input[type="checkbox"] {
accent-color: green; /* зеленые чекбоксы */
}
input[type="radio"] {
accent-color: rebeccapurple; /* фиолетовые радио-кнопки */
}
progress {
accent-color: orange; /* оранжевый индикатор прогресса */
}
Функция has() (родительский селектор)
/* Стилизация родителя на основе дочерних элементов *//* Карточка, содержащая изображение */
.card:has(img) {
padding-top:0;
}
/* Форма с заполненным полем */form:has(input:valid) {
border-color: green;
}
/* Родитель с наведением на дочерний элемент */
.gallery:has(.image:hover) {
background-color:#f0f0f0;
}
/* Абзац с большим количеством текста */p:has(+p) {
margin-bottom:1em;
}
/* Сложные условия */
.container:has(.item:hover, .item:focus) {
outline:2px solid blue;
}
Селектор :focus-visible
/* Улучшенный фокус */button:focus {
/* Применяется при любом фокусе */outline:2px solid blue;
}
button:focus-visible {
/* Применяется только при фокусе с клавиатуры */outline:2px solid blue;
box-shadow:0004pxrgba(0,102,204,0.3);
}
button:focus:not(:focus-visible) {
/* Убирает контур при клике мышью */outline: none;
}
Свойство font-variant
/* Варианты отображения шрифта */
.small-caps {
font-variant: small-caps; /* малые прописные */
}
.numeric {
font-variant-numeric: oldstyle-nums tabular-nums; /* старый стиль цифр, моноширинные */
}
.ligatures {
font-variant-ligatures: common-ligatures discretionary-ligatures;
}
/* Все варианты */
.advanced-typography {
font-variant: small-caps oldstyle-nums common-ligatures discretionary-ligatures;
}
Свойство gap для Flexbox
/* Интервалы между flex-элементами */
.flex-container {
display: flex;
gap:20px; /* равные интервалы между всеми элементами */
}
.flex-container-2d {
display: flex;
flex-wrap: wrap;
gap:20px10px; /* row-gap column-gap */row-gap:20px;
column-gap:10px;
}
Свойство text-underline-offset и text-decoration-thickness
/* Настройка подчеркивания */
.custom-underline {
text-decoration: underline;
text-decoration-color: red;
text-decoration-thickness:2px; /* толщина линии */text-underline-offset:5px; /* отступ от текста */text-decoration-skip-ink: auto; /* обходит нижние выносные элементы букв */
}
Современные псевдоклассы
/* Проверка пустоты с учетом пробелов */:blank {
display: none;
}
/* Целевой элемент (при клике на якорную ссылку) */:target {
background-color: yellow;
}
/* Текущий элемент в навигации */:current {
font-weight: bold;
}
/* Прошлые и будущие элементы (например, в презентации) */:past {
opacity:0.5;
}
:future {
opacity:0.5;
}
/* Управление выделением текста */
.no-select {
user-select: none; /* запрет выделения */
}
.select-all {
user-select: all; /* выделение всего содержимого при клике */
}
.select-text {
user-select: text; /* стандартное выделение текста (по умолчанию) */
}
.select-auto {
user-select: auto; /* браузер определяет поведение */
}
Свойство pointer-events
/* Управление событиями указателя */
.disabled {
pointer-events: none; /* элемент не реагирует на клики и наведение */
}
.clickable-overlay {
pointer-events: auto; /* элемент реагирует на события (по умолчанию) */
}
хороший урок