Sel tabel CSS sama dengan lebar

148

Saya memiliki sejumlah elemen sel tabel di dalam wadah tabel.

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

Apakah ada cara CSS murni untuk mendapatkan sel tabel untuk menjadi sama lebar bahkan jika mereka memiliki ukuran konten yang berbeda di dalamnya?

Terima kasih.

Sunting: Memiliki max-width akan memerlukan mengetahui berapa banyak sel yang Anda miliki, saya pikir?

Harry
sumber
Bagaimana jumlah kolom ditentukan: sisi klien atau server?
iambriansed
Setelah saya mencoba beberapa metode, saya pikir jika Anda ingin memiliki beberapa baris dan menginginkannya dengan lebar yang sama, gunakan flexbox alih-alih tabel
Eric

Jawaban:

299

Berikut adalah biola yang berfungsi dengan jumlah sel yang tidak ditentukan: http://jsfiddle.net/r9yrM/1/

Anda dapat memperbaiki lebar untuk setiap orang tua div( tabel ), jika tidak maka akan menjadi 100% seperti biasa.

Caranya adalah dengan menggunakan table-layout: fixed;dan beberapa lebar pada setiap sel untuk memicunya, di sini 2%. Itu akan memicu algoritma tabel lainnya , yang mana browser berusaha sangat keras untuk menghormati dimensi yang ditunjukkan.
Silakan uji dengan Chrome (dan IE8- jika perlu). Tidak apa-apa dengan Safari baru-baru ini, tetapi saya tidak ingat kompatibilitas trik ini dengan mereka.

CSS (instruksi yang relevan):

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

EDIT (2013): Waspadai Safari 6 di OS X, ada table-layout: fixed; kesalahan (atau mungkin hanya berbeda, sangat berbeda dari browser lain. Saya tidak membaca-baca tata letak tabel REC CSS2.1;)). Bersiaplah untuk hasil yang berbeda.

FelipeAls
sumber
1
Terima kasih, ini sepertinya jawabannya. Saya tidak tahu mengapa, tetapi jika saya mengatur lebar menjadi 2% itu benar-benar menyapu setiap kolom menjadi 2%. Tetapi 100% tampaknya bekerja dengan baik. Adakah yang tahu apa yang terjadi di sana?
Harry
3
Saya mengalami masalah yang sama yaitu perlu menggunakan lebar 100% pada tabel-sel. Ini terjadi karena perbaikan jelas diterapkan ke elemen induk dengan tampilan: tabel. Karena sel lebar 100% tidak berfungsi di IE8, perbaikan untuk saya adalah menghapus clearfix. Semoga ini bisa membantu seseorang.
Alex Barrett
Untuk memperluas ini, ini berfungsi untuk tata letak sederhana (1x1, 2x2, 3x3, dll) tetapi tata letak yang kompleks (1x3x1, 1x2x3x4, dll) memerlukan tambahan divs dengan display:tableuntuk digunakan seolah-olah mereka adalah baris, tidak display:tabl-rowseperti yang mungkin beberapa orang harapkan. Contoh di sini .
filoxo
2
Lebar 100% tidak berfungsi pada IE8 (kejutan) tetapi saran awal untuk 2% memberikan hasil yang benar.
1
Lebar 100% juga tidak berfungsi di IE10. Ini memang bekerja di IE11. Dan lebar 1% membuat Mobile Safari menampilkan kolom yang sangat sempit. Jadi saya akhirnya menggunakan peretasan CSS yang menargetkan IE9 dan IE10: .my-cell { width: 100%; }; @media screen and (min-width:0\0) { .my-cell { width: 1%; } }Peretasan CSS berasal dari sini: 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;
}

DEMO.

Alfa
sumber
Biola tidak bekerja di sini. Sel-sel selalu 25%.
netAction
Solusi ini tidak terlalu skalabel untuk segala sesuatu yang dinamis, seperti navigasi situs yang dikendalikan oleh klien.
Eric K
Mungkin Anda benar dan btw, sudah hampir dua tahun anser @QuantumDynamix. Punya sesuatu yang lebih baik? Mengapa tidak berbagi saja ide Anda, biarkan dunia tahu hal-hal yang lebih baik :-)
The Alpha
15

