Почему 4 25% ширины встроенных блоков не могут оставаться на одной линии? [Дубликат]

Вы также можете использовать HTML5 replaceState, если хотите изменить URL-адрес, но не хотите добавлять запись в историю браузера:

  if (window.history.replaceState) {/  / запрещает браузеру сохранять историю с каждым изменением: window.history.replaceState (указано, название, URL);  }  

Это сломает функциональность кнопки «Назад». Это может потребоваться в некоторых случаях, например, в галерее изображений (где вы хотите, чтобы обратная кнопка возвращалась обратно на индексную страницу галереи, вместо того чтобы перемещаться по каждому просматриваемому изображению), предоставляя каждому изображению свой собственный уникальный URL-адрес.

239
задан Josh Crozier 2 September 2014 в 04:45
поделиться

6 ответов

В этом случае ваши div элементы были изменены с элементов уровня block на элементы inline. Типичной характеристикой элементов inline является то, что они соблюдают пробелы в разметке. Это объясняет, почему между элементами создается промежуток пробела пространства. (пример)

Существует несколько решений, которые могут быть использованы для решения этой проблемы.

Способ 1 - Удалить пробел из разметки

Пример 1 - Прокомментировать пробел: (пример)

<div>text</div><!--
--><div>text</div><!--
--><div>text</div><!--
--><div>text</div><!--
--><div>text</div>

Пример 2 - Удалить разрывы строк: (пример)

<div>text</div><div>text</div><div>text</div><div>text</div><div>text</div>

Пример 3 - Закройте часть тега на следующей строке (пример)

<div>text</div
><div>text</div
><div>text</div
><div>text</div
><div>text</div>

Пример 4 - Закройте весь тег на Следующая строка: (пример)

<div>text
</div><div>text
</div><div>text
</div><div>text
</div><div>text
</div>

Способ 2 - Сброс font-size

Так как пробелы между элементами inline определяются font-size, вы можете просто сбросить font-size на 0 и, таким образом, удалить пространство между элементами.

Просто установите font-size: 0 на родительские элементы, а затем объявите новый font-size для элементов детей. Это работает, как показано здесь (пример)

#parent {
    font-size: 0;
}

#child {
    font-size: 16px;
}

Этот метод работает очень хорошо, так как он не требует изменения разметки; однако, он не работает, если дочерний элемент font-size объявлен с помощью em единиц. Поэтому я рекомендую удалить пробелы из разметки или, альтернативно, , плавающие над элементами и, таким образом, избегая пространства, сгенерированного элементами inline.

Метод 3 - Установите родительский элемент в display: flex

В некоторых случаях вы также можете установить display родительского элемента на flex. (пример)

Это эффективно удаляет пробелы между элементами в поддерживаемых браузерами . Не забудьте добавить соответствующие префиксы поставщиков для дополнительной поддержки.

.parent {
    display: flex;
}
.parent > div {
    display: inline-block;
    padding: 1em;
    border: 2px solid #f00;
}

.parent {
    display: flex;
}
.parent > div {
    display: inline-block;
    padding: 1em;
    border: 2px solid #f00;
}
<div class="parent">
    <div>text</div>
    <div>text</div>
    <div>text</div>
    <div>text</div>
    <div>text</div>
</div>


Примечания сторон:

Неверно отрицательно использовать отрицательные поля, чтобы удалить пространство между элементами inline. Пожалуйста, не используйте отрицательные поля, если есть другие, более оптимальные решения.

484
ответ дан Josh Crozier 17 August 2018 в 10:41
поделиться
  • 1
    +1 для суммирования всех – Dipak Ingole 26 April 2014 в 04:38
  • 2
    Изменение размера шрифта до 0 на родительском мне работало. – Davis Hunt 12 October 2014 в 03:21
  • 3
    Поскольку никто не потрудился объяснить , почему это происходит ... Элементы inline (и inline-block) учитывают пробелы в разметке, поэтому то, что вы видите, по существу является символом пробела между словами " в разметке. Именно поэтому установка отрицательного word-spacing также может быть «исправлена». это, хотя отрицательные интервалы между словами и отрицательная маржа являются недопустимыми решениями, поскольку интервал зависит от вашего браузера и размера шрифта (как показывает последний пример Джоша), так что это будет первое, что сломается, если вы внесете какие-либо изменения. – colllin 20 October 2014 в 03:26
  • 4
    В тот момент, когда вы проводите 20-минутную отладку своего CSS, только для обнаружения Chrome увеличивается до 110%, и никогда не было никакого пробела. – Imperative 6 February 2015 в 23:12
  • 5
    Я бы сказал, что display: flex - лучшее решение в наши дни. – Alan Shortis 13 November 2015 в 15:14

