Chiều rộng ô cố định


175

Rất nhiều người vẫn sử dụng bảng để điều khiển bố cục, dữ liệu, v.v. - một ví dụ về điều này là jqGrid phổ biến. Tuy nhiên, có một số phép thuật xảy ra mà tôi dường như không thể hiểu được (các bàn của nó khóc rất to, có thể có bao nhiêu phép thuật?)

Làm thế nào có thể đặt chiều rộng cột của bảng và tuân theo như jqGrid!? Nếu tôi cố gắng sao chép này, ngay cả khi tôi đặt mọi thứ <td style='width: 20px'>, ngay khi nội dung của một trong các ô đó lớn hơn 20px, ô sẽ mở rộng!

Bất kỳ ý tưởng hoặc hiểu biết?

Câu trả lời:


249

Bạn có thể thử sử dụng <col>thẻ quản lý kiểu bảng cho tất cả các hàng nhưng bạn sẽ cần đặt table-layout:fixedkiểu trên lớp <table>hoặc bảng css và đặt overflowkiểu cho các ô

https://developer.mozilla.org/en-US/docs/Web/HTML/Euity/col

<table class="fixed">
    <col width="20px" />
    <col width="30px" />
    <col width="40px" />
    <tr>
        <td>text</td>
        <td>text</td>
        <td>text</td>
    </tr>
</table>

và đây là CSS của bạn

table.fixed { table-layout:fixed; }
table.fixed td { overflow: hidden; }

15
col sẽ không hoạt động trong html5, thiết lập độ rộng của td riêng lẻ thay vì các lớp css hoặc css nội tuyến
Pankaj Phartiyal

10
Câu trả lời được chấp nhận không hoạt động trừ khi bạn áp dụng rõ ràng chiều rộng cho bảng mong muốn. Hoạt động hoàn hảo cho dù bạn sử dụng một đơn vị hoặc tỷ lệ phần trăm. Hình tôi muốn chỉ ra điều này vì câu trả lời của @ totymedli không nhận được bất kỳ phiếu bầu nào và tôi không muốn người dùng bỏ qua nó. Tuy nhiên, đề xuất ngắt từ là không cần thiết trừ khi đó là những gì bạn đang hướng tới.
thebdawk05

Điều gì xảy ra khi bạn có các hàng chỉ có 1 phần tử TD kéo dài nhiều cột? Sử dụng mã mẫu của bạn, nếu bạn có <TD colspan="3">một hàng tự nó sẽ là 90px?
sab669

Cảm ơn nó đã giúp. Đối với dữ liệu chồng chéo, thêm điều này table.fixed td { word-wrap: break-word; }.
Parag Tyagi

Gợi ý ngắt từ là không cần thiết, nhưng nó hữu ích cho những người dùng SO còn lại và khá phù hợp với câu hỏi, vì tràn nội dung trong các bảng có chiều rộng cố định gần như chắc chắn sẽ xuất hiện trong hầu hết các tình huống.
Amy Pellegrini

101

Bây giờ trong HTML5 / CSS3, chúng tôi có giải pháp tốt hơn cho vấn đề. Theo tôi, giải pháp CSS hoàn toàn này được khuyến nghị:

table.fixed {table-layout:fixed; width:90px;}/*Setting the table width is important!*/
table.fixed td {overflow:hidden;}/*Hide text outside the cell.*/
table.fixed td:nth-of-type(1) {width:20px;}/*Setting the width of column 1.*/
table.fixed td:nth-of-type(2) {width:30px;}/*Setting the width of column 2.*/
table.fixed td:nth-of-type(3) {width:40px;}/*Setting the width of column 3.*/
<table class="fixed">
    <tr>
        <td>Veryverylongtext</td>
        <td>Actuallythistextismuchlongeeeeeer</td>
        <td>We should use spaces tooooooooooooo</td>
    </tr>
</table>

