Ngăn nội dung mở rộng các mục lưới


153

TL; DR: Có bất cứ điều gì giống như table-layout: fixedlưới CSS không?


Tôi đã cố gắng tạo ra một lịch xem năm với lưới 4x3 lớn trong nhiều tháng và ở đó các lưới 7x6 lồng nhau cho các ngày.

Lịch nên điền vào trang, vì vậy, thùng chứa lưới năm có chiều rộng và chiều cao 100% mỗi trang.

.year-grid {
  width: 100%;
  height: 100%;

  display: grid;
  grid-template: repeat(3, 1fr) / repeat(4, 1fr);
}

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
}

Đây là một ví dụ hoạt động: https://codepen.io/loilo/full/ryXLpO/

Để đơn giản, mỗi tháng trong cây bút đó có 31 ngày và bắt đầu vào thứ Hai.

Tôi cũng chọn một cỡ chữ nhỏ lố bịch để thể hiện vấn đề:

Các mục lưới (= ô ngày) khá cô đọng vì có hàng trăm trong số chúng trên trang. Và ngay khi nhãn số ngày trở nên quá lớn (hãy thoải mái chơi với kích thước phông chữ trong bút bằng các nút ở phía trên bên trái), lưới sẽ chỉ tăng kích thước và vượt quá kích thước cơ thể của trang.

Có cách nào để ngăn chặn hành vi này?

Ban đầu, tôi đã tuyên bố lưới năm của mình là 100% về chiều rộng và chiều cao để có thể là điểm bắt đầu, nhưng tôi không thể tìm thấy bất kỳ thuộc tính CSS nào liên quan đến lưới có thể cần.

Tuyên bố miễn trừ trách nhiệm: Tôi biết rằng có nhiều cách khá dễ dàng để định kiểu lịch đó mà không cần sử dụng CSS Grid Layout. Tuy nhiên, câu hỏi này là về kiến ​​thức chung về chủ đề hơn là giải quyết ví dụ cụ thể.


Thay vào đó, bạn muốn điều gì xảy ra? Phông chữ trong mỗi ô có thể chỉ là kích thước bất kỳ và nó không bao giờ làm cho kích thước ô lưới tăng?
Michael Coker

1
Chính xác. Về cơ bản, một cách thuận tiện hơn về những gì sẽ xảy ra nếu tôi đặt kích thước của các mục lưới thành giá trị phần trăm thay vì phân số.
Loilo

Về cơ bản, tôi đang tìm kiếm một phiên bản bố trí dạng lưới của bố cục bảng: đã sửa (xem: codepen.io/loilo/pen/dvxpvq?editors=1100 )
Loilo

7
Đây là nỗi đau lớn nhất trong toàn bộ đặc tả CSS Grid. Nhu cầu của họ là một thiết lập trong đó các khu vực lưới không thể thoát khỏi kích thước của bất kỳ thùng chứa lưới mẹ nào của chúng! Như là, nó là một cơn ác mộng cho các cấu trúc lưới được lồng sâu.
Lonnie tốt nhất

Câu trả lời:


263

Theo mặc định, một mục lưới không thể nhỏ hơn kích thước của nội dung của nó.

Các mục lưới có kích thước ban đầu min-width: automin-height: auto.

Bạn có thể ghi đè lên hành vi này bằng cách thiết lập mục lưới min-width: 0, min-height: 0hoặc overflowvới bất kỳ giá trị khác hơn visible.

Từ thông số kỹ thuật:

6.6. Kích thước tối thiểu tự động của các mục lưới

Để cung cấp một kích thước tối thiểu mặc định hợp lý hơn cho các hạng mục lưới, đặc tả này định nghĩa rằng autogiá trị của min-width/ min-heightcũng áp dụng một kích thước tối thiểu tự động ở trên trục quy định để các mặt hàng lưới mà overflowvisible. (Hiệu ứng này tương tự với kích thước tối thiểu tự động được áp dụng cho các mục flex.)

Đây là một lời giải thích chi tiết hơn bao gồm các mục flex, nhưng nó cũng áp dụng cho các mục lưới:

Bài đăng này cũng đề cập đến các vấn đề tiềm ẩn với các thùng chứa lồng nhausự khác biệt về kết xuất giữa các trình duyệt chính .


Để sửa bố cục của bạn, hãy thực hiện các điều chỉnh này cho mã của bạn:

.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;
  min-height: 0;  /* NEW */
  min-width: 0;   /* NEW; needed for Firefox */
}

.day-item {
  padding: 10px;
  background: #DFE7E7;
  overflow: hidden;  /* NEW */
  min-width: 0;      /* NEW; needed for Firefox */
}

sửa đổi codepen


1fr đấu với minmax(0, 1fr)

Các giải pháp trên hoạt động ở cấp độ mục lưới. Đối với một giải pháp cấp container, xem bài này:


