Что такое CSS и как браузер применяет его к HTML?
|
CSS описывает presentation документа. Браузер разбирает stylesheets в CSSOM, сопоставляет selectors с DOM, разрешает cascade и inheritance, вычисляет значения, а затем использует их для layout, paint и compositing. |
Что такое selector и declaration?
|
Selector выбирает элементы, declaration задает пару property/value внутри rule. Несколько selectors могут совпасть с одним элементом, после чего cascade определяет победившее значение каждого property. |
Что такое cascade?
|
Cascade разрешает конфликт declarations по relevance, origin и importance, cascade layer, specificity, scope proximity и порядку. Specificity — только один этап, поэтому «самый тяжелый selector всегда побеждает» — неверное упрощение. |
Что такое inheritance в CSS?
|
Некоторые properties, например |
Что такое initial value и что делают inherit, initial, unset, revert?
|
Каждое property имеет initial value. |
Что такое CSS box model?
|
Box состоит из content, padding, border и margin. При |
Чем единицы em, rem, %, vw, vh и px отличаются?
|
|
Что такое CSS custom properties?
|
Custom properties объявляются как |
Что такое currentColor?
|
|
Веса в CSS
|
Специфичность селектора записывают как три числа:
button {
}
.button {
}
#button {
}Если все три селектора подходят одному элементу, победит Inline style рассматривают отдельно: он сильнее обычной специфичности selector. |
Что такое user agent style?
|
То есть CSS, который браузер сам применяет к HTML-элементам, даже если ты не написал свой CSS. <h1>Hello</h1>
<p>Text</p>
<button>Click</button>Даже без CSS у них уже есть внешний вид: h1 {
font-size: 2em;
font-weight: bold;
margin-block-start: 0.67em;
margin-block-end: 0.67em;
}
button {
appearance: auto;
} |
Что делает box-sizing: border-box?
|
При *,
*::before,
*::after {
box-sizing: border-box;
} |
Что такое normal flow?
|
Normal flow — стандартное размещение элементов без positioning, float и специальных layout-контекстов. Block-элементы идут сверху вниз, inline-контент располагается внутри строк. Flex и Grid создают собственные правила раскладки для дочерних элементов. |
Что такое block formatting context?
|
BFC — изолированный контекст раскладки block-элементов. Он удерживает floats и предотвращает схлопывание внешних margin
с содержимым в ряде случаев. Его создают, например, |
Что такое inline formatting context?
|
В нем текст и inline boxes формируют строки внутри контейнера. На расположение влияют |
Чем display: block, inline, inline-block, flex, grid отличаются друг от друга?
|
|
Что такое margin collapsing?
|
Вертикальные margin соседних block boxes в normal flow могут объединиться в один margin вместо суммы. Обычно остается наибольший положительный отступ, а отрицательные значения участвуют по отдельным правилам. Flex и Grid items не схлопывают margin. |
Когда margin схлопывается?
|
Между соседними block-элементами, а также между parent и первым или последним child при отсутствии border, padding, inline content и разделяющей высоты. Может схлопываться margin пустого блока. Это относится к block formatting context. |
Как избежать схлопывания margin?
|
Предпочесть |
Когда margin не схлопывается?
|
У flex/grid items, absolutely positioned elements, floats и элементов в разных BFC. Border, padding или inline content между parent и child также разделяют margin. Горизонтальные margin не схлопываются. |
Что такое positioning в CSS?
|
Свойство |
Чем отличаются relative, absolute, fixed и sticky?
|
|
Что такое stacking context?
|
Это локальная система наложения элементов. Новый context создают, например, positioned element с |
Что такое z-index и почему он иногда не работает?
|
|
Что такое overflow?
|
Overflow описывает поведение содержимого, выходящего за padding box. Он может обрезать содержимое или создать scroll container. Это влияет на sticky positioning, доступность скрытого контента и layout. |
Чем отличаются overflow: hidden, auto, scroll и clip?
|
|
Что такое scroll-snap?
|
Scroll Snap позволяет контейнеру после прокрутки остановиться у заданных snap positions. Контейнер задает ось и строгость, элементы — точки выравнивания. Это CSS-enhancement, а не замена доступной навигации carousel. .carousel {
display: flex;
overflow-x: auto;
scroll-snap-type: x mandatory;
}
.slide {
flex: 0 0 100%;
scroll-snap-align: start;
} |
Когда стоит использовать scroll-snap?
|
Для горизонтальных галерей, paged sections и сценариев, где остановка на целом элементе ожидаема пользователем. Нужно оставить обычную прокрутку и элементы управления. Для длинного читаемого контента mandatory snapping часто мешает. |
Какие проблемы бывают у scroll-snap на мобильных устройствах?
|
Слишком строгий snap может бороться с жестом пользователя, затруднять диагональную прокрутку и перескакивать после изменения размера контента. Safe areas и browser chrome меняют viewport. Поведение нужно проверять на touch devices и с увеличенным шрифтом. |
Что такое containing block?
|
Containing block — прямоугольник, относительно которого вычисляются position и percentage sizes элемента. Его источник
зависит от |
Практический пример: css/examples/flexbox
Что такое Flexbox?
|
Flexbox — одномерная модель раскладки для строки или колонки. Она распределяет свободное пространство, выравнивает элементы и управляет их ростом и сжатием. Подходит для toolbar, sidebar/content и элементов компонента. .layout {
display: flex;
gap: 16px;
}
.sidebar {
flex: 0 0 280px;
}
.content {
flex: 1 1 auto;
min-width: 0;
}Практика: |
Какие задачи решает Flexbox?
|
Flexbox помогает строить одномерные раскладки: строку, колонку, toolbar, группу кнопок, карточку или пару sidebar и content. Он распределяет свободное место, выравнивает элементы, управляет переносом, ростом и сжатием flex items. Практика: |
Что такое main axis и cross axis?
|
Main axis задается Практика: |
Чем justify-content отличается от align-items?
|
Практика: |
Что делает flex-direction?
|
Практика: |
Что делает flex-wrap?
|
Практика: |
Что делает gap во Flexbox?
|
Практика: |
Почему gap часто удобнее, чем margin между элементами?
|
Практика: |
Что делают flex-grow, flex-shrink и flex-basis?
|
Практика: |
Что значит flex: 1?
|
В современном CSS это обычно раскрывается примерно в Практика: |
Чем flex-basis: 0 отличается от flex-basis: auto?
|
Практика: |
Почему во Flexbox часто нужен min-width: 0?
|
Flex items по умолчанию имеют automatic minimum size, часто равный min-content width. Длинный текст или вложенный блок
может растягивать колонку и ломать layout. Практика: |
Как сделать две колонки, где одна занимает фиксированную ширину, а вторая все остальное место?
|
Контейнеру задают Практика: |
Как сделать равные колонки через Flexbox?
|
Для равных колонок обычно задают элементам одинаковое сокращение, например Практика: |
Как прижать кнопку или блок к низу карточки через Flexbox?
|
Карточку делают flex-контейнером с Практика: |
Как центрировать элемент по горизонтали и вертикали через Flexbox?
|
Контейнеру задают Практика: |
Какие типичные ошибки бывают при использовании Flexbox?
|
Частые ошибки: путать main axis и cross axis, ждать от Flexbox полноценной двумерной сетки, забывать про Практика: |
Практический пример: css/examples/grid
Когда лучше использовать Flexbox, а когда CSS Grid?
|
Flexbox выбирают для строки, колонки, выравнивания и неизвестного числа элементов. Grid — когда важны согласованные колонки, строки или двумерные области. Если приходится имитировать строки вложенными flex-контейнерами, Grid обычно проще. Практика: |
Что такое CSS Grid?
|
Grid — двумерная система раскладки со строками, колонками и областями. Она позволяет определить структуру контейнера, а элементам — занимать одну или несколько ячеек. Grid удобен для карточек и page-level layout. Практика: |
Чем Grid отличается от Flexbox?
|
Grid управляет двумя измерениями одновременно и начинает с структуры контейнера. Flexbox распределяет элементы вдоль одной основной оси и лучше адаптируется к содержимому. Их часто комбинируют: Grid для страницы, Flexbox внутри компонентов. Практика: |
Когда лучше использовать Grid вместо Flexbox?
|
Grid лучше выбирать для двумерной структуры: согласованных строк, колонок, областей страницы и карточных сеток. Flexbox удобнее для одномерного распределения элементов внутри компонента. Если layout одновременно зависит и от строк, и от колонок, Grid обычно проще и устойчивее. Практика: |
Что делают grid-template-columns и grid-template-rows?
|
Они описывают явные tracks сетки и их размеры. Можно использовать px, Практика: |
Что такое minmax()?
|
Практика: |
Что такое auto-fit и auto-fill?
|
Оба значения создают столько повторяющихся tracks, сколько помещается. .cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 16px;
}Практика: |
Что такое Grid stacking?
|
Grid stacking — прием, при котором несколько grid items размещают в одной и той же области сетки или в пересекающихся
grid lines. Элементы накладываются друг на друга, а порядок слоя определяется обычными правилами stacking context:
порядком в DOM, Это удобно для overlay: текст поверх изображения, badge на карточке, декоративный слой или controlled overlap без
.card {
display: grid;
}
.card img,
.card .content {
grid-column: 1 / 2;
grid-row: 1 / 2;
}Практика: |
Как сделать Grid wrapping?
|
В Grid нет прямого аналога Так сетка сама вычисляет, сколько колонок помещается в контейнер, и переносит лишние элементы на следующую строку без media queries. .cards {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
gap: 16px;
}Практика: |
Чем responsive design отличается от adaptive design?
|
Responsive layout плавно подстраивается под доступное пространство, а adaptive обычно выбирает несколько заранее подготовленных layouts для диапазонов устройств. На практике подходы комбинируют, а границы выбирают по content, не по моделям телефонов. |
Что такое mobile-first?
|
Mobile-first начинает с базового layout для узкого экрана и добавляет возможности через |
Что такое media query?
|
|
Что такое container query и чем она отличается от media query?
|
Media query смотрит на viewport или device features, container query — на размер или styles ближайшего query container. Container queries делают компонент адаптивным к месту использования, независимо от ширины всей страницы. |
Что такое fluid typography и как работает clamp()?
|
Fluid typography плавно меняет размер между границами. .title {
font-size: clamp(1.5rem, 1rem + 2vw, 3rem);
}Границы сохраняют читаемость на очень узких и широких экранах. |
Что такое safe area?
|
Safe area учитывает вырезы, скругления и системные overlays устройства. Значения |
Как учитывать разные плотности экранов?
|
Layout строят в CSS pixels, а raster assets предоставляют с подходящим resolution через |
Как responsive images связаны с responsive layout?
|
Layout определяет отображаемую ширину, а |
Какие плюсы и минусы у БЭМ?
|
БЭМ дает предсказуемые глобальные имена и явно показывает block, element и modifier. Цена — длинные class names, дисциплина соглашений и возможное дублирование контекста там, где framework уже изолирует component styles. |
Чем CSS Modules, CSS-in-JS и utility-first CSS отличаются?
|
CSS Modules генерируют локальные class names, CSS-in-JS связывает styles с JavaScript runtime или build step, utility-first собирает UI из небольших готовых classes. Выбор влияет на isolation, runtime cost, theming, tooling, server rendering и читаемость markup. |
Какие плюсы и минусы у Tailwind-подхода?
|
Utilities ускоряют композицию, ограничивают произвольные значения и удаляют неиспользуемые rules при сборке. Минусы — шумная markup, необходимость соглашений для повторяющихся patterns и риск смешать design decisions со случайными utilities без tokens и component boundaries. |
Что такое design tokens?
|
Tokens — именованные design decisions: colors, spacing, typography, radii, motion. Их хранят в нейтральном source of
truth и преобразуют в CSS custom properties, platform constants и design-tool variables. Семантические tokens вроде
|
Как сделать theme и dark theme?
|
Компоненты используют semantic custom properties, а theme переопределяет их на root container. Начальный выбор может
учитывать |
Почему глобальные стили могут быть проблемой?
|
Широкие selectors создают неявные зависимости, conflicts и regressions в далеких features. Global layer оставляют для reset, tokens, typography и действительно общих primitives; component и feature styles ограничивают понятными boundaries. |
Что такое cascade layers @layer?
|
Cascade layers задают явный порядок групп styles до сравнения specificity. Например, |
Что такое Shadow DOM style encapsulation?
|
Shadow DOM создает отдельное tree boundary: обычные document selectors не проникают внутрь, а внутренние styles не
выходят наружу. Наследуемые properties, CSS custom properties, |
Что такое BEM?
|
BEM делит CSS-имена на block, element и modifier: .user-card {
}
.user-card__title {
}
.user-card--compact {
}Соглашение делает связи явными и снижает конфликты глобальных стилей, но длинные имена и ручная дисциплина могут быть избыточны при надежной component style isolation. |
Чем SCSS @import отличается от @use?
|
Legacy
@use 'tokens';
.button {
color: tokens.$primary;
}Для нового Sass-кода используют |
Какие есть способы изоляции стилей?
|
Основные варианты:
Изоляция уменьшает конфликты, но global tokens, typography и overlays все равно требуют продуманного общего слоя. |
Какие плюсы и минусы готового UI Kit?
|
Плюсы: единый дизайн, accessibility primitives, быстрый старт, готовые сложные компоненты и меньше дублирования. Минусы: ограниченная кастомизация, лишний bundle, зависимость от release cycle и сложные обновления. Перед выбором проверяют accessibility, theming, SSR, forms integration, поддержку Angular-версий и качество API. |
Что такое reflow/layout?
|
Layout вычисляет геометрию render tree: размеры и координаты элементов. Изменение ширины, шрифта или структуры может потребовать пересчета части или всей страницы. Стоимость растет с размером и связанностью layout. |
Почему GPU не делает любую анимацию бесплатной?
|
Compositor может дешево перемещать готовый layer, но его сначала нужно rasterize и хранить в GPU memory. Большие layers,
filters, uploads и частые изменения content создают overhead. Производительность подтверждают trace, а не наличием
|
Что делают contain и content-visibility?
|
|
Что такое repaint?
|
Paint рисует пиксели для фона, текста, border, shadow и других визуальных свойств. Он может выполняться без нового layout, если геометрия не изменилась. Большие painted areas и сложные эффекты увеличивают стоимость. |
Что такое compositing?
|
Compositing собирает ранее нарисованные слои в итоговый кадр, применяя трансформации и прозрачность. Эту работу часто можно передать compositor thread/GPU. Но создание и хранение слоев расходует память. |
Чем reflow отличается от repaint?
|
Reflow пересчитывает геометрию и обычно приводит к последующему paint. Repaint меняет пиксели без обязательного пересчета размеров. Compositing может обновить итоговый кадр без обоих этапов для подходящих свойств. |
Какие CSS-свойства чаще вызывают layout?
|
Свойства размеров и геометрии: |
Какие CSS-свойства чаще вызывают paint?
|
Цвета, backgrounds, borders, shadows и часть filters обычно требуют paint, но не layout. Чем больше область и сложнее эффект, тем дороже операция. Реальная pipeline зависит от браузера и layer structure. |
Почему transform и opacity обычно лучше для анимаций?
|
Они часто применяются на этапе compositing без повторного layout и paint содержимого. Это уменьшает работу main thread и делает кадры стабильнее. Гарантии нет: сложная сцена и лишние layers тоже могут быть дорогими. |
Что выполняется на CPU, а что может уйти на GPU?
|
JavaScript, style calculation и layout в основном выполняются CPU/main thread. GPU часто ускоряет rasterization и compositing слоев. Он не делает произвольную CSS-анимацию бесплатной и не исправляет long JavaScript tasks. |
Что такое compositor layer?
|
Это поверхность, которую браузер может независимо перемещать и смешивать при сборке кадра. Layers полезны для анимируемых элементов, fixed content и video. Каждый слой требует памяти и может увеличить raster/compositing work. |
Что такое layer promotion?
|
Браузер решает вынести элемент в отдельный compositor layer из-за transform, animation или других эвристик. Разработчик
может подсказать намерение через |
Что делает will-change?
|
Он заранее сообщает браузеру, какое свойство скоро изменится, чтобы подготовить оптимизацию. Использовать его следует незадолго до анимации и для ограниченного числа элементов. После завершения долгой подготовки hint можно убрать. |
Почему will-change нельзя ставить на все элементы?
|
Браузер может создать слишком много слоев и потратить GPU memory. Это увеличивает rasterization, compositing и иногда
ухудшает производительность сильнее исходной проблемы. |
Почему top/left часто хуже для анимаций, чем transform?
|
Offsets меняют геометрию positioned element и могут запускать layout и paint. Transform обычно перемещает готовый слой на этапе compositing. Итог зависит от элемента, поэтому анимацию измеряют. /* Плохо для частых анимаций */
.box {
left: 100px;
}
/* Обычно лучше */
.box {
transform: translateX(100px);
} |
Почему box-shadow и filter могут быть дорогими?
|
Они требуют вычисления пикселей вокруг элемента, размытия и дополнительных offscreen surfaces. Большой blur radius и анимация на крупной области особенно дороги. Иногда дешевле использовать подготовленный asset или меньшую область. |
Что такое layout thrashing?
|
Это повторное чередование DOM writes и layout reads, вынуждающее браузер синхронно пересчитывать геометрию много раз за кадр. Проблема часто возникает в циклах. Чтения и записи нужно группировать. |
Как избежать layout thrashing?
|
Сначала прочитать необходимые размеры, затем пакетно изменить DOM. Для кадра использовать |
Почему чтение offsetWidth после записи стилей может быть проблемой?
|
После write вычисленные размеры становятся устаревшими. Чтение |
Как DevTools Performance помогает искать reflow/repaint?
|
Запись trace показывает scripting, style recalculation, layout, paint и compositing по кадрам. Можно открыть дорогой event, увидеть call stack и affected nodes. Paint flashing и Layers дополняют анализ. |
Что такое FPS?
|
FPS — число отображенных кадров в секунду. Низкий или нестабильный FPS заметен как рывки анимации и scrolling. Важно смотреть не только среднее, но и пропущенные кадры. |
Почему 60 FPS означает бюджет около 16.6ms на кадр?
|
Секунда делится на 60 интервалов: примерно |
Как requestAnimationFrame помогает с анимациями?
|
Callback вызывается перед следующим paint и синхронизирует обновление с refresh cycle. Браузер может приостанавливать его в фоновой вкладке. Тяжелая работа внутри callback все равно блокирует кадр. |
Что такое CSS nesting?
|
Native nesting позволяет вкладывать relative selectors внутрь style rule. Оно уменьшает повторение context, но глубокая вложенность повышает specificity и связанность. Синтаксис и результат следует отличать от дополнительных возможностей Sass. |
Чем :is() отличается от :where()?
|
Обе pseudo-classes группируют selectors. Specificity |
Что такое :has()?
|
|
Что такое style queries?
|
Style container queries применяют rules по computed style container, прежде всего по custom properties. Это позволяет компоненту реагировать на semantic state контекста. Поддержку конкретного синтаксиса нужно проверять для целевых браузеров. |
Для чего нужны accent-color и color-scheme?
|
|
Как работают prefers-color-scheme и prefers-reduced-motion?
|
Эти media features отражают системные предпочтения пользователя. Первая помогает выбрать начальную theme, вторая — уменьшить необязательное движение. Reduced motion означает не «выключить все», а убрать потенциально проблемные эффекты, сохранив понятную обратную связь. |
Что такое logical properties?
|
Logical properties описывают flow-relative стороны: |
Для чего нужны aspect-ratio и object-fit?
|
|
Что делают overscroll-behavior и scrollbar-gutter?
|
|
