2009-06-19 106 views
66

我所知道的this question,但沒有答案的Safari瀏覽器,瀏覽器等方面的工作製作TBODY在WebKit瀏覽器滾動

接受的策略(as demonstrated here)是設置TBODY高度和溢流性能,像這樣:

<table> 
    <thead> 
     <tr><th>This is the header and doesn't scroll</th></tr> 
    </thead> 
    <tbody style="height:100px; overflow:auto;"> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
    </tbody> 
</table> 

不幸的是,這在任何webkit瀏覽器中都不起作用。有一個bug report關於它似乎並不是一個高優先級(報告6月05日)。

所以我的問題是:有實際工作的替代策略?我已經嘗試了兩種表格的方法,但不可能保證標題將與內容對齊。我是否必須等待Webkit來修復它?

回答

0

添加display:block;這也將消除FireFox中不必要的水平滾動。你也是,毫無疑問,知道,無論例如MSIE 8

<table> 
    <thead> 
     <tr><th>This is the header and doesn't scroll</th></tr> 
    </thead> 
    <tbody style="height:100px; overflow:auto;display:block;"> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
     <tr><td>content that scrolls</td></tr> 
    </tbody> 
</table> 
+27

如果您有多個列,這不起作用。 – 2011-07-28 15:13:10

+6

多列不是問題中給出的示例的一部分。 – mmcglynn 2011-08-29 19:44:44

+2

@ mmcglynn:雖然這可能是真的,但首先要做到這一點的唯一理由是多列表,所以這是一個合理的假設。不要以面值爲準考慮所有問題。 – 2014-04-30 11:52:52

17

作品使用顯示:如果你有1列塊風格纔有效。如果您有多個數據列 - 包含多個字段 - 則顯示:block顯示爲使所有數據列可滾動但位於第一列(在Firefox中也是如此 - 這是我知道的唯一瀏覽器,它不會很好地滾動)。順便提一句,在Firefox上 - 您可以使用overflow-x:hidden style來抑制水平滾動。

我意識到我提到的問題只會發生,如果你沒有指定一個寬度的TD & td元素 - 如果你可以修復列寬,那麼它的工作原理。問題是我無法修復列寬。

+7

「問題是我無法修復列寬。」 準確地說,我的問題。 =/ – 2009-08-23 16:52:55

+2

對我來說,無法修復列寬 – i0707 2012-04-27 12:48:10

1

我制定了上述問題
其中工程JavaScript的解決方案只在Firefox 7 +中,因爲我只在FF中測試過

我來到這個線程並找到了解決方案Michael Koper

在此解決方案的三個重要事情完成
1)固定列寬
2)THEAD> TR顯示器被設置爲阻止
3)TBODY顯示設置爲阻止

爲他人提到有修復寬度的問題,我也處於相同的位置;
即使我不能固定寬度靜態

,所以我想我會動態地修正寬度(表在瀏覽器中呈現後) 和這並獲得成功:)

下面是在javascript其運作解決方案只有在FF
(我只在FF測試,我沒有獲得其他瀏覽器)

 function test1(){     
      var tbodys = document.getElementsByTagName("TBODY"); 
      for(var i=0;i<tbodys.length;i++){ 
       do_tbodyscroll(tbodys[i]); 
      } 
     } 


     function do_tbodyscroll(_tbody){ 
      // get the table node 
      var table = _tbody.parentNode; 

      // first row of tbody 
      var _fr = _tbody.getElementsByTagName("TR")[0]; 

      // first row cells .. 
      var _frcells = _fr.cells; 

      // Width array , width of each element is stored in this array 
      var widtharray = new Array(_frcells.length); 

      for(var i=0;i<_frcells.length;i++){      
       widtharray[i] = _frcells[i].scrollWidth; 
      }     

      // Apply width to first row     
      for(var i=0;i<_frcells.length;i++){ 
       _frcells[i].width = widtharray[i];     
      }     

      // Get the Last row in Thead ... 
      // COLGROUPS USING COLSPAN NOT YET SUPPORTED 

      var thead = table.getElementsByTagName("THEAD")[0]; 
      var _rows = thead.getElementsByTagName("TR"); 
      var tableheader = _rows[_rows.length - 1]; 
      var headercells = tableheader.cells; 

      // Apply width to header ..         
      for(var i=0;i<headercells.length;i++){ 
       headercells[i].width = widtharray[i]; 
      } 

      // ADD 16 Pixel of scroll bar to last column .. 
      headercells[headercells.length -1 ].width = widtharray[headercells.length -1] + 16; 

      tableheader.style.display = "block"; 
      _tbody.style.display = "block"; 
     } 

