การตัดตาราง CSS


126

เป็นไปได้ไหมที่จะสร้าง CSS grid wrap โดยไม่ต้องใช้มีเดีย

ในกรณีของฉันฉันมีจำนวนรายการที่ไม่สามารถกำหนดได้ซึ่งฉันต้องการวางไว้ในตารางและฉันต้องการให้เส้นตารางนั้นรวมเข้าด้วยกัน ด้วยการใช้ Flexbox ฉันไม่สามารถจัดพื้นที่ได้อย่างน่าเชื่อถือ ฉันต้องการหลีกเลี่ยงการค้นหาสื่อมากมายเช่นกัน

นี่คือโค้ดตัวอย่างบางส่วน :

.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>

และนี่คือภาพ GIF:

ภาพ GIF ของสิ่งที่ฉันเห็น

โปรดทราบว่าหากใครสามารถบอกฉันได้ว่าฉันสามารถหลีกเลี่ยงการระบุความกว้างของรายการทั้งหมดเช่นที่ฉันอยู่ด้วยgrid-template-columnsได้อย่างไรจะดีมาก ฉันต้องการให้เด็กระบุความกว้างของตัวเอง


2
grid-template-columns: auto auto auto auto;ทำงานในกรณีนี้หรือไม่ =)
Jakub Chlebowicz

คำตอบ:


219

ใช้อย่างใดอย่างหนึ่งauto-fillหรือauto-fitเป็นหมายเลขการทำซ้ำของrepeat()สัญกรณ์

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

auto-fill

เมื่อauto-fillกำหนดให้เป็นหมายเลขการทำซ้ำหากคอนเทนเนอร์กริดมีขนาดที่แน่นอนหรือขนาดสูงสุดในแกนที่เกี่ยวข้องจำนวนของการทำซ้ำจะเป็นจำนวนเต็มบวกที่ใหญ่ที่สุดเท่าที่จะเป็นไปได้ซึ่งจะไม่ทำให้กริดล้นคอนเทนเนอร์กริด

.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>

กริดจะทำซ้ำแทร็กให้มากที่สุดโดยไม่ต้องล้นคอนเทนเนอร์

ใช้การเติมอัตโนมัติเป็นหมายเลขการทำซ้ำของสัญกรณ์ repeat ()

ในกรณีนี้จากตัวอย่างด้านบน(ดูภาพ)มีเพียง 5 แทร็กเท่านั้นที่สามารถใส่กริดคอนเทนเนอร์ได้โดยไม่ล้น มีเพียง 4 รายการในตารางของเราดังนั้นรายการที่ห้าจึงถูกสร้างขึ้นเป็นแทร็กว่างภายในพื้นที่ที่เหลือ

พื้นที่ที่เหลือแทร็ก # 6 สิ้นสุดกริดโจ่งแจ้ง ซึ่งหมายความว่ามีพื้นที่ไม่เพียงพอที่จะวางแทร็กอื่น


auto-fit

auto-fitคำหลักที่มีลักษณะการทำงานเช่นเดียวกับการauto-fillยกเว้นว่าหลังจากที่ตำแหน่งรายการตารางอัลกอริทึมแทร็คที่ว่างใด ๆ 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>

ตารางจะยังคงทำซ้ำเป็นแทร็คให้มากที่สุดเท่าที่เป็นไปได้โดยไม่ต้องล้นภาชนะที่ใช้บรรจุ 0แต่แทร็คที่ว่างเปล่าจะทรุดลงไป

0pxติดตามยุบจะถือว่าเป็นมีฟังก์ชั่นการติดตามการปรับขนาดคงที่

ใช้การปรับให้พอดีอัตโนมัติเป็นหมายเลขการทำซ้ำของสัญลักษณ์การทำซ้ำ ()

แตกต่างจากauto-fillตัวอย่างรูปภาพแทร็กที่ห้าที่ว่างเปล่าจะถูกยุบและสิ้นสุดกริดที่ชัดเจนหลังจากรายการที่ 4


auto-fill เทียบกับ auto-fit

ความแตกต่างระหว่างทั้งสองจะสังเกตเห็นได้ชัดเจนเมื่อใช้minmax()ฟังก์ชัน

ใช้minmax(186px, 1fr)เพื่อกำหนดช่วงรายการตั้งแต่186pxถึง186pxบวกเศษของพื้นที่ที่เหลือในคอนเทนเนอร์กริด

เมื่อใช้auto-fillไอเทมจะเพิ่มขึ้นเมื่อไม่มีพื้นที่ว่างให้วางแทร็กว่าง

.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>

เมื่อใช้รายการที่จะเติบโตเพื่อเติมเต็มพื้นที่ที่เหลือเพราะทุกเพลงที่ว่างเปล่าจะทรุดลงไปauto-fit0px

.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>


สนามเด็กเล่น:

CodePen

กำลังตรวจสอบแทร็กที่เติมอัตโนมัติ

