Bir CSS "display: table-column" nasıl çalışır?


87

Aşağıdaki HTML ve CSS göz önüne alındığında, tarayıcımda kesinlikle hiçbir şey görmüyorum (Chrome ve IE en son yazma sırasında). Her şey 0x0 piksele kadar daralır. Neden?

<!DOCTYPE html>
<html>
<head>
    <style type="text/css">
        section { display: table; height: 100%; background-color: grey; }

        #colLeft { display: table-column; height: 100%; background-color: green; }
        #colRight { display: table-column; height: 100%; background-color: red; }

        #row1 { display: table-row; height: 100%; }
        #row2 { display: table-row; height: 100%; }
        #row3 { display: table-row; height: 100%; }

        #cell1 { display: table-cell; height: 100%; }
        #cell2 { display: table-cell; height: 100%; }
        #cell3 { display: table-cell; height: 100%; }
    </style>
</head>
<body>
    <section>
        <div id="colLeft">
            <div id="row1">
                <div id="cell1">
                    AAA
                </div>
            </div>
            <div id="row2">
                <div id="cell2">
                    BBB
                </div>
            </div>
        </div>
        <div id="colRight">
            <div id="row3">
                <div id="cell3">
                    CCC
                </div>
            </div>
        </div>
    </section>
</body>
</html>

Yanıtlar:


118

CSS tablo modeli, http://www.w3.org/TR/CSS21/tables.html HTML tablo modeline dayanmaktadır.

Bir tablo SATIRLAR'a bölünür ve her satır bir veya daha fazla hücre içerir. Hücreler ROWS'un çocuklarıdır, ASLA sütunların çocukları değildir.

"display: table-column" sütunlu düzenler yapmak için bir mekanizma SAĞLAMAZ (örneğin, içeriğin bir sütundan diğerine akabildiği birden çok sütuna sahip gazete sayfaları).

Bunun yerine, "tablo-sütun" YALNIZCA bir tablonun satırları içindeki karşılık gelen hücrelere uygulanan öznitelikleri belirler. Örneğin, "Her satırdaki ilk hücrenin arka plan rengi yeşil" olarak tanımlanabilir.

Tablonun kendisi her zaman HTML'deki ile aynı şekilde yapılandırılmıştır.

HTML'de ("td" ler "tr" ler içinde, "sütun" lar içinde DEĞİLDİR):

<table ..>
  <col .. />
  <col .. />
  <tr ..>
    <td ..></td>
    <td ..></td>
  </tr>
  <tr ..>
    <td ..></td>
    <td ..></td>
  </tr>
</table>

