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.