2011-02-06 46 views
16

Tôi cần hiển thị dữ liệu dạng bảng bằng cách sử dụng table, nhưng nó sẽ nằm trong bố cục lỏng; Tôi muốn có một nó lấp đầy toàn bộ chiều rộng có sẵn nhưng không mở rộng chiều ngang vượt quá chiều rộng màn hình tối đa, chẳng hạn như các body không nhận được một thanh cuộn ngang. Thay vào đó, các phần tử quá rộng td sẽ có thanh cuộn.Làm cách nào để giới hạn chiều rộng bảng thành phần tử chứa (hoặc màn hình)?

Trong ví dụ này có DATA trong table, các tableborder:1px solid black và đầu ra phải để dễ dàng phân tích khi đường ống từ curl cũng (vì thế white-space:pre); div chỉ là trình trợ giúp bố cục CSS bình thường, nếu có thể, hãy loại bỏ điều đó!

Phần quan trọng là, không phải là loại bố cục pixel cố định và table phải nhỏ hơn chiều rộng có sẵn trong trường hợp dữ liệu không cần nhiều chỗ. Vì vậy, để tổng hợp nó lên, một bảng đơn giản mà không nhận được rộng hơn so với màn hình. Lý tưởng nhất là table sẽ chỉ kéo giãn phần tử của cha mẹ cho đến khi max-width của phần tử kèm theo đó đạt được và sau đó không rộng hơn.

Trong Chrome, với thứ tôi coi là hack ác, tôi phải giữ table ở độ rộng tối đa có sẵn và hiển thị thanh cuộn trên td nếu cần. Tuy nhiên điều này không làm việc cho FF, cũng không phải là giải pháp mà một cái gì đó mà có thể được coi là một chính xác.

Tiếp theo ví dụ về có thể được tìm thấy tại https://hydra.geht.net/table-quirx.html một lúc:

<head> 
<title>Obey max-width for table</title> 
<style> 
.nw    { white-space:nowrap } 
.quirx div  { width:100%; max-width:100%; white-space:pre } 
.quirx td  { max-width:90px; border:1px solid black } 
.quirx td+td { max-width:500px; overflow:auto } 
table.quirx  { width:100%; max-width:100%; border:1px solid black; border-collapse:collapse } 
td    { align:left; max-width:100% } 
</style> 
</head> 
<body> 
<table summary="" class="quirx"><tr><td colspan="3"> 
Just some info 
</td></tr><tr><td>KEY</td><td><div>DATA (which might contain long lines PRE formatted) XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX </div> 
</td></tr></table> 
</body> 
</html> 

Lưu ý rằng "colspan = 3" là không có lỗi ở đây, trong ứng dụng của tôi đôi khi một cột thứ ba có thể xuất hiện, điều này có thể không được biết tại thời điểm tiêu đề table là đầu ra. (Một số điều phong cách là không cần thiết, quá.)

Bí quyết ở trên là, rằng 's max-widthtd cùng có kích thước nhỏ hơn so với màn hình thông thường (590px) và table sau đó được kéo dài đến width nhất định, mà là 100% . Vì td s không kéo dài ra ngoài màn hình, thuộc tính overflow bên trong có thể hoạt động như mong đợi. Tuy nhiên trong FF nó không hoạt động theo cách này, không phải với width cũng không phải với max-width (có thể là do inline-status của chúng). Trong Chrome a width:100% hoặc tương tự không hoạt động trên td cũng như các yếu tố tr. Lưu ý rằng với max-width một bố cục bảng dễ chịu hơn với width (Tôi không hiểu sự khác biệt đó).

Bên cạnh những lỗi này chỉ hoạt động trong Chrome, lỗi khác là, rằng table sử dụng toàn màn hình rộng thậm chí nếu điều đó là không cần thiết nếu chỉ có nhỏ dữ liệu để hiển thị.

