Colspan / Rowspan untuk elemen yang tampilannya diatur ke sel tabel

109

Saya memiliki kode berikut:

<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2">Cell</div>
    </div>
</div>

<style>
    .table {
        display: table;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
    }
    .colspan2 {
        /* What to do here? */
    }
</style>

Cukup mudah. Bagaimana cara menambahkan colspan (atau setara dengan colspan) untuk elemen display: table-cell?

Hantu Madara
sumber
5
Tidak bisakah kamu menggunakan meja? Akan jauh lebih mudah. Ditambah jika ini adalah data tabel, itu akan menjadi lebih semantik juga.
punkrockbuddyholly
@ thirtydot itu mungkin bisa, itu hanya akan menjadi sakit dan tidak perlu. Sistem kisi seperti 960 pada dasarnya mencapai ini, tetapi untuk seluruh tata letak halaman.
punkrockbuddyholly
@MrMisterMan: Saya tidak yakin apa yang Anda katakan. 960.gs tidak digunakan display: table-cell.
tigapuluhdot
@ thirtydot maaf, saya lupa pertanyaan spesifik yang ditanyakan OP. Anda benar, Anda tidak dapat menambahkan colspan melalui CSS. Saya menunjukkan bahwa Anda dapat membuat div berperilaku seperti baris dan kolom dan itu termasuk sel yang mencakup beberapa kolom.
punkrockbuddyholly
Gunakan tabel simulasi seperti yang Anda lakukan untuk tingkat pertama organisasi Anda, yang akan memberi Anda kemampuan untuk membuat footer lengket misalnya. untuk emulasi colspan Anda, Anda dapat membuat tabel bersarang di sel unik Anda, yang akan memiliki satu baris dan sebanyak sel yang Anda butuhkan, atau menggunakan div mengambang sederhana.
Bernard Dusablon

Jawaban:

27

Karena OP tidak secara eksplisit mengatur bahwa solusi harus CSS murni, saya akan keras kepala dan memberikan solusi yang saya temukan hari ini, terutama karena itu jauh lebih elegan daripada memiliki tabel di dalam tabel.

Contoh sama dengan <tabel> dengan dua sel per baris dan dua baris, di mana sel di baris kedua adalah td dengan colspan="2".

Saya telah menguji ini dengan Iceweasel 20, Firefox 23 dan IE 10.

div.table {
  display: table;
  width: 100px;
  background-color: lightblue;
  border-collapse: collapse;
  border: 1px solid red;
}

div.row {
  display: table-row;
}

div.cell {
  display: table-cell;
  border: 1px solid red;
}

div.colspan,
div.colspan+div.cell {
  border: 0;
}

div.colspan>div {
  width: 1px;
}

div.colspan>div>div {
  position: relative;
  width: 99px;
  overflow: hidden;
}
<div class="table">
    <div class="row">
        <div class="cell">cell 1</div>
        <div class="cell">cell 2</div>
    </div>
    <div class="row">
        <div class="cell colspan">
            <div><div>
                cell 3
            </div></div>
        </div>
        <div class="cell"></div>
    </div>
</div>

Aksi langsung (demo) di sini .

EDIT: Saya telah menyempurnakan kode agar lebih ramah printer, karena mereka membiarkan warna latar belakang secara default. Saya juga membuat rowpan-demo , terinspirasi oleh jawaban terlambat di sini.

