CSS Vertical align не работает с float


86

Как я могу использовать vertical-alignкак floatв divсвойствах? vertical-alignРаботает отлично , если я не использовать float. Но если я использую поплавок, то он не работает. Для меня важно использовать float:rightпоследний div.

Я пытаюсь следовать, если вы удалите float из всех div, тогда он будет работать нормально:

<div class="wrap">
    <div class="left">First div, float left,  has more text.</div>
    <div class="left2">Second div, float left </div>
    <div class="right">Third div, float right</div>
</div>

CSS:

.wrap{
    width: 500px;
    overflow:hidden;    
    background: pink;
}

.left {
    width: 150px;       
    margin-right: 10px;
    background: yellow;  
    float:left;
    vertical-align: middle;  
    display:inline-block

}

.left2 {
    width: 150px;    
    margin-right: 10px;
    background: aqua;
    float:left;
    vertical-align: middle;   
    display:inline-block
}

.right{
    width: 150px;
    background: orange;
    float:right;
    vertical-align: middle;
    display:inline-block
}

JSFiddle

Ответы:


90

Вам нужно установить высоту строки.

<div style="border: 1px solid red;">
<span style="font-size: 38px; vertical-align:middle; float:left; line-height: 38px">Hejsan</span>
<span style="font-size: 13px; vertical-align:middle; float:right; line-height: 38px">svejsan</span>
<div style="clear: both;"></div>

http://jsfiddle.net/VBR5J/


32
если вы установите line-heightодинаковое значение для всех элементов, vertical-alignэто бесполезно. ( jsfiddle.net/VBR5J/448 )
Эдерсон Т. Шлахта,

Не работает для <button>элементов. Вместо того , чтобы <span>это <button>.
Green

15
Это неверный ответ. vertical-align принадлежит КОНТЕЙНЕРУ (the div), а не отдельным элементам. Правильное решение - способно вертикальной выравнивань плавало элементы - это поместить как vertical-alignи line-heightна контейнере: <div style="border: 1px solid red; vertical-align:middle; line-height: 38px;">. УДАЛИТЬ vertical-align:middle; line-height: 38px;из стилей пролета.
ToolmakerSteve

1
Только что обнаружил, что то, что я предлагаю, работает для плавающих промежутков в скрипте ответа, но не для некоторых элементов (не удалось для плавающего радиовхода).
ToolmakerSteve

1
@ToolmakerSteve ошибается, и этот ответ неверен. Vertical-align применяется только к встроенным элементам, встроенным блокам или ячейкам таблицы (последнее просто странно). Добавление float делает элемент en блочным. Тем не менее, использование line-height (и игнорирование vertical-align) может быть решением.
commonpike

15

Отредактировано:

Свойство CSS vertical-align указывает вертикальное выравнивание встроенного элемента, элемента встроенного блока или элемента таблицы-ячейки.

Прочтите эту статью, чтобы узнать о вертикальном выравнивании


1
Это относится и к inline-blockэлементам.
Рольф

1
Обновлено. Я пропустил это. Спасибо за упоминание.
Ahsan Хуршид

4
это не ответ
Сержан Ахметов

Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - Из
отзыва

8

Вертикальное выравнивание действительно не работает с плавающими элементами. Это потому, что float выводит элемент из обычного потока документа. Возможно, вы захотите использовать другие методы вертикального выравнивания, такие как те, которые основаны на преобразовании, отображении: таблица, абсолютное позиционирование, высота строки, js (возможно, в крайнем случае) или даже простую старую таблицу html (возможно, первый выбор, если контент собственно табличный). Вы обнаружите, что по этому поводу ведутся жаркие споры.

Однако вот как вы можете вертикально выровнять СВОИ 3 блока:

.wrap{
    width: 500px;
    overflow:hidden;    
    background: pink;
}

.left {
    width: 150px;       
    margin-right: 10px;
    background: yellow;  
    display:inline-block;
    vertical-align: middle; 
}

.left2 {
    width: 150px;    
    margin-right: 10px;
    background: aqua; 
    display:inline-block;
    vertical-align: middle; 
}

.right{
    width: 150px;
    background: orange;
    display:inline-block;
    vertical-align: middle; 
}

Не уверен, зачем вам нужна фиксированная ширина, дисплей: встроенный блок и плавающий.


Не могли бы вы добавить код к своему ответу, чтобы показать, как достичь решения?
abarisone

Кроме того, «правильный ответ» так легко сломать ... это заставляет меня задаться вопросом, как на Земле 19 человек проголосовали за него.
Габриэль

3
в вопросе говорилось: «ему нужен поплавок: прямо на последнем элементе», поэтому ему может понадобиться, чтобы последний элемент располагался с правой стороны контейнера. как достичь этой цели в своем ответе?
fly.x

Хороший ответ и к тому же такой ясный! Просто отсутствует опция Flexbox.
Luillyfe
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.