inline-block автоматически разрешает белое пространство, как говорят все. Самое простое решение - просто добавить float: left; в контейнерную декларацию. Также вы не можете использовать два идентификатора на одной странице. Вместо этого используйте классы.

.container {
    display: inline-block;
    position: relative;
    background: rgb(255, 100, 0);
    margin: 0;
    width: 40%;
    height: 100px;
    float: left;
}
14
ответ дан bradcush 17 August 2018 в 10:41
поделиться
  • 1
    Хотя это работает (thakyou), это вызывает другие проблемы в макете моей страницы, что, вероятно, на данный момент слишком неопытен, чтобы решить – Legatro 26 September 2013 в 22:34
  • 2
    Из всех перечисленных решений это один из лучших, который я нашел. – Darwin Airola 24 August 2016 в 00:26

Использование inline-block позволяет использовать пробел в вашем HTML, обычно это эквивалентно .25em (или 4px).

Вы можете либо прокомментировать белое пространство, либо более общее решение, - установить родительский font-size в 0 и вернуть его обратно к требуемому размеру элементов встроенного блока.

31
ответ дан danjones_mcr 17 August 2018 в 10:41
поделиться
  • 1
    Спасибо, что это был пробел! Я понятия не имел, что это даже существовало ... – Legatro 26 September 2013 в 22:39
  • 2
    Это классное решение, о котором я никогда не думал, но, к сожалению, нарушает обычное наследование CSS шрифтов: / – colllin 20 October 2014 в 03:27
  • 3
    @colllin Да, это так ... но вы просто должны знать об этом. Inline-block и float имеют свои «gotchas» ... как вы их решаете, это вопрос выбора. Решение шрифта - один из вариантов, но не единственный. – Paulie_D 20 October 2014 в 10:24
  • 4
    конечно, но уменьшая то, что я «должен знать об этом». всегда хорошо, и поэтому защищает себя от случайного взлома чего-то через 6 месяцев. – colllin 20 October 2014 в 17:23
  • 5
    @Pauli_D Вы также можете добавлять комментарии между элементами, поскольку они удаляют пробелы не только в документе, но и на сайте. Это немного уродливо и боль в заднице, когда у вас есть тонны элементов. – Niklas Vest 25 December 2015 в 13:42

Вам нужно добавить

#container
{
    display:inline-block;
    position:relative;
    background:rgb(255,100,0);
    margin:0px;
    width:40%;
    height:100px;
    margin-right:-4px;
}

, потому что всякий раз, когда вы пишете display:inline-block, требуется дополнительный margin-right:4px. Итак, вам нужно удалить его.

0
ответ дан IKavanagh 17 August 2018 в 10:41
поделиться

просто добавьте границу: 2px solid #e60000; к вашему 2-му тегу div.

Определенно работает

#Div2Id {
    border: 2px solid #e60000; --> color is your preference
}
0
ответ дан J-Alex 17 August 2018 в 10:41
поделиться

Нашел решение, не связанное с Flex, потому что Flex не работает в старых браузерах. Пример:

.container {
    display:block;
    position:relative;
    height:150px;
    width:1024px;
    margin:0 auto;
    padding:0px;
    border:0px;
    background:#ececec;
    margin-bottom:10px;
    text-align:justify;
    box-sizing:border-box;
    white-space:nowrap;
    font-size:0pt;
    letter-spacing:-1em;
}

.cols {
    display:inline-block;
    position:relative;
    width:32%;
    height:100%;
    margin:0 auto;
    margin-right:2%;
    border:0px;
    background:lightgreen;  
    box-sizing:border-box;
    padding:10px;
    font-size:10pt;
    letter-spacing:normal;
}

.cols:last-child {
    margin-right:0;
}
1
ответ дан Larry 17 August 2018 в 10:41
поделиться