เติมอัตโนมัติ


กำลังตรวจสอบแทร็กที่ปรับให้พอดีอัตโนมัติ

พอดีอัตโนมัติ


3
มีวิธีใดบ้างที่จะทำให้มันอยู่กึ่งกลางรายการที่อยู่ในบรรทัดถัดไป?
kentcdodds

เช่นเดียวกับที่คุณทำกับกล่องดิ้นในการdisplay: gridใช้องค์ประกอบjustify-content: center
Spittal

Dear @Ricky วิธีการทำเพื่อให้คุณสมบัติแรกของ minmax เช่น. repeat(auto-fill, minmax(186px, 1fr));ไม่ใช่พิกเซล แต่ตราบใดที่ div มีข้อความอยู่ข้างใน?
mesqueeb

1
@mesqueeb เป็นไปไม่ได้ต้องมีขนาดที่แน่นอน คุณสามารถดูคำตอบนี้สำหรับรายละเอียดเพิ่มเติม
Ricky

1
มีวิธีใดบ้างที่จะทำให้เมื่อต้องไปที่บรรทัดถัดไปสองรายการลงไปแทนที่จะเป็นเพียงรายการเดียว ชอบจาก 4 เป็น 2 เป็น 1 และไม่มี 4 เป็น 3 เป็น 2 เป็น 1?
sammiepls

16

คุณต้องการอย่างใดอย่างหนึ่งauto-fitหรือauto-fillภายในrepeat()ฟังก์ชัน:

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

ความแตกต่างระหว่างทั้งสองจะชัดเจนหากคุณใช้ a minmax()เพื่ออนุญาตขนาดคอลัมน์ที่ยืดหยุ่น:

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

ซึ่งจะช่วยให้คอลัมน์ของคุณมีขนาดที่ยืดหยุ่นได้ตั้งแต่ 186 พิกเซลไปจนถึงคอลัมน์ที่มีความกว้างเท่ากันซึ่งทอดยาวตลอดความกว้างเต็มของคอนเทนเนอร์ auto-fillจะสร้างคอลัมน์ให้มากที่สุดเท่าที่จะพอดีกับความกว้าง ถ้าสมมติว่าห้าคอลัมน์พอดีแม้ว่าคุณจะมีรายการตารางเพียงสี่รายการ แต่จะมีคอลัมน์ว่างที่ห้า:

ใส่คำอธิบายภาพที่นี่

การใช้auto-fitแทนจะป้องกันไม่ให้คอลัมน์ว่างยืดของคุณเพิ่มเติมหากจำเป็น

ใส่คำอธิบายภาพที่นี่


7

คุณอาจกำลังมองหาauto-fill:

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

การสาธิต: http://codepen.io/alanbuchanan/pen/wJRMox

หากต้องการใช้พื้นที่ว่างให้มีประสิทธิภาพมากขึ้นคุณสามารถใช้minmaxและส่งผ่านautoเป็นอาร์กิวเมนต์ที่สอง:

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

การสาธิต: http://codepen.io/alanbuchanan/pen/jBXWLR

หากคุณไม่ต้องการให้คอลัมน์ว่างคุณสามารถใช้auto-fitแทนauto-fill.


2
มีวิธีใดบ้างที่จะทำให้มันอยู่กึ่งกลางรายการที่อยู่ในบรรทัดถัดไป?
kentcdodds

3

ฉันมีสถานการณ์ที่คล้ายกัน นอกเหนือจากสิ่งที่คุณทำฉันต้องการให้คอลัมน์ของฉันอยู่ตรงกลางในคอนเทนเนอร์ในขณะที่ไม่อนุญาตให้คอลัมน์ว่างไปทางซ้ายหรือขวา:

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

เรื่อง"ในขณะที่ไม่อนุญาตให้คอลัมน์ว่างสำหรับพวกเขา" : คุณหมายความว่า"ในขณะที่ไม่อนุญาตให้คอลัมน์ที่ว่างเปล่าอย่างใดอย่างหนึ่งสำหรับพวกเขา" ( ไปเกินไปอย่างใดอย่างหนึ่ง ) หรือ"ในขณะที่ไม่อนุญาตให้คอลัมน์ว่างเปล่าสำหรับพวกเขา" (โดยไม่ต้องไป )? หรืออย่างอื่น (ดูเหมือนจะคำนวณไม่ได้)?
Peter Mortensen

1

นี่คือความพยายามของฉัน ขอโทษนะฉันรู้สึกสร้างสรรค์เป็นพิเศษ

วิธีการของฉันคือผู้ปกครองdivกับการแก้ไข มิติ ส่วนที่เหลือเป็นเพียงการปรับเนื้อหาภายใน div ให้เหมาะสม

การดำเนินการนี้จะทำการปรับขนาดภาพใหม่โดยไม่คำนึงถึงอัตราส่วนภาพ จะไม่มีการครอบตัดอย่างหนักเช่นกัน

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>

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.