CSS вертикально вирівнює плаваючі divs


88

У мене є div (#wrapper), що містить 2 divs, що стоять поруч.

Я хотів би, щоб право-div було вирівняно по вертикалі. Я спробував вертикальне вирівнювання: середнє на моїй основній обгортці, але це не працює. Це зводить мене з розуму!

Сподіваюся, хтось може допомогти.

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набором атрибутів)
— Коста,

@Costa Я думаю, це має бути так.
— yunzen

не має значення, яким чином це повинно бути, є багато випадків, коли ви ПОВИННІ використовувати плаваючий елемент, і завжди є спосіб робити речі в CSS. завжди. у найпростішому випадку - вертикальне вирівнювання плаваючого тексту: jsbin.com/UWeB/1/edit
— vsync

11
але ваше рішення також не буде працювати, тому що ви не можете просто вирішити НЕ використовувати поплавці .. вся справа в тому, щоб якось вертикально вирівняти під час використання поплавців.
— vsync

2
Усі мої думки полягали в тому, що іноді вбудований блок не був варіантом, і він використовував приклад, щоб допомогти іншим, хто може опинитися на цій сторінці від Google. Не потрібно було грубити.
— Джеймі Баркер,

20

Ви можете зробити це досить легко за допомогою таблиці відображення та відображення комірки таблиці.

#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;
}

1
Привіт SpaceBeers. Ваша пропозиція не працює для мене, оскільки я приховую переповнення right-div (я щойно додав код у css desk). З вашим рішенням переповнення не приховано, 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
Привіт Шон. Дякую, але я намагаюся використовувати гнучке рішення і тим самим сподіваюся уникнути такого рішення ...
— Марк,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.