Урок 46. Примеры: как ломается раскладка и как чинить

📁 Раздел: Качество вёрстки ⏱️ Время изучения: ~70 мин 🎯 Сложность: Средняя
#width #height #margin-left #color #overflow

⚡ Кратко

Каждый пример — пара «❌ как ломается» и «✅ как правильно». Смотри на превью, сравнивай две версии и читай разницу в коде. Открой DevTools (F12) и повтори оба варианта руками.

Ниже шесть классических дефектов раскладки. В каждом — живой «сломанный» результат слева по смыслу () и исправленный (), плюс код обоих вариантов.

1. 100vw → горизонтальный скролл

Блок шириной 100vw шире контейнера на ширину скроллбара — появляется прокрутка вбок. Контейнер ниже намеренно узкий, чтобы было видно, как «сломанный» блок вылезает.

❌ width: 100vw — вылезает, появился скролл ниже

Я шире контейнера

✅ max-width: 100% — вписался ровно

Я внутри контейнера
/* ❌ ломается: vw считается с учётом скроллбара */
.hero { width: 100vw; }

/* ✅ правильно: остаёмся в пределах контейнера */
.hero { max-width: 100%; }

2. Забытый box-sizing: border-box

Слева ширина 100% плюс padding и border вылезают наружу. Справа border-box включает их в ширину — блок остаётся ровно по контейнеру.

❌ content-box: 100% + padding вылезает

width:100% + padding 16

✅ border-box: всё внутри

width:100% + padding 16
/* ❌ padding и border прибавляются к ширине */
.field { box-sizing: content-box; width: 100%; padding: 16px; }

/* ✅ padding и border входят в ширину */
*, *::before, *::after { box-sizing: border-box; }
.field { width: 100%; padding: 16px; }

3. Фиксированная height обрезает контент

Жёсткая высота режет длинный текст. min-height задаёт минимум, но позволяет блоку расти.

❌ height: 60px + overflow:hidden

Длинный текст карточки, который не помещается в фиксированную высоту и обрезается без следа — пользователь не увидит концовку.

✅ min-height: 60px

Длинный текст карточки, который не помещается в фиксированную высоту и обрезается без следа — пользователь не увидит концовку.
/* ❌ обрезает всё, что не влезло */
.card { height: 60px; overflow: hidden; }

/* ✅ растёт под содержимое */
.card { min-height: 60px; }

4. Магические числа vs переменные/относительные единицы

Подогнанные «на глаз» пиксели ломаются при смене контента и шрифта. Относительные единицы и переменные масштабируются.

❌ margin-left: 137px — подогнано под один экран

Сдвинут «волшебным» числом

✅ gap через flex + переменная

AB
/* ❌ магическое число */
.label { margin-left: 137px; }

/* ✅ предсказуемый отступ */
:root { --gap: 1rem; }
.row { display: flex; gap: var(--gap); }

5. Война !important vs нормальный каскад

Подавление через !important мешает обычным правилам менять стиль. Уберите его — и модификатор класса снова работает.

❌ базовый цвет «прибит» !important — модификатор бессилен

✅ без !important — модификатор переопределяет

/* ❌ перекричали каскад — теперь ничего не переопределить */
.button { background: #64748b !important; }
.button--danger { background: #dc2626; } /* не сработает */

/* ✅ обычный каскад: модификатор сильнее по порядку/специфичности */
.button { background: #64748b; }
.button--danger { background: #dc2626; }

6. overflow: hidden прячет нужный контент

overflow: hidden для борьбы с «вылезанием» заодно срезает выпадашки, тени и подсказки. Лучше устранить причину переполнения, а не прятать его.

❌ overflow:hidden срезал «хвост» подсказки

Подсказка: важная деталь, которая не помеща…

✅ контент виден целиком

Подсказка: важная деталь, которая видна полностью.
/* ❌ спрятали симптом — потеряли контент */
.tooltip-wrap { overflow: hidden; height: 34px; }

/* ✅ убрали фикс. высоту, дали блоку дышать */
.tooltip-wrap { } /* контент сам задаёт высоту */
Эксперимент: открой любой пример в DevTools (F12), выбери «сломанный» блок и поправь одно свойство (width, box-sizing, height) — увидишь, как он встаёт на место в реальном времени.

Навигация