3
Ồ Điều đó hấp dẫn và thú vị cùng một lúc, và tôi chắc chắn sẽ không nghĩ ra điều đó nếu chỉ thử xung quanh. Bạn đã lướt qua thông số kỹ thuật cho thông tin đó? Bởi vì sau khi không biết google để làm gì, đó là những gì tôi đã thử trước đó, nhưng cuối cùng tôi đã đọc phần sai (sau khi kết luận nguyên nhân sai của vấn đề).
Loilo

1
Tôi đã gặp vấn đề này trước đây với các mặt hàng flex . Do có nhiều điểm tương đồng giữa các mục flex và lưới, tôi cho rằng hành vi có thể giống nhau và không có trong phần đó của thông số kỹ thuật.
Michael Benjamin

1
Nó sửa chiều cao, nhưng nó tiếp tục phát triển theo hướng ngang, min-width: 0;không giúp được gì. Tui bỏ lỡ điều gì vậy?
người dùng

2
Đối với lưới lồng nhau, chúng ta cần áp dụng điều này cho tất cả các cấp. Nhưng tôi thực sự đã đến đây để upvote và cảm ơn bạn ..
Knack


57

Câu trả lời trước đó là khá tốt, nhưng tôi cũng muốn đề cập rằng có một cách bố trí tương đương cố định dùng cho lưới, bạn chỉ cần phải viết minmax(0, 1fr)thay vì 1frnhư kích thước theo dõi của bạn.


6
Tôi đề nghị phương pháp này hơn câu trả lời trước, được chấp nhận.
Thierry Prost

Mặc dù điều này hoạt động, tôi không hiểu một chút về nó ... Bạn có thể giải thích tại sao điều này hoạt động không? Minmax (0, 1fr) đang làm gì? Không nên luôn luôn là 0? Tôi bối rối :(
BAERUS

2
minmax(0, 1fr)hoạt động vì 1frthực sự là một tốc ký minmax(auto,1fr), không phải là giá trị chính xác cho câu hỏi ban đầu.
Mikko Rantalainen

Để biết thêm chi tiết, xem github.com/w3c/csswg-dcraft/issues/1777
Mikko Rantalainen

1

Các câu trả lời hiện có giải quyết hầu hết các trường hợp. Tuy nhiên, tôi gặp phải trường hợp tôi cần nội dung của ô lưới overflow: visible. Tôi đã giải quyết nó bằng cách định vị hoàn toàn trong một trình bao bọc (không lý tưởng, nhưng tốt nhất tôi biết), như thế này:


.month-grid {
  display: grid;
  grid-template: repeat(6, 1fr) / repeat(7, 1fr);
  background: #fff;
  grid-gap: 2px;  
}

.day-item-wrapper {
  position: relative;
}

.day-item {
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  padding: 10px;

  background: rgba(0,0,0,0.1);
}

https://codepen.io/bjnsn/pen/vYYVPZv


0

một điều dễ dàng hơn để làm sẽ thiết lập chiều rộng tối đa của mục lưới như vậy:

//for the container
.gridContainer{
    display: grid;
    grids-templates-column: repeat (12, 1fr);
 }

 //for the grid item
 .gridItem{
       max-width: 100%;
       grid-column: span 4  //4 can be any number from1-12 as we specified in the grid template
  }

Tôi là một chút bối rối để thành thật. Mã của bạn hoàn toàn không giống với câu hỏi ban đầu và áp dụng độ rộng tối đa: 100% cho các mục lưới (thay vì độ rộng tối thiểu: 0 từ giải pháp được chấp nhận) sẽ không giải quyết được vấn đề ...
Loilo

chiều rộng tối đa sẽ ngăn nó điều chỉnh lại so với chiều rộng con của nó
Pedro JR

Tôi đã cố gắng sao chép mã của bạn và nó thực sự hoạt động, nhưng dường như không phải vì độ rộng tối đa: 100% mà là do cột lưới: span 4; mà không xác định một cột bắt đầu. Xác định một cột bắt đầu (ví dụ: bằng cách sử dụng cột lưới: 1 / span 4;) và nó sẽ phá vỡ bố cục một lần nữa. (Hành vi đó hơi kỳ lạ, nhưng tôi chắc chắn có một góc ở đâu đó trong thông số kỹ thuật được xác định.)
Loilo

cũng được, nghe có vẻ tốt. nhưng bạn chưa xem xét một upvote cho tôi chưa
Pedro JR

Thành thật mà nói: 1. Đây là một vấn đề đã được giải quyết trong hơn ba năm. 2. câu trả lời của bạn không được kiểm tra đúng cách (CSS của bạn chứa nhiều lỗi chính tả cần được sửa trước khi trình duyệt nhận ra lưới của bạn). Và 3. câu trả lời của bạn không thực sự phục vụ cho ví dụ trong câu hỏi của tôi (nếu không bạn sẽ nhận ra rằng giải pháp của bạn không hoạt động với nó). - Vì vậy, tôi xin lỗi, nhưng tôi không xem xét một upvote.
Loilo
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.