2017-11-21 45 views
6

Tôi muốn tạo bố cục trang web với cột linh hoạt có thể được gắn với một số chiều rộng tối đa nhất định. Ví dụ: trình đơn thanh bên chiếm 30% không gian ngang có sẵn nhưng không được lớn hơn 200px.Làm cách nào để giới hạn độ rộng của cột lưới CSS3 được chia tỷ lệ?

Với CSS flexbox, tôi sẽ đi với một giải pháp như thế này:

.flexbox-layout { 
 
    display: flex; 
 
} 
 
.flexbox-sidebar { 
 
    flex: 1 1 30%; 
 
    max-width: 200px; 
 
    background-color: lightblue; 
 
} 
 
.flexbox-content { 
 
    flex: 1 1 70%; 
 
    background-color: lightgreen; 
 
}
<p>Layout based on CSS flexbox:</p> 
 
<div class="flexbox-layout"> 
 
    <div class="flexbox-sidebar"> 
 
    <ol> 
 
     <li>Menu item 1</li> 
 
     <li>Menu item 2</li> 
 
     <li>Menu item 3</li> 
 
    </ol> 
 
    </div> 
 
    <div class="flexbox-content"> 
 
    <p>Content</p> 
 
    </div> 
 
</div>

Điều này rõ ràng là một ví dụ rất nhỏ - các bố trí thực sẽ phức tạp hơn nhiều và tôi muốn để tận dụng lợi thế của các tính năng lưới CSS như cột/hàng spanning và cột tự động, kết hợp với các truy vấn phương tiện truyền thông để đáp ứng. Cho đến bây giờ, tôi đã không quản lý để đạt được tác dụng tương tự của mẫu flexbox trên với CSS lưới:

.grid-layout { 
 
    display: grid; 
 
    grid-template-columns: 30% 70%; /* Max. width for 1st column? */ 
 
    grid-template-rows: auto; 
 
} 
 
.grid-sidebar { 
 
    background-color: lightblue; 
 
} 
 
.grid-content { 
 
    background-color: lightgreen; 
 
}
<p>Layout based on CSS grid:</p> 
 
<div class="grid-layout"> 
 
    <div class="grid-sidebar"> 
 
    <ol> 
 
     <li>Menu item 1</li> 
 
     <li>Menu item 2</li> 
 
     <li>Menu item 3</li> 
 
    </ol> 
 
    </div> 
 
    <div class="grid-content"> 
 
    <p>Content</p> 
 
    </div> 
 
</div>

Các tiêu đề của những câu hỏi sau đây không có vẻ đầy hứa hẹn, nhưng trong địa chỉ cuối những vấn đề khác:

Can't use max-width to limit content width in css grid column

How to set the maximum width of a column in CSS Grid Layout?

Chức năng minmax(...) của lưới CSS không giúp ích bởi vì nó không tính toán độ rộng cột tương đối - ít nhất là như tôi đã thử.

Có cách nào để thực hiện điều này với lưới CSS không?

+0

Bạn có thể cần phải đặt vùng chứa thành 'lưới-mẫu-khu vực: 30% 70%'. Sau đó đặt 'max-width: 200px' trên chính mục lưới. Thật không may, Grid không xuất hiện để cung cấp một phương pháp sạch hơn.Hàm 'minmax()' là vô dụng trong trường hợp này bởi vì * max * bị bỏ qua khi nó nhỏ hơn * min *, tính đến * min * trong những trường hợp như vậy. –

+0

Tôi đã thử điều này, quá không may, điều này không hoàn toàn hoạt động vì chính cột lưới vẫn tiếp tục phát triển và đẩy cột sau và nội dung của nó (vùng màu xanh lá cây trong đoạn trích của tôi) sang bên phải. – Gyro

+0

Ah, vâng. Điều đó có ý nghĩa. Sau đó, những gì về việc thiết lập cột đầu tiên để 'tự động' trong container, và xác định cả chiều dài min và tối đa trên mục? (Và, btw, tôi nghĩ cột thứ 2 chỉ có thể là '1fr' trên thùng chứa.) –

Trả lời

2

Cảm thấy một chút giống như một hack, nhưng bạn có thể đạt được điều này với:

grid-template-columns: auto minmax(calc(100% - 200px), 70%);


Giải thích (https://drafts.csswg.org/css-grid/#valdef-grid-template-columns-minmax)

'minmax (min, max) '
Xác định phạm vi kích thước lớn hơn hoặc bằng min và nhỏ hơn hoặc bằng với giá thầu CPC Nếu tối đa < phút, thì max được bỏ qua và minmax (min, max) là được coi là min. Tối đa, một giá trị đặt hệ số flex của bản nhạc; nó không hợp lệ ở mức tối thiểu.

Điều này có nghĩa là trước tiên, trình duyệt sẽ cố gắng áp dụng giá trị 30% - 70%. Nếu việc tính toán 100% - 200px lớn hơn thì 70% toàn bộ chiều rộng nó ngừng tăng, cho phép cột đầu tiên chính xác chiếm không gian 200px.

+1

Cảm ơn bạn! Với một chút tinh chỉnh, mã của bạn dường như hoạt động cho bố cục 2 cột cụ thể của tôi từ các đoạn mã: 'lưới-mẫu-cột: minmax (0, 30%) minmax (calc (100% - 200px), 70%) ; ' Nó bây giờ hoạt động chính xác như biến thể flexbox. Tôi sẽ cố gắng điều chỉnh giải pháp của bạn thành một số cột lưới tùy ý với chiều rộng tối đa và sau đó báo cáo lại. – Gyro

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