F-3000
sumber
Saya mencari solusi serupa. Tapi sebaliknya, saya memiliki 5 sel di baris atas. Di baris bawah, saya membutuhkan 1 sel yang ukurannya sama dengan baris atas. Kemudian satu sel memiliki colspan = 2 dan sel lain memiliki colspan = 2 sehingga totalnya 5 sel di baris paling bawah juga. Inilah masalah jsfiddle berdasarkan solusi Anda. Ada pemikiran? jsfiddle.net/7wdza4ye/1
Varun Verma
1
@VarunVerma, Anda harus menambahkan sel kosong antara sel 7 dan 8. Hanya menambahkan <div class="cell"></div>karya (setidaknya dengan Firefox). Dengan desain ini, Anda perlu mengisi dengan sel kosong. Misalnya, jika Anda memilikinya sehingga sel 7 adalah colspan = 3 dan sel 8 normal, Anda memerlukan dua sel kosong antara sel 7 dan 8. Kecuali Anda mendesain sesuatu yang lain (margin? Satu div yang disesuaikan?) . Selain itu, lebar 100px dan 5 sel membuat segalanya menjadi rumit, karena kata-kata meregangkan sel css, pengaturan luapan tampaknya tidak membuat perbedaan. Anda juga perlu menghitung ulang widthuntuk div.colspan>div>div.
F-3000
itu berhasil. Terima kasih. Bahkan, saya menambahkan sel kosong setelah sel 8 karena batas bawah tidak muncul. Ini yang terbaru: jsfiddle.net/7wdza4ye/3 . Yakin bagaimana cara mendapatkan batas antara sel 7 dan 8. Ada saran? Terima kasih atas bantuan Anda.
Varun Verma
1
@VarunVerma, dengan Chrome batas luar tidak lengkap tanpa sel kosong setelah 8, jadi memang diperlukan. Cara sederhana untuk menambahkan perbatasan antara sel-sel 7 dan 8 bisa ini: div.colspan{border-left:1px solid red}. Ini harus ditempatkan di suatu tempat di bawah aturan yang menetapkan div.colspan tanpa batas, atau akan ditolak.
F-3000
Terima kasih @ F-3000. Itu sangat membantu. Selebihnya, inilah tautan terbaru berdasarkan solusi F-3000: jsfiddle.net/7wdza4ye/4
Varun Verma
16

Solusi sederhana yang berhasil untuk saya di Chrome 30:

Colspan dapat ditiru dengan menggunakan display: tablealih-alih display: table-rowuntuk baris:

.table {
    display: block;
}
.row {
    display: table;
    width: 100%;
}
.cell {
    display: table-cell;
}
.row.colspan2 {/* You'll have to add the 'colspan2' class to the row, and remove the unused <div class=cell> inside it */
    display: block;
}

Satu-satunya kelemahan adalah bahwa sel baris yang ditumpuk tidak akan sejajar secara vertikal, karena berasal dari tabel yang berbeda.

Philippe97
sumber
7

Jika Anda mencari cara CSS langsung untuk mensimulasikan colspan, Anda dapat menggunakan display: table-caption.

.table {
  display: table;
}
.row {
  display: table-row;
}
.cell {
  display: table-cell;
  border: 1px solid #000;
}
.colspan2 {
  /* What to do here? */
  display: table-caption;
}
<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2">Cell</div>
    </div>
</div>

stacigh
sumber
Itu luar biasa, kamu keren!
Raj Kamal
1
Menggunakan display: table-caption akan menjangkau semua kolom dan menempatkan baris di bagian atas tabel, seperti elemen caption dalam tabel html, jadi ini tidak benar-benar berfungsi. Hanya jika Anda ingin merentangkan semua kolom pada baris pertama atau terakhir.
Michiel
6

Cukup gunakan a table.

tabel hanya disukai saat digunakan untuk tujuan tata letak.

Ini tampak seperti data tabel (baris / kolom data). Oleh karena itu saya akan merekomendasikan menggunakan file table.

Lihat jawaban saya untuk pertanyaan ini untuk informasi lebih lanjut:

membuat hal yang sama dengan div sebagai tabel

Singkat
sumber
11
Masalahnya, ini bukan untuk data tabular, jadi saya tidak ingin menggunakan tabel :)
Madara's Ghost
13
Saya tidak mengerti mengapa membuat semua CSS berperilaku persis seperti tabel entah bagaimana lebih disukai daripada hanya menggunakan tabel. Memang tr/ tdspam bukanlah html tercantik tetapi apakah itu satu-satunya alasan? Semua orang mengatakan tabel tidak "dimaksudkan" untuk digunakan untuk pemformatan, tetapi html itu sendiri tidak "dimaksudkan" untuk melakukan setengah dari hal-hal yang kami anggap dapat diterima oleh standar saat ini, termasuk aplikasi web.
Sedikit
4
Hampir setahun kemudian, tapi - Sedikit, saya berbagi kekesalan Anda dengan orang-orang yang menghindari tabel tanpa alasan selain "tabel sudah ketinggalan zaman". Namun, saya menemukan beberapa desain responsif yang berguna untuk memiliki tabel bukan menjadi tabel, sehingga dapat diatur ulang dengan lebar yang lebih rendah. Mempelajari Saya tidak memiliki colspan untuk div agak mengecewakan.
berputar
4

Inilah salah satu cara untuk merentang kolom di CSS yang saya gunakan untuk situasi saya sendiri.

