CSS вертикальное выравнивание плавающих div

89

У меня есть div (#wrapper), содержащий 2 блока, стоящих рядом.

Я хотел бы, чтобы правый div был выровнен по вертикали. Я пробовал vertical-align: middle на моей основной обертке, но это не работает. Это сводит меня с ума!

Надеюсь, кто-то может помочь.

http://cssdesk.com/LWFhW

HTML:

<div id="wrapper">
  <div id="left-div">
    <ul>
      <li>One</li>
      <li>Two</li>
    </ul>
  </div>  
  <div id="right-div">
    Here some text...
  </div>
</div>

CSS:

#wrapper{
  width:400px;
  float:left;
  height:auto;
  border:1px solid purple;}

#left-div{
  width:40px;
  border:1px solid blue;
  float:left;}

#right-div{
  width:350px;
  border:1px solid red;
  float:left;}

ul{
  list-style-type: none;
  padding:0;
  margin:0;}
Марк
источник

Ответы:

67

Вам не везет с плавающими элементами. Они не подчиняются вертикальному выравниванию,

display:inline-blockвместо этого вам нужно :

http://cssdesk.com/2VMg8

ОСТОРОЖНО


Будьте осторожны, display: inline-block;поскольку он интерпретирует белое пространство между элементами как настоящее белое пространство. Он не игнорирует это, как display: blockделает.

Я рекомендую это:

Установите font-sizeдля содержащего элемента значение 0(ноль) и установите font-sizeнеобходимое значение в таких элементах, как

ul {
    margin: 0;
    padding: 0;
    list-style: none;
    font-size: 0;
}
ul > li {
    font-size: 12px;
}

См. Демонстрацию здесь: http://codepen.io/HerrSerker/pen/mslay


CSS

#wrapper{
  width:400px;
  height:auto;
  border:1px solid green;
  vertical-align: middle;
  font-size: 0;
}

#left-div{
  width:40px;
  border:1px solid blue;
  display: inline-block;
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}

#right-div{
  width:336px;
  border:1px solid red;
  display: inline-block;  
  font-size: initial;
  /* IE 7 hack */
  *zoom:1;
  *display: inline;
  vertical-align: middle;
}
  
Юнзен
источник
Это не сработает, если высота #wrapper фиксирована. # Right-div центрируется относительно # left-div , а не относительно элемента-оболочки. ( inline-blockзаставляет его вести себя как встроенный img, у которого установлен alignатрибут)
Коста
@ Коста Думаю, так и должно быть.
yunzen
не имеет значения, каким образом это должно быть, есть много случаев, когда вы ДОЛЖНЫ использовать плавающий элемент, и всегда есть способ делать что-то в CSS. всегда. в самом простом случае - вертикальное выравнивание плавающего текста: jsbin.com/UWeB/1/edit
vsync
11
но ваше решение также не будет работать, потому что вы не можете просто решить НЕ использовать поплавки ... весь смысл в том, чтобы каким-то образом выровнять по вертикали при использовании поплавков.
vsync
2
Все, что я хотел сказать, заключалось в том, что иногда встроенный блок не был вариантом и давал пример использования, чтобы помочь другим, которые могли оказаться на этой странице из Google. Не нужно было грубить.
Джейми Баркер
21

Вы можете сделать это довольно легко с помощью display table и display table-cell.

#wrapper {
    width: 400px;
    float: left;
    height: auto;
    display: table;
    border: 1px solid green;
}

#right-div {
    width: 356px;
    border: 1px solid red;
    display: table-cell;
    vertical-align: middle;
}

РЕДАКТИРОВАТЬ: На самом деле быстро испортил вам CSS Desk - http://cssdesk.com/RXghg

ДРУГОЙ РЕДАКТИРОВАНИЕ: используйте Flexbox. Это будет работать, но оно устарело - http://www.cssdesk.com/davf5

#wrapper {
    display: flex;
    align-items: center;
    border:1px solid green;
}

#left-div {
    border:1px solid blue;
}

#right-div {
    border:1px solid red;
}
SpaceBeers
источник
1
Привет, SpaceBeers. Ваше предложение не работает для меня, поскольку я скрываю переполнение right-div (я только что добавил код в стол css). С вашим решением переполнение не скрывается, div расширяет свою ширину ...
Marc
11

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

Создав оболочку вокруг содержимого, которое вы хотите разместить, вы можете затем использовать псевдоселекторы :: after или :: before для вертикального выравнивания содержимого внутри оболочки. Вы можете настроить размер этого содержимого сколько угодно, не влияя на выравнивание. Единственная загвоздка в том, что обертка должна заполнять 100% высоты своего контейнера.

http://jsfiddle.net/jmdrury/J53SJ/

HTML

<div class="container">
    <span class="floater">
        <span class="centered">floated</span>
    </span>
    <h1>some text</h1>
</div>

CSS

div {
    border:1px solid red;
    height:100px;
    width:100%;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.floater {
    float:right;
    display:inline-block;
    height:100%;
    box-sizing: border-box;
}
.centered {
    border:1px solid blue;
    height: 30px;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
h1 {
    margin:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
.container:after, .floater:after, .centered:after, h1:after {
    height:100%;
    content:'';
    font-size:0;
    vertical-align:middle;
    display:inline-block;
    box-sizing: border-box;
}
Джастин Друри
источник
Я не уверен, что вы делаете, но после удаления centeredкласса и очистки большого количества лишних вещей из этого CSS он по-прежнему отлично справляется с вертикальным выравниванием, просто (извините за потерю форматирования! ...):div { border:1px solid red; height:100px; } .floater { float:right; height:100%; } h1 { vertical-align:middle; } .container:after, .floater:after, .centered:after { height:100%; content:''; font-size:0; vertical-align:middle; display:inline-block; }
Sz.
2

Я изо всех сил стараюсь избегать использования поплавков ... но - при необходимости я вертикально выравниваю по середине, используя следующие строки:

position: relative;
top: 50%;
transform: translateY(-50%);
Маорицио
источник
-1

Единственный недостаток моих модификаций - у вас есть заданная высота div ... Не знаю, проблема для вас в этом или нет.

http://cssdesk.com/kyPhC

Шон Каррутерс
источник
1
Привет, Шон. Спасибо, но я пытаюсь использовать гибкое решение и, таким образом, надеюсь избежать такого решения ...
Marc