CSS alinea verticalmente divs flotantes

89

Tengo un div (#wrapper) que contiene 2 divs uno al lado del otro.

Me gustaría que el div derecho esté alineado verticalmente. Intenté vertical-align: middle en mi envoltorio principal pero no funciona. ¡Me vuelve loco!

Espero que alguien pueda ayudar.

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

Respuestas:

67

No tienes suerte con los elementos flotantes. No obedecen a la alineación vertical

necesitas, en display:inline-blockcambio:

http://cssdesk.com/2VMg8

TENER CUIDADO


Tenga cuidado display: inline-block;ya que interpreta el espacio en blanco entre los elementos como un espacio en blanco real. No lo ignora como lo display: blockhace.

Recomiendo esto:

Establezca el font-sizedel elemento contenedor en 0(cero) y restablezca el font-sizevalor necesario en los elementos como tal

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

Vea una demostración aquí: 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;
}
  
yunzen
fuente
Esto no funcionará si la altura de #wrapper es fija. # Right-div está centrado en relación con # left-div , no en relación con el elemento contenedor. ( inline-blockhace que se comporte como una línea imgque tiene el alignatributo establecido)
Costa
@Costa Eso es lo que debería ser, creo.
yunzen
no importa de qué manera debería ser, hay muchos casos en los que DEBE usar un elemento flotante, y siempre hay una manera de hacer cosas en CSS. siempre. en el caso más simple, una alineación vertical de texto flotante
vsync
11
pero su solución no funcionará también, porque no puede simplemente decidir NO usar flotadores ... el punto es alinear verticalmente de alguna manera mientras usa flotadores.
vsync
2
Todo lo que quería decir era que a veces el bloqueo en línea no era una opción y proporcionaba un caso de uso para ayudar a otros que podrían terminar en esta página de Google. No había necesidad de ser grosero.
Jamie Barker
21

Puede hacer esto con bastante facilidad con la tabla de visualización y la celda de la tabla de visualización.

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

EDITAR: En realidad, se metió rápidamente en CSS Desk para usted: http://cssdesk.com/RXghg

OTRA EDICIÓN: Use Flexbox. Esto funcionará, pero está bastante desactualizado: 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
fuente
1
Hola SpaceBeers. Su sugerencia no me funciona porque estoy ocultando el desbordamiento de right-div (acabo de agregar el código en el escritorio css). Con su solución, el desbordamiento no está oculto, el div expande su ancho ...
Marc
11

Me doy cuenta de que esta es una pregunta antigua, sin embargo, pensé que sería útil publicar una solución al problema de alineación vertical del flotador.

Al crear una envoltura alrededor del contenido que desea flotar, puede usar los pseudo selectores :: after o :: before para alinear verticalmente su contenido dentro de la envoltura. Puede ajustar el tamaño de ese contenido todo lo que desee sin que afecte a la alineación. El único inconveniente es que la envoltura debe llenar el 100% de la altura de su contenedor.

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;
}
Justin Drury
fuente
No estoy seguro de lo que estás haciendo, pero después de eliminar la centeredclase y limpiar muchas cosas redundantes de ese CSS, todavía hace bien la alineación vertical, con solo (¡perdón por la pérdida de formato! ...):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

Hago todo lo posible para evitar el uso de flotadores ... pero, cuando es necesario, me alineo verticalmente con el medio usando las siguientes líneas:

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

El único inconveniente de mis modificaciones es que tienes una altura div establecida ... No sé si eso es un problema para ti o no.

http://cssdesk.com/kyPhC

Sean Carruthers
fuente
1
Hola Sean. Gracias, pero estoy tratando de usar una solución flexible y, por lo tanto, espero evitar este tipo de solución ...
Marc