2011-10-06 11 views
19

después de investigar el modelo de caja flexible durante todo un día, debo decir que realmente me gusta. Implementa la funcionalidad que implemento en JavaScript de una manera rápida y limpia. Sin embargo, una cosa me molesta:Cálculo de altura de modelo de caja flexible HTML5

No puedo expandir un div para tomar el tamaño completo calculado por el modelo de caja flexible.

Para ilustrarlo, demostraré que soy un ejemplo. En él, los dos lugares flexibles toman el exacto con y la altura, pero el div en su interior solo toma la altura del elemento "<p>...</p>". Para este ejemplo no importa, pero lo que originalmente se estaba tratando de colocar un "modelo de caja flexible" dentro de otro "modelo de caja flexible" y esto debe ser posible en mi opinión

html, body { 
 
    font-family: Helvetica, Arial, sans-serif; 
 
    width: 100%; 
 
    height: 100%; 
 
    margin: 0px; 
 
    padding: 0px; 
 
} 
 

 
#box-1 { 
 
    background-color: #E8B15B; 
 

 
} 
 
#box-2 { 
 
    background-color: #C1D652; 
 
} 
 
#main { 
 
    width: 100%; 
 
    height: 100%; 
 
    overflow-x: auto; 
 
    overflow-y: hidden; 
 
} 
 

 

 
.flexbox { 
 
    display:-moz-box; 
 
    display:-webkit-box; 
 
    display: box; 
 
    text-align: left; 
 
    overflow: auto; 
 
} 
 
H1 { 
 
    width: auto; 
 
} 
 
#box-1 { 
 
    height: auto; 
 
    -moz-box-orient: vertical; 
 
    -webkit-box-orient: vertical; 
 
    box-orient: vertical; 
 

 
    -moz-box-flex: 3; 
 
    -webkit-box-flex: 3; 
 
    box-flex: 3; 
 
} 
 
#box-2 { 
 
    height: auto; 
 
    min-width: 50px; 
 
    -moz-box-orient: vertical; 
 
    -webkit-box-orient: vertical; 
 
    box-orient: vertical; 
 

 
    -moz-box-flex: 1; 
 
    -webkit-box-flex: 1; 
 
    box-flex: 1; 
 
} 
 
#fullsize{ 
 
    background-color: red; 
 
    height: 100%; 
 
}
<div id="main" class="flexbox"> 
 
    <div id="box-1" class="flexbox"> 
 
    <div id="fullsize"> 
 
     <p>Hallo welt</p> 
 
    </div> 
 

 
    </div> 
 
    <div id="box-2" class="flexbox"> 
 

 
    </div> 
 
</div>

Respuesta

34

He estado luchando con esto por mi cuenta, pero finalmente he logrado encontrar una solución.

Vea esto jsFiddle, aunque solo he agregado prefijos de webkit para abrir en Chrome.

Básicamente tiene 2 problemas que trataré por separado.

  1. Conseguir el hijo de un elemento-flex para llenar la altura del 100%
    • Conjunto position:relative; en el padre del niño.
    • Establecer position:absolute; en el niño.
    • Puede establecer ancho/alto según sea necesario (100% en mi muestra).
  2. La fijación del cambio de tamaño de desplazamiento "capricho" en Chrome
    • Ponga overflow-y:auto; en el div desplazable.
    • El div desplazable debe tener una altura explícita especificada. Mi muestra ya tiene una altura de 100% pero si ya se aplica ninguno puede especificar height:0;

ver este answer para obtener más información sobre el tema de desplazamiento.

+1

¿El problema 'height: 100%' es un error de webkit? ¿O eso está definido en la recomendación W3C? – Xenos

0

ya que hay algo de interés en esta pregunta, le daré la solución actual que encontré. Es una prueba en Chrome (no hay otro navegador que trabaje actualmente con esta muestra, pero tengo otro más grande trabajando en FF que de alguna manera no funciona cuando lo "simplifico" ...).

La idea detrás de esto es hacer que el elemento anidado dentro de la caja flexible se extienda hasta el tamaño completo del elemento de caja flexible. Para hacerlo, se agrega un elemento de posición absoluta en el interior, que tiene 0 de distancia hacia la izquierda, derecha, arriba y abajo.

Sin embargo, incluso en Chrome, hay un error al reducir y cambiar el tamaño del elemento para que desaparezca la barra de desplazamiento.

Aquí es el html:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
    <title>flexbox example - 2 column layout</title> 
    <meta name="author" content="Gwilym Johnston"> 
    <style type="text/css"> 
    html, body{ 
     height: 100%; 
     margin: 0px; 
    } 
    #box-orient-example { 
     -moz-box-orient: horizontal; 
     -webkit-box-orient: horizontal; 
     -ms-box-orient: horizontal; 
     box-orient: horizontal; 
     display: -moz-box; 
     display: -webkit-box; 
     display: -ms-box; 
     display: box; 
     height: 100%; 
     overflow: auto; 
    } 
    #box1 { 
     -moz-box-flex: 1; 
     -webkit-box-flex: 1; 
     -ms-box-flex: 1; 
     background: none repeat scroll 0 0 lightblue; 
     text-align: center; 
     overflow: auto; 
     position: relative; 
    } 
    #box2 { 
     -moz-box-flex: 1; 
     -webkit-box-flex: 1; 
     -ms-box-flex: 1; 
     background: none repeat scroll 0 0 #DDDDDD; 
     text-align: center; 
     overflow: auto; 
     position: relative; 
    } 

    .abs { 
     position: absolute; 
     top: 0; 
     right: 0; 
     left: 0; 
     bottom: 0; 
    } 
    .rel{ 
     position: relative; 
    } 
    </style> 
</head> 
<body> 
    <div id="box-orient-example" class="example"> 
     <div id="box1"> 
      <div class="abs"> 
       <div class="rel"> 
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
       </div> 
      </div> 
     </div> 
     <div id="box2"> 
      <div class="abs"> 
       <div class="rel"> 
        Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet. 
        Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. 
        Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat. Duis autem vel eum iriure dolor in hendrerit in vulputate velit esse molestie consequat, vel illum dolore eu feugiat nulla facilisis at vero eros et accumsan et iusto odio dignissim qui blandit praesent luptatum zzril delenit augue duis dolore te feugait nulla facilisi. 
      </div> 
     </div> 
    </div> 
</body> 
</html> 
2

También debe hacer el div que desea expandir un flex-caja como bien y añadir un valor flex. Esto soluciona el problema.

#fullsize{ 
    background-color: red; 

    display: -webkit-box; 
    display: box; 
    display: -moz-box; 

    box-flex:1; 
    -webkit-box-flex:1; 
    -moz-box-flex:1; 
} 
Cuestiones relacionadas