Вы не знаете CSS. Мои вопросы о CSS с ответами

в 9:01, , рубрики: ruvds_статьи
Вы не знаете CSS. Мои вопросы о CSS с ответами - 1

Я стабильно пишу здесь о 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

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js