Нежелательное поле в элементах списка встроенных блоков [дубликат]
этот вопрос уже есть ответ здесь:
у меня есть следующий HTML-код:
<ul>
<li>
<div>first</div>
</li>
<li>
<div>first</div>
</li>
<li>
<div>first</div>
</li>
<li>
<div>first</div>
</li>
</ul>
и следующие правила css:
ul {
padding: 0;
border: solid 1px #000;
}
li {
display:inline-block;
padding: 10px;
width: 114px;
border: solid 1px #f00;
margin: 0;
}
li div {
background-color: #000;
width: 114px;
height: 114px;
color: #fff;
font-size: 18px;
}
по какой-то странной причине элементы списка отображаются с полями вокруг них в обоих Firefox и хром. Глядя на firebug, элементы списка вообще не имеют никакого поля, но между ними, похоже, есть пустое пространство.
Если я позже добавлю больше элементов списка через javascript с помощью
$('<li><div>added via js</div></li>').appendTo($('ul'));
"поле" не появляется вокруг новых элементов:
есть идеи, что, черт возьми, здесь происходит?
10 ответов:
это вызвано
display: inline-block;
li { display: inline-block; padding: 10px; width: 114px; border: solid 1px #f00; margin: 0; }
изменить на
float: left;
.Я думал, что это была обивка, но присмотрелся и оказалось, что это был дисплей:)
после дальнейшие исследования я обнаружил, что
inline-block
является методом, зависящим от пробела, и отображает поле размером 4px справа от каждого элемента.чтобы избежать этого, вы можете запустить все ваши
li
s вместе в одной строке, или блокировать конечные теги и начать теги вместе, как это:<ul> <li> <div>first</div> </li><li> <div>first</div> </li><li> <div>first</div> </li><li> <div>first</div> </li> </ul>
надеюсь, что это поможет:)
Я нашел очень хороший трюк, чтобы преодолеть этот же вопрос. У моих элементов списка в моем верхнем меню были поля пробелов между каждым после того, как я отбросил "float:left;" в пользу "display:inline-block;".
попробуйте установить размер шрифта для неупорядоченного списка в "0", т. е.:
ul { font-size:0; } li { font-size:18px; }
работал для меня.
увидев этот пост и ответы, я подумал, что объясню, что здесь происходит. Это не ошибка, но на самом деле предполагаемое поведение инлайн-блок.
лучший способ проиллюстрировать, почему это правильное поведение-это смайлики в абзаце:
<p> Hi, really glad to hear from you yesterday <img src="annoying_smiley.gif"/><img src="annoying_smiley.gif"/>. </p>
изображения по умолчанию отображаются как встроенный блок (т. е. элемент блока, который подчиняется встроенному потоку - так же, как один символ текста). В этом случае вы бы хотели, чтобы два смайлика встаньте рядом друг с другом, но вы все равно хотите пространство между "вчера" и первым смайликом.
надеюсь, это объясняет это, а также объясняет, почему встроенный блок занял так много времени, чтобы быть полностью поддержанным; на самом деле не так много вариантов использования для его использования по назначению.
чтобы ответить на ваш вопрос, лучше всего было бы сделать это:
ul { height: some set height /* OR */ overflow-y: auto; } ul li { float: left; }
на мой взгляд и в этом случае лучше всего сделать, это удалить письмо интервал
li
родитель и повторно поставить его наli
!Итак, ваше правило CSS:
ul{ padding: 0; border: solid 1px #000; letter-spacing :-4px; /*Remove the letter spacing*/ } li{ display:inline-block; padding: 10px; width: 114px; border: solid 1px #f00; margin: 0; letter-spacing :0px; /*Put back the letter spacing*/ }
удалить все
</li>
теги. Я не знаю почему, но это решает вашу проблему маржи.<ul> <li> <div>first</div> <li> <div>first</div> <li> <div>first</div> <li> <div>first</div> </ul>
Я только что узнал причину, почему это происходит. Похоже, что при использовании inline-block любые пробелы внутри элемента отображаются.
вместо того, чтобы писать
<li> <div>first</div> </li> <li> <div>first</div> </li>
Я должен написать:
<li> <div>first</div> </li><li><div>first</div> </li><li>....
не оставляя пробелов между li и закрывающим тегом. Причина, по которой это пространство не появлялось при добавлении через js, заключается в том, что метод appendTo имеет все теги без каких-либо пробелов между ними. Да, это отстой, но это единственный решение, если я не хочу использовать float:left.
решение здесь
изменение
display: inline-block
todisplay: table-cell
также удаляет пространство.li { display: table-cell; padding: 10px; width: 114px; border: solid 1px #f00; margin: 0; }
Я нашел ответ на этот вопрос здесь: http://robertnyman.com/2010/02/24/css-display-inline-block-why-it-rocks-and-why-it-sucks/
Он говорит:
"...есть один гигантский недостаток [для встроенного блока]. То есть, поскольку элементы становятся встроенными, пробелы в вашем HTML-коде будут влиять на рендеринг. Это означает, что если у нас есть пространство между элементами LI в нашем коде, он будет отображать 4 пикселя справа от каждого элемент."
таким образом, решение состоит в том, чтобы удалить разрывы строк между
inline-block
элементы.<ul> <li><a href="#">Make</a></li> <li><a href="#">Love</a></li> <li><a href="#">Not</a></li> <li><a href="#">War</a></li> </ul>
становится...
<ul> <li> <a href="#">Make</a> </li><li> <a href="#">Love</a> </li><li> <a href="#">Not</a> </li><li> <a href="#">War</a> </li> </ul>
и надоедливые поля исчезают.
попробуйте это решение:
<ul><!-- --><li><div>first</div></li><!-- --><li><div>first</div></li><!-- --><li><div>first</div></li><!-- --><li><div>first</div></li><!-- --></ul>
попробуйте изменить "дисплей: встроенный блок" на "float: left". Тогда разделение, которое вы видите, исчезает. Вот jsFiddle для вас, чтобы играть с:
http://jsfiddle.net/rcravens/XD9SD/
Боб