2013-12-01 3 views
30

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

У меня есть вложенные дивы

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

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

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

и визуализируется как это: enter image description here

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

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

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

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

+3

Я думаю, что этот пост будет полностью ответить на ваш вопрос http://stackoverflow.com/questions/9273016/why-is-this-inline-block-element-pushed-downward –

+1

просто использовать встроенный и не встроенный блок, и ваша проблема будет решена. http://jsfiddle.net/w8dfU/1/ – San

+3

Технический ответ заключается в том, что 'overflow: hidden' перемещает базовую линию встроенного блока.Строка линейного ящика по умолчанию ограничена сидением на той же базовой линии, что и встроенный блок, поэтому линейная строка и ее содержащий div должны увеличиваться по высоте, чтобы содержать спусковой механизм стойки. Но главный ответ на ссылку Максим Степаненко объясняет эту проблему гораздо более четко. – Alohci

ответ

54

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

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

Действительно, вертикальное выравнивание: верхнее было решением. Вот объяснение, почему: http://www.brunildo.org/test/inline-block.html – stralsi

+5

Я так ненавижу css. Это абсолютно и совершенно бессмысленно, что такое поведение происходит. Спасибо за эту работу, и я надеюсь вместе, что мы можем изгнать создателей css к самым глубоким неизбежным релятам ада. –

+0

Спасибо! Это было так здорово –

0

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

5

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

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

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

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

  • Вот почему проблема устранена установкой по вертикали: вверху.

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

Хотя этот код может ответить на вопрос, предоставив дополнительный контекст относительно _why_ и/или _how_ он отвечает вопрос значительно улучшит его долгосрочное значение . Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение. –

Смежные вопросы