На практической части собеса чаще всего дают пять-шесть задач, которые встречаются в любом интерфейсе. Ниже короткие современные решения, которые работают во всех основных браузерах.
Центрирование
По обеим осям, одним правилом на родителе:
.parent {
display: grid;
place-items: center;
}
Вариант на flex: display: flex; justify-content: center; align-items: center;. Если родитель не растянут по высоте, центрировать по вертикали некуда: задай ему высоту, например min-height: 100dvh.
Абсолютно позиционированный элемент центрируют так: position: absolute; inset: 0; margin: auto; при заданных ширине и высоте, или top: 50%; left: 50%; transform: translate(-50%, -50%).
Подвал прижат к низу
body {
min-height: 100dvh;
display: flex;
flex-direction: column;
margin: 0;
}
main { flex: 1; }
dvh учитывает выезжающие панели мобильного браузера, обычный vh на телефоне бывает выше видимой области.
Сетка карточек без медиазапросов
.cards {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));
gap: 24px;
}
Колонок столько, сколько влезет при ширине не меньше 240px, остаток делится поровну. auto-fit вместо auto-fill схлопывает пустые колонки, и при малом числе карточек они растягиваются на всю ширину.
Чтобы карточки в ряду были одной высоты, а кнопка стояла внизу, карточку делают флекс-колонкой и толкают кнопку margin-top: auto.
Пропорции и картинки
.cover {
aspect-ratio: 16 / 9;
width: 100%;
object-fit: cover;
}
aspect-ratio держит пропорцию без старого трюка с padding-top: 56.25%. object-fit: cover заполняет рамку, обрезая лишнее, а не растягивая картинку.
Обрезка текста
Одна строка:
.name {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
Несколько строк:
.desc {
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 3;
overflow: hidden;
}
Префиксная запись выглядит странно, но работает во всех основных браузерах. Во флекс-элементе обрезка не сработает, пока не добавишь min-width: 0: по умолчанию флекс-элемент не сжимается меньше своего содержимого.
Липкая шапка
.header {
position: sticky;
top: 0;
z-index: 10;
}
Почему sticky «не липнет»: не задан top; у какого-то предка overflow: hidden или auto, и элемент прилипает внутри этого предка, а не окна; родитель шапки по высоте равен самой шапке, и ей некуда ехать.
Плавающий размер шрифта
h1 { font-size: clamp(1.75rem, 1rem + 3vw, 3rem); }
Шрифт растёт с шириной окна, но не меньше 1.75rem и не больше 3rem. rem в формуле нужен, чтобы учитывалась настройка размера шрифта пользователя.
Как вести себя на практике
- Проговаривай решение вслух: что выбрал и почему.
- Начинай с семантичной разметки, потом стили.
- Не ставь фиксированные высоты контенту: тексты бывают длиннее.
- Проверь узкий экран и длинное слово.
Что спросят на собесе
- Отцентрируй блок по горизонтали и вертикали двумя способами.
- Сделай адаптивную сетку карточек без медиазапросов.
- Почему не работает
position: sticky? - Как обрезать текст многоточием в одну и в три строки?
- Как прижать подвал к низу страницы?