Skip to main content

Блокові, інлайнові та інлайново-блокові елементи в HTML та CSS

display: block, display: inline та display: inline-block визначають, як елементи займають місце і рухаються в потоці документа.

Теорія

Коротко

  • Block - як оголошення на всю сторінку: займає весь рядок, стекується вертикально, поважає всі box model властивості.
  • Inline - як слово в реченні: тече горизонтально, ігнорує width/height, працюють тільки ліві та праві margin.
  • Inline-block - як зображення в тексті: тече в рядку, але поважає width, height і всі margin.
  • Головна різниця: block примушує перенос рядка і повну ширину; inline ігнорує розміри; inline-block дозволяє і те, і інше.
  • Правило вибору: block для секцій layout, inline для стилізації тексту, inline-block для кнопок або іконок в рядку.

Швидкий приклад

html
<style> .block { display: block; background: lightblue; padding: 10px; margin: 10px; } .inline { display: inline; background: lightgreen; padding: 10px; margin: 10px; } .inl-block { display: inline-block; background: lightcoral; padding: 10px; margin: 10px; width: 120px; height: 50px; } </style> <!-- Стекується вертикально, повна ширина --> <div class="block">Block 1</div> <div class="block">Block 2 (нижче)</div> <!-- Розташовується поряд, ігнорує width/height --> <span class="inline">Inline 1</span> <span class="inline">Inline 2</span> <!-- Розташовується поряд, поважає розміри --> <span class="inl-block">Inline-block 1</span> <span class="inl-block">Inline-block 2</span>

Block-елементи стекуються. Inline-елементи стоять поряд, але не приймають width чи height. Inline-block стоїть поряд і приймає розміри.

Ключова різниця

Block примушує перенос рядка до і після себе, а потім розтягується на всю ширину контейнера. Саме тому <div> займає весь рядок навіть якщо в ньому одне слово. Inline вливається в текстовий потік, як слово в реченні: без переносу рядка, без реакції на width чи height. Inline-block - середній варіант. Лишається в потоці рядка, але створює блок з розмірами. Тому кнопки зазвичай так і роблять.

Коли що використовувати

  • Потрібно стекувати вертикально і заповнити ширину? Block. Секції, заголовки, контейнери статей.
  • Стилізуєш частину речення або обертаєш посилання всередині тексту? Inline. <span>, <a>, <em>.
  • Кнопка, бейдж або таб навігації з padding і розміром, які мають стояти поряд? Inline-block.
  • Не встановлюй width чи height на inline-елементи - вони не матимуть ефекту.

Таблиця порівняння

Властивістьblockinlineinline-block
Новий рядокТакНіНі
width / heightТакНіТак
Margin (всі сторони)ТакТільки ліво/правоТак
Padding (всі сторони)ТакТільки ліво/правоТак
Повна ширина за замовчуваннямТакНіНі
Коли використовуватиСекції, контейнериСтилізація текстуКнопки, бейджі, таби

Типові помилки

Встановлення width/height на inline-елементи:

css
span { display: inline; width: 200px; height: 100px; } /* обидва ігноруються */

Браузер ігнорує ці властивості для inline-елементів. Якщо потрібен розмір - переключи на inline-block.

Очікування вертикальних margin на inline-елементах:

html
<span style="margin-top: 20px;">Текст</span>

Вертикальні margin на inline-елементах не впливають на layout. Працюють тільки margin-left і margin-right. Використовуй inline-block або додай vertical-align.

Пробіл між inline-block елементами:

html
<span style="display: inline-block; width: 100px;">A</span> <span style="display: inline-block; width: 100px;">B</span>

Перенос рядка між тегами рендериться як ~4px пробіл. Я бачив, як це руйнувало nav-меню не один раз. Виправлення: встановити font-size: 0 на батьківський елемент, або прибрати весь пробіл між закриваючим і відкриваючим тегами.

Де зустрічається в реальних проєктах

  • Bootstrap btn-group використовує inline-block для кнопок в рядку (v5.3+).
  • Таби навігації GitHub - це inline-block-посилання з padding і бордерами.
  • Утиліта inline-block в Tailwind з'являється в компонентах кнопок і бейджів.
  • Компонент Chip у Material UI за замовчуванням використовує inline-flex - для потоку поводиться так само.

Питання на співбесіді

Q: Яке значення display за замовчуванням у <img>?
A: Inline. Зображення - це замінені елементи (replaced elements), які течуть як текстові символи, але зберігають власні розміри. Тому під зображеннями всередині контейнерів часто є невеликий пробіл - це вирівнювання по базовій лінії, а не баг.

Q: Що відбувається з inline-block дочірніми елементами всередині flex-контейнера?
A: Flex formatting context бере верх. display: flex на батьківському елементі перевизначає inline-потік дочірніх елементів. Але width і height, які ти задав на дочірніх елементах, продовжують працювати.

Q: Чому vertical-align працює тільки для inline і inline-block?
A: Вона вирівнює елементи в межах рядкових боксів (line boxes). Block-елементи створюють власні рядки і не мають line box для вирівнювання.

Q: (Senior) Якщо встановити display: block на grid-елемент, чи вплине це на grid layout?
A: Ні. Grid-елементи ігнорують власну властивість display для позиціювання, бо grid formatting context бере верх. Але зміна впливає на внутрішній контекст форматування: дочірні елементи цього grid-айтема тепер течуть як block. Якщо згадати концепцію containing block - інтерв'юер це помітить.

Приклади

Навігаційна панель з inline-block табами

html
<nav style="background: #f6f8fa; padding: 1rem;"> <a href="#" style="display: inline-block; padding: 0.5rem 1rem; margin-right: 0.5rem; background: white; border: 1px solid #ddd; text-decoration: none;">Code</a> <a href="#" style="display: inline-block; padding: 0.5rem 1rem; margin-right: 0.5rem; background: white; border: 1px solid #ddd; text-decoration: none;">Issues</a> <a href="#" style="display: inline-block; padding: 0.5rem 1rem; background: white; border: 1px solid #ddd; text-decoration: none;">Pull requests</a> </nav>

Кожне посилання потребує padding і бордер, але всі мають стояти в одному рядку. Чистий inline ігноруватиме padding у layout; block поставить кожне посилання на окремий рядок. inline-block дає кожному посиланню правильний блок з розміром і водночас тримає їх поряд. Цей патерн - основа навігації GitHub.

Аватар користувача з іменем

html
<style> .avatar-wrap { display: inline-block; vertical-align: middle; margin-right: 8px; } .avatar-wrap img { display: block; width: 32px; height: 32px; border-radius: 50%; } .username { display: inline; font-weight: bold; } </style> <span class="avatar-wrap"> <img src="avatar.png" alt="Аватар користувача"> </span> <span class="username">john_doe</span>

Обгортка зображення - inline-block, щоб мати фіксований розмір і vertical-align: middle для вирівнювання з текстом поряд. Ім'я користувача - звичайний inline, бо розміри йому не потрібні, воно просто тече як текст.

Коротка відповідь

Для співбесіди
Premium

Коротка відповідь допоможе вам впевнено відповідати на цю тему під час співбесіди.

Дочитали статтю?