HTML colspan dalam CSS

251

Saya mencoba membuat tata letak yang mirip dengan yang berikut:

+---+---+---+
|   |   |   |
+---+---+---+
|           |
+-----------+

di mana bagian bawah mengisi ruang baris atas.

Jika ini adalah tabel aktual, saya dapat dengan mudah melakukannya <td colspan="3">, tetapi karena saya hanya membuat tata letak seperti tabel , saya tidak dapat menggunakan <table>tag. Apakah ini mungkin menggunakan CSS?

Menara
sumber
8
Solusi terbaik sangat tergantung pada apa yang masuk ke tabel. Jika itu data (sesuatu yang termasuk dalam tabel) maka gunakan tabel. Jika Anda menggunakan tabel untuk mengontrol tata letak halaman, maka salah satu solusi HTML + CSS di bawah ini lebih baik.
mwcz
Tambahkan markup untuk kedua kasus, lalu tampilkan hanya satu per satu menggunakan kelas CSS kueri Media.
DigitalDesignDj
2
Lupakan CSS. Jika Anda menampilkan data tabular, Anda tentu akan tahu berapa banyak kolom yang akan span. Gunakan colspanatribut
Tihomir Mitkov
Saya akan melakukan ini dengan bootstrap atau grid yang disesuaikan dari bootstrap
Arun Prasad ES
Jika Anda menggunakan CSS3, Anda dapat menggunakan columnSpan. Tidak seperti <td colspan = "#">, Anda tidak memiliki opsi untuk mengatur jumlah kolom, tetapi Anda dapat merentangkan semua kolom. w3schools.com/cssref/css3_pr_column-span.asp
MistyDawn

Jawaban:

407

Tidak ada analog CSS sederhana dan elegan untuk colspan.

Pencarian pada masalah ini akan menghasilkan berbagai solusi yang mencakup sejumlah alternatif, termasuk penentuan posisi absolut, ukuran, bersama dengan variasi serupa dari peringatan khusus peramban dan keadaan. Baca, dan buat keputusan terinformasi terbaik berdasarkan apa yang Anda temukan.

David
sumber
10
Tabel adalah elemen struktural dan hanya karena menggunakan perubahan colspan penampilannya tidak berarti tidak. CSS digunakan untuk elemen gaya dan tidak mengubah struktur. W3C membahas struktur tabel di sini: w3.org/TR/html401/struct/tables.html#h-11.2
Rob
88
Rob, pahami posisi Anda, tetapi lihatlah dalam rekomendasi W3C - khususnya yang berkaitan dengan seluruh paradigma tabel - dan Anda akan menemukan bahwa bagian dari pertimbangan mereka adalah, tentu saja, presentasi tabel. Gagasan bahwa tabel murni dipahami sebagai struktur adalah fiksi kontemporer, saya pikir kita semua akan lebih baik dilayani untuk berhenti menyebar. Intinya adalah kita harus berhenti bersikap dogmatis tentang tabel. Akan salah bagi saya untuk mengatakan mereka selalu presentasi, dan sama salahnya jika Anda mengatakan bahwa mereka selalu terstruktur. Kenyataannya tidak sesederhana itu.
David
4
Sepertinya jawaban Anda adalah jawaban yang populer. :) Saya senang mengetahui bahwa dogma anti-tabel (yang telah saya terima) terlalu ketat. Saya berdiri dengan jawaban saya hanya sejauh saya masih berpikircolspan alat yang tepat untuk pekerjaan itu. Jawaban saya adalah 75% benar, dan jawaban Anda 100% benar. Anda harus kembali ke SO.
mwcz
71
Setelah 2 tahun, saya googled ini dan ingin memilih penulis tetapi katanya "tidak dapat memilih posting Anda sendiri" dan saya menyadari itu adalah saya, lol. Saya memutuskan untuk mengubah solusi yang diterima untuk yang satu ini karena saya merasa memiliki informasi yang lebih baik.
Menara
14
Ini adalah esai mini tentang beberapa jawaban lain (tidak spesifik), bukan jawaban untuk pertanyaan yang diajukan.
Jukka K. Korpela
56

Tidak ada colspan di css sejauh yang saya tahu, tetapi akan ada column-spantata letak multi-kolom dalam waktu dekat, tetapi karena itu hanya konsep di CSS3, Anda dapat memeriksanya di sini . Lagi pula Anda dapat melakukan solusi menggunakan divdan spandengan tampilan seperti tabel seperti ini.

Ini akan menjadi HTML:

<div class="table">
  <div class="row">
    <span class="cell red first"></span>
    <span class="cell blue fill"></span>
    <span class="cell green last"></span>
  </div>
</div>
<div class="table">
  <div class="row">
    <span class="cell black"></span>
  </div>
</div>

Dan ini akan menjadi css:

  /* this is to reproduce table-like structure
     for the sake of table-less layout. */
  .table { display:table; table-layout:fixed; width:100px; }
  .row { display:table-row; height:10px; }
  .cell { display:table-cell; }

  /* this is where the colspan tricks works. */
  span { width:100%; }

  /* below is for visual recognition test purposes only. */
  .red { background:red; }
  .blue { background:blue; }
  .green { background:green; }
  .black { background:black; }

  /* this is the benefit of using table display, it is able 
     to set the width of it's child object to fill the rest of 
     the parent width as in table */
  .first { width: 20px; }
  .last { width: 30px; }
  .fill { width: 100%; }

Satu-satunya alasan untuk menggunakan trik ini adalah untuk mendapatkan manfaat dari table-layoutperilaku, saya menggunakannya banyak jika hanya mengatur div dan lebar rentang persentase tertentu tidak memenuhi persyaratan desain kami.

Tetapi jika Anda tidak perlu mendapat manfaat dari table-layoutperilaku, maka jawaban durilai akan cukup cocok untuk Anda.