CSS tablo özelliklerini kullanarak karşılık gelen HTML ("sütun" div'lerinin herhangi bir içerik içermediğine dikkat edin - standart, doğrudan sütunlardaki içeriğe izin vermez):

.mytable {
  display: table;
}
.myrow {
  display: table-row;
}
.mycell {
  display: table-cell;
}
.column1 {
  display: table-column;
  background-color: green;
}
.column2 {
  display: table-column;
}
<div class="mytable">
  <div class="column1"></div>
  <div class="column2"></div>
  <div class="myrow">
    <div class="mycell">contents of first cell in row 1</div>
    <div class="mycell">contents of second cell in row 1</div>
  </div>
  <div class="myrow">
    <div class="mycell">contents of first cell in row 2</div>
    <div class="mycell">contents of second cell in row 2</div>
  </div>
</div>



İSTEĞE BAĞLI : hem "satırlar" hem de "sütunlar", her satıra ve hücreye aşağıdaki gibi birden çok sınıf atanarak şekillendirilebilir. Bu yaklaşım, stil uygulanacak çeşitli hücre kümelerini veya tek tek hücreleri belirlemede maksimum esneklik sağlar:

//Useful css declarations, depending on what you want to affect, include:

/* all cells (that have "class=mycell") */
.mycell {
}

/* class row1, wherever it is used */
.row1 {
}

/* all the cells of row1 (if you've put "class=mycell" on each cell) */
.row1 .mycell {
}

/* cell1 of row1 */
.row1 .cell1 {
}

/* cell1 of all rows */
.cell1 {
}

/* row1 inside class mytable (so can have different tables with different styles) */
.mytable .row1 {
}

/* all the cells of row1 of a mytable */
.mytable .row1 .mycell {
}

/* cell1 of row1 of a mytable */
.mytable .row1 .cell1 {
}

/* cell1 of all rows of a mytable */
.mytable .cell1 {
}
<div class="mytable">
  <div class="column1"></div>
  <div class="column2"></div>
  <div class="myrow row1">
    <div class="mycell cell1">contents of first cell in row 1</div>
    <div class="mycell cell2">contents of second cell in row 1</div>
  </div>
  <div class="myrow row2">
    <div class="mycell cell1">contents of first cell in row 2</div>
    <div class="mycell cell2">contents of second cell in row 2</div>
  </div>
</div>

Kullanmak bugünün esnek tasarımlar, içinde <div>farklı amaçlar için, bu koymak için akıllıca olacaktır bazı başvurmak yardımına, her div class. Burada eskiden <tr>HTML'de olan şey oldu class myrowve <td>oldu class mycell. Bu kural, yukarıdaki CSS seçicilerini yararlı kılan şeydir.

PERFORMANS NOTU : Her hücreye sınıf adları koymak ve yukarıdaki çok sınıflı seçicileri kullanmak *, .row1 *veya hatta ile biten seçicileri kullanmaktan daha iyi performans gösterir .row1 > *. Bunun nedeni, seçicilerin en son eşleştirilmesidir , bu nedenle eşleşen öğeler aranırken .row1 *önce tüm öğelerle *eşleşir ve ardından herhangi bir atanın sahip olup olmadığını bulmak için her öğenin tüm atalarını kontrol eder . Bu, yavaş bir aygıtta karmaşık bir belgede yavaş olabilir. daha iyidir, çünkü yalnızca yakın ebeveyn incelenir. Ancak, çoğu öğeyi aracılığıyla hemen ortadan kaldırmak çok daha iyidir . (class row1.row1 > *.row1 .cell1.row1 > .cell1 eden daha sıkı bir özelliktir, ancak bu aramanın ilk adımıdır. bu en büyük farkı yaratır, bu nedenle genellikle karmaşaya değmez ve her zaman doğrudan bir çocuk olup olmayacağına dair ekstra düşünme sürecine çocuk seçiciyi> .)

Yeniden götürmek önemli nokta performansı olmasıdır geçen bir seçici içindeki madde olmalıdır mümkün olduğunca kesin ve olmamalıdır *.


Bunu kendim denemedim, ancak IE6 ve IE7 için bir javascript çözümü olan tanalin.com/en/projects/display-table-htc için öneriler gördüm . Javascript çalıştığında, sayfayı eski HTML tablo etiketlerine dönüştürür.
ToolmakerSteve

Çözüm IE8 +, Firefox, Chrome, iPad, Android üzerinde çalışıyor. Bir tablonun esnek yapısına ihtiyacınız varsa ve yukarıda listelenen daha modern tarayıcıları destekliyorsanız, tablo düzenlerinden kaçınmanın iyi bir yoludur.
mbokil

<col style="color: red;" >iş değil, ama <col style="background-color: red;" >ok! bunun nesi var?
xgqfrms

@xgqfrms: Başka bir css kuralı rengi geçersiz kılıyor olmalı. Muhtemelen hücrelerinizin içindeki bir öğeye uygulanan bir kural. Örneğin, metniniz <p> içindeyse, bir yerde daha özel bir kural ayarına sahip olursunuz <p> renk. Deneyin <col style="color: red !important;">. Bu işe yararsa, sorun budur. Ancak aşırı kullanma alışkanlığı edinmeyin !important. Bu çalışmayı gördükten sonra, en iyisi onu kaldırmak ve öncelik almak için daha spesifik bir seçici bulmaktır. google "css daha özel seçici" veya smashingmagazine.com/2007/07/…
ToolmakerSteve

23

"Tablo-sütun" görüntüleme türü, bunun şu şekilde davrandığı anlamına gelir: <col> , HTML'deki etiket - yani genişliği *, çevreleyen tablonun karşılık gelen fiziksel sütununun genişliğini yöneten görünmez bir öğe.

CSS tablo modeli hakkında daha fazla bilgi için W3C standardına bakın .

* Ve kenarlıklar, arka planlar gibi diğer birkaç özellik.


2
Eğer coleleman mantıksal bir yapıya sahipse, ki var, o zaman display: table-column;sadece sunumsal yapıya sahip olan CSS kuralı kullanılarak nasıl gerekçelendirilebilir ? display( W3.org/wiki/CSS/Properties/display ) adresindeki özelliklere göre , bir colöğe gibi "davranması" gerekiyor . Ama bunun ne kadar yararlı olduğunu göremiyorum ...
chharvey

1
@ TestSubject528491 Çünkü o zaman bir [sunum] tablosunun sütun arka planını, sütun genişliğini vb. Ayarlayabilirsiniz. Ancak, <col>etiketin kendisi için varsayılan stil kuralını veya farklı bir XML tabanlı biçimlendirme dilinde eşdeğer bir etiketi belirtmek açısından gerçekten yararlıdır .
Random832

@chharvey: HTML en colbir olan mantıksal içeren eleman sadece presentational stil. İçine bir sütun bilgi koyamazsınız - bu yaygın bir yanlış anlaşılmadır. Tablo verileri her zaman satırlar halindedir. display: table-column;mantıksal bir öğeyi (tipik olarak a div) bir col. Bu öğeye atanan diğer stil alanlarının "bir sütun" sunum konseptine uygulanmasına neden olur. Sonuç, görüntülenmeyen ve varsa içeriği göz ardı edilen mantıksal bir öğedir; tek etkisi, ilişkili sunumun "sütunlarına" stil uygulamaktır. Bir şablon için cevabımı görün.
ToolmakerSteve
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.