https://jsfiddle.net/mb8npttu/

<div class='table'>
    <div class='row'>
        <div class='cell colspan'>
            spanning
        </div>
        <div class='cell'></div>
        <div class='cell'></div>
    </div>

    <div class='row'>
        <div class='cell'>1</div>
        <div class='cell'>2</div>
        <div class='cell'>3</div>
    </div>
</div>

<style>
    .table { display:table; }
    .row { display:table-row; }
    .cell { display:table-cell; }
    .colspan { max-width:1px; overflow:visible; }
</style>
Tim
sumber
2
Aku harus menambah .colspandengan white-space: nowrap;untuk mendapatkan hasil yang saya inginkan, tapi bekerja hebat.
kshetline
2

Ada solusi untuk membuat colspan menjadi lebar seluruh tabel. Anda tidak dapat menggunakan teknik ini untuk mengumpulkan sebagian dari tabel.

Kode:

    *{
      box-sizing: border-box;
    }
    .table {
        display: table;
        position: relative;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
        border: 1px solid red;
        padding: 5px;
        text-align: center;
    }
    .colspan {
        position: absolute;
        left: 0;
        width: 100%;
    }
    .dummycell {
        border-color: transparent;
    }
<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell dummycell">&nbsp;</div>
        <div class="cell colspan">Cell</div>
    </div>
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
</div>

Penjelasan:

Kami menggunakan posisi absolut pada colspan untuk membuatnya menjadi lebar penuh tabel. Tabel itu sendiri membutuhkan posisi relatif. Kami menggunakan dummycell untuk menjaga ketinggian baris, posisi absolut tidak mengikuti aliran dokumen.

Tentu saja Anda juga dapat menggunakan flexbox dan grid untuk mengatasi masalah ini belakangan ini.

JT Houtenbos
sumber
1

CSS

.tablewrapper {
  position: relative;
}
.table {
  display: table;
  position: relative
}
.row {
  display: table-row;
}
.cell {
  border: 1px solid red;
  display: table-cell;
}
.cell.empty
{
  border: none;
  width: 100px;
}
.cell.rowspanned {
  position: absolute;
  top: 0;
  bottom: 0;
  width: 100px;
}
.cell.colspan {
  position: absolute;
  left: 0;
  right: 0;
}

HTML

<div class="tablewrapper">
  <div class="table">
    <div class="row">
      <div class="cell rowspanned">
        Center
      </div>
      <div class="cell">
        Top right
      </div>
    </div>
    <div class="row">
      <div class="cell empty"></div>
      <div class="cell colspan">
        Bottom right
      </div>
    </div>
  </div>
</div>

Kode

bderevyaga.dll
sumber
1

Ini dapat dilakukan hanya dengan CSS murni dan memusatkan teks di sepanjang colspan "palsu".

Triknya adalah mengatur baris ke position:relative, lalu menempatkan "div kosong" di rowtempat yang Anda inginkan colspan(harus memilikinya heightagar berfungsi), setel celltempat konten berada sebagai display:grid, dan terakhir, terapkan position:absoluteke elemen di dalam sel (dan pusatkan karena Anda dapat memusatkan elemen absolut lainnya).

 .table {
        display: table;
  }
  .row {
      display: table-row;
      position: relative;
  }
  .cell {
      display: table-cell;
      background-color: blue;
      color: white;
      height: 26px;
      padding: 0 8px;
  } 
  .colspan2 {
      display: grid;
  }
  .colspan2 p {
    position:absolute;
    left: 50%;
    transform:translateX(-50%);
    margin: 0;
  }
<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan2"><p>Cell</p></div>
        <div class="cell"></div>
    </div>
</div>

Joe82
sumber
0

Dengan menggunakan kelas div dan atribut CSS yang sesuai, Anda dapat meniru efek colspan dan rowpan yang diinginkan.

Inilah CSS

.table {
    display:table;
}

.row {
    display:table-row;
}

.cell {
    display:table-cell;
    padding: 5px;
    vertical-align: middle;
}

Berikut contoh HTMLnya

