CSS ตารางเซลล์กว้างเท่ากัน


148

ฉันมีองค์ประกอบตารางเซลล์จำนวนไม่แน่นอนภายในคอนเทนเนอร์ตาราง

<div style="display:table;">
  <div style="display:table-cell;"></div>
  <div style="display:table-cell;"></div>
</div>

มีวิธี CSS อย่างแท้จริงในการทำให้เซลล์ตารางมีความกว้างเท่ากันแม้ว่าจะมีเนื้อหาที่มีขนาดต่างกันหรือไม่?

ขอบคุณ

แก้ไข: การมีความกว้างสูงสุดจะทำให้รู้ว่าคุณคิดว่ามีกี่เซลล์?


จำนวนคอลัมน์ถูกกำหนดอย่างไร: ฝั่งไคลเอ็นต์หรือเซิร์ฟเวอร์
iambriansreed

หลังจากที่ฉันลองใช้วิธีการบางอย่างฉันคิดว่าถ้าคุณต้องการมีหลายแถวและต้องการให้มีความกว้างเท่ากันให้ใช้ flexbox แทนตาราง
Eric

คำตอบ:


299

นี่คือซอที่ใช้งานได้ซึ่งมีจำนวนเซลล์ไม่แน่นอน: http://jsfiddle.net/r9yrM/1/

คุณสามารถกำหนดความกว้างให้กับผู้ปกครองแต่ละคนdiv( ตาราง ) มิฉะนั้นจะเป็น 100% ตามปกติ

เคล็ดลับคือการใช้table-layout: fixed;และความกว้างบางส่วนของแต่ละเซลล์เพื่อเรียกใช้ที่นี่ 2% สิ่งนี้จะทริกเกอร์ตารางอื่น ๆซึ่งเป็นที่ที่เบราว์เซอร์พยายามอย่างหนักเพื่อเคารพขนาดที่ระบุ
กรุณาทดสอบด้วย Chrome (และ IE8- ถ้าจำเป็น) ไม่เป็นไรกับ Safari ล่าสุด แต่ฉันจำความเข้ากันได้ของเคล็ดลับนี้กับพวกเขาไม่ได้

CSS (คำแนะนำที่เกี่ยวข้อง):

div {
    display: table;
    width: 250px;
    table-layout: fixed;
}

div > div {
    display: table-cell;
    width: 2%; /* or 100% according to OP comment. See edit about Safari 6 below */
}

แก้ไข (2013): ระวัง Safari 6 บน OS X มันtable-layout: fixed; ผิด (หรืออาจจะแตกต่างจากเบราว์เซอร์อื่น ๆ มากฉันไม่ได้อ่านเค้าโครงของตาราง CSS2.1 REC เพื่ออ่าน) ได้เตรียมผลลัพธ์ที่แตกต่าง


1
ขอบคุณดูเหมือนว่าคำตอบ ฉันไม่รู้ว่าทำไม แต่ถ้าฉันตั้งค่าความกว้างเป็น 2% จริง ๆ แล้ว scrunges แต่ละคอลัมน์เป็น 2% แต่ 100% ดูเหมือนว่าจะทำงานได้ดี ความคิดใด ๆ ที่เกิดขึ้นที่นั่น?
แฮร์รี่

3
ฉันพบปัญหาเดียวกันกับที่ต้องใช้ความกว้าง 100% ในเซลล์ตาราง สิ่งนี้เกิดขึ้นเนื่องจาก clearfix นำไปใช้กับองค์ประกอบพาเรนต์ที่มีตารางแสดงผล: เนื่องจากเซลล์ความกว้าง 100% ใช้งานไม่ได้ใน IE8 การแก้ไขสำหรับฉันคือการลบ clearfix หวังว่านี่จะช่วยใครซักคน
Alex Barrett

