chiều rộng td, không hoạt động?


96

Vì vậy, tôi có mã này ở đây:

<table>
    <tr>
        <td width="200px" valign="top">
            <div class="left_menu">
                <div class="menu_item">
                    <a href="#">Home</a>
                </div>
            </div>
        </td>
        <td width="1000px" valign="top">Content</td>
    </tr>
</table>

với CSS

.left_menu {
    background: none repeat scroll 0 0 #333333;
    border-radius: 5px 5px 5px 5px;
    font-family: Arial,Helvetica,sans-serif;
    font-size: 12px;
    font-weight: bold;
    padding: 5px;
}

.menu_item {
    background: none repeat scroll 0 0 #CCCCCC;
    border-bottom: 1px solid #999999;
    border-radius: 5px 5px 5px 5px;
    border-top: 1px solid #FFFFCC;
    cursor: pointer;
    padding: 5px;
}

Nó hoạt động tốt trên trình duyệt của tôi và tôi đã thử nghiệm nó trên mọi trình duyệt, cả mac và PC, nhưng ai đó phàn nàn rằng tdvới width200 liên tục thay đổi chiều rộng. Tôi không biết anh ta đang nói về cái gì. Có ai biết tại sao anh ấy hoặc cô ấy thấy chiều rộng thay đổi trên tdkhông?


Vì vậy, làm thế nào chúng ta có thể giúp đỡ khi chúng ta thậm chí còn không biết rõ về nội dung khiếu nại là gì? Chúng tôi thậm chí không thể kiểm tra trang thực và chúng tôi không có thông tin về một người nào đó và môi trường duyệt web của họ.
Jukka K. Korpela

Câu trả lời:


125

Nó phải là:

<td width="200">

hoặc là

<td style="width: 200px">

Lưu ý rằng nếu ô của bạn chứa một số nội dung không vừa với 200px (như somelongwordwithoutanyspaces), thì ô sẽ kéo dài, trừ khi CSS của bạn chứa table-layout: fixedcho bảng.

BIÊN TẬP

Như kristina con đã lưu ý trong câu trả lời của cô ấy, bạn nên tránh cả widththuộc tính và sử dụng CSS nội tuyến (có stylethuộc tính). Đó là một thực tiễn tốt để tách biệt phong cách và cấu trúc càng nhiều càng tốt.


Cảm ơn bfavaretto ... cố gắng mà bây giờ
user979331

47
nên bàn được<table style="table-layout:fixed;">
user979331

3
@ user1193385, Đúng vậy. Nhưng tránh sử dụng css nội tuyến nếu có thể.
bfavaretto

4
css nội tuyến là một ý tưởng tồi trừ khi bạn thực sự chỉ cần nó ở một nơi. Ngoài ra, chiều rộng td đã bị giảm giá trị trong một thời gian. xem câu trả lời bên dưới
kristina childs

2
@kristinachilds Tôi đồng ý. Tôi đã sử dụng css nội tuyến trong ví dụ của mình nên tôi sẽ không cần phải chia thành hai khối mã cho HTML và CSS. Đã thêm một nhận xét ở trên yêu cầu OP tránh CSS nội tuyến. Về thuộc tính width, về mặt kỹ thuật, nó không bị phản đối (vì thông số kỹ thuật HTML5 vẫn là một bản nháp đang hoạt động), nhưng bạn nói đúng thì nên tránh nó. Tôi sẽ chỉnh sửa câu trả lời của mình với một ghi chú về điều đó.
bfavaretto

31

Chiều rộng và / hoặc chiều cao trong bảng không còn là tiêu chuẩn nữa; như Ianzz nói, chúng không được dùng nữa. Thay vào đó, cách tốt nhất để làm điều này là có một phần tử khối bên trong ô bảng của bạn sẽ giữ ô mở theo kích thước mong muốn của bạn:

<table>
    <tr>
        <td valign="top">
            <div class="left_menu">
                <div class="menu_item">
                    <a href="#">Home</a>
                </div>
            </div>
        </td>
        <td valign="top" class="content">Content</td>
    </tr>
</table>

CSS

.content {
    width: 1000px;
}

.left_menu {
    background: none repeat scroll 0 0 #333333;
    border-radius: 5px 5px 5px 5px;
    font-family: Arial,Helvetica,sans-serif;
    font-size: 12px;
    font-weight: bold;
    padding: 5px;
    width: 200px;
}

.menu_item {
    background: none repeat scroll 0 0 #CCCCCC;
    border-bottom: 1px solid #999999;
    border-radius: 5px 5px 5px 5px;
    border-top: 1px solid #FFFFCC;
    cursor: pointer;
    padding: 5px;
}

10
Thật không may, công nghệ email chậm hơn nhiều năm so với thông số kỹ thuật HTML hiện tại, và trong trường hợp đó, đáng buồn là không thể tránh khỏi các bảng và css nội tuyến.
MikeTheLiar

2
Không ai nói về email html, điều này dành cho duyệt web cơ bản trên máy tính để bàn. Nhưng có, đối với các bảng email và css nội tuyến là cách duy nhất để xây dựng chúng. Cảm ơn, Microsoft ...
kristina Childs

3
Tôi chỉ đưa ra email vì đó là thứ đã đưa tôi đến đây; Tôi đã gặp vấn đề tương tự với email.
MikeTheLiar

22
 <table style="table-layout:fixed;">

