Переваги використання display: inline-block vs float: зліва в CSS


127

Зазвичай, коли ми хочемо мати кілька DIVsпідряд, ми б використовували float: left, але тепер я виявив хитрістьdisplay:inline-block

Приклад посилання тут . Мені здається, display:inline-blockце кращий спосіб align DIVsпоспіль, але чи є недоліки? Чому цей підхід менш популярний, ніж floatфокус?


@Moak Саме з цього питання йдеться inline, ні inline-block. Але перший з них пов’язаний добре: stackoverflow.com/a/11823622/918414
ThinkingStiff


2
Приклад посилання мертва
information_interchange

Відповіді:


156

У трьох словах: inline-blockкраще.

Вбудований блок

Єдиний недолік display: inline-blockпідходу полягає в тому, що в IE7 і нижче елемент може відображатися лише в тому inline-blockвипадку, якщо він вже був inlineза замовчуванням. Це означає, що замість <div>елемента потрібно використовувати <span>елемент. Це насправді не є величезним недоліком, оскільки семантично <div>це розділення сторінки, а а <span>- лише для покриття прольоту сторінки, тому немає величезної семантичної різниці. Величезною перевагою display:inline-blockє те, що коли інші розробники підтримують ваш код у більш пізній момент, це набагато очевидніше, що display:inline-blockі text-align:right намагається зробити, ніж заява float:leftчи float:rightзаява. Моя улюблена користь від inline-blockпідходу полягає в тому, що він простий у використанні vertical-align: middle, line-heightіtext-align: centerідеально центрувати елементи інтуїтивно зрозумілим чином. У блозі Mozilla я знайшов чудову публікацію в блозі про те, як реалізувати крос-браузерний вбудований блок . Ось сумісність браузера .

Поплавок

Причина того, що використання floatметоду не підходить для компонування вашої сторінки, полягає в тому, що floatвластивість CSS спочатку була призначена лише для того, щоб обгорнути текст навколо зображення (стиль журналу) і, за задумом, не найкраще підходить для цілей загального розміщення сторінки. При подальшій зміні плаваючих елементів іноді виникнуть проблеми з позиціонуванням, оскільки вони не в потоці сторінки . Ще один недолік полягає в тому, що він, як правило, вимагає чіткого виправлення, інакше він може порушити аспекти сторінки. Очищення вимагає додавання елемента після плаваючих елементів, щоб не допустити згортання їх батьків навколо них, що перетинає семантичну лінію між розділенням стилю від вмісту і, таким чином, є антидіаграмою у веб-розробці .

Будь-які проблеми з пробілом, згадані у посиланні вище, легко можна виправити за допомогою white-spaceвластивості CSS.

Редагувати:

SitePoint - дуже надійне джерело для консультацій з веб-дизайну, і вони, схоже, мають таку саму думку, що і я:

Якщо ви не знайомі з макетами CSS, вам пробачать думати, що використання CSS-плавців у образних способах - це висота майстерності. Якщо ви спожили стільки навчальних посібників з компонування CSS, ви можете припустити, що освоєння плавців - це обряд проходження. Вас осліпить винахідливість, вражена складністю, і ви отримаєте відчуття досягнення, коли нарешті зрозумієте, як працюють поплавки.

Не обманюйте. Ти промиваєш мозок.

http://www.sitepoint.com/give-floats-the-flick-in-css-layouts/

Оновлення 2015 року - Flexbox є хорошою альтернативою для сучасних браузерів :

.container {
  display: flex; /* or inline-flex */
}

.item {
  flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]
}

Більше інформації

Оновлення 21 грудня 2016 року

Bootstrap 4 видаляє підтримку IE9, і, таким чином, позбавляється плавців з рядків і працює повний Flexbox.

Затягнути запит # 21389


4
"clearfix" - це лише ім'я; "виправлення" вказує на виправлення невірних очікувань та / або неправильної реалізації браузера. Я (щасливо) погоджуюся, що існують альтернативи плаваючому / очищенню, але в цьому немає нічого суттєво зламаного чи виправленого.
Тім Медора

10
@Alex - Чи існує не хакізний, сумісний між браузером спосіб видалити пробіл між елементами вбудованого блоку, які знаходяться на окремих лініях? Мені б хотілося перестати використовувати плавки, але найкращі посилання, які я міг знайти про цю проблему ( тут і тут ), є незадовільними. Ви згадуєте white-spaceвластивість - ви могли б це пояснити?
antinome