การขยายตัวนี้งานนี้สำหรับรูปแบบง่าย (1x1, 2x2, 3x3, ฯลฯ ) แต่รูปแบบที่ซับซ้อน (1x3x1, 1x2x3x4 ฯลฯ ) ต้องเพิ่มเติมdivs พร้อมด้วยdisplay:tableที่จะใช้เป็นว่าพวกเขาเป็นแถวไม่display:tabl-rowเป็นบางคนอาจจะคาดหวังว่า ตัวอย่างที่นี่
filoxo

2
ความกว้าง 100% ไม่ทำงานบน IE8 (แปลกใจ) แต่คำแนะนำเริ่มต้นสำหรับ 2% ให้ผลลัพธ์ที่ถูกต้อง

1
ความกว้าง 100% ไม่ทำงานใน IE10 มันไม่ได้ทำงานใน IE11 และความกว้าง 1% ทำให้ Mobile Safari แสดงคอลัมน์ที่แคบมาก ดังนั้นฉันจึงใช้ CSS แฮ็คที่กำหนดเป้าหมาย IE9 และ IE10: .my-cell { width: 100%; }; @media screen and (min-width:0\0) { .my-cell { width: 1%; } }แฮ็ค CSS มาจากที่นี่: stackoverflow.com/a/24321386/6962
Henrik N

29

HTML

<div class="table">
    <div class="table_cell">Cell-1</div>
    <div class="table_cell">Cell-2 Cell-2 Cell-2 Cell-2Cell-2 Cell-2</div>
    <div class="table_cell">Cell-3Cell-3 Cell-3Cell-3 Cell-3Cell-3</div>
    <div class="table_cell">Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4Cell-4</div>
</div>

CSS

.table{
    display:table;
    width:100%;
    table-layout:fixed;
}
.table_cell{
    display:table-cell;
    width:100px;
    border:solid black 1px;
}

การสาธิต.


ซอไม่ทำงานที่นี่ เซลล์มักจะ 25%
netAction

โซลูชันนี้ไม่สามารถปรับขนาดได้สำหรับทุกสิ่งที่มีไดนามิกเช่นการนำทางไซต์ที่ควบคุมโดยไคลเอนต์
Eric K

อาจเป็นคุณที่ถูกต้องและ btw มันเป็น anser เกือบสองปี @QuantumDynamix มีอะไรที่ดีกว่าในใจ? ทำไมไม่เพียงแค่แชร์ความคิดของคุณให้โลกรู้ว่าสิ่งที่ดีกว่า :-)
The Alpha

15

เพียงแค่ใช้max-width: 0ในdisplay: table-cellองค์ประกอบที่ทำงานให้ฉัน:

.table {
  display: table;
  width: 100%;
}

.table-cell {
  display: table-cell;
  max-width: 0px;
  border: 1px solid gray;
}
<div class="table">
  <div class="table-cell">short</div>
  <div class="table-cell">loooooong</div>
  <div class="table-cell">Veeeeeeery loooooong</div>
</div>


1
เพียง nitpicking ที่นี่ แต่0pxไม่ใช่หน่วยที่ถูกต้อง 0มันก็ควรจะเป็น
กาวิน

สิ่งนี้ใช้ได้กับฉัน แต่คุณช่วยอธิบายได้อย่างไรว่ามันทำงานอย่างไร
Emmanual

6

แทนที่

  <div style="display:table;">
    <div style="display:table-cell;"></div>
    <div style="display:table-cell;"></div>
  </div>

กับ

  <table>
    <tr><td>content cell1</td></tr>
    <tr><td>content cell1</td></tr>
  </table>

ดูปัญหาทั้งหมดที่อยู่รอบ ๆ ซึ่งพยายามทำให้ div ทำงานได้เหมือนตาราง พวกเขาต้องเพิ่ม table-xxx เพื่อเลียนแบบเลย์เอาต์ของตาราง

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

ในความคิดของฉันใช้เครื่องมือที่ดีที่สุดสำหรับงานและถ้าคุณต้องการข้อมูลที่มีตารางหรือสิ่งที่มีลักษณะคล้ายกับตารางข้อมูลแบบตารางเพียงแค่ทำงาน