Hendra Uzia
sumber
4
Yup, tapi sedikit perbaikan: bukannya .span { ...seharusnya span { ....
Slavik Meltser
2
Menggunakan divtag untuk menampilkan data tabular sama buruknya dengan menggunakan tables untuk mengontrol tata letak halaman
Tihomir Mitkov
1
@TichomirMitkov tergantung apakah Anda menggunakan desain responsif atau tidak untuk mengubah tata letak - dalam hal ini terkadang ini bisa bekerja dengan baik.
Simon_Weaver
4
Ini tidak benar-benar menjawab pertanyaan karena pada dasarnya Anda memiliki dua tabel setelah satu sama lain dalam contoh yang Anda berikan. (Ietwo divs dengan "tabel" kelas)
Musim Dingin
21

Saran lain adalah menggunakan flexbox, bukan tabel sama sekali. Ini adalah "browser modern", tentu saja, tetapi ayolah, ini 2016;)

Setidaknya ini mungkin menjadi solusi alternatif bagi mereka yang mencari jawaban untuk ini saat ini, karena pos aslinya berasal dari 2010.

Berikut ini panduan hebat: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

.table {
  border: 1px solid red;
  padding: 2px;
  max-width: 300px;
  display: flex;
  flex-flow: row wrap;
}
.table-cell {
  border: 1px solid blue;
  flex: 1 30%;
}
.colspan-3 {
  border: 1px solid green;
  flex: 1 100%;
}
<div class="table">
  <div class="table-cell">
    row 1 - cell 1
  </div>
  <div class="table-cell">
    row 1 - cell 2
  </div>
  <div class="table-cell">
    row 1 - cell 3
  </div>
  <div class="table-cell colspan-3">
    row 2 - cell 1 (spans 3 columns)
  </div>
</div>

Musim dingin
sumber
8
<div style="width: 100%;">
    <div style="float: left; width: 33%;">Row 1 - Cell 1</div>
    <div style="float: left; width: 34%;">Row 1 - Cell 2</div>
    <div style="float: left; width: 33%;">Row 1 - Cell 3</div>
</div>
<div style="clear: left; width: 100%;">
Row 2 - Cell 1
</div>
Dustin Laine
sumber
Saya tidak bisa mengetahui lebar sel.
Tower
1
Maka jangan meletakkan lebar. Seharusnya tidak masalah. Tetapi jika Anda ingin mereka membentang dengan lebar yang sama maka dua div utama harus memiliki lebar yang sama.
Dustin Laine
1
Anda dapat menggunakan width: calc (100% / 3) yang akan sedikit lebih baik daripada memberi yang tengah 1% lebih banyak
ii iml0sto1
5

Itu bukan bagian dari lingkup CSS. colspanmenjelaskan struktur konten halaman, atau memberi makna pada data dalam tabel, yang merupakan pekerjaan HTML.

mwcz
sumber
OP dengan jelas menyebutkan "menciptakan tata letak seperti tabel ", tanpa makna struktural. Bukankah itu tujuan utama tabel CSS? Tidak ada alasan obyektif untuk memperlakukan properti colspan secara berbeda dari seluruh tabel, jika ada elemen tabel CSS hanya desain, mengapa bukan properti CSS colspan hanya desain ...
Skippy le Grand Gourou
2
Lihatlah jawaban pilihan teratas untuk pertanyaan ini. Sentimen Anda sudah dibahas di sana dan saya cenderung setuju dengannya. Pendapat saya tentang masalah ini telah bergeser dalam lima tahun sejak saya menulis jawaban ini.
mwcz
4

Untuk memberikan jawaban terkini: Cara terbaik untuk melakukannya hari ini adalah dengan menggunakan tata letak css seperti ini:

.container {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  grid-template-rows: auto;
  grid-template-areas: 
    "top-left top-middle top-right"
    "bottom bottom bottom"
}

.item-a {
  grid-area: top-left;
}
.item-b {
  grid-area: top-middle;
}
.item-c {
  grid-area: top-right;
}
.item-d {
  grid-area: bottom;
}

dan HTML

<div class="item-a">1</div>
<div class="item-b">2</div>
<div class="item-c">3</div>
<div class="item-d">123</div>
Toby 1 Kenobi
sumber
3

Anda dapat mencoba menggunakan sistem kisi seperti http://960.gs/

Kode Anda akan menjadi seperti ini, dengan asumsi Anda menggunakan tata letak "12 kolom":

<div class="container_12">
<div class="grid_4">1</div><div class="grid_4">2</div><div class="grid_4">3</div>
<div class="clear"></div>
<div class="grid_12">123</div>
</div>
Jeff
sumber
3

Coba tambahkan display: table-cell; width: 1%;ke elemen sel tabel Anda.

Ismail Farooq
sumber
bagaimana itu akan membantu? Konsep dasar dari sebuah tabel adalah bahwa setiap baris memiliki sel yang identik. Jika salah satu baris memiliki sel yang berhasil mengimplementasikan "width: 1%", maka semua baris akan memiliki kolom itu sebagai "width: 1%". Titik "colspan" adalah untuk mengambil 2 (atau lebih) dari kolom lebar tetap dan menggabungkannya untuk mendapatkan lebar gabungan.
IAM_AL_X
3

Saya sudah beberapa kali sukses, meskipun itu bergantung pada beberapa properti untuk bekerja:

table-layout: fixed border-collapse: separate

dan sel 'lebar' yang membelah / merentang dengan mudah, yaitu 4 x sel dengan lebar 25%:

.div-table-cell,
* {
  box-sizing: border-box;
}

.div-table {
  display: table;
  border: solid 1px #ccc;
  border-left: none;
  border-bottom: none;
  table-layout: fixed;
  margin: 10px auto;
  width: 50%;
  border-collapse: separate;
  background: #eee;
}

.div-table-row {
  display: table-row;
}

.div-table-cell {
  display: table-cell;
  padding: 15px;
  border-left: solid 1px #ccc;
  border-bottom: solid 1px #ccc;
  text-align: center;
  background: #ddd;
}

.colspan-3 {
  width: 300%;
  display: table;
  background: #eee;
}

.row-1 .div-table-cell:before {
  content: "row 1: ";
}

.row-2 .div-table-cell:before {
  content: "row 2: ";
}

.row-3 .div-table-cell:before {
  content: "row 3: ";
  font-weight: bold;
}

.div-table-row-at-the-top {
  display: table-header-group;
}
<div class="div-table">

  <div class="div-table-row row-1">

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

  </div>

  <div class="div-table-row row-2">

    <div class="div-table-cell colspan-3">
      Cor blimey he's only gone and done it.
    </div>

  </div>

  <div class="div-table-row row-3">

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

  </div>

</div>

https://jsfiddle.net/sfjw26rb/2/

Juga, menerapkan tampilan: table-header-group atau table-footer-group adalah cara praktis untuk melompati elemen 'baris' ke atas / bawah 'tabel'.

pengguna3464561
sumber
0

jika Anda menggunakan div dan span itu akan menempati lebih banyak ukuran kode ketika baris datagrid-tabel lebih banyak volumenya. Kode di bawah ini diperiksa di semua browser

HTML:

<div id="gridheading">
<h4>Sl.No</h4><h4 class="big">Name</h4><h4>Location</h4><h4>column</h4><h4>column</h4><h4>column</h4><h4>Amount(Rs)</h4><h4>View</h4><h4>Edit</h4><h4>Delete</h4> 
</div>
<div class="data"> 
<h4>01</h4><h4 class="big">test</h4><h4>TVM</h4><h4>A</h4><h4>I</h4><h4>4575</h4><h4>4575</h4></div>
<div class="data"> 
<h4>01</h4><h4 class="big">test</h4><h4>TVM</h4><h4>A</h4><h4>I</h4><h4>4575</h4><h4>4575</h4></div>

CSS:

#gridheading {
    background: #ccc;
    border-bottom: 1px dotted #BBBBBB;
    font-size: 12px;
    line-height: 30px;
    text-transform: capitalize;
}
.data {
    border-bottom: 1px dotted #BBBBBB;
    display: block;
    font-weight: normal;
    line-height: 20px;
    text-align: left;
    word-wrap: break-word;
}
 h4 {
    border-right: thin dotted #000000;
    display: table-cell;
    margin-right: 100px;
    text-align: center;
    width: 100px;
    word-wrap: break-word;
}
.data .big {
    margin-right: 150px;
    width: 200px;
}
Desainer Web dan Promotor
sumber
0
column-span: all; /* W3C */
-webkit-column-span: all; /* Safari & Chrome */
-moz-column-span: all; /* Firefox */
-ms-column-span: all; /* Internet Explorer */
-o-column-span: all; /* Opera */