<div class="table">
    <div class="row">
        <div class="cell">
            <div class="table">
                <div class="row">
                    <div class="cell">X</div>
                    <div class="cell">Y</div>
                    <div class="cell">Z</div>
                </div>
                <div class="row">
                    <div class="cell">2</div>
                    <div class="cell">4</div>
                    <div class="cell">6</div>
                </div>
            </div>
        </div>
        <div class="cell">
            <div class="table">
                <div class="row">
                    <div class="cell">
                        <div class="table">
                            <div class="row">
                                <div class="cell">A</div>
                            </div>
                            <div class="row">
                                <div class="cell">B</div>
                            </div>
                        </div>
                    </div>
                    <div class="cell">
                        ROW SPAN
                    </div>    
                </div>
            </div>
        </div>
    </div>
</div>    

Dari apa yang saya lihat di kedua pertanyaan, dan sebagian besar tanggapan, adalah orang-orang tampaknya lupa bahwa dalam div tertentu yang bertindak sebagai "sel tabel" Anda dapat memasukkan div lain yang bertindak seperti tabel yang disematkan, dan memulai proses lebih.

*** Ini tidak glamor, tetapi berhasil bagi mereka yang mencari jenis pemformatan ini dan mereka ingin menghindari TABLE. Jika untuk TATA LETAK DATA, TABEL masih berfungsi di HTML5.

Semoga ini bisa membantu seseorang.

JRC
sumber
Pertama, HTML5 memiliki dukungan penuh <table>- hanya saja orang harus menghindari penggunaannya untuk pemformatan visual . Menggunakannya untuk menampilkan data terstruktur adalah tempat yang harus digunakan , kecuali sesuatu yang lain (seperti <ul>, sebagai contoh belaka) lebih cocok untuk tugas tersebut. Kedua, bung, 4 tabel. Anda membawa pertanyaan menarik ke tabel (baris baris), tetapi jawaban Anda menangis karena digunakan <table>. Saya harus melihat bagaimana solusi saya bekerja di sini ...
F-3000
Saya akan mengedit komentar saya sebelumnya, tetapi timelimit berhasil masuk. Seperti jawaban saya tentang colspan, rowpan dapat dicapai dengan JAUH lebih mudah daripada dengan ... pendekatan asli Anda. Lihat sendiri .
F-3000
Terima kasih atas tanggapan Anda. Saya tidak pernah mengatakan HTML5 tidak mendukung tabel. Banyak orang hanya ingin menghindarinya. Terkadang, saat menulis aplikasi web (bukan hanya halaman jenis iklan), Anda memerlukan lebih banyak tata letak tetap untuk penempatan tombol dan / atau kontrol.
JRC
0

Anda dapat menyetel posisi konten colspan sebagai "relatif" dan baris "absolut" seperti ini:

.table {
    display: table;
}
.row {
    display: table-row;
    position: relative;
}
.cell {
    display: table-cell;
}
.colspan2 {
    position: absolute;
    width: 100%;
}
Justo
sumber
0

Anda tidak dapat mencapai ini saat ini.

AFAIK ini akan dicakup oleh Tabel CSS , spesifikasi yang tampaknya saat ini berada dalam status "sedang dalam proses".

naXa
sumber
0

Anda dapat mencoba solusi ini, di mana Anda dapat menemukan cara menerapkan colspan menggunakan div https://codepen.io/pkachhia/pen/JyWMxY

HTML:

<div class="div_format">
            <div class="divTable">
                <div class="divTableBody">
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Project Name</div>
                        <div class="divTableCell cell_value">: Testing Project</div>
                        <div class="divTableCell cell_lable">Project Type</div>
                        <div class="divTableCell cell_value">: Web application</div>
                    </div>
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Version</div>
                        <div class="divTableCell cell_value">: 1.0.0</div>
                        <div class="divTableCell cell_lable">Start Time</div>
                        <div class="divTableCell cell_value">: 2016-07-10 11:00:21</div>
                    </div>
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Document Version</div>
                        <div class="divTableCell cell_value">: 2.0.0</div>
                        <div class="divTableCell cell_lable">End Time</div>
                        <div class="divTableCell cell_value">: 2017-07-10 11:00:23</div>
                    </div>
                    <div class="divTableRow">
                        <div class="divTableCell cell_lable">Document Revision</div>
                        <div class="divTableCell cell_value">: 3</div>
                        <div class="divTableCell cell_lable">Overall Result</div>
                        <div class="divTableCell cell_value txt_bold txt_success">: Passed</div>
                    </div>                          
                </div>
                <div class="divCaptionRow">
                    <div class="divCaptionlabel">Description</div>
                    <div class="divCaptionValue">: Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore</div>
                </div>
            </div>
        </div>

