Gói lưới CSS


126

Có thể tạo một cuộn lưới CSS mà không sử dụng các truy vấn phương tiện không?

Trong trường hợp của tôi, tôi có một số mục không xác định mà tôi muốn được đặt trong một lưới và tôi muốn lưới đó được bao bọc. Sử dụng Flexbox, tôi không thể sắp xếp mọi thứ một cách đáng tin cậy. Tôi cũng muốn tránh một loạt các truy vấn phương tiện truyền thông.

Đây là một số mã mẫu :

.grid {
  display: grid;
  grid-gap: 10px;
  grid-auto-flow: column;
  grid-template-columns: 186px 186px 186px 186px;
}

.grid > * {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Và đây là ảnh GIF:

Hình ảnh GIF về những gì tôi đang thấy

Lưu ý thêm, nếu ai đó có thể cho tôi biết cách tôi có thể tránh chỉ định chiều rộng của tất cả các mục giống như tôi với grid-template-columnsđiều đó thì thật tuyệt. Tôi muốn bọn trẻ chỉ định chiều rộng của riêng chúng.


2
grid-template-columns: auto auto auto auto;làm việc trong trường hợp này? =)
Jakub Chlebowicz

Câu trả lời:


219

Sử dụng một trong hai auto-fillhoặc auto-fitlàm số lặp lại của repeat()ký hiệu.

repeat( [ <positive-integer> | auto-fill | auto-fit ] , <track-list> )

auto-fill

Khi auto-fillđược cho là số lặp lại, nếu vùng chứa lưới có kích thước xác định hoặc kích thước tối đa trong trục liên quan, thì số lần lặp lại là số nguyên dương lớn nhất có thể không làm cho lưới tràn vùng chứa lưới của nó.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Lưới sẽ lặp lại nhiều bản nhạc nhất có thể mà không làm tràn vùng chứa của nó.

Sử dụng tự động điền làm số lặp lại của ký hiệu repeat ()

Trong trường hợp này, với ví dụ ở trên (xem hình ảnh) , chỉ có 5 rãnh có thể vừa với khung chứa lưới mà không bị tràn. Chỉ có 4 mục trong lưới của chúng tôi, vì vậy một mục thứ năm được tạo dưới dạng một rãnh trống trong không gian còn lại.

Phần còn lại của không gian còn lại, rãnh số 6, kết thúc lưới rõ ràng. Điều này có nghĩa là không có đủ không gian để đặt một bản nhạc khác.


auto-fit

Các auto-fittừ khóa cư xử giống như auto-fill, ngoại trừ việc sau khi thuật toán sắp xếp item lưới bất kỳ bài hát trống trong không gian còn lại sẽ được thu gọn để 0.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, 186px);
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Lưới sẽ vẫn lặp lại nhiều bản nhạc nhất có thể mà không làm tràn vùng chứa của nó, nhưng các đường trống sẽ được thu gọn lại 0.

Một bản nhạc thu gọn được coi là có chức năng định cỡ bản nhạc cố định 0px.

Sử dụng tự động điều chỉnh làm số lặp lại của ký hiệu repeat ()

Không giống như auto-fillví dụ hình ảnh, rãnh thứ năm trống được thu gọn, kết thúc lưới rõ ràng ngay sau mục thứ 4.


auto-fill vs auto-fit

Sự khác biệt giữa hai là đáng chú ý khi minmax()chức năng được sử dụng.

Sử dụng minmax(186px, 1fr)để phân chia các mục từ 186pxđến 186pxcộng với một phần nhỏ của không gian còn lại trong vùng chứa lưới.

Khi sử dụng auto-fill, các vật phẩm sẽ lớn dần lên khi không còn chỗ để đặt các rãnh trống.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>

Khi sử dụng auto-fit, các vật phẩm sẽ phát triển để lấp đầy không gian còn lại vì tất cả các bản nhạc trống đều được thu gọn 0px.

.grid {
  display: grid;
  grid-gap: 10px;
  grid-template-columns: repeat(auto-fit, minmax(186px, 1fr));
}

.grid>* {
  background-color: green;
  height: 200px;
}
<div class="grid">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
</div>


Sân chơi:

CodePen

Kiểm tra các tuyến đường tự động điền

tự động điền


Kiểm tra các bản nhạc tự động điều chỉnh

tự động phù hợp


3
Có cách nào để làm cho nó ở giữa những cái ở dòng tiếp theo không?
kentcdodds

Cũng giống như bạn làm với hộp flex, trên display: gridsử dụng yếu tốjustify-content: center
Spittal

Kính gửi @Ricky Làm thế nào để làm cho nó thành thuộc tính đầu tiên của minmax, ví dụ. repeat(auto-fill, minmax(186px, 1fr));không phải là pixel, nhưng miễn là div có văn bản bên trong?
mesqueeb

1
@mesqueeb Không thể, cần có kích thước xác định . Bạn có thể xem câu trả lời này để biết thêm chi tiết.
Ricky

1
Có cách nào để làm cho nó để khi nó phải chuyển đến dòng tiếp theo, hai trong số các mục giảm xuống thay vì chỉ một? Vì vậy, giống như từ 4 đến 2 thành 1 và không có nó 4 thành 3 đến 2 thành 1?
sammiepls

