CSS alinha verticalmente divs flutuantes


90

Eu tenho um div (#wrapper) contendo 2 divs lado a lado.

Eu gostaria que a div direita fosse alinhada verticalmente. Tentei o alinhamento vertical: meio no meu wrapper principal, mas não está funcionando. Isso está me deixando louco!

Espero que alguém possa ajudar.

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

Respostas:


67

Você não tem sorte com elementos flutuantes. Eles não obedecem ao alinhamento vertical,

você precisa, em display:inline-blockvez disso:

http://cssdesk.com/2VMg8

CUIDADO


Tenha cuidado, display: inline-block;pois ele interpreta o espaço em branco entre os elementos como um espaço em branco real. Não o ignora como o display: blockfaz.

Eu recomendo isto:

Defina o font-sizedo elemento que o contém para 0(zero) e redefina o font-sizepara o valor necessário nos elementos como este

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

Veja uma demonstração aqui: 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;
}
  

Isso não funcionará se a #wrapper height for fixa. O # right-div é centralizado em relação ao # left-div , não em relação ao elemento wrapper. ( inline-blockfaz com que se comporte como um inline imgque tem o alignatributo definido)
— Costa

@Costa Acho que é assim que deve ser.
— yunzen de

não importa como deveria ser, existem muitos casos onde você DEVE usar um elemento flutuante, e sempre HÁ uma maneira de fazer coisas em CSS. sempre. no caso mais simples, um alinhamento vertical de texto flutuante
— vsync

11
mas sua solução também não funcionará, porque você não pode simplesmente decidir NÃO usar flutuadores ... o objetivo é alinhar verticalmente de alguma forma ao usar flutuadores.
— vsync

2
Tudo o que quero dizer é que às vezes o inline-block não era uma opção e dava um caso de uso para ajudar outras pessoas que poderiam acabar nesta página do Google. Não havia necessidade de ser rude.
— Jamie Barker de

21

Você pode fazer isso facilmente com display table e 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;
}

EDIT: Na verdade, mexeu rapidamente no CSS Desk para você - http://cssdesk.com/RXghg

OUTRA EDIÇÃO: Use o Flexbox. Isso funcionará, mas está bastante desatualizado - 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
Olá, SpaceBeers. Sua sugestão não está funcionando para mim, pois estou escondendo o estouro de right-div (acabei de adicionar o código na mesa css). Com sua solução, o estouro não fica oculto, a div expande sua largura ...
— Marc

11

Sei que essa é uma questão antiga, mas achei que seria útil postar uma solução para o problema do alinhamento vertical do flutuador.

Ao criar um invólucro em torno do conteúdo que deseja flutuar, você pode usar os pseudo seletores :: after ou :: before para alinhar verticalmente seu conteúdo dentro do invólucro. Você pode ajustar o tamanho desse conteúdo o quanto quiser, sem afetar o alinhamento. O único problema é que a embalagem deve preencher 100% da altura de seu recipiente.

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

Não tenho certeza do que você está fazendo, mas depois de excluir a centeredclasse e limpar muitas coisas redundantes daquele CSS, ele ainda faz o alinhamento vertical muito bem, com apenas (desculpe a perda de formatação! ...):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.


3

Eu faço o meu melhor para evitar o uso de flutuadores ... mas - quando necessário, eu alinho verticalmente ao meio usando as seguintes linhas:

position: relative;
top: 50%;
transform: translateY(-50%);

-1

A única queda das minhas modificações é que você tem uma altura div definida ... Não sei se isso é um problema para você ou não.

http://cssdesk.com/kyPhC


1
Olá Sean. Obrigado, mas estou tentando usar uma solução flexível e, portanto, espero evitar esse tipo de solução ...
— Marc
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.