Переполнение: скрытый на встроенном блоке добавляет высоту родительскому

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

У меня есть несколько вложенных div

<div class="parent">
    <div class="child">A</div>
</div>

И у ребенка есть отображение: inline-block и overflow: hidden

.parent{
    background-color:red;
}
.child{ 
    background-color:green; 
    display:inline-block;
    overflow:hidden; 
}

И он получается таким: enter image description here

Вы можете заметить, что родительский объект на 5px выше, чем ребенок.

Откуда возникает дополнительная высота?

Вот пример: http://jsfiddle.net/w8dfU/

Edit: Я не хочу удалять отображение: inline-block или overflow: hidden, это упрощенный пример, чтобы проиллюстрировать проблему, но в моем реальном макете мне нужны они оба. Я просто хочу понять, почему появляется эта дополнительная высота. Является ли он где-то указанным, что это должно быть так? Является ли это следствием какой-либо другой функции css?

Ответ 1

У меня возникла эта проблема при построении горизонтального слайдера. Я установил его с вертикальным выравниванием: сверху на мои встроенные элементы.

ul {
    overflow-x: scroll;
    overflow-y:hidden;
    white-space: nowrap;
    -webkit-overflow-scrolling: touch;
}

ul&::-webkit-scrollbar {
    display: none;
}

li {
    display: inline-block;
    vertical-align: top;
    width: 75px;
    padding-right: 20px;
    margin:20px 0 0 0;
}

Ответ 2

Принятый ответ выше правильно, но он не дает объяснения, которые я искал. Хорошее объяснение было дано @Alohci в его comment.

Объяснение в нескольких словах:

  • Значение vertical-align равно baseline, поэтому дочерний div выравнивается с базовым текстом текста.

  • Эта базовая линия текста не совпадает с базовой линией. Это немного выше, чтобы разместить буквы с descenders: p, q, g.

  • Вот почему проблема исправлена ​​установкой vertical-align: top.

Ответ 3

Это дополнительное пространство, исходящее от overflow:hidden класса Child. Удалите это свойство и проверьте, и если вы действительно хотели использовать свойство overflow:hidden, тогда используйте отрицательный запас для дочернего класса. Вы можете удалить это дополнительное пространство.

Ответ 4

.child{
    background-color:green; 
    display:inline-block;
    overflow:hidden; 
    vertical-align: top;
}