2011-09-16 18 views
12

Ok esta es la estructura div.Cómo alinear verticalmente div dentro de otro div sin pantalla: table-cell

<div class="DivParent"> 
    <a href="#"> 

    <div class="DivWhichNeedToBeVerticallyAligned"></div> 

    </a>  
    </div> 

DivParent ha fijado los valores de anchura y altura pero DivWhichNeedToBeVerticallyAligned no han fijado valores de altura.

Si realiza la visualización DivParent: table-cell; puedes alinear verticalmente DivWhichNeedToBeVerticallyAligned pero no quiero usar esa función ya que causa un lío.

Un enlace de etiqueta href debe ser del mismo tamaño que divParent, quiero decir que debe poderse hacer clic en todo divparent. como pantalla: bloque.

Entonces, ¿hay alguna manera de CSS de alineación vertical o una solución ligera de jquery que también ayude?

Gracias.

Aquí jsFiddle: http://jsfiddle.net/XHK2Z/

*

+1

¿Qué pasa con display: table-cell? – user123444555621

Respuesta

43

puede utilizar un ayudante adicional para lograr la alineación vertical en un bloque con altura fija.

vistazo a esto: http://jsfiddle.net/kizu/7Fewx/

No debe tener un ayudante cerca de un bloque que desea alinear con:

.DivHelper { 
    display: inline-block; 
    vertical-align: middle; 
    height:100%; 
} 

Y añadir display: inline-block; vertical-align: middle; a .DivWhichNeedToBeVerticallyAligned

+0

gracias esto está funcionando bastante bien, pero actualicé la pregunta, ¿puedes comprobar de nuevo :) – MonsterMMORPG

+0

i también creó jsfiddle: http://jsfiddle.net/XHK2Z/ – MonsterMMORPG

+1

Se debe a que usa un elemento extra no 'bloque en línea '. Una de las formas de hacer que funcione: mover el enlace al contenedor: http://jsfiddle.net/kizu/XHK2Z/1/, y otro, es mover al ayudante a 'a': http://jsfiddle.net/kizu/XHK2Z/2 /. De todos modos, es mejor no usar 'div's dentro de' a', está bien en HTML5, pero debes tener cuidado con esto y evitarlo cuando sea posible – kizu

11

No hay manera de hacer esto con CSS sin saber la altura de la div niño.

Con jQuery, podría hacer algo como esto.

var parentHeight = $('#parent').height(); 
var childHeight = $('#child').height(); 
$('#child').css('margin-top', (parentHeight - childHeight)/2); 
+0

Me gusta su enfoque simple y lo envolví en una función. https://gist.github.com/dylanvalade/7088132 –

3

si el padre no tiene ningún otro hijo. esto sería un css única "Hack"

DivParent{line-height:100px /*the div actual height*/ } 
.DivWhichNeedToBeVerticallyAligned{display:inline-block} 

otro hack es

DivParent{height:100px; position:relative} 
.DivWhichNeedToBeVerticallyAligned{height:20px; position:absolute; top:50%; margin-top:-10px;} 
+0

gracias por la respuesta. ambos pirateo fallaron. el segundo alineado verticalmente, pero como usted define la altura, arruina todo: D – MonsterMMORPG

+0

alinear verticalmente es hacky. Necesitarás JS al final. Al igual que Facebook: https://www.facebook.com/notes/facebook-engineering/developing-facebooks-new-photo-viewer/499447633919 – Mohsen

3

Esta solución funciona para mí fina en navegadores modernos, incluido IE 10 y superior.

<div class="parent"> 
    <div class="child">Content here</div> 
</div> 

inlucluding este css

.parent { 
    height: 700px; 
    display: flex; 
    justify-content: center; 
    align-items: center; 
} 
.child { 
    width : 525px; 
} 
0

He estado usando la siguiente solución (sin posicionamiento, no-celda de la tabla/table-fila y sin altura de línea) desde más de un año, funciona con IE 7 y 8 también.

<style> 
.outer { 
    font-size: 0; 
    width: 400px; 
    height: 400px; 
    background: orange; 
    text-align: center; 
    display: inline-block; 
} 

.outer .emptyDiv { 
    height: 100%; 
    background: orange; 
    visibility: collapse; 
} 

.outer .inner { 
    padding: 10px; 
    background: red; 
    font: bold 12px Arial; 
} 

.verticalCenter { 
    display: inline-block; 
    *display: inline; 
    zoom: 1; 
    vertical-align: middle; 
} 
</style> 

<div class="outer"> 
    <div class="emptyDiv verticalCenter"></div> 
    <div class="inner verticalCenter"> 
     <p>Line 1</p> 
     <p>Line 2</p> 
    </div> 
</div> 
0

Aquí es otra opción para los navegadores modernos:

.child { 
    position: absolute; 
    left: 50%; 
    top: 50%; 
    -webkit-transform: translate(-50%, -50%); 
    -moz-transform: translate(-50%, -50%); 
    -ms-transform: translate(-50%, -50%); 
    -o-transform: translate(-50%, -50%); 
    transform: translate(-50%, -50%); 
} 
Cuestiones relacionadas