У меня есть div (#wrapper), содержащий 2 блока, стоящих рядом.
Я хотел бы, чтобы правый div был выровнен по вертикали. Я пробовал vertical-align: middle на моей основной обертке, но это не работает. Это сводит меня с ума!
Надеюсь, кто-то может помочь.
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;}
inline-block
заставляет его вести себя как встроенныйimg
, у которого установленalign
атрибут)Вы можете сделать это довольно легко с помощью 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; }
источник
Я понимаю, что это древний вопрос, однако я подумал, что было бы полезно опубликовать решение проблемы вертикального выравнивания поплавка.
Создав оболочку вокруг содержимого, которое вы хотите разместить, вы можете затем использовать псевдоселекторы :: 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; }
Возможное решение - создать оболочку
div
flex
с элементами, выровненными,center
как указано в https://spin.atomicobject.com/2016/06/18/vertically-center-floated-elements-flexbox/ .источник
Я изо всех сил стараюсь избегать использования поплавков ... но - при необходимости я вертикально выравниваю по середине, используя следующие строки:
position: relative; top: 50%; transform: translateY(-50%);
источник
Единственный недостаток моих модификаций - у вас есть заданная высота div ... Не знаю, проблема для вас в этом или нет.
http://cssdesk.com/kyPhC
источник