該解決方案發現什麼是列從瀏覽器
寬度,並設置寬度後,再次設置相同的寬度(列頭和第一行tbody)
; THEAD> tr和TBODY顯示器設置爲阻止

希望這個解決方案是爲大家有用..
如果你可以將其擴展到其他瀏覽器請回復這個帖子

3

一個面臨着同樣的問題很久以前,我終於列出了兩張表的方法。結果如下:http://jsfiddle.net/bGr4V/3/,適用於所有瀏覽器(IE6 + incl)。

this jsFiddle你可以玩一個乾淨的版本。

我的解決辦法是增加一個修復細胞<th class="fix"> </th>thead填充滾動條的空間在tbody,然後給一列的可變寬度(<td class="grow">),所以頭修復細胞不會調整大小無與倫比。

HTML:

<div class="fixed_table"> 
    <div class="head"> 
    <table> 
     <thead> 
     <tr> 
      <th>Column header</th> 
      <th class="grow">Column header</th> 
      <th class="fix"> </th> 
     </tr> 
     </thead> 
    </table> 
    <div class="body"> 
    <table class="full_table"> 
     <caption class="caption">Caption</caption> 
     <tbody> 
     <tr> 
      <td>Data</td> 
      <td class="grow">Data</td> 
     </tr> 
     <tr> 
      <td>...</td> 
      <td>...</td> 
     </tr> 
     <tr> 
      <td>...</td> 
      <td>...</td> 
     </tr> 
     </tbody> 
    </table> 
    </div> 
</div> 

CSS:具有*_劈爲ie6-7,和一個特定的在每種情況下的首標修復細胞匹配滾動寬度-webkit

.fixed_table table { 
    table-layout: fixed; 
    width: auto; 
    border-width: 0; 
    padding: 0; 
    border-collapse: collapse; 
} 

.fixed_table .body { 
    overflow: scroll; 
    overflow-x: hidden; 
    max-height: 10.75em; 
    min-height: 2.5em; 
    padding-bottom: 0.8em; 
    *padding-right: 17px; /*ie7 & ie6*/ 
    _padding-right: 0; /*ie6*/ 
    _height: 10em ; 
} 

.fixed_table th, .fixed_table td { 
    width: 4.7em; 
} 

.fixed_table .grow { 
    width: auto; 
} 

.fixed_table .fix { 
    width: 16px; 
    *width: 17px; /*ie7 & ie6*/ 
    _width: 16px; /*ie6*/ 
} 

/* webkit specific */ 
@media screen and (-webkit-min-device-pixel-ratio:0) { 
    .fixed_table .fix{ width: 17px } 
} 
1

這實在是相當哈克但也許這將有助於有人的地方......

http://jsfiddle.net/yUHCq/1/

它使用的列而不是行這樣處理它將基本上倒着做。

爲IE兼容性添加的過渡DOCTYPE。

5

我有同樣的問題,並寫了一個jQuery腳本來做到這一點...使用兩個表格元素和相應的格式的CSS。希望這可以幫助其他人誰具有相同的問題...

http://jsfiddle.net/pe295/1/

5

