Tại sao dấu chấm lửng CSS không hoạt động trong ô bảng?


150

Xem xét ví dụ sau: ( bản demo trực tiếp tại đây )

$(function() {
  console.log("width = " + $("td").width());
});
td {
  border: 1px solid black;
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<table>
  <tbody>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

Đầu ra là : width = 139, và dấu chấm lửng không xuất hiện.

Tôi đang thiếu gì ở đây?



Bằng cách nào đó trùng lặp, nhưng câu trả lời không cung cấp cách giải quyết (như Arlen Cuss làm).
Florian Margaine

1
widthheighttrên các ô của bảng luôn được sử dụng làm chiều rộng và chiều cao tối thiểu . Các tế bào bảng là khác nhau!
Ông Lister

1
@FlorianMargaine Trên thực tế, câu hỏi khác không cung cấp cách giải quyết: đặt div vào ô có chiều rộng mong muốn.
Ông Lister

Tôi vẫn thích các câu trả lời được liệt kê trên trang này tuy nhiên.
Florian Margaine

Câu trả lời:


102

Rõ ràng, thêm:

td {
  display: block; /* or inline-block */
}

giải quyết vấn đề là tốt.


Một giải pháp khả thi khác là đặt table-layout: fixed;cho bảng và cũng đặt nó width. Ví dụ: http://jsfiddle.net/fd3Zx/5/


4
Chính xác. Các phần tử có display: table-cell(mặc định cho tdcác phần tử) không chấp nhận chiều rộng.
Michael Mior

29
display: block;loại thất bại mục đích sử dụng một bảng. Tôi thích các table-layout: fixed;tùy chọn, nó làm việc tốt cho tôi.
Alex K

7
table-layout:fixedphân phối chiều rộng của các cột theo cách kém thông minh hơn. Có một tùy chọn khác sẽ gán chiều rộng cột theo cùng một cách table-layout: normalvà vẫn hiển thị dấu chấm lửng một cách chính xác?
làm tổ

Vít này với đường viền bảng; sử dụng chiều rộng tối đa không.
Charlie

84

Nó cũng quan trọng để đặt

table-layout:fixed;

Trên bảng chứa, vì vậy nó cũng hoạt động tốt trong IE9 (nếu bạn sử dụng chiều rộng tối đa).


7
điều này cũng sẽ đảm bảo rằng tràn văn bản hoạt động trong các bố cục đáp ứng
jao

3
Đây chính xác là những gì tôi cần. Tôi có chiều rộng bảng 100%. Và tất cả các cột ngoại trừ một cột có chiều rộng cố định. Điều này cho phép cột cuối cùng chiếm nhiều không gian còn lại.
matthew_360

78

Như đã nói, bạn có thể sử dụng td { display: block; }nhưng điều này đánh bại mục đích sử dụng bảng.

Bạn có thể sử dụng table { table-layout: fixed; }nhưng có thể bạn muốn nó hoạt động khác nhau đối với một số thuộc địa.

Vì vậy, cách tốt nhất để đạt được những gì bạn muốn là bọc văn bản của bạn <div>và áp dụng CSS của bạn cho <div>(không phải <td>) như thế này:

td {
  border: 1px solid black;
}
td > div {
  width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}

2
Đây là phương pháp đơn giản nhất tôi từng thấy và nó thực sự hoạt động trong IE8.
Keith Ketterer

2
THAT thực sự là giải pháp tốt nhất tôi từng thấy trên dấu chấm lửng trong bảng.
viên

41

Hãy thử sử dụng max-widththay vìwidth , bảng vẫn sẽ tự động tính toán chiều rộng.

Hoạt động ngay cả trong ie11(với chế độ tương thích eg8).

td.max-width-50 {
  border: 1px solid black;
  max-width: 50px;
  overflow: hidden;
  text-overflow: ellipsis;
  white-space: nowrap;
}
<table>
  <tbody>
    <tr>
      <td class="max-width-50">Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
    <tr>
      <td>Hello Stack Overflow</td>
    </tr>
  </tbody>
</table>

jsfiddle .


1
Cũng phát hiện ra. Có lẽ tốt nhất là sử dụng cả hai , để phần tử có chiều rộng cố định. Nếu không, nó có thể ngắn hơn nếu nội dung cho phép nó.
LSerni

Cách tốt hơn hiển thị hack; vít hiển thị với đường viền bảng.
Charlie

21

Trang demo

Đối với các bảng có chiều rộng động, tôi tìm thấy cách bên dưới để tạo ra kết quả thỏa mãn. Mỗi <th>cái được mong muốn có khả năng cắt xén văn bản nên có một phần tử gói bên trong bao bọc nội dung <th>cho phép text-overflowhoạt động.

Bí quyết thực sự là đặt max-width(trên <th>) theo vwđơn vị .

Điều này sẽ có hiệu quả làm cho chiều rộng của phần tử bị "ràng buộc" với chiều rộng của khung nhìn (cửa sổ trình duyệt) và sẽ dẫn đến việc cắt nội dung phản hồi. Đặt các vwđơn vị thành một giá trị thỏa mãn cần thiết.

CSS tối thiểu:

th{ max-width:10vw; }
      
th > .wrap{ 
   text-overflow:ellipsis;
   overflow:hidden;
   white-space:nowrap;
}

Đây là bản demo có thể chạy được:

table {
  font: 18px Arial;
  width: 40%;
  margin: 1em auto;
  color: #333;
  border: 1px solid rgba(153, 153, 153, 0.4);
}

table td, table th {
  text-align: left;
  padding: 1.2em 20px;
  white-space: nowrap;
  border-left: 1px solid rgba(153, 153, 153, 0.4);
}

table td:first-child, table th:first-child {
  border-left: 0;
}

table th {
  border-bottom: 1px solid rgba(153, 153, 153, 0.4);
  font-weight: 400;
  text-transform: uppercase;
  max-width: 10vw;
}

table th > .wrap {
  text-overflow: ellipsis;
  overflow: hidden;
  white-space: nowrap;
}
<table>
    <thead>
        <tr>
            <th>
                <div class="wrap" title="Some long title">Some long title</div>
            </th>
            <th>
                <div class="wrap">Short</div>
            </th>
            <th>
                <div class="wrap">medium one</div>
            </th>
            <th>
                <div class="wrap" title="endlessly super long title which no developer likes to see">endlessly super long title which no developer likes to see</div>
            </th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>-</td>
            <td>-</td>
            <td>-</td>
            <td>very long text here</td>
        </tr>
    </tbody>
</table>


3

Chỉ cần đưa ra một giải pháp thay thế là tôi có vấn đề này và không có câu trả lời nào khác ở đây có hiệu quả mong muốn tôi muốn. Vì vậy, thay vì tôi sử dụng một danh sách. Bây giờ về mặt ngữ nghĩa, thông tin tôi đưa ra có thể được coi là cả dữ liệu dạng bảng nhưng cũng là dữ liệu được liệt kê.

Vì vậy, cuối cùng những gì tôi đã làm là:

<ul>
    <li class="group">
        <span class="title">...</span>
        <span class="description">...</span>
        <span class="mp3-player">...</span>
        <span class="download">...</span>
        <span class="shortlist">...</span>
    </li>
    <!-- looped <li> -->
</ul>

Vì vậy, về cơ bản ultable, litr, và spantd .

Sau đó, trong CSS tôi đặt các spanphần tử thành display:block;float:left;(tôi thích sự kết hợp inline-blockđó vì nó sẽ hoạt động trong các phiên bản IE cũ hơn, để xóa hiệu ứng nổi, xem: http://css-tricks.com/snippets/css/clear- sửa lỗi / ) và cũng có dấu chấm lửng:

span {
    display: block;
    float: left;
    width: 100%;

    // truncate when long
    overflow: hidden;
    text-overflow: ellipsis;
    white-space: nowrap;
}

Sau đó, tất cả những gì bạn làm là thiết lập các max-widthsnhịp của bạn và điều đó sẽ cho danh sách xuất hiện một bảng.


bạn có thể áp dụng ul bên trong td (ví dụ. <td><ul>...</ul></td>)? Nó dường như không hoạt động đối với tôi :(
Sam

2

Thay vì sử dụng dấu chấm lửng để giải quyết vấn đề tràn văn bản, tôi thấy rằng một đầu vào bị vô hiệu hóa và kiểu dáng trông tốt hơn và vẫn cho phép người dùng xem và chọn toàn bộ chuỗi nếu họ cần.

<input disabled='disabled' style="border: 0; padding: 0; margin: 0" />

Nó trông giống như một trường văn bản nhưng có thể nổi bật để thân thiện với người dùng hơn


2
Nó không thân thiện với người dùng vì sử dụng các công cụ hỗ trợ, điều này bị đọc sai thành đầu vào và vì vậy người dùng nghĩ rằng anh ta có thể nhập nội dung nào đó. Nó là khá không ok để sử dụng sai ngữ nghĩa của các yếu tố.
Carlo

OMG, điều này thật thông minh! vì nó là một phần của bảng, chỉ cần đặt đầu vào là không viền với nền trong suốt. Tôi thích giải pháp này!
Sam

1

Kiểm tra box-sizingtài sản css của các tdyếu tố của bạn . Tôi đã có vấn đề với mẫu css mà đặt nó thành border-boxgiá trị. Bạn cần thiết lập box-sizing: content-box.


0

Để lại bàn của bạn như chúng là. Chỉ cần bọc nội dung bên trong TD với một khoảng có CSS ​​cắt ngắn được áp dụng.

/* CSS */
.truncate {
    width: 50px; /*your fixed width */
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;
    display: block; /* this fixes your issue */
}

<!-- HTML -->
<table>
    <tbody>
        <tr>
            <td>
                <span class="truncate">
                    Table data to be truncated if it's too long.
                </span>
            </td>
        </tr>
    </tbody>
</table>

Tôi đã thử điều này, nó không hoạt động trên DataTables.net. bất kỳ ý tưởng?
Sam

-2

Nếu bạn không muốn đặt chiều rộng tối đa thành td (như trong câu trả lời này ), bạn có thể đặt chiều rộng tối đa thành div:

function so_hack(){}

function so_hack(){} http://jsfiddle.net/fd3Zx/754/ function so_hack(){}

function so_hack(){}

Lưu ý: 100% không hoạt động, nhưng 99% thực hiện thủ thuật trong FF. Các trình duyệt hiện đại khác không cần hack div ngớ ngẩn.

td {
  viền: 1px màu đen;
    đệm-trái: 5px;
    đệm-phải: 5px;
}
td> div {
    chiều rộng tối đa: 99%;
    tràn: ẩn;
    tràn văn bản: dấu chấm lửng;
    khoảng trắng: nowrap;

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