CSS:

body {
                font-family: arial
            }
            * {
                -webkit-box-sizing: border-box;
                -moz-box-sizing: border-box;
                box-sizing: border-box
            }
            .div_format {
                width: 100%;
                display: inline-block;
                position: relative
            }           
            .divTable {
                display: table;
                width: 100%;            
            }
            .divTableRow {
                display: table-row
            }
            .divTableHeading {
                background-color: #EEE;
                display: table-header-group
            }
            .divTableCell,
            .divTableHead {
                display: table-cell;
                padding: 10px
            }
            .divTableHeading {
                background-color: #EEE;
                display: table-header-group;
                font-weight: bold
            }
            .divTableFoot {
                background-color: #EEE;
                display: table-footer-group;
                font-weight: bold
            }
            .divTableBody {
                display: table-row-group
            }
            .divCaptionRow{
                display: table-caption;
                caption-side: bottom;
                width: 100%;
            }
            .divCaptionlabel{
                caption-side: bottom;
                display: inline-block;
                background: #ccc;
                padding: 10px;
                width: 15.6%;
                margin-left: 10px;
                color: #727272;
            }
            .divCaptionValue{
                float: right;
                width: 83%;
                padding: 10px 1px;
                border-bottom: 1px solid #dddddd;
                border-right: 10px solid #fff;
                color: #5f5f5f;
                text-align: left;
            }

            .cell_lable {
                background: #d0d0d0;
                border-bottom: 1px solid #ffffff;
                border-left: 10px solid #ffffff;
                border-right: 10px solid #fff;
                width: 15%;
                color: #727272;
            }
            .cell_value {
                border-bottom: 1px solid #dddddd;
                width: 30%;
                border-right: 10px solid #fff;   
                color: #5f5f5f;
            }
pkachhia.dll
sumber
-1

Meskipun ini adalah pertanyaan lama, saya ingin membagikan solusi saya untuk masalah ini.

<div class="table">
    <div class="row">
        <div class="cell">Cell</div>
        <div class="cell">Cell</div>
    </div>
    <div class="row">
        <div class="cell colspan">
            <div class="spanned-content">Cell</div>
        </div>
    </div>
</div>

<style>
    .table {
        display: table;
    }
    .row {
        display: table-row;
    }
    .cell {
        display: table-cell;
    }
    .colspan:after {
        /* What to do here? */
        content: "c";
        display: inline;
        visibility: hidden;
    }
    .spanned-content {
        position: absolute;
    }
</style>

Ini biola . Ini sebenarnya bukan rentang, dan solusinya agak hack, tetapi berguna dalam beberapa situasi. Diuji di Chrome 46, Firefox 31 dan IE 11.

Dalam kasus saya, saya harus menyajikan beberapa data non-tabular dengan cara tabular, menjaga lebar kolom dan memberi judul pada sub-bagian data.

Gabriel
sumber
Tentu saja, Anda selalu dapat mengandalkan solusi jaringan seperti Bootstrap. Dalam kasus khusus ini, saya sangat membutuhkan lebar otomatis yang menawarkan tampilan: tabel.
Gabriel
Selain itu, jika Anda ingin memberikan warna latar belakang pada konten yang direntangkan, Anda harus mengisi tr Anda dengan jumlah penuh tds :(
Gabriel
Saya akhirnya membuat tabel, dan mendefinisikan kembali konsep saya tentang "data tabel" ^^
Gabriel
-2

Gunakan tabel bersarang untuk menyarangkan rentang kolom ...

<div class="table">
  <div class="row">
    <div class="cell">
      <div class="table">
        <div class="row">
          <div class="cell">Cell</div>
          <div class="cell">Cell</div>
        </div>
      </div>
    </div>
  </div>

  <div class="row">
    <div class="cell">Cell</div>
  </div>
</div>

Atau gunakan 2 tabel di mana rentang kolom mencakup seluruh baris ...

<div class="table">
  <div class="row">
    <div class="cell">Cell</div>
    <div class="cell">Cell</div>
  </div>
</div>

<div class="table">
  <div class="row">
    <div class="cell">Cell</div>
  </div>
</div>
Henry George
sumber
2
Pertanyaannya adalah, bagaimana melakukannya dengan menggunakan CSS.
Enno Gröper
4
Maaf, tapi kedengarannya ide yang sangat buruk.
Hantu Madara