我看見肖恩Haddy的excellent solution並代爲making some edits的自由:

  • 使用類而不是ID,所以一個jQuery腳本可能被重新用於 多個表在一個頁面上
  • 像標題,THEAD,TFOOT和TBODY
  • 製造滾動條語義HTML表元素的加入支持可選的,所以它不會出現那些比滾動高度「短」表
  • 調整後的滾動div的寬度用
    • 把滾動條拉到桌子旁邊來
    • 製造概念訪問的右邊緣詠歎調隱藏上注入靜態表頭
    • 和離開原始THEAD到位=「真」,只是被隱藏與jQuery並設置aria-hidden="false"
  • 呈多表的示例具有不同尺寸

肖恩雖然做了沉重的舉動。感謝Matt Burland也指出需要支持tfoot。

請看看自己在http://jsfiddle.net/jhfrench/eNP2N/

2

以爲我會扔我的解決辦法混進去 - http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/

它採用與@Michael Koper的解決方案相同的基本路線,但包含一個解決方法,以便在IE瀏覽器返回IE6時表格看起來正確。

我通過給出<table> a table-layout: fixed並明確地爲每列中的單元格指定寬度來解決寬度問題。不理想,但它確實會生成一個語義表,它將對齊跨瀏覽器,而不管是否需要滾動條。

演示:http://codepen.io/tjvantoll/pen/JEKIu

1

這可能是矯枉過正的這個問題,但仍YUI可能提供最好的免費跨瀏覽器的數據表。它也可以用於只讀數據。

YUI 2 DataTable

YUI 3 DataTable

點擊例子有看到滾動的樣本。既然,我是一個新手來stackoverflow,我只能發佈這兩個鏈接。

0

如果有人需要它在IE怪癖模式下工作,這裏是我如何更改和簡化I.G. Pascual的工作代碼:

.fixed_table{ 
     overflow: scroll; 
     overflow-x: hidden; 
     max-height: 300px; 
     height: 300px; 
     min-height: 50px; 
     padding-right:0; 
} 
#datatable td 
{ 
     padding:3px; 
     text-align: center; 
     width: 9%; 
     vertical-align: middle; 
     background-color: #343435; 
     color: #E0E0E3; 
     overflow:hidden; 
} 
<div class="head"> 
    <table> 
     <thead> 
      <tr> 
       <th>Time (GMT)</th> 
       <th>Price</th> 
      </tr> 
     </thead> 
    </table> 
</div> 
<div class="fixed_table"> 
    <table id="datatable" cellspacing="1" cellpadding="1"> 
     <tbody></tbody> 
    </table> 
</div> 
0

讓表格按照它的方式繪製並計算每列的寬度並將其設置到每個標題中。標題由分部製作,然後我們可以讓桌面自由滾動。

<!DOCTYPE html> 
<html> 
<head> 
<style> 
.t_heading{ 
    margin-top: 20px; 
    font-family: Verdana, Geneva, sans-serif; 
    background-color: #4CAF50; 
} 

.heading{ 
    background-color: #4CAF50; 
    color: white; 
    float:left; 
    padding: 8px 0PX 8PX 0PX; 
    border-bottom: 1px solid #ddd; 
    height: 20px; 
    text-align: left; 
} 

.t_data{ 
    overflow-y: scroll; 
    overflow-x: hidden; 
    height:0px; 
    width: 100%; 

} 

.t_content{ 
    border-collapse: collapse; 
    font-family: Verdana, Geneva, sans-serif; 
    width: 100%; 
} 

.column1,.column2,.column3,.column4{ 
    padding: 8px 0PX 8PX 0PX; 
    text-align: left; 
    border-bottom: 1px solid #ddd; 
} 
.t_row:hover{ 
    background-color:#f5f5f5; 
} 
</style> 
<script> 
function setBody(){ 
    var body = document.body, 
    html = document.documentElement; 

    var height = Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight); 
    height = height-300; 
    /* 
    ** By changing the subtraction value, You can fit the table in to the screen correctly. 
    ** Make sure not to come the hscroll. 
    ** Or you can set fixed height with css for the div as your wish. 
    */ 
    document.getElementById("t_data").style.height = height+"px"; 

    setColumnWidth("column1"); 
    setColumnWidth("column2"); 
    setColumnWidth("column3"); 
    setColumnWidth("column4"); 
} 

