ป้องกันเนื้อหาไม่ให้ขยายรายการในกริด


153

TL; DR:มีอะไรที่เหมือนกับtable-layout: fixedCSS กริดหรือไม่


ฉันพยายามสร้างปฏิทินมุมมองรายปีด้วยตารางขนาดใหญ่ 4x3 ตารางในเดือนนั้นและซ้อนกัน 7x6 กริดสำหรับวันนั้น

ปฏิทินควรเติมหน้าดังนั้นคอนเทนเนอร์กริดของปีจะได้รับความกว้างและความสูง 100% ต่อรายการ

.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);
}

นี่คือตัวอย่างการทำงาน: https://codepen.io/loilo/full/ryXLpO/

เพื่อความเรียบง่ายปากกาทุกเดือนมี 31 วันและเริ่มในวันจันทร์

ฉันยังเลือกขนาดตัวอักษรที่เล็กเพื่อแสดงให้เห็นถึงปัญหา:

รายการกริด (= เซลล์วัน) จะค่อนข้างข้นเนื่องจากมีหลายร้อยรายการในหน้า และทันทีที่ป้ายหมายเลขวันมีขนาดใหญ่เกินไป (อย่าลังเลที่จะเล่นด้วยขนาดตัวอักษรในปากกาโดยใช้ปุ่มที่ด้านซ้ายบน) ตารางจะขยายขนาดและเกินขนาดของหน้ากระดาษ

มีวิธีป้องกันพฤติกรรมนี้หรือไม่?

เริ่มแรกฉันประกาศกริดปีของฉันให้มีความกว้างและความสูง 100% ดังนั้นนั่นอาจเป็นจุดเริ่มต้น แต่ฉันไม่สามารถหาคุณสมบัติ CSS ที่เกี่ยวข้องกับกริดที่ต้องการได้

ข้อจำกัดความรับผิดชอบ:ฉันทราบว่ามีวิธีการง่ายๆในการจัดรูปแบบปฏิทินโดยไม่ต้องใช้ CSS Grid Layout อย่างไรก็ตามคำถามนี้เกี่ยวกับความรู้ทั่วไปในหัวข้อมากกว่าการแก้ไขตัวอย่างที่เป็นรูปธรรม


คุณต้องการจะเกิดอะไรขึ้นแทน แบบอักษรในแต่ละเซลล์สามารถมีขนาดเท่าใดก็ได้และจะไม่ทำให้ขนาดกริดเซลล์เพิ่มขึ้นใช่หรือไม่
Michael Coker

1
เผง โดยทั่วไปแล้ววิธีที่สะดวกกว่าจะเกิดอะไรขึ้นถ้าฉันตั้งขนาดของรายการกริดเป็นค่าเปอร์เซ็นต์แทนที่จะเป็นเศษส่วน
Loilo

ฉันกำลังมองหารุ่นกริดเลย์เอาต์ของตารางเลย์เอาต์: แก้ไขแล้ว (ดู: codepen.io/loilo/pen/dvxpvq?editors=1100 )
Loilo

7
นี่เป็นความเจ็บปวดที่ยิ่งใหญ่ที่สุดในสเปค CSS Grid ทั้งหมด ความต้องการของพวกเขาคือการตั้งค่าที่พื้นที่กริดไม่สามารถหลบหนีจากมิติของคอนเทนเนอร์กริดหลักของพวกเขา! มันเป็นฝันร้ายสำหรับโครงสร้างกริดซ้อนกัน
Lonnie Best

คำตอบ:


263

ตามค่าเริ่มต้นรายการกริดจะต้องไม่เล็กกว่าขนาดของเนื้อหา

รายการตารางมีขนาดเริ่มต้นและmin-width: automin-height: auto

คุณสามารถแทนที่พฤติกรรมนี้โดยการตั้งค่ารายการตารางเพื่อmin-width: 0, min-height: 0หรือoverflowมีค่าอื่น ๆ visibleกว่าใด

จากสเป็ค:

6.6 ขนาดขั้นต่ำอัตโนมัติของรายการกริด

เพื่อให้มีขนาดต่ำสุดเริ่มต้นที่เหมาะสมมากขึ้นสำหรับรายการตารางข้อกำหนดนี้กำหนดว่าautoค่าของmin-width/ min-heightยังใช้ขนาดต่ำสุดอัตโนมัติในแกนที่ระบุไปยังรายการที่มีตารางเป็นoverflow visible(เอฟเฟ็กต์นั้นคล้ายคลึงกับขนาดต่ำสุดอัตโนมัติที่กำหนดในรายการเฟล็กซ์)

ต่อไปนี้เป็นคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับรายการเฟล็กซ์ แต่ใช้กับรายการกริดเช่นกัน:

โพสต์นี้ยังครอบคลุมถึงปัญหาที่อาจเกิดกับตู้คอนเทนเนอร์ซ้อนกันและเป็นที่รู้จักความแตกต่างของการแสดงผลในหมู่เบราว์เซอร์ที่สำคัญ


ในการแก้ไขเลย์เอาต์ของคุณทำการปรับเปลี่ยนรหัสเหล่านี้:

.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 */
}

แก้ไข codepen


1fr VS minmax(0, 1fr)

การแก้ปัญหาข้างต้นทำงานที่ระดับรายการกริด สำหรับการแก้ปัญหาระดับภาชนะดูโพสต์นี้:


3
ว้าว. นั่นเป็นสิ่งที่น่าสนใจและน่าสนใจในเวลาเดียวกันและฉันก็ไม่ได้คิดแบบนั้นด้วยการลองทำ คุณเพิ่งดูข้อมูลจำเพาะของข้อมูลนั้นอย่างรวดเร็วหรือไม่? เพราะหลังจากไม่รู้ว่าจะทำอะไรกับ google นั่นคือสิ่งที่ฉันได้ลองทำมาก่อน แต่ฉันลงเอยด้วยการอ่านหัวข้อที่ไม่ถูกต้อง (หลังจากสรุปสาเหตุที่ไม่ถูกต้องของปัญหา)
Loilo

1
ผมเคยทำงานเป็นปัญหานี้ก่อนที่จะมีรายการดิ้น เนื่องจากมีความคล้ายคลึงกันมากมายระหว่างรายการเฟล็กซ์และกริดฉันจึงคิดว่าพฤติกรรมอาจเหมือนกันและมีค่าเป็นศูนย์ในส่วนของข้อมูลจำเพาะนั้น
Michael Benjamin

1
มันแก้ไขความสูง แต่มันยังคงเติบโตในทิศทางแนวนอนmin-width: 0;ไม่ได้ช่วย ฉันพลาดอะไรไปรึเปล่า?
ผู้ใช้

2
สำหรับกริดที่ซ้อนกันเราจำเป็นต้องใช้สิ่งนี้กับทุกระดับ แต่ฉันมาที่นี่เพื่อ upvote และขอบคุณ ..
สามารถ


57

คำตอบก่อนหน้านี้เป็นรักที่ดี แต่ผมก็อยากจะพูดถึงว่ามีเป็นเทียบเท่ารูปแบบคงที่สำหรับร่อน, คุณเพียงแค่ต้องเขียนminmax(0, 1fr)แทน1frขนาดการติดตามของคุณ


6
ฉันแนะนำวิธีนี้มากกว่าคำตอบก่อนหน้าซึ่งเป็นที่ยอมรับ
Thierry Prost

แม้ว่ามันจะใช้งานได้ แต่ข้าก็ไม่เข้าใจเลย ... เจ้าช่วยอธิบายได้ไหมว่าทำไมถึงได้ผล? minmax (0, 1fr) กำลังทำอะไร ควรเป็น 0 หรือไม่? ฉันสับสน :(
BAERUS

2
minmax(0, 1fr)ใช้งาน1frได้จริงเพราะเป็นการจดชวเลขminmax(auto,1fr)ซึ่งไม่ใช่ค่าที่ถูกต้องสำหรับคำถามดั้งเดิม
Mikko Rantalainen

สำหรับรายละเอียดเพิ่มเติมโปรดดูgithub.com/w3c/csswg-drafts/issues/1777
Mikko Rantalainen

1

คำตอบที่มีอยู่แก้ปัญหากรณีส่วนใหญ่ overflow: visibleแต่ผมวิ่งเข้าไปในกรณีที่ผมจำเป็นต้องมีเนื้อหาของตารางเซลล์ที่จะเป็น ฉันแก้ไขมันโดยการวางตำแหน่งอย่างภายในเสื้อคลุม (ไม่เหมาะ แต่ฉันดีที่สุดที่รู้) เช่นนี้


.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

สิ่งที่ง่ายกว่าที่จะทำเพื่อตั้งค่าความกว้างสูงสุดของรายการกริดเช่น:

//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
  }

ฉันสับสนเล็กน้อยที่จะซื่อสัตย์ รหัสของคุณไม่เหมือนกับคำถามต้นฉบับเลยและใช้ความกว้างสูงสุด: 100% กับรายการกริด (แทนที่จะเป็นความกว้างขั้นต่ำ: 0 จากโซลูชันที่ยอมรับ) จะไม่แก้ปัญหา ...
Loilo

ความกว้างสูงสุดจะป้องกันไม่ให้ทำการปรับเทียบกับความกว้างของลูก
Pedro JR

ฉันพยายามสร้างโค้ดของคุณใหม่และใช้งานได้จริง แต่ดูเหมือนจะไม่เป็นเพราะความกว้างสูงสุด: 100% แต่เนื่องมาจากกริดคอลัมน์: span 4; โดยไม่ต้องกำหนดคอลัมน์เริ่มต้น กำหนดคอลัมน์เริ่มต้น (เช่นโดยใช้กริดคอลัมน์: 1 / span 4;) และมันจะแบ่งเค้าโครงอีกครั้ง (นั่นคือพฤติกรรมแปลก ๆ นะ แต่ฉันแน่ใจว่ามีบางมุมในสเปคที่นี้จะกำหนด.)
Loilo

เอาล่ะฟังดูดี แต่คุณยังไม่พิจารณา upvote ให้ฉันเลย
Pedro JR

ความซื่อสัตย์ตรงไปตรงมา: 1. ปัญหานี้ได้รับการแก้ไขมานานกว่าสามปี 2. คำตอบของคุณไม่ได้รับการทดสอบอย่างถูกต้อง (CSS ของคุณมีหลายประเภทที่ต้องแก้ไขก่อนที่เบราว์เซอร์จะจำตารางของคุณได้) และ 3. คำตอบของคุณไม่ได้ตอบสนองตัวอย่างในคำถามของฉัน (ไม่เช่นนั้นคุณจะรู้ว่าโซลูชันของคุณใช้ไม่ได้) - ไม่ฉันขอโทษ แต่ฉันไม่คิดว่าจะมี upvote
Loilo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.