Питання на співбесіді з верстки з відповідями
HTML, CSS, Flexbox, Grid, Tailwind, адаптивність, доступність і продуктивність стилів.
225 запитань для співбесіди з теми Верстка з відповідями й поясненнями - рівні Junior, Middle і Senior. Приклади запитань, онлайн-тести й задачі на код.
- HTML
- CSS
- Flexbox
- Grid
- Tailwind
Запитання за рівнями
Junior
Базові поняття та синтаксис · 50 запитань
Middle
Практика, нюанси й оптимізація · 50 запитань
Senior
Архітектура, внутрішня будова, edge cases · 50 запитань
Приклади запитань
Кілька запитань із кожного рівня з правильною відповіддю й поясненням.
Верстка · Junior
- Навіщо на початку HTML-документа пишуть
<!DOCTYPE html>?Правильна відповідь: Щоб увімкнути стандартний режим рендерингу, а не quirks mode
DOCTYPE - не тег і не підключення ресурсів. Він повідомляє браузеру, що сторінку написано за сучасними стандартами, і вмикає standards mode. Без нього браузер переходить у quirks mode та емулює помилки старих браузерів (наприклад, іншу блокову модель). Кодування задає
<meta charset="utf-8">, а не DOCTYPE. - Який набір складається лише із семантичних тегів HTML5?
Правильна відповідь:
<header>,<nav>,<main>,<article>,<footer>Семантичні теги описують зміст: шапка, навігація, основний контент, самостійна стаття, підвал.
<div>і<span>- нейтральні контейнери без сенсу, а<b>та<i>- презентаційні (виділення без смислової ваги). Семантика допомагає скринрідерам, пошуковикам і читабельності коду. - Скільки видимих елементів
<main>може бути на сторінці і для чого він потрібен?Правильна відповідь: Один - він містить основний унікальний вміст сторінки
<main>позначає основний контент документа, унікальний для цієї сторінки (без шапки, меню та підвалу). Видимим має бути лише один (решта - з атрибутомhidden). Це орієнтир (landmark) для скринрідерів: за ним користувач одразу переходить до вмісту.<section>- тематичний розділ, а не заміна<main>. - Чим
<div>відрізняється від<span>за замовчуванням?Правильна відповідь:
<div>- блоковий елемент,<span>- рядковийУ
<div>за замовчуваннямdisplay: block: він розтягується на всю ширину батька й починається з нового рядка. У<span>-display: inline: він вбудовується в потік тексту і займає ширину за вмістом. Обидва елементи не мають семантики, це контейнери для групування та стилізації.
Верстка · Middle
- Яка специфічність селектора
nav#main .item:hover > a::before?Правильна відповідь: (1, 2, 3) - ID, клас + псевдоклас, два теги + псевдоелемент
Рахуємо за розрядами: ID -
#main(1); класи, атрибути та псевдокласи -.itemі:hover(2); теги та псевдоелементи -nav,a,::before(3). Комбінатори (>, пробіл) специфічності не додають. Псевдоклас важить як клас, а псевдоелемент - як тег. - Як перебити правило з
!importantзі сторонньої бібліотеки, не чіпаючи її код?Правильна відповідь: Написати своє правило теж з
!importantі селектором специфічнішимЗвичайне правило ніколи не переб'є
!important, хай яким специфічним воно буде. Серед кількох!important-декларацій знову працюють специфічність і порядок. Ще варіанти: inline-стиль з!importantабо каскадні шари - для!importantпорядок шарів інвертується. Найкращий шлях - уникати!importantу власному коді. - На що розгортається скорочення
flex: 1?Правильна відповідь:
flex-grow: 1; flex-shrink: 1; flex-basis: 0%flex: 1=1 1 0%: базовий розмір нуль, тому весь простір ділиться між елементами строго пропорційно доflex-grow- колонки виходять рівними незалежно від контенту.flex: auto=1 1 auto- ділиться лише вільне місце понад розмір контенту.flex: none=0 0 auto. - Чим
flex-basisвідрізняється відwidthу flex-елемента в рядку (flex-direction: row)?Правильна відповідь:
flex-basis- початковий розмір по головній осі; якщо він неauto, то важливіший заwidthflex-basisзадає початковий розмір елемента вздовж головної осі, від якого рахуютьсяgrowіshrink. Заflex-basis: autoберетьсяwidth(абоheightу колонці). Заflex-direction: columnflex-basisпрацює по висоті, а не по ширині - у цьому ключова відмінність відwidth.
Верстка · Senior
- Як каскадні шари
@layerвпливають на пріоритет стилів?Правильна відповідь: Порядок шарів важливіший за специфічність: перемагає пізніший шар
Каскад спершу порівнює шари й лише потім специфічність усередині шару. Тому
.btnіз шаруcomponentsпереб'є#app .btnз ранішого шаруbase. Стилі поза шарами сильніші за будь-які шари. Для!importantпорядок інвертується: важливі декларації раннього шару сильніші. Tailwind v4 будує свої стилі на шарахtheme,base,components,utilities. - Який порядок застосування у звичайних (не
!important) стилів із шарів і поза шарами?Правильна відповідь: Стилі поза шарами сильніші за будь-який шар
Стилі без шару неявно потрапляють в «останній» шар і виграють у всіх іменованих шарів. Це дає змогу обгорнути сторонній CSS у
@layer vendorі легко перебивати його своїми стилями. За!importantлогіка зворотна: важливі стилі із шарів сильніші за важливі стилі без шару. - Що робить
@scope (.card) to (.card__content) { img { ... } }?Правильна відповідь: Стилізує
imgусередині.card, але не всередині.card__content@scopeзадає корінь області й необов'язкову «нижню межу» (donut scope): стилі діють усередині.card, але не проникають у.card__contentі його нащадків. Крім того, за однакової специфічності перемагає правило з ближчим коренем (scoping proximity). Shadow DOM@scopeне створює. - Яку проблему розв'язує
subgrid?Правильна відповідь: Дає вкладеній сітці треки батьківської, вирівнюючи частини різних карток
З
grid-template-rows: subgridдочірня сітка успадковує лінії батьківської. Класичний приклад - ряд карток, де заголовки, тексти й кнопки мають стояти на одному рівні, навіть якщо в одній картці заголовок у два рядки. Без subgrid кожна картка вирівнюється незалежно.
Збірні тести з цією темою
Запитання з кількох тем одразу - як на співбесіді на конкретну вакансію.
Задачі на код
Напишіть рішення просто в браузері - тести перевірять його одразу. Класика співбесід: debounce, throttle, deepClone, Promise.all, EventEmitter, LRU-кеш та інші.
Відкрити задачі →