function setColumnWidth(o){ 
     var object = o; 
     var x = document.getElementsByClassName(object); 
     var y = x[0].clientWidth; 
     document.getElementById(object).style.width = y+"px"; 
} 
</script> 
</head> 

<body onload="setBody()"> 
<div class="t_heading"> 
<div class="heading" id="column1">Heading 1</div> 
<div class="heading" id="column2">Heading 2</div> 
<div class="heading" id="column3">Heading 3</div> 
<div class="heading" id="column4">Heading 4</div> 
</div> 
<div class="t_data" id="t_data"> 
<table class="t_content"> 
    <tr class='t_row'> 
     <td class='column1'>Column1 Row 0</td> 
     <td class='column2'>Column2 Row 0</td> 
     <td class='column3'>Column3 Row 0</td> 
     <td class='column4'>Column4 Row 0</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 1</td> 
     <td class='column2'>Column2 Row 1</td> 
     <td class='column3'>Column3 Row 1</td> 
     <td class='column4'>Column4 Row 1</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 2</td> 
     <td class='column2'>Column2 Row 2</td> 
     <td class='column3'>Column3 Row 2</td> 
     <td class='column4'>Column4 Row 2</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 3</td> 
     <td class='column2'>Column2 Row 3</td> 
     <td class='column3'>Column3 Row 3</td> 
     <td class='column4'>Column4 Row 3</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 4</td> 
     <td class='column2'>Column2 Row 4</td> 
     <td class='column3'>Column3 Row 4</td> 
     <td class='column4'>Column4 Row 4</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 5</td> 
     <td class='column2'>Column2 Row 5</td> 
     <td class='column3'>Column3 Row 5</td> 
     <td class='column4'>Column4 Row 5</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 6</td> 
     <td class='column2'>Column2 Row 6</td> 
     <td class='column3'>Column3 Row 6</td> 
     <td class='column4'>Column4 Row 6</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 7</td> 
     <td class='column2'>Column2 Row 7</td> 
     <td class='column3'>Column3 Row 7</td> 
     <td class='column4'>Column4 Row 7</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 8</td> 
     <td class='column2'>Column2 Row 8</td> 
     <td class='column3'>Column3 Row 8</td> 
     <td class='column4'>Column4 Row 8</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 9</td> 
     <td class='column2'>Column2 Row 9</td> 
     <td class='column3'>Column3 Row 9</td> 
     <td class='column4'>Column4 Row 9</td> 
    </tr><tr class='t_row'> 
     <td class='column1'>Column1 Row 10</td> 
     <td class='column2'>Column2 Row 10</td> 
     <td class='column3'>Column3 Row 10</td> 
     <td class='column4'>Column4 Row 10</td> 
    </tr> 
<!-- 
<?php 
$data = array(); 
for($a = 0; $a<50; $a++) 
{ 
    $data[$a] = array(); 
    $data[$a][0] = "Column1 Row ".$a; 
    $data[$a][1] = "Column2 Row ".$a; 
    $data[$a][2] = "Column3 Row ".$a; 
    $data[$a][3] = "Column4 Row ".$a; 
} 
/* 
** supose you have data in an array.. which red from database. The table will draw using array data. Or you can draw the table manualy. 
** tip: If using manual table, No need of 
** 'var x = document.getElementsByClassName(object); var y = x[0].clientWidth;'. 
** You can just set ID of first row's cells in to some name and use it to read width. 
*/ 
for($i=0;$i<sizeof($data);$i++){ 
    echo "<tr class='t_row'><td class='column1'>".$data[$i][0]."</td><td class='column2'>".$data[$i][1]."</td><td class='column3'>".$data[$i][2]."</td><td class='column4'>".$data[$i][3]."</td></tr>"; 
} 
?> 
--> 
</table> 
</div> 
</body> 
</html> 
相關問題