3
@ Алекс - дякую, це дуже круто, але я все-таки вважаю, що підхід з плаваючим сучасним чітким виправленням є трохи більш ретельним, тому що він не зламається, якщо я колись трапиться налаштувати в letter-spacingіншому місці мого CSS.
antinome

1
чому завантажувальний механізм все ще використовує float для своєї сіткової системи? Хіба це не макет?
AzDesign

2
Майте на увазі, що вбудований блок додає пробіл навколо елементів. Якщо ви використовуєте його для сітки або не хочете цього білого простору, вам доведеться додати додаткові хакерські стилі / HTML для обліку цього. Дивіться: css-tricks.com/fighting-the-space-between-inline-block-elements/…
kretzm

23

Хоча я погоджуюся, що в цілому inline-blockкраще, є одна додаткова річ, яку слід врахувати, якщо ви використовуєте відсоткові ширини для створення чуйної сітки (або якщо ви хочете, щоб пікселі були ідеальними):

Якщо ви використовуєте inline-blockдля сіток загальною чи 100% шириною, вам потрібно переконатися, що розмітка HTML не містить пробілів між стовпцями .

З плавцями це не те, про що потрібно турбуватися - стовпці плавають над будь-яким пробілом чи іншим вмістом між стовпцями. Відповіді на це запитання містять кілька корисних порад щодо способів видалення пробілів HTML, не роблячи код некрасивим .

Якщо з будь-якої причини ви не можете керувати розміткою HTML (наприклад, обмежувальний CMS), ви можете спробувати описані тут трюки, або вам може знадобитися піти на компроміс і використовувати плавці замість вбудованого блоку. Існують також некрасиві фокуси CSS, які слід використовувати лише в екстремальних обставинах, наприклад, font-size:0;на контейнері стовпців, а потім повторно застосувати розмір шрифту в кожному стовпці .

Наприклад:


Чи можливе вирішення питання про відсутність пробілів між ними, можливо, div+(whitespace) {display:none}чи щось таке?
NoBugs

1
Дивіться третій абзац після його першого пропозиції ... Особливо дивіться пов’язане запитання
user56reinstatemonica8

@NoBugs просто застосуйте розмір шрифту: 0; до елемента, що містить, просто слідкуйте за тим, щоб у вас не було визначених розмірів шрифту для елементів у вбудованих блоках !!
Джай

@Jai Саме так, а оскільки стилізація / перегляд має бути невід'ємною від процесу створення html / моделі, це погана практика. (Що робити, якщо ви користуєтесь послугою, яку вам дали <div class="inlinething">hi</div> <div class="inlinething">there</div> more content here... ?)
NoBugs

4

Якщо ви хочете divточно вирівняти піксель, використовуйте float. inline-blockЗдається, завжди вимагає відрізати кілька пікселів (принаймні в IE)


6
Так, це тому, що вам потрібно уникати пробілів між елементами, оскільки вбудовані блоки враховують пробіли так само, як і вбудовані елементи. Тримайте теги вбудованого блоку щільно один до одного і не виникайте проблем із пікселями.
Бен Сінклер

Також це може бути різниця у веб-переглядачах із прокладкою / запасом за замовчуванням на елементах. Ну, принаймні, у минулому я це робив, * {padding:0px; margin:0px; }оскільки це допомагає збалансувати кодування
Сердитий 84

Це причина, чому Bootstrap (можливо, інші) користується ним, а не вбудованим блоком?
NoBugs

1

Ви можете глибоко знайти відповідь тут .

Але загалом з floatвами потрібно бути обізнаним і дбати про навколишні елементи та inline-blockпростий спосіб вирівнювати елементи.

Дякую


1

Існує одна характеристика вбудованого блоку, який може бути не прямим вперед. Тобто, значення за замовчуванням для вертикального вирівнювання в CSS є базовим. Це може спричинити деяку несподівану поведінку вирівнювання. Подивіться на цю статтю.

http://www.brunildo.org/test/inline-block.html

Натомість, коли ви робите float: зліва, діви не залежать один від одного, і ви можете легко вирівняти їх за допомогою поля.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.