
Я стабильно пишу здесь о CSS. Мне радостно, что моя работа вам полезна. Но хочется чего-то нового. Вызывающего споры. В общем я возвращаюсь к формату статей в виде вопрос-ответ. Вопросы будут те, которые я спрашиваю на интервью. Так что у вас будет повод сказать: «А зачем это надо?».
При составлении вопросов я хотел проверить понимание базовых моментов, которые есть в вёрстке любого проекта. Ещё будут вопросы на знание более редких аспектов и «новинок» в CSS. В общем я хочу вас завалить, чтобы казаться супер умным! (здесь ирония).
Пожалуйста, не воспринимайте мои вопросы серьёзно. Давайте просто весело проведём время. Плюс попробуем узнать что-то новое. Ведь у каждого вопроса будет мой ответ. И вы тоже можете оставить свой в комментариях. Я обязательно буду их читать.
Так, вы готовы? Давайте посмотрим, что я вам подготовил.
▍ Какое значение применится для свойства background-color
?
<body>
<span class="awesome-text">Великолепный текст</span>
</body>
:where(.awesome-text) {
background-color: tomato;
}
span {
background-color: lightblue;
}
Рассчитаем специфичность селектора из каждого правила. В первом используется псевдо-класс :where()
. У него всегда специфичность 0, 0, 0
. У второго правила используется только селектор по типу. Таким образом получается, что специфичность равняется 0, 0, 1
. Этот селектор специфичнее, поэтому второе правило побеждает.
:where(.awesome-text) {
background-color: tomato; /* специфичность 0, 0, 0. */
}
span {
background-color: lightblue; /* специфичность 0, 0, 1. Это правило выиграло */
}
Правильный ответ: lightblue
.
▍ Какое значение для свойства height
вычислят браузеры у элемента с классом .awesome-block
?
<body>
<div class="grid-container">
<div class="awesome-block">Великолепный текст</div>
<div class="awesome-block">Великолепный текст</div>
</div>
</body>
.grid-container {
display: grid;
height: 200px;
}
Когда у элемента установлено свойство display
со значением grid
, то по умолчанию браузеры делают свойство height
его дочерних элементов таким, чтобы оно занимало всё доступное пространство. По этой причине высота элемента с классом .grid-container
будет равномерно распределяться между значениями свойства height
у элементов с классом .awesome-block
.
У нас их два. Поэтому надо разделить 200px
на 2
. Получаем 100px
.
Правильный ответ: 100px
.
▍ Почему у элемента с классом .awesome-block
по-разному рассчитывается значение для свойства height
?
<body>
<div class="awesome-block">Великолепный текст</div>
<div class="flex-container">
<div class="awesome-block">Великолепный текст</div>
</div>
</body>
.flex-container {
display: flex;
height: 100px;
}
На алгоритм расчёта свойства height
влияет свойство display
. Если элемент с display: block
находится внутри элемента, у которого указано свойство display
со значением block
, то свойство height
рассчитывается по высоте содержимого. Это первый наш случай.
Второй элемент с классом .awesome-block
является дочерним элементом элемента с классом .flex-direction
. У него установлено свойство display
со значением flex
. В этом случае уже браузеры рассчитывают свойство height
так, чтобы оно совпадало со значением свойства height
родительского элемента, т. е. элемента с классом .flex-container
.
Правильный ответ: Браузеры рассчитывают значение по-разному, потому что элементы с классом .awesome-block
находятся внутри элементов с разным значением для свойства display
. В частности первый элемент с классом .awesome-block
находится внутри элемента с display: block
, а второй с display: flex
.
▍ Браузеры отобразят один и тот же результат в первом и втором случае?
<body>
<div class="awesome-block"></div>
</body>
Случай №1
.awesome-block {
background-color: lightblue;
position: relative;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
Случай №2
.awesome-block {
background-color: lightblue;
position: absolute;
top: 0;
left: 0;
bottom: 0;
right: 0;
}
Для правильного ответа нужно вспомнить, относительно чего рассчитываются значения свойств top
, right
, bottom
и left
при использовании значения relative
и absolute
для свойства position
.
В первом случае браузеры отсчитывают значение от той точки, где располагается элемент до применения свойств top
, right
, bottom
и left
. В случае со значением absolute
браузеры используют границы родительского элемента с нестатичным типом позиционирования (значения relative
, absolute
, fixed
, sticky
для свойства position
) или вьюпорта. При этом происходит установка значения для свойств width
и height
, если они не заданы явно.
По этой причине во втором случае элемент сразу растягивается по всем сторонам. В первом случае такого не происходит. Элемент остаётся на месте и не отображается, потому что у него не задано свойство height
.
Правильный ответ: Нет. В первом случае элемент останется на месте, но он визуально не будет отображён, потому что у него не задано свойство height
. Во втором случае элемент отобразится на весь вьюпорт.
▍ Браузеры вычислят одинаковое значение для свойства height
у элемента с классом .fixed-panel
в первом и во втором случае?
<body>
<div class="fixed-panel">
<div class="awesome-block">Великолепный текст</div>
</div>
</body>
Случай №1
.awesome-block {
position: fixed;
height: 100px;
}
Случай №2
.awesome-block {
position: sticky;
height: 100px;
}
После добавления свойства position
со значением fixed
к элементу, он перестаёт влиять на размеры родительского элемента. Он пропадает. По этой причине в нашем примере браузеры вычислят значение 0
для свойства height
у элемента с классом .fixed-panel
в первом случае.
При значении sticky
такого не происходит. Элемент продолжает влиять на размеры родителя. В нашем примере будет вычислено значение 100px
.
Правильный ответ: Нет. Значения будут разные. В первом случае браузеры вычислят 0px
, а во втором 100px
.
▍ Какое значение будет вычислено для свойства background-color
у элемента <body>
?
:root {
--page-background-color: lightblue;
background-color: tomato;
}
body {
--page-background-color: inherit;
background-color: var(--page-background-color);
}
Для правильного ответа нужно помнить, что пользовательские свойства — самодостаточные свойства, и для них также работает механизм наследования. Они наследуют значение между друг другом, если у них одинаковое наименование. В нашем примере это --page-background-color
.
По этой причине браузеры наследуют значение lightblue
из пользовательского свойства --page-background-color
из первого правила, а потом передают его в свойство background-color
.
Правильный ответ: lightblue
.
▍ Какое значение вычислят браузеры для свойства margin
?
:root {
--margin-extra-start: 30px;
--margin-main-end: 40px;
--margin-extra-end: 50px;
}
.box {
margin: var(--margin-extra-start)
var(--margin-main-end)
var(--margin-extra-end)
var(--margin-main-start);
}
В нашем примере используются четыре пользовательских CSS-свойства для установки значения для свойства margin
. Такое использование пользовательских свойств заставляет передавать все значения для них. Если этого не сделать, то браузеры не могут правильно соотнести значения, а в итоге просто не применят значения.
Это и произошло. В итоге мы увидим, что у свойства margin
установлено значение 0
со всех сторон.
Правильный ответ: 0px
.
▍ Браузеры вычислят значение #e2e2e2
для свойства color
и значение transparent
для свойства background-color
. Правда или ложь?
body {
color: #e2e2e2;
}
p {
color: unset;
background-color: unset;
}
При использовании ключевого слова unset
важно помнить о том, что есть свойства, которые могут наследовать значение от родителя, и не могут. Например, свойство color
может, поэтому в нашем примере у элемента <p>
вместо unset
будет использоваться значение #e2e2e2
.
Если свойство не может наследовать значение, то браузеры буду использовать значение из веб-стандартов. У свойства background-color
это значение transparent
. Оно будет использовано в нашем примере.
Правильный ответ: Правда.
▍ В первом случае браузеры будут постоянно перерисовывать элемент, а во втором — нет. Это так?
Случай №1
.awesome-block {
width: 2rem;
height: 2rem;
background-color: lightblue;
position: absolute;
animation: move 2s infinite;
}
@keyframes move {
0% {
translate: 0;
}
100% {
translate: 2rem;
}
}
Случай №2
.awesome-block {
width: 2rem;
height: 2rem;
background-color: lightblue;
position: absolute;
animation: move 2s infinite;
}
@keyframes move {
0% {
left: 0;
}
100% {
left: 2rem;
}
}
При изменении значения большинство свойств вызывают этап перерисовки элемента. Исключением являются свойства трансформации и свойство opacity
. В первом случае используется более современная альтернатива для свойства transform
со значением translateX()
. По этой причине при анимировании свойства этапа перерисовки не будет.
Во втором случае изменяется значение свойства left
, поэтому браузеры будут перерисовывать элемент на каждое изменение значения.
Правильный ответ: Нет. Наоборот, в первом случае браузеры не будут рассчитывать геометрию элемента, а во втором будут.
▍ Какое значение будет рассчитано для свойства width
?
<body>
<div class="awesome-block">Великолепный текст</div>
</body>
body {
writing-mode: vertical-lr;
}
.awesome-block {
inline-size: 160px;
block-size: 320px;
background-color: lightblue;
}
Свойства inline-size
и block-size
относят к группе свойств, зависящих от направления текста. В нашем примере установлено свойство writing-mode
со значением vertical-lr
. При этом значении за ширину блока уже отвечает свойство block-size
, и для свойства width
будет установлено значение 320px
.
Правильный ответ: 320px
.
▍ Заключение
В этой статье мы рассмотрели вопросы, касающиеся следующих аспектов:
- специфичность псевдо-класса
:where()
; - как свойство
display
влияет на алгоритм расчёта свойстваheight
; - свойства
top
,right
,bottom
иleft
могут повлиять на вычисление свойствwidth
иheight
при использовании значенияabsolute
для свойстваposition
; - как значения
fixed
иsticky
влияют на вычисление значения для свойстваheight
у родительского элемента; - алгоритм наследования у пользовательских CSS-свойств;
- особенности работы пользовательских CSS-свойств для свойств, являющимися краткими формами;
- тонкости ключевого свойства
unset
; - производительность CSS-анимации;
- логические CSS-свойства
inline-size
иblock-size
.
На этом всё. Спасибо за чтение!
P.S. Помогаю больше узнать про CSS в своём ТГ-канале CSS isn't magic. Присоединяйтесь. Ссылка в профиле.
© 2025 ООО «МТ ФИНАНС»
Автор: melnik909