Một số lưu ý về điều đó tất cả:

  • Tôi nghĩ rằng đây đây là một điều rất cơ bản và tôi đang bối rối vì sao có vẻ như rất khó để thể hiện với CSS
  • Mục tiêu là để giữ cho nó miễn phí của bất kỳ Javascript, vì vậy chỉ CSS với hacks
  • người dùng có thể thay đổi kích thước cửa sổ, ví dụ từ 800px đến 1920px hoặc thậm chí rộng hơn, và do đó chiều rộng của table sẽ tự động làm theo (không có JavaScript)
  • Nó sẽ hiển thị tốt trên văn bản trình duyệt dựa trên như Lynxw3m, quá
  • Output sẽ không quá lộn xộn để dễ dàng phân tích khi đường ống từ curl
  • Nó sẽ hiển thị nhiều hơn hoặc ít hơn đúng trên chính 4 (IE, FF, Chrome, Safari)
  • Nó không có trách nhiệm phá vỡ những người khác (nó có thể có lỗi hiển thị, nhưng nội dung không được ẩn)

Tôi thực sự không có ý tưởng làm thế nào để lưu trữ đó. Có lẽ đó là một câu hỏi thường gặp, nhưng tôi không thể phát hiện ra một giải pháp cho bản thân mình.

Trả lời

18

(câu trả lời của tôi đến một chút muộn hơn có lẽ mong muốn, nhưng có lẽ nó sẽ có ích cho bạn hoặc người khác không-the-less ...

tôi bao gồm một số đánh dấu (dưới đây) mà tôi đã thực hiện để kiểm tra HTML/CSS để đạt được những gì tôi tin bạn muốn.

có một phong cách di động chiều rộng cố định "fixedcell" và chất lỏng kiểu tế bào chiều rộng "fluidcell".

chiều rộng cố định tôi đã thiết ở độ rộng cố định (ví dụ này là 75px) để minh họa cho mọi thứ tốt hơn.

Các chiều rộng chất lỏng có chiều rộng : tự động để chúng lấp đầy chiều rộng của không gian bảng còn lại; họ cũng quan trọng có không gian trắng: nowrap để văn bản không mở rộng chiều cao của ô (khoảng trắng: trước cũng hoạt động); và cuối cùng chúng bị tràn : ẩn để văn bản không tràn chiều rộng và làm mọi thứ xấu xí, cách khác bạn có thể đặt mức tràn : cuộn để có thanh cuộn trong các ô đó khi/nếu cần.

Bảng được đặt thành 100% chiều rộng để nó sẽ mở rộng để vừa với màn hình/v.v khi cần. Và điều quan trọng liên quan đến kiểu bàn là bố cục bảng : cố định, điều này làm cho bảng tuân thủ bố cục của trang chính xác hơn là tự động định kích thước dựa trên nội dung của bảng (bố cục bảng: tự động) .

Tôi cũng đã thêm một số đường viền để giúp minh họa ranh giới của bảng và ô.

<html> 
<head> 
    <title>Table with auto-width sizing and overflow hiding.</title> 
    <style type="text/css"> 
     table {width:100%; border:solid 1px red; table-layout:fixed;} 
     table td {border:solid 1px green;} 
     .fixedcell {width:75px;} 
     .fluidcell {width:auto; overflow:hidden; white-space:nowrap;} 
    </style> 
</head> 
<body> 
    Table with one fluid column: 
    <table> 
     <tr> 
      <td class="fixedcell">row 1</td> 
      <td class="fluidcell">a whole bunch of content could go here and it still needs to fit nice into the cell without mucking things up</td> 
      <td class="fixedcell">fixie</td> 
      <td class="fixedcell">another</td> 
     </tr> 
    </table> 

    Table with two fluid columns: 
    <table> 
     <tr> 
      <td class="fixedcell">row 1</td> 
      <td class="fluidcell">a whole bunch of content could go here and it still needs to fit nice into the cell without mucking things up</td> 
      <td class="fluidcell">blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah blah</td> 
      <td class="fixedcell">fixie</td> 
      <td class="fixedcell">another</td> 
     </tr> 
    </table> 
</body> 

Tôi đã thử nghiệm nó trong một số trình duyệt hiện đại và dường như làm việc một cách chính xác trong mỗi.

PS.Mặc dù các bảng là một không-không cho bố trí trang nói chung, bảng là chính xác và được khuyến khích cho bố trí dữ liệu dạng bảng.

+0

Điều này hữu ích. Tôi đang gặp sự cố và bố cục bảng dường như đang được phát. Cảm ơn – huyz

+0

Điều này cực kỳ hữu ích, cảm ơn anh chàng –

Các vấn đề liên quan