CSS'de HTML colspan'ı


251

Aşağıdakine benzer bir düzen oluşturmaya çalışıyorum:

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

alt kısım üst sıranın boşluğunu dolduruyor.

Bu gerçek bir tablo olsaydı, bunu kolayca başarabilirdim <td colspan="3">, ancak basitçe tablo benzeri bir düzen oluşturduğum için <table>etiketleri kullanamıyorum . Bu CSS kullanarak mümkün mü?


8
En iyi çözüm gerçekten masaya ne olduğuna bağlıdır. Veriler (tabloya ait bir şey) ise tablo kullanın. Sayfanın düzenini kontrol etmek için bir tablo kullanıyorsanız, aşağıdaki HTML + CSS çözümlerinden biri daha iyidir.
mwcz

Her iki durum için de işaretleme ekleyin, ardından Medya sorgusu CSS sınıfını kullanarak her seferinde yalnızca bir tane gösterin.
DigitalDesignDj

2
CSS'yi unutun. Sekmeli veriler görüntülerseniz, bunun kaç tane sütuna yayılacağını kesinlikle bilirsiniz. Kullan colspanözelliği
Tihomir Mitkov

Bunu bootstrap veya bootstrap'tan özelleştirilmiş ızgara ile yaparım
Arun Prasad ES

CSS3 kullanıyorsanız columnSpan kullanabilirsiniz. <Td colspan = "#"> 'dan farklı olarak, sütun sayısını ayarlama seçeneğiniz yoktur, ancak tüm sütunlara yayılabilir. w3schools.com/cssref/css3_pr_column-span.asp
MistyDawn

Yanıtlar:


407

Basit, zarif bir CSS analogu yok colspan.

Bu konudaki aramalar, tarayıcı ve duruma özgü benzer uyarılarla birlikte mutlak konumlandırma, boyutlandırma gibi çok sayıda alternatif içeren çeşitli çözümler getirecektir. Bulduklarınızı temel alarak okuyabileceğiniz en iyi kararı verin.


10
Tablolar yapısal unsurlardır ve sadece colspan değişikliklerinin kullanılması görünüşünün olmadığı anlamına gelmez. CSS, öğeleri stilize etmek için kullanılır ve yapıyı değiştirmez. W3C burada tablo yapısını tartışıyor: w3.org/TR/html401/struct/tables.html#h-11.2
Rob

88
Rob, konumunuzu anlayın, ancak W3C önerilerine bakın - özellikle tüm masa paradigmasıyla ilgili - ve düşüncelerinin bir kısmının, kesinlikle tabloların sunumu olduğunu göreceksiniz . Tabloların sadece yapı olarak tasarlandığı fikri, çağdaş bir kurgu. Bence hepimiz yayılmayı durdurmak için daha iyi hizmet edecektik. Mesele şu ki tablolar hakkında dogmatik olmayı bırakmalıyız. Her zaman sunum olduklarını söylemek benim için yanlış olur ve her zaman yapılandığını söylemek sizin için de yanlıştır . Gerçeklik, sadece kesilmiş ve kurutulmuş değildir.
David

4
Cevabınız gibi görünüyor olduğunu popüler cevap. :) Anti-tablo dogmanın (satın aldığım) çok katı olduğunu öğrendiğim için mutluyum. Sadece colspaniş için doğru araç olduğunu düşündüğüm sürece cevabımın yanında duruyorum . Cevabım% 75, sizin yanıtınız% 100 doğrudur. SO'ya geri dönmelisin.
mwcz

71
2 yıl sonra, bu googled ve yazar oy vermek istedim ama "kendi yazı için oy veremiyorum" dedi ve ben olduğumu fark lol. Daha iyi bilgiye sahip olduğunu düşündüğüm için kabul edilen çözümü buna değiştirmeye karar verdim.
Kule

14
Bu, sorulan soruya bir cevap değil, başka (belirtilmemiş) bir cevap hakkında küçük bir deneme.
Jukka K. Korpela

56

