Bảng 100% chiều rộng tràn div container


136

Tôi đang gặp vấn đề với một bảng html tràn bộ chứa chính của nó.

.page {
    width: 280px;
    border:solid 1px blue;
}

.my-table {
    word-wrap: break-word; 
}

.my-table td {
    border:solid 1px #333;
}
<div class="page">
    <table class="my-table">
        <tr>
            <th>Header Text</th>
            <th>Col 1</th>
            <th>Col 2</th>
            <th>Col 3</th>
            <th>Col 4</th>
            <th>Header Text</th>
        </tr>
        <tr>
            <td>An archipelago is a chain or cluster of islands. The word archipelago is derived from the Greek ἄρχι- – arkhi and πέλαγος – pélagosthrough the Italian arcipelago. In Italian, possibly following a tradition of antiquity, the Arcipelago (from medieval Greek *ἀρχιπέλαγος) was the proper name for the Aegean Sea and, later, usage shifted to refer to the Aegean Islands (since the sea is remarkable for its large number of islands). It is now used to refer to any island group or, sometimes, to a sea containing a large number of scattered islands such as the Aegean Sea.[1]</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>some data</td>
            <td>An archipelago is a chain or cluster of islands. The word archipelago is derived from the Greek ἄρχι- – arkhi and πέλαγος – pélagosthrough the Italian arcipelago. In Italian, possibly following a tradition of antiquity, the Arcipelago (from medieval Greek *ἀρχιπέλαγος) was the proper name for the Aegean Sea and, later, usage shifted to refer to the Aegean Islands (since the sea is remarkable for its large number of islands). It is now used to refer to any island group or, sometimes, to a sea containing a large number of scattered islands such as the Aegean Sea.[1]</td>
        </tr>
    </table>    
</div>

Làm thế nào tôi có thể buộc cả văn bản tiêu đề và văn bản ô bảng để bọc theo cách nó sẽ phù hợp với thùng chứa của nó đúng cách? Tôi thích một phương thức chỉ CSS, nhưng cũng sẵn sàng sử dụng Javascript (hoặc jQuery) nếu thực sự cần thiết.

Câu trả lời:


252

Từ phối cảnh hoàn toàn "làm cho nó phù hợp với div", hãy thêm phần sau vào lớp bảng của bạn ( jsfiddle ):

table-layout: fixed;
width: 100%;

Đặt độ rộng cột của bạn như mong muốn; mặt khác, thuật toán bố trí cố định sẽ phân phối chiều rộng bảng đồng đều trên các cột của bạn.

Để tham khảo nhanh, đây là các thuật toán bố trí bảng, nhấn mạnh của tôi:

  • Đã sửa ( nguồn )
    Với thuật toán (nhanh) này, bố cục ngang của bảng không phụ thuộc vào nội dung của các ô; nó chỉ phụ thuộc vào chiều rộng của bảng, chiều rộng của các cột và đường viền hoặc khoảng cách ô.
  • Tự động ( nguồn )
    Trong thuật toán này (thường yêu cầu không quá hai lần), chiều rộng của bảng được cho bởi chiều rộng của các cột [, như được xác định bởi nội dung] (và các đường viền can thiệp ).

    [...] Thuật toán này có thể không hiệu quả vì nó yêu cầu tác nhân người dùng có quyền truy cập vào tất cả nội dung trong bảng trước khi xác định bố cục cuối cùng và có thể yêu cầu nhiều hơn một lần vượt qua.

Nhấp qua tài liệu nguồn để xem chi tiết cụ thể cho từng thuật toán.


54

Hãy thử thêm

word-break: break-all 

đến CSS trên phần tử bảng của bạn.

Điều đó sẽ làm cho các từ trong các ô của bảng bị phá vỡ để bảng không phát triển rộng hơn div chứa của nó, tuy nhiên các cột của bảng vẫn có kích thước động. bản demo jsfiddle .


10
Thậm chí tốt hơn vớiword-wrap: break-word;
Apolo

1
@Apolo - Đồng ý! Tôi cũng đã sử dụng nó trong bản demo jsfiddle ban đầu của mình (xem liên kết trong phần thân câu trả lời ở trên).
Jon Schneider

1
Trình duyệt Blink có word-break: break-wordhoạt động tốt nhất.
Volvox

overflow-wrapThay vào đó, tốt hơn là sử dụng tài sản, vì nó được chuẩn hóa
Romko

18

Thêm display: block;overflow: auto;để .my-table. Điều này chỉ đơn giản là cắt bỏ mọi thứ vượt quá 280pxgiới hạn bạn đã thi hành. Không có cách nào để làm cho nó "trông đẹp" với yêu cầu đó do những từ như pélagosthroughrộng hơn 280px.


Chỉ với trường hợp của tôi: Tôi cần bảng phù hợp với tất cả chiều rộng cha mẹ (ở độ phân giải cao), vì vậy tôi bao quanh bảng với một div và áp dụng các kiểu của bạn cho nó. Bây giờ bảng cố gắng sử dụng tất cả chiều rộng của cha mẹ nhưng nếu nội dung bảng tràn ra thì nó sẽ xuất hiện thanh cuộn.
manuman94

2

Hãy thử thêm vào td:

display: -webkit-box; // to make td as block
word-break: break-word; // to make content justify

tds tràn sẽ phù hợp với hàng mới.


1

Vâng, với các ràng buộc của bạn, tôi nghĩ rằng thiết lập overflow: scroll;trên .pagediv có lẽ là lựa chọn duy nhất của bạn. 280 px là khá hẹp và với kích thước phông chữ của bạn, việc gói từ một mình sẽ không làm điều đó. Một số từ chỉ dài và không thể gói gọn. Bạn có thể giảm kích thước phông chữ của mình một cách mạnh mẽ hoặc đi với tràn: cuộn.


1

cập nhật CSS của bạn như sau: điều này sẽ khắc phục

.page {
    width: 280px;
    border:solid 1px blue;
    overflow-x: auto;
}
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.