ตอบกลับช้ามากฉันรู้ แต่ก็คุ้มค่าที่จะพูด


2
+1 เพราะใช้งานได้และเนื่องจาก CSS ยังคงอยู่ในปี 2014ไม่สามารถทำสิ่งนี้ได้อย่างถูกต้องในทุกเบราว์เซอร์
Yuck

6
บางครั้งคุณต้องการเค้าโครงเหมือนโต๊ะสำหรับสิ่งที่ไม่ใช่ข้อมูลแบบตาราง เช่นองค์ประกอบนำทางซึ่งควรใช้<nav>, <ul>ฯลฯ
เบน

1
เพื่อตอบสนองมันเหมาะที่จะมีเค้าโครงตาม div การแสดงตารางในอุปกรณ์มือถือเป็นความเจ็บปวดในตูด
Pablo Rincon

พยายามเลียนแบบตารางทำให้การออกแบบตอบสนองไม่ได้ ฉันเห็นด้วยถ้าคุณต้องการการออกแบบที่ตอบสนองต่อตารางไม่ใช่ตัวเลือก
DeveloperChris

2
ตารางถูกสร้างขึ้นเพื่อแสดงข้อมูลตาราง: มันเป็นและมันจะเป็นองค์ประกอบ HTML เพื่อใช้ในการแสดงข้อมูลตารางทำไมทุกคนจะคลองพวกเขา (เพื่อจุดประสงค์)? รูปแบบตารางไม่ได้เลียนแบบ : เป็นส่วนหนึ่งของคำแนะนำ CSS2 ในขณะนี้และมันเกิดขึ้นที่เค้าโครงเริ่มต้นของตาราง HTML นั้นdisplay: table-etcค่อนข้างเป็นธรรมชาติ ฉันไม่ได้ใช้เวลาทั้งวันในการสร้างลิงค์เลียนแบบ divs หรือ divs การลอกเลียนแบบตารางช่วงหรืออินพุต: ฉันแค่ใช้ CSS สำหรับการจัดแต่งทรงผม ท้ายที่สุดขอให้โชคดีกับ IE9 สำหรับการใช้displayคุณสมบัติอื่น ๆ กับองค์ประกอบ table, tr, td
FelipeAls

1

มันจะใช้ได้กับทุกคน

<table border="your val" cellspacing="your val" cellpadding="your val" role="grid" style="width=100%; table-layout=fixed">
<!-- set the table td element roll attr to gridcell -->
<tr>
<td roll="gridcell"></td>
</tr>
</table>

สิ่งนี้จะใช้ได้กับข้อมูลตารางที่สร้างโดยการทำซ้ำ


0

ไปเลย:

http://jsfiddle.net/damsarabi/gwAdA/

คุณไม่สามารถใช้ความกว้าง: 100px เนื่องจากจอแสดงผลเป็นเซลล์แบบตาราง อย่างไรก็ตามคุณสามารถใช้ความกว้างสูงสุด: 100px จากนั้นกล่องของคุณจะไม่ใหญ่กว่า 100px แต่คุณต้องเพิ่มโอเวอร์โฟลว์: ซ่อนเพื่อให้แน่ใจว่าส่วนที่ไม่ถูกเลือดออกไปยังเซลล์อื่น คุณสามารถเพิ่ม white-space: nowrap หากคุณต้องการป้องกันไม่ให้ความสูงเพิ่มขึ้น


0

สิ่งนี้สามารถทำได้โดยการตั้งค่าสไตล์ของตารางเซลล์เป็นwidth: autoและเนื้อหาว่างเปล่า ขณะนี้คอลัมน์มีความกว้างเท่ากัน แต่ไม่มีเนื้อหา

ในการแทรกเนื้อหาลงในเซลล์ให้เพิ่มdivด้วย css:

position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;

คุณต้องเพิ่มposition: relativeไปยังเซลล์

ตอนนี้คุณสามารถใส่เนื้อหาจริงลงใน div ที่พูดถึงข้างต้น

https://jsfiddle.net/vensdvvb/

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