Điều này sẽ buộc chiều rộng được tạo kiểu <td>. Nếu văn bản này lấp đầy nó, nó sẽ chồng lên <td>văn bản khác . Vì vậy, hãy thử sử dụng truy vấn phương tiện.


1
Về trường hợp sử dụng của tôi, đây là quan trọng như bfavaretto của câu trả lời
brasofilo

Trong trường hợp của tôi (Firefox 70.0), đã table-layout:fixedgán chiều rộng cố định cho các cột, vì vậy tôi không thể thay đổi widthnữa (với jquery).
Jose Manuel Abarca Rodríguez,

7

Bạn không thể chỉ định các đơn vị trong width/ heightthuộc tính của bảng; chúng luôn ở dạng pixel, nhưng bạn không nên sử dụng chúng vì chúng không được dùng nữa.



7

Bạn có thể sử dụng trong <td>thẻ css:display:inline-block

Giống: <td style="display:inline-block">





0

Lưu ý rằng việc điều chỉnh độ rộng của một cột trong phần sẽ ảnh hưởng đến toàn bộ bảng

<table>
    <thead>
        <tr width="25">
            <th>Name</th>
            <th>Email</th>
        </tr>
    </thead>
    <tr>
        <td>Joe</td>
        <td>joe@email.com</td>
    </tr>
</table>

Trong trường hợp của tôi, chiều rộng trên thead> tr đã ghi đè trực tiếp chiều rộng trên table> tr> td.


0

Sử dụng

<table style="table-layout:fixed;">

Nó sẽ buộc bảng đặt thành 100% chiều rộng. Sau đó, hãy sử dụng mã này

$('#dataTable').dataTable( {
        bAutoWidth: false, 
        aoColumns : [
          { sWidth: '45%' },
          { sWidth: '45%' },
          { sWidth: '10%' },
              ]
      });

(id bảng là dataTable và có 3 cột) để chỉ định độ dài cho mỗi ô


0

Tôi đã thử với nhiều giải pháp nhưng nó không hiệu quả với tôi vì vậy tôi đã thử uốn dẻo với bảng và nó hoạt động tốt với tôi với tất cả các chức năng của bảng như thu gọn đường viền và như vậy chỉ có thay đổi là thuộc tính hiển thị

Đây là yêu cầu HTML của tôi

<table>
  <thead>
    <tr>
      <th>1</th>
      <th colspan="3">2</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td colspan="3">2</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td>3</td>
      <td>4</td>
    </tr>
    <tr>
      <td>1</td>
      <td>2</td>
      <td colspan="2">3</td>
    </tr>
  </tbody>
</table>

CSS của tôi

table{
    display: flex;
  flex-direction: column;
}
table tr{
    display: flex;
  width: 100%;
}
table > thead > tr > th:first-child{
    width: 20%;
}
table > thead > tr > th:last-child{
    width: 80%;
}
table > tbody tr > td:first-child{
    width: 10%;
}
table > tbody tr > td{
    width: 30%;
}
table > tbody tr > td[colspan="2"]{
    width: 60%;
}
table > tbody tr > td[colspan="3"]{
    width: 90%;
}
/*This is to remove border making 1px space on right*/
table > tbody tr > td:last-child{
    border-right: 0;
}

0

Vấn đề này khá dễ dàng giải quyết bằng cách sử dụng min-widthmax-widthtrong một quy tắc css.

HTML

<table>
  <tr>
    <td class="name">Peter</td>
    <td class="hobby">Photography</td>
    <td class="comment">A long comment about something...</td>
  </td>
</table>

CSS

.name {
  max-width: 80px;
  min-width: 80px;
}

Điều này sẽ buộc cột đầu tiên phải rộng 80px. Thông thường, tôi chỉ sử dụng chiều rộng tối đa mà không có chiều rộng tối thiểu để thống trị trong văn bản đôi khi quá dài để tạo bảng có cột siêu rộng hầu như trống. Câu hỏi của OP là về việc thiết lập một chiều rộng cố định, do đó cả hai quy tắc với nhau. Trên nhiều trình duyệt width:80px;trong CSS bị bỏ qua cho các cột bảng. Đặt chiều rộng trong HTML hoạt động, nhưng không phải là cách bạn nên làm.

Tôi khuyên bạn nên sử dụng quy tắc chiều rộng tối thiểu và chiều rộng tối đa và không đặt chúng giống nhau mà nên đặt một phạm vi. Bằng cách này, bảng có thể làm được điều đó, nhưng bạn có thể cung cấp cho nó một số gợi ý về việc phải làm với nội dung quá dài.

Nếu tôi muốn giữ cho văn bản không bị bao bọc và tăng chiều cao của một hàng - nhưng vẫn giúp người dùng có thể xem toàn bộ văn bản, tôi sử dụng white-space: nowrap;trên quy tắc chính, sau đó áp dụng quy tắc di chuột loại bỏ quy tắc chiều rộng và ngay để người dùng có thể xem toàn bộ nội dung khi họ di chuột qua nội dung đó. Một cái gì đó như thế này:

CSS

.name {
  max-width: 80px;
  white-space: nowrap;
  overflow: hidden;
}
.name:hover {
  max-width: none;
  white-space: normal;
  overflow:auto;
}

Nó chỉ phụ thuộc vào chính xác những gì bạn đang cố gắng đạt được. Tôi hi vọng điêu nay se giup được ai đo. PS Ngoài ra, đối với iOS có một bản sửa lỗi cho di chuột không hoạt động - xem CSS Hover không hoạt động trên iOS Safari và Chrome

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.