Два вбудовані блокові елементи, кожен із шириною 50%, не поміщаються поруч в один ряд


87
<!DOCTYPE html>
<html>
<head>
<title>Width issue</title>
<style type="text/css">
body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
}
</style>
</head>
<body>
    <div id="left">Left</div>
    <div id="right">Right</div>
</body>
</html>

JSFiddle: http://jsfiddle.net/5EcPK/

Наведений вище код намагається розмістити #left div і #right div, поруч, в одному рядку. Але, як ви можете бачити у наведеній вище URL-адресі JSFiddle, це не так.

Я можу вирішити проблему, зменшивши ширину одного з div до 49%. Див. Http://jsfiddle.net/mUKSC/ . Але це не є ідеальним рішенням, оскільки між двома розділами з'являється невеликий проміжок.

Інший спосіб вирішити проблему - це плаваючи обидва div. Див. Http://jsfiddle.net/VptQm/ . Це чудово працює.

Але моє початкове питання залишається. Чому, коли обидва div-елементи зберігаються як елементи вбудованого блоку, вони не підходять один до одного?

Відповіді:


139

При використанні inline-blockелементів завжди виникатиме whitespace проблема між цими елементами (цей простір становить приблизно ~ 4 пікселі).

Отже, ваші два divs, у яких обидва мають ширину 50%, плюс це whitespace(~ 4px) більше 100% в ширину, і тому він ламається. Приклад вашої проблеми:


Є кілька способів виправити це:

1. Немає простору між цими елементами

2. Використання HTML-коментарів

3. Встановіть для батьків font-sizeзначення 0, а потім додайте деяке значення inline-blockелементам

4. Використання від’ємного запасу між ними ( не переважно )

5. Падіння кута закриття

6. Пропуск певних закриваючих тегів HTML (спасибі @thirtydot за посилання )


Список літератури:

  1. Боротьба з простором між вбудованими блочними елементами на CSS Tricks
  2. Видаліть пробіл між елементами вбудованого блоку Девіда Уолша
  3. Як прибрати пробіл між елементами вбудованого блоку?

Як @ MarcosPérezGude сказав , то кращий спосіб полягає у використанні rem, а також додати значення по замовчуванням деякі font-sizeна htmlмітці (наприклад , в HTML5Boilerplate ). Приклад:

html{
    font-size: 1em;
}

.ib-parent{             /* ib -> inline-block */
    font-size: 0;
}

.ib-child{
    display: inline-block;
    font-size: 1rem;
}

Оновлення : оскільки вже майже 2018 рік, використовуйте flexbox або навіть краще - макет сітки CSS .


3
@hoosierEE це не нонсенс. Простір між елементами чудовий, адже елементи вбудованого блоку позиціонують у текстовому рядку. Якщо ви поставите пробіл у рядку, він буде пробілом. Отже, поведінка правильна, навіть якщо ви вважаєте, що це проблема (як Vucko називає це неправильно).
Маркос Перес Гуде

2
Я погоджуюсь з @ MarcosPérezGude, така поведінка є правильною. Як ви можете бачити з мого допису, існує кілька способів видалити цей пробіл (я сам використовую HTML-коментарі для видалення пробілів). Але якщо ви пам'ятаєте , що білий простір, ви завжди можете використовувати flexbox, table/table-row/table-cellабо використання float.
Вучко

2
Я відмінно використовую вбудовані блоки. Мій нормальний підхід - це parent { font-size:0; } child {font-size: 1rem; }. З ремами зараз найпростіше
Маркос Перес Гуде

трохи дратує те, що вкладки все ще аналізуються як пробіли. я ніколи раніше не бачив, що скидання виправлення закриваючого тегу чи має це нестабільність чи побічні ефекти?
MintWelsh

Також переконайтеся, що borderвимкнено. Це може додати простір, якщо ви плаваєте у div.
еволюс

22

хороша відповідь у css3:

white-space: nowrap;

у батьківському вузлі та:

white-space: normal;
vertical-align: top;

в div (або інший) на 50%

приклад: http://jsfiddle.net/YpTMh/19/

РЕДАГУВАТИ:

є інший спосіб:

font-size: 0;

для батьківського вузла та перевизначити його у дочірньому вузлі


7

Це тому, що пробіл між двома div-файлами інтерпретується як пробіл. Якщо ви поставите свої <div>теги в один ряд, як показано нижче, проблема виправлена :

<div id="left"></div><div id="right"></div>


4

Або змусьте їх блокувати замість вбудованого блоку. Це призведе до того, що divs ігнорує пробіли між ними.

display:block;

або видалити пробіл між тегами

<div id='left'></div><div id='right'></div>

або додати

margin: -1en;

до одного з div, щоб зменшити простір, зайнятий одержуваним одиничним пробілом.


2

Будь ласка, перевірте код нижче:

body {
    margin: 0;
}
#left {
    width: 50%;
    background: lightblue;
    display: inline-block;
    float:left;
}
#right {
    width: 50%;
    background: orange;
    display: inline-block;
    float:left;
}
<div id="left">Left</div>
<div id="right">Right</div>



1

Це можна зробити, додавши css display: inline до div, який містить вбудовані елементи.

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

Тож було б безпечніше використовувати display: inline;


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