2011-10-06 32 views
19

sau khi nghiên cứu mô hình hộp linh hoạt trong cả ngày, tôi phải nói rằng tôi thực sự thích nó. Nó thực hiện các chức năng tôi thực hiện trong JavaScript một cách nhanh chóng và sạch sẽ. Tuy nhiên, có một điều khiến tôi bị lỗi:Tính toán chiều cao mô hình hộp linh hoạt HTML5

Tôi không thể mở rộng div để lấy kích thước đầy đủ được tính toán bởi mô hình hộp linh hoạt!

Để minh họa, tôi sẽ chứng minh một ví dụ. Trong đó hai vị trí linh hoạt lấy chính xác và chiều cao, nhưng div bên trong nó chỉ lấy chiều cao của phần tử "<p>...</p>". Ví dụ này nó không quan trọng nhưng những gì tôi ban đầu đã cố gắng được đặt một "mô hình hộp linh hoạt" bên trong một "mô hình hộp linh hoạt" và điều này phải được thể theo ý kiến ​​của tôi

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>

Trả lời

34

Tôi đã tự đấu vật với bản thân mình, nhưng cuối cùng đã tìm ra giải pháp.

Xem này jsFiddle, mặc dù tôi chỉ thêm tiền tố webkit để mở trong Chrome.

Về cơ bản, bạn có 2 vấn đề mà tôi sẽ giải quyết riêng.

  1. Bắt con của một flex-item để điền vào chiều cao 100%
    • Set position:relative; về cha mẹ của đứa trẻ.
    • Đặt position:absolute; cho trẻ.
    • Sau đó, bạn có thể đặt chiều rộng/chiều cao theo yêu cầu (100% trong mẫu của tôi).
  2. Sửa thay đổi kích cỡ di chuyển "những đứa" trong Chrome
    • Đặt overflow-y:auto; trên div cuộn.
    • div có thể cuộn phải có chiều cao rõ ràng được chỉ định. mẫu của tôi đã có chiều cao 100% nhưng nếu không đã được áp dụng, bạn có thể chỉ định height:0;

Xem answer này để biết thêm thông tin về vấn đề di chuyển.

+1

Sự cố 'chiều cao: 100%' có phải là lỗi webkit không? Hay điều đó được định nghĩa trong khuyến nghị của W3C? – Xenos

0

vì có một số quan tâm trong câu hỏi này, tôi sẽ cung cấp cho bạn giải pháp hiện tại tôi đã tìm thấy. Đó là thử nghiệm trong chrome (không có trình duyệt khác hiện đang làm việc với mẫu này, nhưng có một lớn hơn về làm việc trong FF mà bằng cách nào đó không hoạt động khi tôi "simplfy nó" ...).

Ý tưởng đằng sau nó là, bằng cách nào đó làm cho phần tử lồng trong hộp linh hoạt mở rộng đến kích thước đầy đủ của phần tử hộp linh hoạt. Để làm như vậy một yếu tố vị trí tuyệt đối được thêm vào bên trong, trong đó có 0 khoảng cách sang trái, phải, trên và dưới.

Tuy nhiên, ngay cả trong Chrome, có lỗi, khi giảm kích thước và đổi kích thước phần tử sao cho thanh cuộn biến mất.

Đây là 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

Bạn cũng phải làm cho div bạn muốn mở rộng một flex-box như tốt và thêm một giá trị flex. Việc này sẽ khắc phục sự cố.

#fullsize{ 
    background-color: red; 

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

    box-flex:1; 
    -webkit-box-flex:1; 
    -moz-box-flex:1; 
} 
Các vấn đề liên quan