Учитывая этот HTML и CSS:
span {
display:inline-block;
width:100px;
background-color:palevioletred;
}
<p>
<span> Foo </span>
<span> Bar </span>
</p>
В результате между элементами SPAN будет пространство шириной 4 пикселя.
Демо: http://jsfiddle.net/dGHFV/
Я понимаю, почему это происходит, и я также знаю, что я мог бы избавиться от этого пространства, удалив пустое пространство между элементами SPAN в исходном коде HTML, например, так:
<p>
<span> Foo </span><span> Bar </span>
</p>
Однако я надеялся на CSS-решение, которое не требует подделки исходного кода HTML.
Я знаю, как решить эту проблему с помощью JavaScript - удалив текстовые узлы из элемента контейнера (абзаца), вот так:
// jQuery
$('p').contents().filter(function() { return this.nodeType === 3; }).remove();
Демо: http://jsfiddle.net/dGHFV/1/
Но можно ли решить эту проблему с помощью только 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 (как большинство из нас).
Вот что я, как опытный веб-разработчик, на самом деле делаю, чтобы решить эту проблему:
Да все верно. Я удаляю пробел в HTML между элементами inline-block.
Это просто. Это просто. Это работает везде. Это прагматичное решение.
Иногда вам нужно тщательно продумать, откуда появятся пробелы. Будет ли добавление другого элемента с помощью JavaScript добавлять пробелы? Нет, если вы делаете это правильно.
Давайте отправимся в волшебное путешествие по различным способам удаления пробелов с новым HTML:
Вы можете сделать это, как я обычно делаю:
http://jsfiddle.net/thirtydot/dGHFV/1362/
Или это:
Или используйте комментарии:
Или, если вы используете PHP или подобное:
Или, вы можете даже полностью пропустить некоторые закрывающие теги (все браузеры хорошо с этим):
Теперь, когда я ушел и утомил вас до смерти "тысячей различных способов удаления пробелов с помощью тридцати точек", надеюсь, вы забыли все о
font-size: 0
.Кроме того, теперь вы можете использовать flexbox для достижения многих макетов, для которых вы, возможно, ранее использовали встроенный блок: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
источник
:(
font-size:0
трюк не очень хорошая идея в конце концов ...Для браузеров, соответствующих CSS3, есть
white-space-collapsing:discard
см .: http://www.w3.org/TR/2010/WD-css3-text-20101005/#white-space-collapsing
источник
trim-inner
а неdiscard
?text-space-collapse
:
discard
<p>A long text...</p>
которого открывающие и закрывающие теги находятся на отдельных строках, чем текстовое содержимое. Это то, что я делаю все время, чтобы мои HTML-файлы были аккуратными и читаемыми.float
РЕДАКТИРОВАТЬ:
сегодня мы должны просто использовать Flexbox .
СТАРЫЙ ОТВЕТ:
Хорошо, хотя я проголосовал и за,
font-size: 0;
и заnot implemented CSS3 feature
ответы, после попытки я обнаружил, что ни один из них не является реальным решением .На самом деле, нет даже одного обходного пути без сильных побочных эффектов.
Затем я решил удалить пробелы (это ответы об этом аргументе) между
inline-block
div-ами из моегоHTML
источника (JSP
), превратив это:к этому
это уродливо, но работает.
Но, подожди минутку ... что, если я создаю свои div внутри
Taglibs loops
(Struts2
,JSTL
и т.д ...)?Например:
Абсолютно не мыслим, чтобы встроить все эти вещи, это будет означать,
это не читается, трудно поддерживать и понимать, и т.д ...
Решение, которое я нашел:
Таким образом, вы получите читаемый и правильно с отступом код.
И, как положительный побочный эффект, результат
HTML source
, хотя и наполненный пустыми комментариями, будет иметь правильный отступ;давайте возьмем первый пример. По моему скромному мнению, это:
лучше чем это:
источник
Добавьте комментарии между элементами, чтобы НЕ иметь пробел. Для меня это проще, чем сбросить размер шрифта на ноль и затем установить его обратно.
источник
Все методы уничтожения космоса для
display:inline-block
неприятных хаков ...Используйте Flexbox
Это потрясающе, решает все эти встроенные блочные макеты, и с 2017 года браузер поддерживает 98% (больше, если вы не заботитесь о старых IE).
источник
Добавьте
display: flex;
к родительскому элементу. Вот решение с префиксом:Упрощенная версия 👇
Исправить с префиксом 👇
источник
Это тот же ответ, который я дал в отношении: Дисплей: Встроенный блок - Что это за пространство?
На самом деле существует действительно простой способ удаления пробелов из встроенного блока, который является простым и семантическим. Он называется нестандартным шрифтом с пробелами нулевой ширины, который позволяет свернуть пробел (добавленный браузером для встроенных элементов, когда они находятся на отдельных строках) на уровне шрифта с использованием очень маленького шрифта. После того, как вы объявите шрифт, вы просто меняете
font-family
контейнер и снова возвращаетесь к потомкам, и вуаля. Нравится:Костюм по вкусу. Вот загрузка шрифта, который я только что приготовил в font-forge и конвертировал с помощью генератора веб-шрифтов FontSquirrel. У меня ушло всего 5 минут. Включено
@font-face
объявление css : заархивированный шрифт пробела нулевой ширины . Он находится на Google Диске, поэтому вам нужно нажать «Файл»> «Загрузить», чтобы сохранить его на своем компьютере. Возможно, вам также потребуется изменить пути к шрифту, если вы скопируете объявление в ваш основной файл CSS.источник
flex-wrap
по крайней мере, до v28 ( srsly? ), Но до тех пор это был идеальный запасной вариант.Еще две опции, основанные на текстовом модуле CSS уровня 3 (вместо того,
white-space-collapsing:discard
который был исключен из черновика спецификации):word-spacing: -100%;
Теоретически, он должен делать именно то, что нужно - сокращать пробелы между «словами» на 100% ширины символа пробела, то есть до нуля. Но, похоже, нигде не работает, к сожалению, и эта функция помечена как «подверженная риску» (ее также можно исключить из спецификации).
word-spacing: -1ch;
Сокращает пробелы между словами на ширину цифры «0». В моноширинном шрифте он должен быть точно равен ширине символа пробела (и любого другого символа также). Это работает в Firefox 10+, Chrome 27+ и почти работает в Internet Explorer 9+.
скрипка
источник
' '
и'0'
. В немоно-космических шрифтах нет подходящей магической пропорции между шириной' '
и'0'
символами, поэтомуch
это не очень полезно.word-spacing
мы могли бы использоватьletter-spacing
с произвольным большим отрицательным значением, как показано в моем ответеК сожалению, это 2019 год и
white-space-collapse
до сих пор не реализован.А пока отдайте родительский элемент
font-size: 0;
и установитеfont-size
для дочерних элементов . Это должно сделать свое делоисточник
Используйте flexbox и сделайте запасной вариант (из предложений выше) для старых браузеров:
источник
Просто:
Нет необходимости прикасаться к родительскому элементу.
Единственное условие здесь: размер шрифта элемента не должен быть определен (должен быть равен размеру шрифта родителя).
0.25em
по умолчаниюword-spacing
W3Schools - пространственное слово
источник
Размер шрифта: 0; может быть немного сложнее управлять ...
Я думаю, что следующие несколько строк намного лучше и более пригодны для повторного использования, и экономят время, чем любые другие методы. Я лично использую это:
Тогда вы можете использовать его следующим образом ...
Насколько я знаю (могу ошибаться), но все браузеры поддерживают этот метод.
ОБЪЯСНЕНИЕ :
Это работает (возможно, -3px может быть лучше) именно так, как вы ожидаете, что это сработает.
class="items"
родительский элемент каждого встроенного блока.Вам НЕ нужно возвращаться к CSS и добавлять другое правило CSS для ваших новых встроенных блоков.
Решение двух вопросов одновременно.
Также обратите внимание, что
>
(больше, чем знак) это означает, что * / все дочерние элементы должны быть встроены в блок.http://jsfiddle.net/fD5u3/
ПРИМЕЧАНИЕ: я изменил, чтобы приспособить, чтобы наследовать межбуквенный интервал, когда у оболочки есть дочерняя оболочка.
источник
-4px
дляletter-spacing
которого может быть недостаточно для больших размеров шрифта, например: смотрите эту скрипку , мы могли бы использовать большее значение, как в моем постеХотя технически это не ответ на вопрос: «Как убрать пробел между элементами inline-block?»
Вы можете попробовать решение flexbox и применить приведенный ниже код, и место будет удалено.
Вы можете узнать больше об этом по этой ссылке: https://css-tricks.com/snippets/css/a-guide-to-flexbox/
источник
Я не совсем уверен, хотите ли вы сделать два синих пролета без пробела или хотите обработать другие пробелы, но если вы хотите устранить пробел:
И сделано.
источник
Обычно мы используем такие элементы в разных строках, но в случае
display:inline-block
использования тегов в одной строке удалит пробел, а в другой строке - нет.Пример с тегами в другой строке:
Пример с тегами в одной строке
Другой эффективный метод - это CSS-задание, которое используется
font-size:0
для родительского элемента и даетfont-size
дочернему элементу столько, сколько вы хотите.источник
У меня была эта проблема прямо сейчас, и
font-size:0;
я обнаружил, что в Internet Explorer 7 проблема остается, потому что Internet Explorer думает: «Размер шрифта 0?!?! WTF ты сумасшедший человек?» - Итак, в моем случае я сбросил CSS Эрика Мейера, и уfont-size:0.01em;
меня разница в 1 пиксель от Internet Explorer 7 до Firefox 9, поэтому я думаю, что это может быть решением.источник
источник
float
иdisplay:inline-block
дляspan
s должны были быть запасные варианты для случая, еслиflex
он не поддерживается, ноfloat
он фактически отбрасывает эффектinline-block
, поэтому последний кажется избыточным.Я занимался этим недавно, и вместо того, чтобы установить родителя, а
font-size:0
затем установить для дочернего элемента разумное значение, я получил согласованные результаты, установив родительский контейнер, аletter-spacing:-.25em
затем дочернийletter-spacing:normal
.В другой ветке я увидел упоминание комментатора о том, что
font-size:0
которое не всегда идеально, потому что люди могут контролировать минимальный размер шрифта в своих браузерах, полностью исключая возможность установки размера шрифта равным нулю.Использование ems работает независимо от того, установлен ли размер шрифта 100%, 15pt или 36px.
http://cdpn.io/dKIjo
источник
Я думаю, что есть очень простой / старый метод для этого, который поддерживается всеми браузерами, даже IE 6/7. Мы могли бы просто установить
letter-spacing
большое отрицательное значение в parent и затем установить его обратноnormal
на дочерние элементы:источник
letter-spacing:normal
все дочерние элементы.letter-spacing
в 99,99% случаевnormal
. размер шрифта не имеет такого фиксированного значения и сильно зависит от дизайна. это может быть небольшое или большое значение, основанное на семействе шрифтов и других вещах ... Никогда в своей жизни я не помню, чтобы видеть / использовать специальное значение (отличное от 0 / нормальное)letter-spacing
, поэтому я думаю, что это безопаснее и лучший выборСамый простой ответ на этот вопрос - добавить.
CSS
ссылка на код: http://jsfiddle.net/dGHFV/3560/
источник
С PHP скобками:
источник
Я собираюсь немного расширить ответ пользователя user5609829, так как считаю, что другие решения здесь слишком сложны / слишком много работы. Применение
margin-right: -4px
к элементам встроенного блока удалит пробел и поддерживается всеми браузерами. Смотрите обновленную скрипку здесь . Для тех , кто связан с использованием отрицательных полей, попробуйте дать это чтение.источник
Спецификация CSS Text Module Level 4 определяет
text-space-collapse
свойство, которое позволяет контролировать способ обработки пустого пространства внутри и вокруг элемента.Итак, что касается вашего примера, вам просто нужно написать это:
К сожалению, ни один браузер не реализует это свойство (по состоянию на сентябрь 2016 года), как указано в комментариях к ответу HBP .
источник
Я нашел чистое CSS-решение, которое очень хорошо работало для меня во всех браузерах:
источник
Добавить
white-space: nowrap
к элементу контейнера:CSS:
HTML:
Вот Плункер .
источник
Есть много решений , как
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
нет других.Если вы используете Chrome (тестовая версия 66.0.3359.139) или Opera (тестовая версия 53.0.2907.99), то, что вы видите, может быть:
Если вы используете Firefox (60.0.2), IE10 или Edge, то, что вы видите, может быть:
Это интересно. Итак, я проверил mdn-letter-spacing и нашел это:
Кажется, в этом причина.
источник
Добавьте
letter-spacing:-4px;
родительскийp
CSS и добавьтеletter-spacing:0px;
к своемуspan
CSS.источник
Я думал, что добавлю что-то новое к этому вопросу, так как многие из представленных ответов более чем адекватны и актуальны, есть некоторые новые свойства CSS, которые могут обеспечить очень чистый вывод, с полной поддержкой во всех браузерах и мало нет "хаков". Это отходит,
inline-block
но дает те же результаты, что и заданный вопрос.Эти свойства CSS
grid
CSS Grid высоко поддерживается ( CanIUse ), кроме IE, которому нужен только
-ms-
префикс, чтобы он мог работать.CSS сетка является очень гибкой, и принимает все хорошие части из
table
,flex
иinline-block
элементы , и выводит их в одно место.При создании
grid
вы можете указать промежутки между строками и столбцами. Разрыв по умолчанию уже установлен,0px
но вы можете изменить это значение на любое другое.Короче говоря, вот соответствующий рабочий пример:
источник
display:grid
элемента блокируется, поэтому не столько отображение: сетка помогает вам работать с макетами inline-block, а скорее позволяет заменить работуinline-block
чем-то, где вы можете управлять «желобами», как этот вопрос хочет. Кроме того, я действительно удивлен, что до сих пор никто не ответил с помощью CSS Grid Layout.inline-block
. И да, я тоже был удивлен, думаю, никто сgrid
опытом не приходил к этому раньше. Играл с ним вокруг немного , и наткнулся на этот вопрос так думали , почему нет: PЕще один способ, который я нашел, это применение поля left в качестве отрицательных значений, кроме первого элемента строки.
источник
Каждый вопрос, который пытается удалить пространство между
inline-block
s, кажется<table>
мне ...Попробуйте что-то вроде этого:
источник