Почему display = встроенный блок добавляет неконтролируемые вертикальные поля
Я пытаюсь решить мою проблему на http://jsfiddle.net и там было странное поведение. Не могли бы вы объяснить, откуда взялись эти (http://jsfiddle.net/C6V3S/) вертикальные поля? Появляется на jsfiddle.net(по крайней мере, в Chrome и FF), не отображаются при копировании/вставке в локальный автономный файл...
![enter image description here]()
работает OK afer переходит на простой блок
![enter image description here]()
Пример для автономного тестового файла: .btn { padding: 0px; граница: 1px сплошной красный; display: inline-block; }
.txt {
display: inline-block;
width: 12px;
height: 12px;
border: none;
padding: 0;
margin: 0;
background: #77FF77;
}
</style>
<div class="btn"><div class="txt"></div></div>
Ответы
Ответ 1
Когда вы создаете элемент .txt
inline-block
, он переносится в текстовый поток родительского элемента .btn
. В этот момент начинается высота строки .btn
, которая больше высоты элемента .txt
.
Итак, добавьте .btn {line-height: 10px;}
(например), и ваша проблема исправлена. Я видел, что вы уже пытались повлиять на высоту строки внутреннего элемента .txt
, поэтому вы были довольно близки к вашим попыткам. Корректировка размера шрифта также будет работать, так как высота строки по умолчанию является формулой на основе размера шрифта. В любом случае ключ должен сделать это на родительском элементе, а не на дочернем элементе.
У вас нет этой проблемы, когда вы создаете внутренний элемент a block
, потому что тогда нет текстового содержимого, поэтому нет никакой высоты строки, применяемой вообще.
Ответ 2
inline-block
является блестящим и удобным для многих случаев. Но они приходят с одной досадной ловушкой: ненужные пробелы. Поскольку вы встраиваете встроенный блок внутри встроенного блока, это приводит к бедовому пространству. Вы можете прочитать все о пробелах и встроенных блоках в блог Дэвида Уолша.
Есть много способов справиться с этим, но мое любимое (и наиболее широко поддерживаемое) решение устанавливает это в родительский элемент inline-block
:
.btn {
font-size: 0;
}
Вот пример до/после:
http://jsfiddle.net/C6V3S/1/
Ответ 3
Это не вызвано пробелами (у вас нет внутри div
в вашем HTML), а также помещением inline-block
внутри другого inline-block
. Это вызвано из-за line-height
внешнего div
. Как видно из приведенной ниже скрипты, текущий line-height
в красном пограничном div имеет line-height
, который задается браузером (и он варьируется от браузера к браузеру), и до тех пор, пока что-то внутри div
, который занимает пробел как элемент inline
или inline-block
, на height
будет влиять line-height
.
Существует много способов обойти это, и все они в значительной степени выполняют одно и то же:
1) Извлеките внутренний элемент из потока, а затем снова вставьте его обратно. Это заставит внешний div
думать, что внутри него нет ничего, и попытайтесь стать как можно меньше, а затем заполните пространство вокруг элемента, когда оно вставлено обратно. Самый простой способ сделать это - float
его.
2) Сделайте внешний элемент занятым. Это заставит внутренний элемент определить height
и width
его родителя. Если вы сделаете font-size: 0
, как уже упоминалось ранее, это заставит внешний элемент думать, что встроенный внутренний элемент не занимает места и, следовательно, не занимает какое-либо пространство и не обертывается вокруг внутреннего элемента. Это можно сделать, установив line-height: 0
(что является идеальным решением проблемы, так как проблема line-height
).
Есть и другие способы заставить родительский элемент не иметь его line-height
, но это должно заставить вас начать.
http://jsfiddle.net/C6V3S/4/
Ответ 4
Это "как это работает", но его можно обойти. Самый простой способ исправить это - установить отрицательные поля на .btn
. Он должен работать для любого современного браузера (IE8 и выше, если я помню). Плавающие элементы также должны достичь того, чего вы хотите. Как совершенно другое решение, если ваша проблема с ним просто эстетична, вы можете просто обернуть элементы родителем, установить родительский background-color
на то, что вы хотите, и не беспокоиться о его дочерних элементах. Они будут прозрачны для всех, что под ними, и вы избавитесь от этих визуальных перерывов.
Если вы хотите придерживаться отрицательных полей с помощью display: inline-block
, но нужно, чтобы этот надоедливый первый элемент не прыгал влево из своего родителя, вы можете настроить его явно:
.btn {
margin-left: -4px;
}
.btn:first-of-type {
margin-left: 0px;
}
Изменить: прочитав еще один ответ, я не уверен, понял ли я этот вопрос: вы имеете в виду маржу поверх элементов (которые были бы горизонтальными) или поля по бокам (по вертикали)?