70

私はこの質問を知っていますが、Safari、Chromeなどではどの答えも機能しません。

受け入れられている戦略(ここに示されているように)は、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ブラウザでも機能しません。優先度が高くないように思われるバグレポートがあります(6月5日報告)。

だから私の質問は:実際に機能する代替戦略はありますか?2テーブルのアプローチを試しましたが、ヘッダーがコンテンツと一致することを保証することはできません。Webkitが修正するのを待つ必要がありますか?

4

14 に答える 14

33

これが実際の例です:

http://www.imaputz.com/cssStuff/bigFourVersion.html

display:block を thead > tr および tbody に追加する必要があります

于 2011-11-10T18:24:46.887 に答える
17

display:blockスタイルの使用は、列が1つある場合にのみ機能します。複数のデータ列(複数のフィールド)がある場合、display:blockはすべてのデータ列をスクロール可能にするように見えますが、最初の列の下にあります(Firefoxでも同じです-これは私が知っている唯一のブラウザーで、スクロールがうまくいきます)。ちなみに、Firefoxでは、overflow-x:hiddenスタイルを使用して水平スクロールを抑制することができます。

私が言及した問題は、th&td要素の幅を指定していない場合にのみ発生することに気付きました。列の幅を修正できれば、それは機能します。私にとっての問題は、列幅を修正できないことです。

于 2009-08-19T09:44:48.170 に答える
12

このページの最初の方法である単一のテーブルを持つ純粋な CSS を試してください (テーブルの周りに 2 つの div があり、ヘッドは絶対に配置 されています): http://www.cssplay.co.uk/menu/tablescroll.html IE7/FF3.6に加えてFF4/IE9/IE8。

于 2011-04-08T15:39:13.253 に答える
5

私はSeanHaddyの優れたソリューションを見て、自由に編集を行いました。

  • IDの代わりにクラスを使用するため、1つのjQueryスクリプトを1ページの複数のテーブルに再利用できます
  • caption、thead、tfoot、tbodyなどのセマンティックHTMLテーブル要素のサポートが追加されました
  • スクロールバーをオプションにして、スクロール可能な高さよりも「短い」テーブルには表示されないようにしました
  • スクロールdivの幅を調整して、スクロールバーをテーブルの右端に移動しました
  • によってコンセプトにアクセスできるようになりました
    • 挿入された静的テーブルヘッダーでaria-hidden="true"を使用する
    • 元のtheadをそのままにして、jQueryで非表示にして設定しますaria-hidden="false"
  • サイズの異なる複数のテーブルの例を示しました

しかし、ショーンは重労働をしました。tfootをサポートする必要性を指摘してくれたMattBurlandにも感謝します。

http://jsfiddle.net/jhfrench/eNP2N/で自分の目で確かめてください

于 2012-10-11T18:42:36.020 に答える
5

私は同じ問題を抱えていて、これを行うためにjQueryスクリプトを書きました... 2つのテーブル要素を使用し、それに応じてcssをフォーマットします。これが同じ問題を抱えている他の人に役立つことを願っています...

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

于 2012-07-12T21:12:08.373 に答える
3

A はずっと前に同じ問題に直面し、ついに 2 つのテーブルのアプローチに着手しました。これが結果です: http://jsfiddle.net/bGr4V/3/、すべてのブラウザー (IE6+ を含む) で動作します。

この jsFiddleでは、クリーン バージョンで遊ぶことができます。

私の解決策は、 のスクロール バーのスペースを埋めるために修正セル <th class="fix"> </th>を追加し、1 つの列に可変幅 ( ) を付けて、サイズ変更時にヘッダー修正セルが一致しないようにすることでした。theadtbody<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 のhas*とhack、およびそれぞれの場合にスクロール幅に一致するヘッダーfix-cellに固有のもの。_-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 }
}
于 2012-02-08T16:45:10.477 に答える
2

私は自分のソリューションをミックスに投入したいと思っていました - http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/

@Michael Koperのソリューションと同じ基本的なルートを取りますが、回避策が含まれているため、IEでテーブルがIE6に戻って正しく表示されます。

<table>atable-layout: fixedを指定し、各列のセルに幅を明示的に割り当てることで、幅の問題を解決します。理想的ではありませんが、スクロールバーが必要かどうかに関係なく、クロス ブラウザーを整列させるセマンティック テーブルが生成されます。

デモ: http://codepen.io/tjvantoll/pen/JEKIu

于 2012-11-11T02:22:22.900 に答える
1

これは本当にかなりハッキーですが、多分それはどこかで誰かを助けるでしょう...

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

行の代わりに列を使用するため、処理は基本的に逆方向に行われます。

IEとの互換性のために移行DOCTYPEが追加されました。

于 2012-02-08T22:18:00.630 に答える
1

上記の問題に対する JavaScript ソリューションを開発しました
。これは Firefox 7 以降でのみ機能します。これは FF でのみテストし

たためです。このスレッドに来て、Michael Koperが指摘する解決策を見つけました。

このソリューションでは、3 つの重要な処理が行われます
。1) 列幅を修正します
。2) thead > tr 表示をブロックに設定します
。3) tbody 表示をブロックに設定します。

他の人が幅を修正する問題があると述べたように、私も同じ立場にいます。
幅を静的に修正することさえできません

だから私は幅を動的に修正すると思った(テーブルがブラウザでレンダリングされた後)そしてこれはトリックをした:)

以下は、FFでのみ機能するjavascriptのソリューションです
(私は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 表示がブロックに設定されている

このソリューションが皆さんにとって役立つことを願っています..
他のブラウザに拡張できる場合は、この投稿に返信してください

于 2012-02-02T11:08:10.660 に答える
1

この質問にはやり過ぎかもしれませんが、YUI はおそらく最良の無料のクロスブラウザー データテーブルを提供しています。読み取り専用データにも使用できます。

YUI 2 データテーブル

YUI 3 データテーブル

そこにある例をクリックして、スクロール可能なサンプルを表示します。私はstackoverflowの初心者なので、これら2つのリンクしか投稿できません。

于 2013-01-31T19:54:01.900 に答える
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>
于 2016-08-14T13:47:30.113 に答える
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>
于 2009-07-20T16:16:45.123 に答える
0

ここに、IE5+、Firefox、および Chrome で動作する例があります。ただし、固定幅の列を使用します。 http://www.cssplay.co.uk/menu/tablescroll.html

于 2014-06-13T02:35:55.283 に答える