2011-10-06 12 views
19

po zbadaniu modelu elastycznego pudełka przez cały dzień, muszę powiedzieć, że naprawdę to lubię. Implementuje funkcjonalność, którą wdrażam w JavaScript w szybki i czysty sposób. Jedna rzecz jednak buga mnie:Modelowanie elastycznego pudełka HTML5 modelowania wysokości

Nie mogę rozwinąć elementu div, aby uzyskać pełny rozmiar obliczony przez model elastycznego pudełka !!!

Aby to zilustrować, udowodnię przykład. W nim dwa elastyczne miejsca przyjmują dokładnie wysokość i wysokość, ale element div wewnątrz zajmuje tylko wysokość elementu "<p>...</p>". W tym przykładzie nie ma znaczenia, ale to, co początkowo starał się umieszczenie „elastyczny model skrzynki” wewnątrz innego „elastycznego modelu pudełkowego” i to musi być możliwe, moim zdaniem

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>

Odpowiedz

34

Sam się z tym zmagałem, ale w końcu udało mi się wymyślić rozwiązanie.

Zobacz ten jsFiddle, ale dodałem tylko przedrostki zestawu webkit, więc otwórz w Chrome.

Zasadniczo masz 2 problemy, którymi zajmę się osobno.

  1. Pierwsze dziecko flex-elementu, aby wypełnić wysokość 100%
    • Set position:relative; na rodzica dziecka.
    • Ustaw position:absolute; na dziecku.
    • Następnie można ustawić szerokość/wysokość zgodnie z wymaganiami (100% w mojej próbce).
  2. Mocowanie Resize przewijanie "dziwactwo" w Chrome
    • Put overflow-y:auto; na przewijanej div.
    • Przewijany element div musi mieć określoną określoną wysokość. Moja próbka ma już wysokość 100%, ale jeśli nikt nie jest już stosowane można określić height:0;

Zobacz ten answer uzyskać więcej informacji na temat kwestii przewijania.

+1

Czy "wysokość: 100%" powoduje błąd w webkitach? Czy jest to określone w zaleceniu W3C? – Xenos

0

ponieważ jest pewne zainteresowanie tym pytaniem, dam ci aktualne rozwiązanie, które znalazłem. Jest to test w wersji chrome (żadna inna przeglądarka aktualnie nie działa z tym przykładem, ale dostałem kolejny większy na pracy w FF, który jakoś nie działa, gdy "po prostu to" ...).

Pomysł polega na tym, aby element zagnieżdżony wewnątrz elastycznego pudełka rozciągał się do pełnego rozmiaru elastycznego elementu skrzynkowego. W tym celu dodaje się element pozycji absolutnej, który ma 0 odległości do lewej, prawej, górnej i dolnej.

Jednak nawet w Chrome wystąpił błąd podczas zmniejszania rozmiaru i zmniejszania rozmiaru elementu, aby pasek przewijania zniknął.

Oto 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

Należy również dokonać div chcesz rozszerzyć flex-box, jak również i dodać wartość Flex. Rozwiązuje to problem.

#fullsize{ 
    background-color: red; 

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

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