Bạn cần đặt bàn widthngay cả trong giải pháp của haunter . Nếu không thì nó không hoạt động.
Ngoài ra một tính năng CSS3 mới mà vsync đề xuất là : word-break:break-all;. Điều này sẽ phá vỡ các từ không có khoảng trắng trong chúng thành nhiều dòng quá. Chỉ cần sửa đổi mã như thế này:

table.fixed { table-layout:fixed; width:90px; word-break:break-all;}

Kết quả cuối cùng

Bảng kết xuất


Nếu bạn ném một hàng vào với một colspan, điều này dường như phá vỡ giải pháp này. Có gợi ý nào về cách sử dụng giải pháp này với bảng chứa colspan> 1 không?
Eric K

@QuantumDOUNDix Tôi đã sửa lỗi này bằng cách bao gồm hàng đầu tiên, một hàng không có colspans, chỉ tất cả các cột riêng lẻ có chiều rộng. Sau đó, tôi đã ẩn hàng đó với 0 chiều cao, đường viền: none, mức độ hiển thị: bị ẩn, phần đệm: 0px, v.v., sau đó hàng thứ hai là hàng đầu tiên tôi muốn thấy ở đó có colspans. Hàng đầu tiên với các ô có chiều rộng cố định riêng sẽ thiết lập độ rộng.
AaronLS

@totymedli Bất kỳ ý tưởng làm thế nào để có được bảng của tôi để lấy tổng của tất cả các chiều rộng cột của tôi? Bảng của tôi được tạo động một chút và tôi không thể tính toán trước chiều rộng của bảng, nhưng tôi không muốn sử dụng 100% vì điều đó kéo dài một số yếu tố.
AaronLS

14
table td 
{
  table-layout:fixed;
  width:20px;
  overflow:hidden;
  word-wrap:break-word;
}

9
Bạn có chắc chắn bạn có thể sử dụng table-layouttrên một yếu tố td?
Nick

@Nick - Nó hoạt động ổn. Hovewer tôi cũng phải thêm thuộc tính chiều rộng tối thiểu và chiều rộng tối đa (cùng giá trị với chiều rộng), và sau đó nó trở thành chiều rộng thực sự cố định.
Denis Khay

11

Tôi đã có một ô td bảng dài, điều này buộc bảng vào các cạnh của trình duyệt và trông xấu xí. Tôi chỉ muốn cột đó chỉ có kích thước cố định và ngắt các từ khi nó đạt đến chiều rộng được chỉ định. Vì vậy, điều này làm việc tốt cho tôi:

<td><div style='width: 150px;'>Text to break here</div></td>

Bạn không cần chỉ định bất kỳ loại kiểu nào cho bảng, phần tử tr. Bạn cũng có thể sử dụng overflow: hidden; như được đề xuất bởi các câu trả lời khác nhưng nó làm cho văn bản thừa biến mất.


2
Hoặc bạn có thể sử dụng chiều rộng tối đa thay vì chiều rộng khi cần thiết. Điều này sẽ cho phép bạn không phá vỡ văn bản trừ khi bạn đạt đến giới hạn chiều rộng của mình. Và ô bảng sẽ không có không gian trống nếu văn bản của bạn nhỏ hơn chiều rộng được chỉ định. <td> <div style = 'max-width: 150px;'> Văn bản để ngắt ở đây </ div> </ td>
Tarik


0

cho bảng chiều rộng FULLSCREEN:

  • chiều rộng bảng PHẢI là 100%

  • nếu cần N colunms, thì THs phải là N + 1

ví dụ cho 3 cột:

table.fixed {
      table-layout: fixed;
      width: 100%;
    }
    table.fixed td {
      overflow: hidden;
    }
  <table class="fixed">
      <col width=20 />
      <col width=20 />
      <col width=20 />
    <tr>
      <th>1</th>
      <th>2</th>
      <th>3</th>
      <th>FREE</th>
    </tr>
    <tr>
      <td>text111111111</td>
      <td>text222222222</td>
      <td>text3333333</td>
    </tr>
  </table>


-2
table
{
  table-layout:fixed;
}
td,th
{
  width:20px; 
  word-wrap:break-word;
}

: con đầu lòng ...: con thứ n (1) hoặc ...

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.