http://www.quackit.com/css/css3/properties/css_column-span.cfm

Adam Hunter Peck
sumber
tidak cukup dukungan ... IE8 sayangnya masih menjadi masalah bagi evolusi
beauXjames
9
OP ingin memiliki table-cellrentang beberapa kolom tabel. column-spanadalah untuk mengendalikan tata letak kolom. Yang memungkinkan Anda mengalirkan teks ke beberapa kolom, seperti yang dilakukan koran.
Chris Wesseling
1
Memang - sementara ini akan sangat baik untuk digunakan pada layar: table-cell; elemen, itu hanya berlaku untuk css-kolom: jsfiddle.net/mk0rrLc3/1
Mark
@ Mark-- rentang kolom digunakan dengan properti penghitungan kolom yang ditentukan pada induk. Tidak perlu mengubah jenis tampilan. Juga, rentang kolom hanya dapat menerima 1 atau semua sebagai nilai, itu tidak memungkinkan untuk fraksinasi, maka "rentang kolom: 2", seperti yang terlihat dalam biola Anda, bukan penggunaan yang valid dari properti.
MistyDawn
0

Jika Anda datang ke sini karena Anda harus menghidupkan atau mematikan colspanatribut (katakan untuk tata letak seluler):

Gandakan <td>dan hanya tampilkan yang dengan yang diinginkan colspan:

table.colspan--on td.single {
  display: none;
}

table.colspan--off td.both {
  display: none;
}
<!-- simple table -->
<table class="colspan--on">
  <thead>
    <th>col 1</th>
    <th>col 2</th>
  </thead>
  <tbody>
    <tr>
      <!-- normal row -->
      <td>a</td>
      <td>b</td>
    </tr>
    <tr>
      <!-- the <td> spanning both columns -->
      <td class="both" colspan="2">both</td>

      <!-- the two single-column <td>s -->
      <td class="single">A</td>
      <td class="single">B</td>
    </tr>
    <tr>
      <!-- normal row -->
      <td>a</td>
      <td>b</td>
    </tr>
  </tbody>
</table>
<!--
that's all
-->

 

<!--
stuff only needed for making this interactive example looking good:
-->
<br><br>
<button onclick="toggle()">Toggle colspan</button>
<script>/*toggle classes*/var tableClasses = document.querySelector('table').classList;
function toggle() {
  tableClasses.toggle('colspan--on');
  tableClasses.toggle('colspan--off');
}
</script>
<style>/* some not-needed styles to make this example more appealing */
td {text-align: center;}
table, td, th {border-collapse: collapse; border: 1px solid black;}</style>

luckydonald
sumber
0

Properti CSS "jumlah kolom", "celah kolom", dan "rentang kolom" dapat melakukan ini dengan cara yang membuat semua kolom tabel pseudo di dalam pembungkus yang sama (HTML tetap bagus dan rapi).

Satu-satunya peringatan adalah bahwa Anda hanya dapat mendefinisikan 1 kolom atau semua kolom, dan rentang kolom belum berfungsi di Firefox, sehingga beberapa CSS tambahan diperlukan untuk memastikan itu akan ditampilkan dengan benar. https://www.w3schools.com/css/css3_multiple_columns.asp

.split-me {
  -webkit-column-count: 3;
  -webkit-column-gap: 0;
  -moz-column-count: 3;
  -moz-column-gap: 0;
  column-count: 3;
  column-gap: 0;
}

.cols {
  /* column-span is 1 by default */
  column-span: 1;
}

div.three-span {
  column-span: all !important;
}