Hanya menggunakan max-width: 0di display: table-cellelemen bekerja untuk saya:

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

José Antonio Postigo
sumber
1
Hanya melakukan nitpicking di sini, tetapi 0pxbukan unit yang valid. Seharusnya begitu 0.
Gavin
Ini bekerja untuk saya, tetapi bisakah Anda menjelaskan bagaimana cara kerjanya?
Emmanual
6

Menggantikan

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

dengan

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

Lihatlah semua masalah di sekitar mencoba membuat div berfungsi seperti tabel. Mereka harus menambahkan table-xxx untuk meniru tata letak tabel

Tabel didukung dan berfungsi dengan sangat baik di semua browser. Mengapa membuang mereka? fakta bahwa mereka harus meniru mereka adalah bukti bahwa mereka melakukan pekerjaan mereka dengan baik.

Menurut pendapat saya gunakan alat terbaik untuk pekerjaan itu dan jika Anda ingin data tabulasi atau sesuatu yang menyerupai tabel data tabulasi hanya bekerja.

Sangat terlambat balas saya tahu tapi layak disuarakan.

DeveloperChris
sumber
2
+1 karena berfungsi dan karena CSS masih, pada 2014 tidak melakukan ini dengan benar di semua browser.
Yuck
6
Kadang-kadang Anda ingin tata letak seperti tabel untuk hal-hal yang tidak ditabulasi data. misalnya elemen navigasi yang harus menggunakan <nav>, <ul>, dll
Ben
1
Untuk responsif, sangat ideal untuk memiliki tata letak berbasis div. Menampilkan tabel di perangkat seluler sangat merepotkan.
Pablo Rincon
Mencoba meniru suatu meja menghalangi desain yang responsif. Saya setuju jika Anda ingin desain yang responsif, tabel bukan pilihan.
DeveloperChris
2
Tabel dibuat untuk menampilkan data tabular: itu adalah, itu dan itu akan menjadi elemen HTML yang akan digunakan untuk menampilkan data tabular, mengapa ada yang membuangnya (untuk tujuan itu)? Layout tabel tidak ditiru : ini sudah menjadi bagian dari rekomendasi CSS2 untuk sementara waktu sekarang dan kebetulan bahwa layout default tabel HTML adalah display: table-etc(secara alami). Saya tidak menghabiskan hari-hari saya membuat tautan meniru divs atau div meniru tabel, rentang atau input: Saya hanya menggunakan CSS untuk styling. Akhirnya, semoga berhasil dengan IE9 untuk menerapkan nilai displayproperti lainnya ke elemen tabel, tr, td.
FelipeAls
1

ini akan bekerja untuk semua orang

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

Ini juga akan berfungsi untuk data tabel yang dibuat oleh iterasi

tcasante1
sumber
0

Ini dia:

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

Anda tidak dapat menggunakan lebar: 100px, karena tampilan adalah sel tabel. Namun Anda dapat menggunakan Max-width: 100px. maka kotak Anda tidak akan pernah menjadi lebih besar dari 100px. tetapi Anda perlu menambahkan overflow: disembunyikan untuk memastikan contect tidak berdarah ke sel lain. Anda juga dapat menambahkan ruang putih: nowrap jika Anda ingin menjaga ketinggian agar tidak bertambah.

Sammy
sumber
0

Ini dapat dilakukan dengan menyetel gaya sel tabel ke width: auto, dan konten kosong. Kolom sekarang sama lebarnya, tetapi tidak memuat konten.

Untuk memasukkan konten ke sel, tambahkan divdengan css:

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

Anda juga perlu menambahkan position: relativeke sel.

Sekarang Anda dapat memasukkan konten aktual ke div yang disebutkan di atas.

https://jsfiddle.net/vensdvvb/

RnMss
sumber