CSS “display: table-column” hoạt động như thế nào?


87

Với HTML và CSS sau, tôi hoàn toàn không thấy gì trong trình duyệt của mình (Chrome và IE mới nhất tại thời điểm viết bài). Mọi thứ thu gọn xuống 0x0 px. Tại sao?

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

Câu trả lời:


118

Mô hình bảng CSS dựa trên mô hình bảng HTML http://www.w3.org/TR/CSS21/tables.html

Một bảng được chia thành ROWS và mỗi hàng chứa một hoặc nhiều ô. Tế bào là con của ROWS, chúng KHÔNG BAO GIỜ là con của cột.

"display: table-column" KHÔNG cung cấp cơ chế tạo bố cục dạng cột (ví dụ: các trang báo có nhiều cột, nơi nội dung có thể chảy từ cột này sang cột tiếp theo).

Đúng hơn, "bảng-cột" CHỈ đặt các thuộc tính áp dụng cho các ô tương ứng trong các hàng của bảng. Ví dụ: "Màu nền của ô đầu tiên trong mỗi hàng là màu xanh lá cây" có thể được mô tả.

Bản thân bảng luôn có cấu trúc giống như trong HTML.

Trong HTML (quan sát rằng "td" bên trong "tr" s, KHÔNG bên trong "col" s):

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

HTML tương ứng sử dụng thuộc tính bảng CSS (Lưu ý rằng div "cột" không chứa bất kỳ nội dung nào - tiêu chuẩn không cho phép nội dung trực tiếp trong cột):

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



TÙY CHỌN : cả "hàng" và "cột" có thể được tạo kiểu bằng cách gán nhiều lớp cho mỗi hàng và ô như sau. Cách tiếp cận này mang lại sự linh hoạt tối đa trong việc chỉ định các tập hợp ô khác nhau hoặc các ô riêng lẻ được tạo kiểu:

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

Trong các thiết kế linh hoạt ngày nay, sử dụng <div>cho nhiều mục đích, nên đặt một số lớp vào mỗi div, để giúp tham khảo nó. Ở đây, những gì từng có <tr>trong HTML đã trở thành class myrow<td>đã trở thành class mycell. Quy ước này là những gì làm cho các bộ chọn CSS ở trên trở nên hữu ích.

LƯU Ý HIỆU SUẤT : việc đặt tên lớp trên mỗi ô và sử dụng các bộ chọn nhiều lớp ở trên, sẽ có hiệu suất tốt hơn so với việc sử dụng các bộ chọn kết thúc bằng *, chẳng hạn như .row1 *hoặc thậm chí .row1 > *. Lý do là các bộ chọn được so khớp cuối cùng trước , vì vậy khi các phần tử phù hợp đang được tìm kiếm, .row1 *trước tiên hãy thực hiện *khớp với tất cả các phần tử, sau đó kiểm tra tất cả tổ tiên của mỗi phần tử , để tìm xem có tổ tiên nào không class row1. Điều này có thể chậm trong một tài liệu phức tạp trên một thiết bị chậm. .row1 > *tốt hơn, bởi vì chỉ cha mẹ trực tiếp được kiểm tra. Nhưng tốt hơn hết là vẫn nên loại bỏ ngay hầu hết các yếu tố, thông qua .row1 .cell1. (.row1 > .cell1là một thông số kỹ thuật thậm chí còn chặt chẽ hơn, nhưng đó là bước đầu tiên của tìm kiếm tạo ra sự khác biệt lớn nhất, vì vậy nó thường không đáng để lộn xộn và quá trình suy nghĩ thêm về việc liệu nó có luôn là con trực tiếp hay không, khi thêm bộ chọn con >.)

Điểm mấu chốt để lấy lại hiệu suất là mục cuối cùng trong bộ chọn phải càng cụ thể càng tốt và không bao giờ nên như vậy *.


Bản thân tôi chưa thử cách này nhưng tôi đã thấy các đề xuất cho tanalin.com/en/projects/display-table-htc , một giải pháp javascript cho IE6 và IE7. Khi javascript chạy, nó sẽ chuyển đổi trang thành các thẻ bảng HTML cũ hơn.
ToolmakerSteve

Giải pháp hoạt động trên IE8 +, Firefox, Chrome, iPad, Android. Đó là một cách tốt để tránh bố trí bảng nếu bạn cần cấu trúc linh hoạt của bảng và bạn đang hỗ trợ các trình duyệt hiện đại hơn được liệt kê ở trên.
mbokil

những <col style="color: red;" >không phải là công việc, nhưng <col style="background-color: red;" >là ok! có gì sai với cái này
xgqfrms

@xgqfrms: Một số quy tắc css khác phải ghi đè màu. Có thể là quy tắc được áp dụng cho một phần tử bên trong ô của bạn. Ví dụ: nếu văn bản của bạn nằm bên trong <p>, thì ở đâu đó bạn có màu <p> cài đặt quy tắc cụ thể hơn . Cố gắng <col style="color: red !important;">. Nếu điều này hoạt động, thì đó là vấn đề. Tuy nhiên , đừng có thói quen lạm dụng !important. Sau khi thấy nó hoạt động, tốt nhất là loại bỏ nó và tìm ra một bộ chọn cụ thể hơn để được ưu tiên. google "css selector cụ thể hơn", hoặc xem smashingmagazine.com/2007/07/...
ToolmakerSteve

23

Kiểu hiển thị "table-column" có nghĩa là nó hoạt động giống như <col>thẻ trong HTML - tức là một phần tử vô hình có chiều rộng * chi phối chiều rộng của cột vật lý tương ứng của bảng bao quanh.

Xem tiêu chuẩn W3C để biết thêm thông tin về mô hình bảng CSS.

* Và một vài thuộc tính khác như đường viền, hình nền.


2
Nếu colphần tử đó có cấu trúc logic, thì làm thế nào để người ta biện minh bằng cách sử dụng quy tắc CSS display: table-column;, quy tắc chỉ có cấu trúc trình bày? Theo thông số kỹ thuật trên display( w3.org/wiki/CSS/Properties/display ), nó phải "hoạt động" giống như một colphần tử. Nhưng tôi không thể nhìn thấy như thế nào đó là hữu ích ...
chharvey

1
@ TestSubject528491 Vì sau đó bạn có thể đặt nền cột, chiều rộng cột, v.v. của bảng [thuyết trình]. Nhưng thực sự nó rất hữu ích về mặt chỉ định quy tắc kiểu mặc định cho <col>chính thẻ đó hoặc một thẻ tương đương trong một ngôn ngữ đánh dấu dựa trên XML khác.
Ngẫu nhiên832

@chharvey: HTML collà một phần tử logic chỉ chứa kiểu trình bày . Bạn không thể đặt một cột thông tin trong đó - đây là một sự hiểu lầm phổ biến. Dữ liệu bảng luôn ở trong hàng. display: table-column;chuyển đổi một phần tử logic (thường là a div) thành a col. Nó khiến các trường kiểu khác được gán cho phần tử đó áp dụng cho khái niệm trình bày "một cột". Kết quả là một phần tử logic không được hiển thị và nội dung của nó, nếu có, bị bỏ qua; tác dụng duy nhất của nó là áp dụng kiểu cho các "cột" của bản trình bày được liên kết. Xem câu trả lời của tôi cho một mẫu.
ToolmakerSteve
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.