2012-12-27 26 views
10

Tôi đang chơi với flexbox của css3 trong Chrome (không cần phải lo lắng về trình duyệt chéo cho điều này). Tôi đang có một thời gian khó khăn thuyết phục nó để đặt ra nội dung của tôi theo cách tôi muốn. Dưới đây là một phác thảo của mục tiêu của tôi:Làm thế nào để sử dụng flexbox css3 để tạo bố cục nhiều cột mà không cần mở rộng theo chiều dọc?

enter image description here

Dưới đây là một jsFiddle của nỗ lực của tôi: http://jsfiddle.net/Yht4V/2/ Điều này dường như làm việc tốt, ngoại trừ mỗi .group sẽ mở rộng chiều cao của nó chứ không phải là tạo ra nhiều cột.

Tôi đang sử dụng flexbox phổ biến ở đây. Các body đưa ra theo chiều dọc, với #content div lấy chiều cao còn lại của trang. Mỗi .group được bố trí theo chiều ngang. Cuối cùng, mỗi .item được đặt trong một số .group theo chiều dọc với gói.

Thật không may, mỗi .group kết thúc bằng một cột đơn bằng cách mở rộng chiều cao #content, làm cho thanh cuộn dọc (không mong muốn). Nếu tôi đặt chiều cao của mỗi .group thành kích thước pixel cố định, các mục sẽ vỡ ra thành nhiều cột, nhưng điều này sẽ đánh bại tính lưu động của flexbox. Dưới đây là những gì nó trông giống như với chiều cao cố định: http://jsfiddle.net/Yht4V/3/

Vì vậy, làm thế nào tôi có thể nhận được #content div để không mở rộng theo chiều dọc vì mọi thứ được quản lý với flexbox mà không đặt độ cao cố định? Tôi đã mong đợi flexbox để kích hoạt thêm cột thay vì mở rộng chiều cao của cha mẹ của nó và gây ra một thanh cuộn.

+0

nên toàn bộ điều là chất lỏng không có vấn đề làm thế nào lớn/nhỏ bạn làm cho cửa sổ? Tại sao các mục có chiều rộng cố định 200px? Bất kỳ nhóm nào có thể có các cột hay chỉ là cột đầu tiên? Nên có bất kỳ tràn ở tất cả? (nếu tôi thêm 100 mục vào mỗi nhóm) Flexbox không tạo các cột có thể xếp chồng như những gì bạn muốn, đó không phải là mục tiêu bố cục cho flexbox.Bắt những gì bạn muốn trong pic của bạn là dễ dàng Tôi chỉ không biết tất cả các yêu cầu mở rộng quy mô, mà có thể làm cho nó rất khó hoặc không thể với CSS chỉ. – skyline3000

+0

@ skyline3000 Tôi đang thử nghiệm với thiết kế kiểu "metro" của Windows 8 với HTML/CSS đơn giản, vì vậy, lý tưởng là mỗi nhóm sẽ thêm cột theo chiều ngang khi cần và gây ra thanh cuộn ngang 'iff' cần thiết (để thêm phần tử theo chiều dọc trước, sau đó quấn theo cột theo chiều ngang). Tôi có thể hình dung các cách để thực hiện điều này với JS, nhưng hy vọng nó có thể được thực hiện chỉ với HTML5/CSS3 trong Webkit. –

+0

@ skyline3000 Để trả lời bạn trực tiếp câu hỏi: Có, nó phải là chất lỏng bất kể chiều cao/chiều rộng của màn hình (Tôi không có quyền kiểm soát kích thước màn hình). Mỗi mục là kích thước cố định theo thiết kế, điều này sẽ đúng cho việc thực hiện cuối cùng của tôi. Có lẽ không phải là những kích thước chính xác, nhưng vẫn cố định. Cuối cùng, như tôi đã đề cập ở trên, các phần tử phải điền theo chiều dọc sau đó tràn theo chiều ngang. –

Trả lời

6

Từ những gì tôi đã thấy với triển khai Chrome và Opera cho Flexbox, một cột flex-direction yêu cầu hạn chế chiều cao của phần tử, nếu không nó sẽ tiếp tục mở rộng theo chiều dọc. Nó không phải là một giá trị cố định, nó có thể là một tỷ lệ phần trăm.

Điều đó nói rằng, bố cục bạn muốn cho các thành phần .group cũng có thể đạt được bằng cách sử dụng mô-đun Cột CSS. Dòng chảy của các phần tử sẽ tương tự như định hướng của cột flexbox, nhưng nó sẽ tạo ra các cột miễn là có đủ chiều rộng cho chúng, bất kể tài liệu là bao lâu.

http://jsfiddle.net/Yht4V/8/ (bạn sẽ phải xin lỗi thiếu tiền tố)

html { 
    height: 100%; 
} 

body { 
    height: 100%; 
    display: flex; 
    flex-flow: column nowrap; 
} 

h1 { 
    padding: 1em; 
} 

#content { 
    padding: 10px; 
    background-color: #eee; 
    display: flex; 
    flex-grow: 1; 
} 

#content > .group { 
    margin: 10px; 
    padding: 10px; 
    border: 1px solid #cfcfcf; 
    background-color: #ddd; 
    flex: 1 1 auto; 
} 

#content > .group:first-child { 
    columns: 10em; 
    flex-grow: 2;  
} 

#content > .group .item { 
    margin: 10px; 
    padding: 10px; 
    background-color: #aaa; 
    break-inside: avoid; 
} 

#content > .group .item:first-child { 
    margin-top: 0; 
} 

Rời nó như là một loạt các flexboxes lồng nhau, đây là khoảng gần như tôi có thể nhận được nó:

http://jsfiddle.net/Yht4V/9/ (một lần nữa, không có tiền tố)

html { 
    height: 100%; 
} 

body { 
    height: 100%; 
    display: flex; 
    flex-flow: column nowrap; 
} 

h1 { 
    padding: 1em; 
} 

#content { 
    padding: 10px; 
    background-color: #eee; 
    display: flex; 
    flex: 1 1 auto; 
    height: 100%; 
    width: 100%; 
} 

#content > .group { 
    margin: 10px; 
    padding: 10px; 
    border: 1px solid #cfcfcf; 
    background-color: #ddd; 

    display: flex; 
    flex-flow: column wrap; 
    flex: 1 1 30%; 
    max-height: 100%; 
} 

#content > .group .item { 
    margin: 10px; 
    padding: 10px; 
    background-color: #aaa; 
} 
0

Thay thế sau trong css của bạn - display: -webkit-flex ; cho các mục sau - display: -webkit-box;

này làm việc rất tốt cho tôi :-)

Các vấn đề liên quan