Учитывая этот HTML и CSS:
span {
display:inline-block;
width:100px;
background-color:palevioletred;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
Учитывая этот HTML и CSS:
span {
display:inline-block;
width:100px;
background-color:palevioletred;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
Поскольку этот ответ стал довольно популярным, я переписываю его значительно.
Позвольте не забывать фактический вопрос, который был задан:
Как убрать пробел между элементами inline-block? Я надеялся на решение CSS, которое не требует подделки исходного кода HTML. Можно ли решить эту проблему с помощью только CSS?
Эту проблему можно решить только с помощью CSS, но нет полностью надежных исправлений CSS.
Решение, которое я имел в своем первоначальном ответе, состояло в том, чтобы добавить font-size: 0
к родительскому элементу, а затем объявить разумный font-size
для дочерних элементов.
http://jsfiddle.net/thirtydot/dGHFV/1361/
Это работает в последних версиях всех современных браузеров. Это работает в IE8. Он не работает в Safari 5, но работает в Safari 6. Safari 5 - практически мертвый браузер (0,33%, август 2015 г.).
Большинство возможных проблем с относительными размерами шрифтов не сложно исправить.
Тем не менее, хотя это разумное решение, если вам конкретно требуется только CSS-исправление, это не то, что я рекомендую, если вы свободны изменять свой HTML (как большинство из нас).
Вот что я, как опытный веб-разработчик, на самом деле делаю, чтобы решить эту проблему:
<p>
<span>Foo</span><span>Bar</span>
</p>
Да, это правильно. Я удаляю пробел в HTML между элементами inline-block.
Это легко. Это просто. Это работает везде. Это прагматичное решение.
Иногда вам нужно тщательно продумать, откуда появятся пробелы. Будет ли добавление другого элемента с помощью JavaScript добавлять пробелы? Нет, если вы делаете это правильно.
Давайте отправимся в волшебное путешествие по различным способам удаления пробелов с новым HTML:
<ul>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
Вы можете сделать это, как я обычно делаю:
<ul>
<li>Item 1</li><li>Item 2</li><li>Item 3</li>
</ul>
Или это:
<ul>
<li>Item 1</li
><li>Item 2</li
><li>Item 3</li>
</ul>
Или используйте комментарии:
<ul>
<li>Item 1</li><!--
--><li>Item 2</li><!--
--><li>Item 3</li>
</ul>
Или, если вы используете PHP или подобное:
<ul>
<li>Item 1</li><?
?><li>Item 2</li><?
?><li>Item 3</li>
</ul>
Или, вы можете даже полностью пропустить некоторые закрывающие теги (все браузеры хорошо с этим):
<ul>
<li>Item 1
<li>Item 2
<li>Item 3
</ul>
Теперь, когда я ушел и утомил вас до смерти "тысячей различных способов удаления пробелов с помощью тридцати точек", надеюсь, вы забыли все о font-size: 0
.
Кроме того, теперь вы можете использовать flexbox для получения многих макетов, для которых вы, возможно, ранее использовали встроенный блок: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
Для CSS3-совместимых браузеров есть white-space-collapsing:discard
см. http://www.w3.org/TR/2010/WD-css3-text-20101005/#white-space-collapsing
Хорошо, хотя я проголосовал за оба font-size: 0;
и not implemented CSS3 feature
отвечает, после попытки я обнаружил, что ни один из них не является реальным решением.
На самом деле, нет даже одного обходного пути без сильных побочных эффектов.
Затем я решил удалить пробелы (это ответы об этом аргументе) между inline-block
элементами inline-block
из моего HTML
источника (JSP
), превратив это:
<div class="inlineBlock">
I'm an inline-block div
</div>
<div class="inlineBlock">
I'm an inline-block div
</div>
к этому
<div class="inlineBlock">
I'm an inline-block div
</div><div class="inlineBlock">
I'm an inline-block div
</div>
это уродливо, но работает.
Но, подождите минутку... что если я создаю свои Taglibs loops
внутри Taglibs loops
Struts2
(Struts2
, JSTL
и т.д.)?
Например:
<s:iterator begin="0" end="6" status="ctrDay">
<br/>
<s:iterator begin="0" end="23" status="ctrHour">
<s:push value="%{days[#ctrDay.index].hours[#ctrHour.index]}">
<div class="inlineBlock>
I'm an inline-block div in a matrix
(Do something here with the pushed object...)
</div>
</s:push>
</s:iterator>
</s:iterator>
Абсолютно не мыслим, чтобы встроить все эти вещи, это будет означать,
<s:iterator begin="0" end="6" status="ctrDay">
<br/>
<s:iterator begin="0" end="23" status="ctrHour"><s:push value="%{days[#ctrDay.index].hours[#ctrHour.index]}"><div class="inlineBlock>
I'm an inline-block div in a matrix
(Do something here with the pushed object...)
</div></s:push></s:iterator>
</s:iterator>
это не читается, трудно поддерживать и понимать, и т.д...
Решение, которое я нашел:
используйте комментарии HTML, чтобы соединить конец одного div с началом следующего!
<s:iterator begin="0" end="6" status="ctrDay">
<br/>
<s:iterator begin="0" end="23" status="ctrHour"><!--
--><s:push value="%{days[#ctrDay.index].hours[#ctrHour.index]}"><!--
--><div class="inlineBlock>
I'm an inline-block div in a matrix
(Do something here with the pushed object...)
</div><!--
--></s:push><!--
--></s:iterator>
</s:iterator>
Таким образом, вы получите читаемый и правильно с отступом код.
И, как положительный побочный эффект, HTML source
, хотя и заполненный пустыми комментариями, будет иметь правильный отступ;
давайте возьмем первый пример. По моему скромному мнению, это:
<div class="inlineBlock">
I'm an inline-block div
</div><!--
--><div class="inlineBlock">
I'm an inline-block div
</div>
лучше чем это:
<div class="inlineBlock">
I'm an inline-block div
</div><div class="inlineBlock">
I'm an inline-block div
</div>
Добавьте комментарии между элементами, чтобы НЕ иметь пробел. Для меня это проще, чем сбросить размер шрифта до нуля и затем установить его обратно.
<div>
Element 1
</div><!--
--><div>
Element 2
</div>
Все методы устранения пробелов для display:inline-block
- неприятные хаки...
Использовать Flexbox
Это потрясающе, решает все эти встроенные макеты bs, и с 2017 года 98% поддержка браузера (больше, если вы не уход за старыми IE).
Это тот же ответ, который я дал по поводу связанного: Дисплей: встроенный блок - что это за пространство?
На самом деле это действительно простой способ удалить пробелы из встроенного блока, который является простым и семантическим. Его называют пользовательским шрифтом с пробелами нулевой ширины, который позволяет вам сбрасывать пробелы (добавленные браузером для встроенных элементов, когда они находятся на отдельных линиях) на уровне шрифта, используя очень маленький шрифт. После того, как вы объявите шрифт, вы просто измените font-family
на контейнере и снова на детей, и вуаля. Вот так:
@font-face{
font-family: 'NoSpace';
src: url('../Fonts/zerowidthspaces.eot');
src: url('../Fonts/zerowidthspaces.eot?#iefix') format('embedded-opentype'),
url('../Fonts/zerowidthspaces.woff') format('woff'),
url('../Fonts/zerowidthspaces.ttf') format('truetype'),
url('../Fonts/zerowidthspaces.svg#NoSpace') format('svg');
}
body {
font-face: 'OpenSans', sans-serif;
}
.inline-container {
font-face: 'NoSpace';
}
.inline-container > * {
display: inline-block;
font-face: 'OpenSans', sans-serif;
}
Костюм по вкусу. Heres скачать шрифт, который я только что приготовил в кузнечной кузнице, и преобразован с помощью генератора веб-шрифтов FontSquirrel. Принял меня все 5 минут. Объявление css @font-face
включено: зашифрованный пробел ширины пробела. Это на Google Диске, поэтому вам нужно нажать "Файл" > "Загрузить", чтобы сохранить его на своем компьютере. Вероятно, вам также придется изменить пути шрифтов, если вы скопируете объявление в основной файл css.
Добавить display: flex;
к родительскому элементу. Вот решение с префиксом:
p {
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
}
span {
float: left;
display: inline-block;
width: 100px;
background: blue;
font-size: 30px;
color: white;
text-align: center;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
Еще две опции, основанные на текстовом модуле CSS уровня 3 (вместо white-space-collapsing:discard
который был удален из черновика спецификации):
word-spacing: -100%;
Теоретически, он должен делать именно то, что нужно - сокращать пробелы между "словами" на 100% ширины символа пробела, то есть до нуля. Но, похоже, нигде не работает, к сожалению, и эта функция помечена как "подверженная риску" (ее также можно исключить из спецификации).
word-spacing: -1ch;
Сокращает пробелы между словами на ширину цифры "0". В моноширинном шрифте он должен быть точно равен ширине символа пробела (и любого другого символа). Это работает в Firefox 10+, Chrome 27+ и почти работает в Internet Explorer 9+.
К сожалению, это 2019 год, и white-space-collapse
все еще не реализован.
А пока задайте родительский элемент font-size: 0;
и установите font-size
на детей. Это должно сделать свое дело
Используйте flexbox и сделайте резервную копию (из приведенных выше предложений) для старых браузеров:
ul {
display: -webkit-box;
display: -moz-box;
display: -ms-flexbox;
display: -webkit-flex;
display: flex;
}
Просто:
item {
display: inline-block;
margin-right: -0.25em;
}
Нет необходимости прикасаться к родительскому элементу.
Единственное условие здесь: элемент font-size не должен быть определен (должен быть равен родительскому font-size).
0.25em
- это word-spacing
0.25em
по умолчанию
Размер шрифта: 0; может быть немного сложнее управлять...
Я думаю, что следующие пары строк намного лучше и более пригодны для повторного использования, а также для экономии времени, чем любые другие методы. Я лично использую это:
.inline-block-wrapper>.inline-block-wrapper,
.inline-block-wrapper{letter-spacing: -4px;}
.inline-block-wrapper>*{letter-spacing: 0;display: inline-block;}
/* OR better shorter name...*/
.items>.items,
.items{letter-spacing: -4px;}
.items>*{letter-spacing: 0;display: inline-block;}
Затем вы можете использовать его как следующий...
<ul class="items">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
Насколько я знаю (я могу ошибаться), но все браузеры поддерживают этот метод.
ОБЪЯСНЕНИЕ
Это работает (возможно, -3px может быть лучше) точно так же, как вы ожидали, что он будет работать.
class="items"
для родителя каждого встроенного блока.Вам не нужно возвращаться к css и добавлять другое правило css для ваших новых встроенных блоков.
Решение сразу двух проблем.
Также обратите внимание на >
(больше знака), это означает, что */все дети должны быть встроенным блоком.
ПРИМЕЧАНИЕ. Я изменил, чтобы учесть наследование расстояния между буквами, когда оболочка имеет дочернюю оболочку.
Хотя технически это не ответ на вопрос: "Как убрать пробел между элементами inline-block?"
Вы можете попробовать решение flexbox и применить приведенный ниже код, и место будет удалено.
p {
display: flex;
flex-direction: row;
}
Вы можете узнать больше об этом по этой ссылке: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
У меня была эта проблема прямо сейчас, и из font-size:0;
я обнаружил, что в Internet Explorer 7 проблема остается, потому что Internet Explorer считает, что размер шрифта 0?!?! WTF - это вы, сумасшедший? - Итак, в моем случае у меня есть Eric Meyer CSS reset и с font-size:0.01em;
У меня есть разница в 1 пиксель от Internet Explorer 7 до Firefox 9, поэтому я думаю, что это может быть решением.
Обычно мы используем такие элементы в разных строках, но в случае display:inline-block
с использованием тегов в одной строке удаляется пробел, но в другой строке это не будет.
Пример с тегами в другой строке:
p span {
display: inline-block;
background: red;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
Я не совсем уверен, если вы хотите сделать два синих пролета без пробелов или хотите обрабатывать другие пробелы, но если вы хотите удалить пробел:
span {
display: inline-block;
width: 100px;
background: blue;
font-size: 30px;
color: white;
text-align: center;
float: left;
}
И сделано.
Я недавно занимался этим вопросом и вместо того, чтобы устанавливать родительский font-size:0
затем вернув ребенку разумное значение, Ive получал согласованные результаты, устанавливая letter-spacing:-.25em
родительского контейнера letter-spacing:-.25em
затем ребенок возвращается к letter-spacing:normal
.
В альтернативном потоке я заметил, что комментатор упоминает, что font-size:0
не всегда идеален, потому что люди могут контролировать минимальные размеры шрифтов в своих браузерах, полностью отрицая возможность установки размера шрифта на ноль.
Использование ems, похоже, работает независимо от того, указан ли размер шрифта 100%, 15pt или 36px.
p {
display: flex;
}
span {
float: left;
display: inline-block;
width: 100px;
background: red;
font-size: 30px;
color: white;
}
<p>
<span> hello </span>
<span> world </span>
</p>
Я думаю, что для этого есть очень простой/старый метод, который поддерживается всеми браузерами даже IE 6/7. Мы могли бы просто установить letter-spacing
на большое отрицательное значение в родительском, а затем вернуть его к normal
в дочерние элементы:
body { font-size: 24px }
span { border: 1px solid #b0b0c0; } /* show borders to see spacing */
.no-spacing { letter-spacing: -1em; } /* could be a large negative value */
.no-spacing > * { letter-spacing: normal; } /* => back to normal spacing */
<p style="color:red">Wrong (default spacing):</p>
<div class="">
<span>Item-1</span>
<span>Item-2</span>
<span>Item-3</span>
</div>
<hr/>
<p style="color:green">Correct (no-spacing):</p>
<div class="no-spacing">
<span>Item-1</span>
<span>Item-2</span>
<span>Item-3</span>
</div>
Самый простой ответ на этот вопрос - добавить.
CSS
float: left;
codepen ссылка: http://jsfiddle.net/dGHFV/3560/
С помощью скобок PHP:
ul li {
display: inline-block;
}
<ul>
<li>
<div>first</div>
</li><?
?><li>
<div>first</div>
</li><?
?><li>
<div>first</div>
</li>
</ul>
Я собираюсь развернуть на user5609829 немного, поскольку считаю, что другие решения здесь слишком сложны/слишком много работают. Применение margin-right: -4px
к встроенным блочным элементам приведет к удалению интервала и будет поддерживаться всеми браузерами. См. Обновленный скрипт здесь. Для тех, кто занимается использованием отрицательных полей, попробуйте дать this читать.
Добавить white-space: nowrap
в элемент контейнера:
CSS
* {
box-sizing: border-box;
}
.row {
vertical-align: top;
white-space: nowrap;
}
.column{
float: left;
display: inline-block;
width: 50% // Or whatever in your case
}
HTML:
<div class="row">
<div class="column"> Some stuff</div>
<div class="column">Some other stuff</div>
</div>
Вот Plunker.
Спецификация текстового модуля CSS 4 уровня определяет свойство text-space-collapse
, которое позволяет управлять тем, как белое пространство внутри и вокруг элемента обрабатывается.
Итак, в отношении вашего примера вам просто нужно написать следующее:
p {
text-space-collapse: discard;
}
К сожалению, ни один браузер не реализует это свойство еще (по состоянию на сентябрь 2016 года), как упоминалось в комментариях к ответу HBP.
Существует множество решений, таких как font-size:0
, word-spacing
, margin-left
, letter-spacing
и т.д.
Обычно я предпочитаю использовать letter-spacing
потому что
-1em
).word-spacing
и margin-left
когда мы установим большее значение, например -1em
.font-size
не удобно, когда мы пытаемся использовать em
качестве единицы font-size
. Таким образом, letter-spacing
кажется лучшим выбором.
Однако я должен предупредить вас
когда вы используете letter-spacing
вам лучше использовать -0.3em
или -0.31em
не другие.
* {
margin: 0;
padding: 0;
}
a {
text-decoration: none;
color: inherit;
cursor: auto;
}
.nav {
width: 260px;
height: 100px;
background-color: pink;
color: white;
font-size: 20px;
letter-spacing: -1em;
}
.nav__text {
width: 90px;
height: 40px;
box-sizing: border-box;
border: 1px solid black;
line-height: 40px;
background-color: yellowgreen;
text-align: center;
display: inline-block;
letter-spacing: normal;
}
<nav class="nav">
<span class="nav__text">nav1</span>
<span class="nav__text">nav2</span>
<span class="nav__text">nav3</span>
</nav>
Добавить letter-spacing:-4px;
на родительском p
css и добавить letter-spacing:0px;
к вашему span
css.
span {
display:inline-block;
width:100px;
background-color:palevioletred;
vertical-align:bottom;
letter-spacing:0px;
}
p {
letter-spacing:-4px;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
Я подумал, что добавлю что-то новое к этому вопросу, поскольку многие из представленных в настоящее время ответов более чем адекватны. В связи с этим появились некоторые новые свойства CSS, которые могут обеспечить очень чистый вывод, с полной поддержкой во всех браузерах и практически без "хаков". Это отходит от inline-block
, но дает те же результаты, что и заданный вопрос.
Эти свойства CSS grid
CSS Grid высоко поддерживается (CanIUse), кроме IE, для работы которого требуется только префикс -ms-
.
CSS Grid также очень гибок и берет все хорошие части из элементов table
, flex
и inline-block
и объединяет их в одном месте.
При создании grid
вы можете указать промежутки между строками и столбцами. Разрыв по умолчанию уже установлен на 0px
, но вы можете изменить это значение на любое другое.
Если коротко, вот соответствующий рабочий пример:
body {
background: lightblue;
font-family: sans-serif;
}
.container {
display: grid;
grid-template-columns: 100px 100px;
grid-column-gap: 0; /* Not needed but useful for example */
grid-row-gap: 0; /* Not needed but useful for example */
}
.box {
background: red;
}
.box:nth-child(even) {
background: green;
}
<div class="container">
<div class="box">
Hello
</div>
<div class="box">
Test
</div>
</div>
Я нашел чистое решение CSS, которое очень хорошо работало для меня во всех браузерах:
span {
display: table-cell;
}
Другим способом, который я нашел, является применение margin-left как отрицательных значений, кроме первого элемента строки.
span {
display:inline-block;
width:100px;
background:blue;
font-size:30px;
color:white;
text-align:center;
margin-left:-5px;
}
span:first-child{
margin:0px;
}
Я опробовал решение font-size: 0
для аналогичной проблемы в React и Sass для проекта Free Code Camp. Я сейчас работая через.
И он работает!
Сначала script:
var ActionBox = React.createClass({
render: function() {
return(
<div id="actionBox">
</div>
);
},
});
var ApplicationGrid = React.createClass({
render: function() {
var row = [];
for(var j=0; j<30; j++){
for(var i=0; i<30; i++){
row.push(<ActionBox />);
}
}
return(
<div id="applicationGrid">
{row}
</div>
);
},
});
var ButtonsAndGrid = React.createClass({
render: function() {
return(
<div>
<div id="buttonsDiv">
</div>
<ApplicationGrid />
</div>
);
},
});
var MyApp = React.createClass({
render: function() {
return(
<div id="mainDiv">
<h1> Game of Life! </h1>
<ButtonsAndGrid />
</div>
);
},
});
ReactDOM.render(
<MyApp />,
document.getElementById('GoL')
);
Затем, Sass:
html, body
height: 100%
body
height: 100%
margin: 0
padding: 0
#mainDiv
width: 80%
height: 60%
margin: auto
padding-top: 5px
padding-bottom: 5px
background-color: DeepSkyBlue
text-align: center
border: 2px solid #381F0B
border-radius: 4px
margin-top: 20px
#buttonsDiv
width: 80%
height: 60%
margin: auto
margin-bottom: 0px
padding-top: 5px
padding-bottom: 0px
background-color: grey
text-align: center
border: 2px solid #381F0B
border-radius: 4px
margin-top: 20px
#applicationGrid
width: 65%
height: 50%
padding-top: 0px
margin: auto
font-size: 0
margin-top: 0px
padding-bottom: 5px
background-color: white
text-align: center
border: 2px solid #381F0B
border-radius: 4px
margin-top: 20px
#actionBox
width: 20px
height: 20PX
padding-top: 0px
display: inline-block
margin-top: 0px
padding-bottom: 0px
background-color: lightgrey
text-align: center
border: 2px solid grey
margin-bottom: 0px