16

Bạn muốn một trong hai auto-fithoặc auto-fillbên trong repeat()hàm:

grid-template-columns: repeat(auto-fit, 186px);

Sự khác biệt giữa cả hai trở nên rõ ràng nếu bạn cũng sử dụng a minmax()để cho phép kích thước cột linh hoạt:

grid-template-columns: repeat(auto-fill, minmax(186px, 1fr));

Điều này cho phép các cột của bạn linh hoạt về kích thước, từ 186 pixel đến các cột có chiều rộng bằng nhau trải dài trên toàn bộ chiều rộng của vùng chứa. auto-fillsẽ tạo ra bao nhiêu cột phù hợp với chiều rộng. Giả sử, nếu năm cột phù hợp, mặc dù bạn chỉ có bốn mục lưới, sẽ có cột trống thứ năm:

Nhập mô tả hình ảnh tại đây

Việc sử dụng auto-fitthay thế sẽ ngăn các cột trống, kéo dài thêm các cột của bạn nếu cần:

Nhập mô tả hình ảnh tại đây


7

Bạn có thể đang tìm kiếm auto-fill:

grid-template-columns: repeat(auto-fill, 186px);

Demo: http://codepen.io/alanbuchanan/pen/wJRMox

Để sử dụng không gian khả dụng hiệu quả hơn, bạn có thể sử dụng minmaxvà chuyển vào autolàm đối số thứ hai:

grid-template-columns: repeat(auto-fill, minmax(186px, auto));

Demo: http://codepen.io/alanbuchanan/pen/jBXWLR

Nếu bạn không muốn các cột trống, bạn có thể sử dụng auto-fitthay thế auto-fill.


2
Có cách nào để làm cho nó ở giữa những cái ở dòng tiếp theo không?
kentcdodds

3

Tôi đã ở trong hoàn cảnh tương tự. Trên hết những gì bạn đã làm, tôi muốn căn giữa các cột của mình trong vùng chứa trong khi không cho phép các cột trống ở bên trái hoặc bên phải:

.grid { 
    display: grid;
    grid-gap: 10px;
    justify-content: center;
    grid-template-columns: repeat(auto-fit, minmax(200px, auto));
}

Re "trong khi không cho phép cột trống để cho họ" : Đỗ bạn có nghĩa là "trong khi không cho phép cột trống hoặc cho họ" ( đểquáhoặc )? Hoặc "trong khi không cho phép cột trống cho họ" (không đến )? Hoặc một cái gì đó khác (nó dường như không tính toán)?
Peter Mortensen

1

Đây là nỗ lực của tôi. Xin lỗi, tôi cảm thấy rất sáng tạo.

Phương thức của tôi là một phương thức gốc divkích thước cố định . Việc còn lại chỉ là lắp nội dung bên trong div đó cho phù hợp.

Điều này sẽ thay đổi tỷ lệ hình ảnh bất kể tỷ lệ khung hình. Sẽ không có việc cắt xén khó khăn .

body {
    background: #131418;
    text-align: center;
    margin: 0 auto;
}

.my-image-parent {
    display: inline-block;
    width: 300px;
    height: 300px;
    line-height: 300px; /* Should match your div height */
    text-align: center;
    font-size: 0;
}

/* Start demonstration background fluff */
    .bg1 {background: url(https://unsplash.it/801/799);}
    .bg2 {background: url(https://unsplash.it/799/800);}
    .bg3 {background: url(https://unsplash.it/800/799);}
    .bg4 {background: url(https://unsplash.it/801/801);}
    .bg5 {background: url(https://unsplash.it/802/800);}
    .bg6 {background: url(https://unsplash.it/800/802);}
    .bg7 {background: url(https://unsplash.it/802/802);}
    .bg8 {background: url(https://unsplash.it/803/800);}
    .bg9 {background: url(https://unsplash.it/800/803);}
    .bg10 {background: url(https://unsplash.it/803/803);}
    .bg11 {background: url(https://unsplash.it/803/799);}
    .bg12 {background: url(https://unsplash.it/799/803);}
    .bg13 {background: url(https://unsplash.it/806/799);}
    .bg14 {background: url(https://unsplash.it/805/799);}
    .bg15 {background: url(https://unsplash.it/798/804);}
    .bg16 {background: url(https://unsplash.it/804/799);}
    .bg17 {background: url(https://unsplash.it/804/804);}
    .bg18 {background: url(https://unsplash.it/799/804);}
    .bg19 {background: url(https://unsplash.it/798/803);}
    .bg20 {background: url(https://unsplash.it/803/797);}
/* end demonstration background fluff */

.my-image {
    width: auto;
    height: 100%;
    vertical-align: middle;
    background-size: contain;
    background-position: center;
    background-repeat: no-repeat;
}
<div class="my-image-parent">
    <div class="my-image bg1"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg2"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg3"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg4"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg5"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg6"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg7"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg8"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg9"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg10"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg11"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg12"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg13"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg14"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg15"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg16"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg17"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg18"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg19"></div>
</div>

<div class="my-image-parent">
    <div class="my-image bg20"></div>
</div>

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.