Olarak bildiğim kadarıyla css hiçbir colspan yoktur, ancak orada olacak column-spanyakın gelecekte çoklu kolon düzeni için, ancak CSS3 sadece bir taslak olduğu için, sen bunu kontrol edebilirsiniz burada . Her neyse, böyle bir tablo benzeri ekran kullanarak divve kullanarak bir geçici çözüm yapabilirsiniz span.

Bu HTML olacaktır:

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

Ve bu css olurdu:

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

Bu hileyi kullanmanın tek nedeni, table-layoutdavranıştan fayda sağlamaktır , sadece div ve span genişliğini belirli bir yüzdeye ayarlamak tasarım gereksinimimizi yerine getirmezse çok kullanırım.

Ancak bu table-layoutdavranıştan yararlanmanız gerekmiyorsa , durilai'nin cevabı size yeterince uygun olacaktır.


4
Evet, ama küçük bir düzeltme: bunun yerine .span { ...olmalı span { ....
Slavik Meltser

2
divtable
Sekmeli

1
@TichomirMitkov, düzeni değiştirmek için duyarlı tasarım kullanıp kullanmadığınıza bağlıdır - bu durumda bazen bu oldukça iyi çalışabilir.
Simon_Weaver

4
Bu aslında soruyu cevaplamıyor çünkü verdiğiniz örnekte birbiri ardına iki tablonuz var. ("Tablo" sınıfıyla Ietwo divs)
Kış

21

Başka bir öneri tablolar yerine flexbox kullanmaktır. Bu elbette bir "modern tarayıcı" şey, ama hadi, 2016;)

En azından bu, bugünlerde buna cevap arayanlar için alternatif bir çözüm olabilir, çünkü orijinal yazı 2010'dan beri.

İşte harika bir rehber: 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>


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>

Hücrelerin genişliğini bilemiyorum.
Kule

1
O zaman genişlik koymayın. Önemli değil. Ancak aynı genişliğe yayılmalarını istiyorsanız, iki ana bölmenin aynı genişliğe sahip olması gerekir.
Dustin Laine 10'10

1
Genişliği kullanabilirsiniz: calc (100% / 3) Bu, orta% 1 oranında daha fazla verecek
ii iml0sto1

5

Bu CSS kavramının bir parçası değil. colspansayfanın içeriğinin yapısını açıklar veya tablodaki HTML'nin işi olan verilere bir anlam verir.


OP yapısal bir anlamı olmadan " tablo benzeri bir düzen oluşturma" dan açıkça bahseder . CSS tablolarının amacı bu değil mi? Sadece tasarımlı bir CSS tablo öğesi varsa, colspan özelliğini tüm tablodan farklı işlemek için nesnel bir neden yoktur, neden sadece tasarımlı bir CSS colspan özelliği
olmasın

2
Bu sorunun en çok oy alan yanıtı inceleyin. Görüşleriniz orada zaten tartışıldı ve ben de buna katılıyorum. Bu cevabı yazdığım günden bu yana beş yıl içinde konu hakkındaki düşüncem değişti.
mwcz

4

Güncel bir cevap vermek için: Bugün bunu yapmanın en iyi yolu şu şekilde css ızgara düzenini kullanmaktır:

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

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

3

Http://960.gs/ gibi bir ızgara sistemi kullanmayı deneyebilirsiniz

"12 sütun" düzenini kullandığınızı varsayarsak, kodunuz şöyle bir şey olurdu:

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

3

display: table-cell; width: 1%;Tablo hücre öğenize eklemeyi deneyin .


bu nasıl yardımcı olacak? Bir tablonun temel konsepti, her sıranın aynı hücrelere sahip olmasıdır. Satırlardan birinde başarıyla "genişlik:% 1" uygulayan bir hücre varsa, tüm satırlarda bu sütun "genişlik:% 1" olarak bulunur. "Soğma" noktası sabit genişlikli sütunlardan 2 (veya daha fazla) almak ve birleşik genişlik elde etmek için bunları birleştirmektir.
IAM_AL_X

3

Çalışmak için birkaç mülke dayanmasına rağmen, bazı başarılar elde ettim:

table-layout: fixed border-collapse: separate

ve kolayca bölünen / yayılan 'genişlikler', yani% 25 genişliğe sahip 4 x hücre:

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

Ayrıca, display: table-header-group veya table-footer-group uygulamak 'satır' öğelerini 'tablonun' üstüne / altına atlamanın kullanışlı bir yoludur.


0

div ve span kullanırsanız, datagrid-tablo satırı daha fazla hacim olduğunda daha fazla kod boyutu kaplar. Aşağıdaki kod tüm tarayıcılarda kontrol edilir

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

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


yeterli destek yok ... IE8 ne yazık ki hala evrim için kalıcı bir konudur
beauXjames

9
OP, table-cellbirden çok tablo sütununa yayılmış olmasını istiyor . column-spansütun düzenini kontrol etmek içindir. Bu, gazetelerin yaptığı gibi, birkaç sütun üzerinden metin akmanızı sağlar.
Chris Wesseling

1
Aslında - bu ekranda kullanmak gerçekten iyi olsa da: table-cell; öğeleri, yalnızca css sütunları için geçerlidir: jsfiddle.net/mk0rrLc3/1
Mark

@ Mark-- column-span, üst öğe üzerinde tanımlanan column-count özelliği ile kullanılır. Ekran türünü değiştirmek gerekli değildir. Ayrıca, sütun aralığı yalnızca 1 veya tümünü bir değer olarak kabul edebilir, kesirlemeye izin vermez, bu nedenle "sütun aralığı: 2", kemanda görüldüğü gibi, mülkün geçerli bir kullanımı değildir.
MistyDawn

0

colspanÖzelliği açmanız veya kapatmanız gerektiğinden buraya gelirseniz (mobil düzen için söyleyin):

Leri çoğaltın <td>ve yalnızca istenenleri gösterin 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>


0

"Sütun sayımı", "sütun aralığı" ve "sütun aralığı" CSS özellikleri, sözde tablonun tüm sütunlarını aynı sarmalayıcı içinde tutacak şekilde yapabilir (HTML güzel ve düzenli kalır).

Tek uyarı, yalnızca 1 sütun veya tüm sütunları tanımlayabilmenizdir ve sütun aralığı henüz Firefox'ta çalışmadığından, doğru bir şekilde görüntülenmesini sağlamak için bazı ek CSS gereklidir. 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>


0

Buraya geldim çünkü şu anda WordPress tablo bloğu colspan parametresini desteklemiyor ve ben CSS kullanarak değiştireceğimizi düşündüm. Bu benim çözümümdü, sütunların aynı genişlikte olduğu varsayılarak:

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>


-1

Her zaman bir position:absolute;şeyler yapabilir ve genişlikleri belirleyebilirsiniz. Bunu yapmanın çok akıcı bir yolu değil, ama işe yarayacaktı.


Bunu başarmak için kötü biçimlendirme kullanmaktan çok daha fazla yol vardır. Bir düzeni zorlamak için mutlak konumlandırma her zaman kötü uygulama olarak kabul edilmiştir.
MistyDawn

-1

Bu kemanı yarattım:

resim açıklamasını buraya girin

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;

}

1
Ama sanırım bootstrap ızgarası bunu çok kolay yapabilir
Arun Prasad ES

Bu, askerin aradığı çözümü sağlamaz. Yalnızca satır içi hücre satırı oluşturur.
MistyDawn

-1

Media Query sınıfları, yinelenen işaretlemeyle geçirilebilir bir şey elde etmek için kullanılabilir. İşte bootstrap ile yaklaşımım:

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

mobil için colspan 1, işi CSS olan diğerleri için colspan 5.


Asker, HTML <table> öğelerini kullanamayacağını özellikle belirtti. Eğer yapabilseydi, bu çözmesi kolay bir problem olurdu.
MistyDawn
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.