Đặt chiều rộng cột của bảng


203

Tôi đã có một bảng đơn giản được sử dụng cho hộp thư đến như sau:

<table border="1">
        <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
        </tr>

Làm cách nào để tôi đặt chiều rộng sao cho Từ và Ngày bằng 15% chiều rộng của trang và Chủ đề là 70%. Tôi cũng muốn bảng chiếm toàn bộ chiều rộng của trang.

Câu trả lời:


318

<table style="width: 100%">
    <colgroup>
       <col span="1" style="width: 15%;">
       <col span="1" style="width: 70%;">
       <col span="1" style="width: 15%;">
    </colgroup>
    
    
    
    <!-- Put <thead>, <tbody>, and <tr>'s here! -->
    <tbody>
        <tr>
            <td style="background-color: #777">15%</td>
            <td style="background-color: #aaa">70%</td>
            <td style="background-color: #777">15%</td>
        </tr>
    </tbody>
</table>


5
Giống như sự sạch sẽ của giải pháp này. Tuy nhiên, vui lòng đóng col, ví dụ <col span = "1" style = "width: 15%;" /> hoặc <col span = "1" style = "width: 15%;"> </ col>
lsu_guy

23
@Isu_guy bạn chỉ đóng <col> khi sử dụng XHTML - trong HTML, thẻ <col> không đóng ... xem liên kết để biết thêm thông tin. Trong HTML5, <col> là một phần tử void, có nghĩa là nó KHÔNG được đóng
Matija Nalis

4
@Zulu theo w3schools.com/tags/att_col_ rắc.asp "Thuộc tính width <col> không được hỗ trợ trong HTML5."
Caltor

30
@Caltor: mã không sử dụng <col> width attribute; nó đang sử dụng a CSS *style* width, cái đã thay thế thuộc tính width <col>. (mặc dù có nhiều người bình chọn rằng bình luận đó !!)
ToolmakerSteve

4
span="1"là không cần thiết vì 1 là mặc định.
Madbreaks

128

HTML:

<table>
  <thead>
    <tr>
      <th class="from">From</th>
      <th class="subject">Subject</th>
      <th class="date">Date</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>[from]</td>
      <td>[subject]</td>
      <td>[date]</td>
    </tr>
  </tbody>
</table>

CSS:

table {
  width: 100%;
  border: 1px solid #000;
}
th.from, th.date {
  width: 15%
}
th.subject {
  width: 70%; /* Not necessary, since only 70% width remains */
}

Cách thực hành tốt nhất là tách biệt HTML và CSS của bạn để sao chép ít mã hơn và tách biệt các mối quan tâm (HTML cho cấu trúc và ngữ nghĩa và CSS để trình bày).

Lưu ý rằng, để điều này hoạt động trong các phiên bản Internet Explorer cũ hơn, bạn có thể phải cung cấp cho bảng của mình một chiều rộng cụ thể (ví dụ: 900px). Trình duyệt đó có một số vấn đề khi hiển thị một phần tử có kích thước phần trăm nếu trình bao bọc của nó không có kích thước chính xác.


giải pháp này thất bại nếu bạn có colspans ở hàng đầu tiên
mark1234

3
Tốt vì <col width = ""> đã lỗi thời trong HTML5: developer.mozilla.org/en/docs/Web/HTML/Euity/col
Richard

30

Sử dụng CSS bên dưới, khai báo đầu tiên sẽ đảm bảo bảng của bạn bám sát chiều rộng bạn cung cấp (bạn sẽ cần thêm các lớp trong HTML của mình):

table{
  table-layout:fixed;
}
th.from, th.date {
  width: 15%;
}
th.subject{
  width: 70%;
}

Thật ra bạn chỉ cần xác định chiều rộng của hai cột. Cái thứ ba sẽ được tính toán tự động, vậy table{table-layout:fixed};.from,.date{width:15%}là đủ. Trừ khi các lớp được sử dụng trên các yếu tố khác nữa, viết th.fromlà dư thừa và có thể rút ngắn thành chỉ .from.
tomasz86

14

Cách khác chỉ với một lớp trong khi vẫn giữ kiểu của bạn trong tệp CSS, thậm chí hoạt động trong IE7:

<table class="mytable">
    <tr>
        <th>From</th>
        <th>Subject</th>
        <th>Date</th>
    </tr>
</table>
<style>
    .mytable td, .mytable th { width:15%; }
    .mytable td + td, .mytable th + th { width:70%; }
    .mytable td + td + td, .mytable th + th + th { width:15%; }
</style>

Gần đây, bạn cũng có thể sử dụng nth-child()bộ chọn từ CSS3 (IE9 +), trong đó bạn chỉ cần đặt nr. của cột tương ứng vào dấu ngoặc đơn thay vì xâu chuỗi chúng cùng với bộ chọn liền kề. Như thế này, ví dụ:

<style>
    .mytable tr > *:nth-child(1) { width:15%; }
    .mytable tr > *:nth-child(2) { width:70%; }
    .mytable tr > *:nth-child(3) { width:15%; }
</style>

Các :nth-childgiải pháp đề xuất là khủng khiếp về hiệu suất. Không có lý do hợp lệ để sử dụng nó (đặc biệt là với bộ chọn phổ quát) trong ví dụ này khi chỉ có ba yếu tố ( thhoặc col) để tạo kiểu. Ngoài ra, bạn chỉ cần đặt chiều rộng cho thhàng đầu tiên. Trong .mytable tdví dụ đầu tiên là dư thừa.
tomasz86

"Đề xuất: giải pháp con thứ n là khủng khiếp về hiệu suất." - cần dẫn nguồn.
DanMan

Điều này là đủ: Kết xuất CSS hiệu quả . Với việc bạn sử dụng bộ chọn phổ quát, trước tiên trình duyệt sẽ kiểm tra TẤT CẢ các phần tử xem chúng có phải là con thứ n của phần tử khác hay không, sau đó nếu cha mẹ trực tiếp của chúng là trvà sau đó chúng có thuộc về chúng hay không .mytable. Nếu bạn thực sự muốn sử dụng "nth" thì một cái gì đó như thế này có lẽ sẽ tốt hơn nhiều : .mytable th:nth-of-type(1) {width: 15%}; .mytable th:nth-of-type(2) {width: 70%};. Cũng không cần chỉ định chiều rộng cột thứ ba trong trường hợp này.
tomasz86

Cá nhân tôi sẽ sử dụng các lớp học hoặc chỉ .mytable th+th{width: 70%}.mytable th+th+th{width:15%}. Bản thân các bộ chọn "thứ n" có thể rất hữu ích nhưng trong trường hợp cụ thể này (một bảng nhỏ chỉ có 3 cột) không thực sự cần thiết. Khi sử dụng, table-layout: fixedbạn thậm chí có thể làm điều này : table{table-layout:fixed}th:first-child+th{width:70%}.
tomasz86

Tôi biết điều đó. Nhưng những bài viết đó là từ nhiều năm trước, và có những vấn đề lớn hơn hiện nay là các bộ chọn CSS, như số lượng lớn hình ảnh và mã JS.
DanMan

8

Đây là hai gợi ý của tôi.

  1. Sử dụng các lớp học. Không cần chỉ định chiều rộng của hai cột khác vì chúng sẽ được trình duyệt tự động đặt thành 15% mỗi cột.

        table { table-layout: fixed; }
        .subject { width: 70%; }
        <table>
          <tr>
            <th>From</th>
            <th class="subject">Subject</th>
            <th>Date</th>
          </tr>
        </table>

  2. Không sử dụng các lớp học. Ba phương pháp khác nhau nhưng kết quả là giống hệt nhau.

    a)

        table { table-layout: fixed; }
        th+th { width: 70%; }
        th+th+th { width: 15%; }
        <table>
          <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
          </tr>
        </table>

    b)

        table { table-layout: fixed; }
        th:nth-of-type(2) { width: 70%; }
        <table>
          <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
          </tr>
        </table>

    c) Đây là yêu thích của tôi. Tương tự như b) nhưng với sự hỗ trợ trình duyệt tốt hơn.

        table { table-layout: fixed; }
        th:first-child+th { width: 70%; }
        <table>
          <tr>
            <th>From</th>
            <th>Subject</th>
            <th>Date</th>
          </tr>
        </table>