/* alternate style for column-span in Firefox */
@-moz-document url-prefix(){
  .three-span {
    position: absolute;
    left: 8px;
    right: 8px;
    top: auto;
    width: auto;
  }
}


    
<p>The column width stays fully dynamic, just like flex-box, evenly scaling on resize.</p>

<div class='split-me'>
  <div class='col-1 cols'>Text inside Column 1 div.</div>
  <div class='col-2 cols'>Text inside Column 2 div.</div>
  <div class='col-3 cols'>Text inside Column 3 div.</div>
  <div class='three-span'>Text div spanning 3 columns.</div>
</div>



  <style>
/* Non-Essential Visual Styles */

html * { font-size: 12pt; font-family: Arial; text-align: center; }
.split-me>* { padding: 5px; } 
.cols { border: 2px dashed black; border-left: none; }
.col-1 { background-color: #ddffff; border-left: 2px dashed black; }
.col-2 { background-color: #ffddff; }
.col-3 { background-color: #ffffdd; }
.three-span {
  border: 2px dashed black; border-top: none;
  text-align: center; background-color: #ddffdd;
}
  </style>

MistyDawn
sumber
0

Saya datang ke sini karena saat ini blok tabel WordPress tidak mendukung parameter colspan dan saya pikir saya akan menggantinya menggunakan CSS. Ini adalah solusi saya, dengan asumsi bahwa kolom memiliki lebar yang sama:

table {
  width: 100%;
}

table td {
  width: 50%;
  background: #dbdbdb;
  text-align: center;
}

table tr:nth-child(2n+1) {
  position:relative;
  display:block;
  height:20px;
  background:green;
}

table tr:nth-child(2n+1) td {
  position:absolute;
  left:0;
  right:-100%;
  width: auto;
  top:0;
  bottom:0;
  background:red;
  text-align:center;
}
<table>
    <tr>
        <td>row</td>
    </tr>
    <tr>
        <td>cell</td>
        <td>cell</td>
    </tr>
    <tr>
        <td>row</td>
    </tr>
    <tr>
        <td>cell</td>
        <td>cell</td>
    </tr>
</table>

passatgt
sumber
-1

Anda selalu dapat position:absolute;menentukan dan menentukan lebar. Ini bukan cara yang sangat lancar untuk melakukannya, tetapi itu akan berhasil.

doubleJ
sumber
Ada jauh lebih banyak cara untuk mencapai ini daripada menggunakan markup yang buruk. Posisi absolut untuk memaksakan tata letak selalu dianggap praktik yang buruk.
MistyDawn
-1

Saya telah membuat biola ini:

masukkan deskripsi gambar di sini

http://jsfiddle.net/wo40ev18/3/

HTML

<div id="table">
<div class="caption">
    Center Caption
</div>
<div class="group">
      <div class="row">
            <div class="cell">Link 1t</div>
            <div class="cell"></div>
          <div class="cell"></div>
          <div class="cell"></div>
            <div class="cell"></div>
            <div class="cell ">Link 2</div>
      </div>
</div>

CSS

   #table {
    display:table;
}

.group {display: table-row-group; }

.row {
    display:table-row;
    height: 80px;
    line-height: 80px;
}

.cell {
    display:table-cell;
    width:1%;
    text-align: center;
    border:1px solid grey;
    height: 80px
        line-height: 80px;
}

.caption {
    border:1px solid red; caption-side: top; display: table-caption; text-align: center; 
    position: relative;
    top: 80px;
    height: 80px;
      height: 80px;
    line-height: 80px;

}
Layke
sumber
1
Tapi saya pikir kotak bootstrap dapat membuatnya dengan sangat mudah
Arun Prasad ES
Ini tidak memberikan solusi yang dicari si penanya. Itu hanya menciptakan baris sel inline.
MistyDawn
-1

Kelas Media Query dapat digunakan untuk mencapai sesuatu yang lumayan dengan duplikat markup. Inilah pendekatan saya dengan bootstrap:

  <tr class="total">
    <td colspan="1" class="visible-xs"></td>
    <td colspan="5" class="hidden-xs"></td>
    <td class="focus">Total</td>
    <td class="focus" colspan="2"><%= number_to_currency @cart.total %></td>
  </tr>

colspan 1 untuk seluler, colspan 5 untuk orang lain dengan CSS yang melakukan pekerjaan.

DigitalDesignDj
sumber
Penanya secara khusus menyatakan dia tidak bisa menggunakan elemen HTML <table>. Jika dia bisa, ini akan menjadi masalah yang mudah dipecahkan.
MistyDawn