Вопросы и ответы с собеседований по CSS
Вопросы и ответы по CSS для собеседования фронтенд-разработчика. Узнайте, как рассказать на техническом интервью про селекторы, псевдоклассы, наследование стилей, блочную модель, единицы измерения, сброс и нормализацию стилей и так далее.
Что такое селектор?
Селектор - это часть CSS-стиля, идентифицирующая HTML-элемент или группу HTML-элементов, по отношению к которым будет применён этот стиль.
Например, в следующем коде h1 является селектором тега <h1>:
h1 {
color: #fff;
font-family: Arial;
}
Что такое селекторы атрибутов?
Селекторы атрибутов - это механизм, позволяющий применять стили по отношению к элементам, имеющим определенные HTML-атрибуты.
Например, следующий код обрамит жёлтой рамкой все элементы класса .photo, имеющие атрибут title:
.photo[title] {
border: 1px solid yellow;
}
Возможна даже более детальная выборка:
a[href="http://www.cafesoylentgreen.com"]{
color: green;
font-weight: bold;
}
Что такое псевдоэлемент?
Псевдоэлемент в CSS — это ключевое слово, добавляемое к селектору, которое позволяет стилизовать определённую часть выбранного элемента.
Например, псевдоэлемент ::first-line может быть использован для изменения шрифта первой строки абзаца:
/* Первая строка каждого элемента <p>. */
p::first-line {
color: blue;
text-transform: uppercase;
}
Стандартные псевдоэлементы:
- ::after
- ::before
- ::cue
- ::first-letter
- ::first-line
- ::selection
- ::slotted
- ::backdrop Экспериментальная возможность
- ::placeholder Экспериментальная возможность
- ::marker Экспериментальная возможность
- ::spelling-error (en-US) Экспериментальная возможность
- ::grammar-error Экспериментальная возможность
Что такое псевдокласс?
Псевдокласс в CSS — это ключевое слово, добавленное к селектору, которое определяет его особое состояние.
Например, :hover может быть использован для изменения цвета кнопки при наведении курсора на неё:
div:hover {
background-color: #F89B4D;
}
Псевдоклассов много, вот буквально пара из них: :focus, :active, :last-of-type, :disabled, :last-child.
Как работает наследование стилей?
Наследование — это прием, с помощью которого CSS-свойства, относящиеся к одному элементу веб-страницы, распространяются и на его вложенные элементы.
Например, абзац p всегда находится внутри тела страницы body. Так, атрибуты, применяемые к элементу body, наследуются p. Допустим, вы создали селектор тега для элемента body, который устанавливает color: red. Производные элементы, являющиеся потомками body, то есть расположенные внутри него, наследуют атрибут. Это означает, что любой текст, заключенный в теги элементов h1, h2, p и т. д., будет отображен тем же красным цветом.
Механизм наследования многоуровневый, то есть его эффект не только распространяется на прямых потомков (дочерние элементы), но и переносится на все вложенные элементы.
В чем разница между id и class?
#id - это селектор, позволяющий применить стиль по отношению к элементу, имеющему определённый #id (идентификатор). id может быть только в единственном экземпляре на странице и не должен повторяться.
.class - это селектор, позволяющий применить стиль по отношению к группе элементов, имеющих определённый .class (класс). Элементов с одинаковым class может быть сколько угодно много на одной странице.
Как устроена специфичность стилей?
CSS устроен так, что одинаковые CSS-свойства с разным значением, применяемым к элементу, не могут быть применены к нему одновременно.
Например:
h1 {
color: red;
}
.h1 {
color: blue;
}
#h1 {
color: yellow;
}
и
<h1 style="color: black">Header</h1>
Какое-то из свойств должно "победить". Побеждает (имеет преимущество) свойство самого близкого по отношению к форматируемому элементу стиля. Или, правильнее выразиться, самого специфичного стиля. Вот упрощенная, но наглядная модель специфичности селекторов в условных единицах:
- Селектор тегов имеет специфичность, равную 1 условной единице.
- Класс — 10 условных единиц.
- Идентификатор — 100 условных единиц.
- Строчный стиль — 1000 условных единиц
В приведённом примере <h1> будет иметь чёрный цвет текста.
Что такое блочные и строчные элементы?
В CSS существует два различных типа элементов: блочные и строчные.
В блочных элементах создается разрыв строки перед элементом и после него. Примеры блочных элементов: <div>, <h1>, <main>.
Строчные элементы не создают разрывов строк ни до, ни после себя. Они отображаются на одной строке с содержимым рядом стоящих элементов. Примеры строчных элементов: <em>, <span>, <b>.
Примечания:
1. Свойства width и height применяются только по отношению к блочным элементам.
2. У блочного элемента margin, padding и border отодвигают от него другие элементы.
3. У строчного элемента только горизонтальные margin, padding и border отодвигают другие (только строчные) элементы .
display: block позволяет сделать элемент блочным.
display: inline позволяет сделать элемент строчным.
display: inline-block позволяет оставить элемент строчным, но позволить css-свойствам (width, height, margin) влиять на него, как на блочный.
Расскажите про единицу измерения px
Физические пиксели — привычные нам пиксели: самые маленькие элементы любого дисплея, каждый из которых имеет свой цвет и яркость.
Плотность экрана (Screen density) — это количество физических пикселей дисплея. Обычно измеряется в пикселях-на-дюйм (PPI: pixels per inch). Apple, разработав Retina-экраны с двойной плотностью пикселей, утверждает, что человеческий глаз не способен различить бо′льшую плотность.
CSS-пиксели — абстрактная величина, используемая браузерами для точного отображения контента на страницах вне зависимости от экрана.
Средствами JavaScript можно узнать плотность пикселей экрана, на котором отображается страница:
window.devicePixelRatio
Расскажите про единицу измерения em
em - это единица измерения в CSS, базирующаяся на размере шрифта текущего контекста.
То-есть, если для <h1> задан font-size: 40px, то можно задать для него margin: 1em и это будет равняться margin: 40px.
em "смотрит" на размер шрифта (свой или унаследованный) элемента, по отношению к которому применяется.
Расскажите про единицу измерения rem
rem - это единица измерения в CSS, которая базируется на размере шрифта элемента <html>.
То-есть, в следующем случае:
html {
font-size: 100px;
}
h1 {
font-size: 10px;
margin: 0.5rem;
}
margin у <h1> будет равняться 50px, что является половиной от размера шрифта элемента <html>.
Для чего нужно свойство box-sizing?
CSS свойство box-sizing определяет формулу вычисления общей ширины и высоты элемента..
box-sizing: content-box (значение по умолчанию) считает шириной и высотой элемента только ширину и высоту его контента.
box-sizing: border-box считает шириной и высотой элемента ширину и высоту его контента, его внутренних отступов (padding) и суммарную ширину и высоту границ (border).
Например:
div {
width: 100px;
padding: 10px;
border: 1px solid black;
box-sizing: content-box;
}
Здесь, например, у <div> получится итоговая ширина в размере 100 + (10 * 2) + (1 * 2) = 122, потому что при box-sizing: content-box ширина устанавливается только для контента внутри элемента, а всё остальное добавляется "сверху" (padding, border).
Однако, если установить для примера выше box-sizing: border-box, то итоговая ширина <div> будет равной 100px, потому что border и padding заставят контент в элементе сжаться, чтобы обеспечить соблюдение заданной ширины.
Для чего нужно свойство margin?
Свойство margin задаёт внешние отступы вокруг элемента. Эти отступы не являются частью ширины/высоты элемента при любом значении box-sizing.
Схлопывание
Вертикальные отступы схлопываются друг с другом, горизонтальные – нет. То-есть, если два <div> расположить в колонку (один под другим) и задать каждому margin: 20px 0, то расстояние между ними будет равняться 20px, а не 40px. При этом, если бы у верхнего элемента был задан отступ в 40px, а у нижнего - в 30px, то автоматически выбрался бы больший из них - 40px. Горизонтальные отступы при этом не схлопываются, а суммируются.
Отрицательные значения
Отрицательные значения margin-top/margin-left смещают элемент со своего обычного места.
В CSS есть другой способ добиться похожего эффекта – а именно position:relative. Но между ними есть одно принципиальное различие: при сдвиге через margin соседние элементы занимают освободившееся пространство в отличие от position: relative, при котором элемент визуально сдвигается, но место, где он был, остаётся «занятым».
Для чего нужно свойство padding?
Свойство padding устанавливает внутренние отступы/поля со всех сторон элемента.
Область отступов - это пространство между содержимым элемента и его границей. Отрицательные значения не допускаются.
Для чего нужно свойство transition?
transition позволяет определять переходное состояние между двумя состояниями элемента. Различные состояния могут быть определены с помощью псевдоклассов, таких как :hover или :active или установлены динамически с помощью JavaScript.
Свойство transition - это сокращённое свойство для transition-property, transition-duration, transition-timing-function, и transition-delay.
Например, в следующем примере кода благодаря свойству transition прозрачность кнопки при наведении на неё будет изменяться плавно.
button {
transition: opacity 0.2s ease-in-out;
}
button:hover {
opacity: 0.8;
}
Антипаттерном является запись вида transition: all, заставляющая браузер прибегать к излишним вычислениям. В особых случаях это может давать заметный негативный эффект в производительности.
Для чего нужно свойство transform?
Свойство transform применяется для поворота, масштабирования, наклона или сдвига элемента.
При этом, в потоке элемент остаётся на прежней позиции. То-есть, увеличение картинки с помощью transform: scale(2) не раздвинет соседние элементы картинки, а заставит её частично их перекрывать. Это является минусом transform. Плюсом же можно назвать высокую производительность этого решения.
Например, благодаря наличию transform считается антипаттерном анимирование width и height.
Некоторые функции transform:
- matrix();
- perspective();
- rotate();
- translate();
- scale();
- skew().
В transform можно передавать сразу несколько функций:
transform: translateX(10px) rotate(10deg) translateY(5px);
Для чего нужно свойство float?
CSS-свойство float указывает, что текущий элемент должен быть изъят из обычного flow (потока) и прижат к левой или правой стороне родительского элемента. Текст и inline-элементы будут обтекать такой элемент.
До поддержки браузерами флексбоксов и CSS Grid в основном использовался float-подход для вёрстки макетов. Ещё прежде, до прихода float, все верстали на таблицах.
Для чего нужно свойство position?
Свойство position позволяет сдвигать элемент со своего обычного места и изменять его положение в потоке.
1. position: static - это значение любого элемента по умолчанию. При нём элемент находится в потоке, раздвигая элементы вокруг себя.
2. position: relative - это значение позволяет элементу позиционироваться относительно его обычного положения с помощью свойств top, right, bottom, left.
3. position: absolute - это значение позволяет элементу позиционироваться по координатам внутри его ближайшего родителя, имеющего position, отличный от static (или относительно всего документа). Абсолютно позиционированный элемент считается блочным и выносится из потока. Ширина элемента устанавливается по содержимому.
4. position: fixed - это подвид абсолютного позиционирования. Работает аналогично position: absolute с тем отличием, что позиционирование происходит всегда относительно window, а не от какого-либо родительского элемента.
Что такое сброс и нормализация стилей?
Сброс CSS и нормализация CSS — это два разных подхода к обнулению стилей веб-страницы.
Сброс CSS — это процесс обнуления стилей, чтобы убрать браузерные стили по умолчанию, которые могут отличаться от одного браузера к другому. Цель сброса CSS — создать «чистую» страницу, на которой все элементы имеют одинаковый вид в разных браузерах. Пример кода:
/* сброс CSS */
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
Нормализация CSS — это процесс создания единообразных стилей для разных элементов, чтобы веб-страница выглядела одинаково во всех браузерах. В отличие от сброса CSS, нормализация CSS сохраняет некоторые стили по умолчанию браузера, но при этом пытается сделать их единообразными. Пример:
/* нормализация CSS */
html {
font-size: 62.5%;
}
body {
font-size: 1.6rem;
line-height: 1.5;
font-family: Arial, sans-serif;
}
Оба подхода могут использоваться в зависимости от нужд проекта. Если вы хотите создать полностью уникальный дизайн, то возможно вам нужен сброс CSS. Если же вы хотите сохранить некоторые стили браузера, но при этом сделать веб-страницу более единообразной, то нормализация CSS может быть более подходящим вариантом.