5

Tùy thuộc vào cơ thể của bạn (hoặc div đang bao bọc bảng của bạn) 'cài đặt', bạn sẽ có thể thực hiện việc này:

body {
  width: 98%;
}

table {
  width: 100%;
}


th {
  border: 1px solid black;
}


th.From, th.Date {
  width: 15%;
}

th.Date {
  width: 70%;
}


<table>
  <thead>
    <tr>
      <th class="From">From</th>
      <th class="Subject">Subject</th>
      <th class="Date">Date</th>
    </tr>
   </thead>
   <tbody>
     <tr>
       <td>Me</td>
       <td>Your question</td>
       <td>5/30/2009 2:41:40 AM UTC</td>
     </tr>
   </tbody>
</table>

Bản giới thiệu



4
<table>
  <col width="130">
  <col width="80">
  <tr>
    <th>Month</th>
    <th>Savings</th>
  </tr>
  <tr>
    <td>January</td>
    <td>$100</td>
  </tr>
  <tr>
    <td>February</td>
    <td>$80</td>
  </tr>
</table>

Bản giới thiệu


8
Thuộc tính chiều rộng col không được hỗ trợ trong HTML5.
Rune

4

Hãy thử điều này thay thế.

<table style="width: 100%">
    <tr>
        <th style="width: 20%">
           column 1
        </th>
        <th style="width: 40%">
           column 2
        </th>
        <th style="width: 40%">
           column 3
        </th>
    </tr>
    <tr>
        <td style="width: 20%">
           value 1
        </td>
        <td style="width: 40%">
           value 2
        </td>
        <td style="width: 40%">
           value 3
        </td>
    </tr>
</table>

3

Không sử dụng thuộc tính viền, sử dụng CSS cho tất cả các nhu cầu tạo kiểu của bạn.

<table style="border:1px; width:100%;">
    <tr>
            <th style="width:15%;">From</th>
            <th style="width:70%;">Subject</th>
            <th style="width:15%;">Date</th>
    </tr>
... rest of the table code...
</table>

Nhưng việc nhúng CSS như thế là thực tế kém - thay vào đó, người ta nên sử dụng các lớp CSS và đặt các quy tắc CSS vào một tệp CSS bên ngoài.


1
Tôi nghi ngờ rằng ví dụ mã OP và các stackoverflow hữu ích được đăng là vì tính dễ đọc và đơn giản, không có nghĩa là một sự khuyến khích cho các kiểu nội tuyến.
Tass

2

Đây là một cách tối thiểu khác để làm điều đó trong CSS, hoạt động ngay cả trong các trình duyệt cũ không hỗ trợ :nth-childvà các bộ chọn tương tự: http://jsfiddle.net/3wZWt/ .

HTML:

<table>
    <tr>
        <th>From</th>
        <th>Subject</th>
        <th>Date</th>
    </tr>
    <tr>
        <td>Dmitriy</td>
        <td>Learning CSS</td>
        <td>7/5/2014</td>
    </tr>
</table>

CSS:

table {
    border-collapse: collapse;
    width: 100%;
}

tr > * {
    border: 1px solid #000;
}

tr > th + th {
    width: 70%;
}

tr > th + th + th {
    width: 15%;
}

2

Thêm colgroup sau thẻ bảng của bạn. Xác định chiều rộng và số lượng cột ở đây. và thêm thẻ tbody. Đặt tr của bạn bên trong của tbody.

<table>
    <colgroup>
       <col span="1" style="width: 30%;">
       <col span="1" style="width: 70%;">
    </colgroup>


    <tbody>
        <tr>
            <td>First column</td>
            <td>Second column</td>
        </tr>
    </tbody>
</table>

0
style="column-width:300px;white-space: normal;"

Xin chào - chào mừng bạn đến với Stack Overflow. Nói chung, câu trả lời bằng văn bản (thay vì chỉ mã) và một số giải thích được xem là tốt hơn so với chỉ trả lời mã. Vì câu hỏi này đã cũ hơn và có rất nhiều câu trả lời khác, chúng có thể giúp hướng dẫn bạn trong các câu trả lời trong tương lai.
jwheron
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.