100%幅のHTMLテーブル、tbody内の垂直スクロール


423

<table>幅を100%に設定し、<tbody>垂直スクロールの内側にのみ高さを設定するにはどうすればよいですか?

tbody内の垂直スクロール

table {
    width: 100%;
    display:block;
}
thead {
    display: inline-block;
    width: 100%;
    height: 20px;
}
tbody {
    height: 200px;
    display: inline-block;
    width: 100%;
    overflow: auto;
}
  
<table>
  <thead>
    <tr>
    	<th>Head 1</th>
    	<th>Head 2</th>
    	<th>Head 3</th>
    	<th>Head 4</th>
    	<th>Head 5</th>
    </tr>
  </thead>
  <tbody>
    <tr>
    	<td>Content 1</td>
    	<td>Content 2</td>
    	<td>Content 3</td>
    	<td>Content 4</td>
    	<td>Content 5</td>
    </tr>
  </tbody>
</table>

私は、変更表示にしようとしたとき、私はいくつかの追加のdivを追加しないようにしたい、私が望むすべては、このような単純なテーブルでありtable-layoutpositionおよびCSSのテーブルでより多くの物事が唯一のピクセルで固定幅で100%の幅との良好な作業ではありません。


私はあなたが何を達成したいのか本当にわかりません。これを見てください:jsfiddle.net/CrSpuとそれがどのように動作するかを教えてください
x4rf41

2
私は知っていますが、見ます.. thとtdは全幅で表示されません.. postimg.org/image/mgd630y61
Marko S


回答:


675

するために<tbody>要素のスクロールを、我々は使用して、すなわち、それがページに表示されます方法を変更する必要があるdisplay: block;ことなどのブロックレベル要素を表示します。

displayプロパティを変更するので、テーブルレイアウトを壊さないように、要素のtbodyプロパティも変更する必要がありtheadます。

だから私たちは:

thead, tbody { display: block; }

tbody {
    height: 100px;       /* Just for the demo          */
    overflow-y: auto;    /* Trigger vertical scroll    */
    overflow-x: hidden;  /* Hide the horizontal scroll */
}

Webブラウザーは thead、デフォルトでおよびtbody要素を行グループtable-header-groupおよびtable-row-group)としてします。

これを変更すると、内側のtr要素はコンテナのスペース全体を埋めません。

これを修正するには、JavaScriptを使用tbodyしてthead列の幅を計算し、対応する値を列に適用する必要があります。

列の自動幅

上記のロジックのjQueryバージョンは次のとおりです。

// Change the selector if needed
var $table = $('table'),
    $bodyCells = $table.find('tbody tr:first').children(),
    colWidth;

// Get the tbody columns width array
colWidth = $bodyCells.map(function() {
    return $(this).width();
}).get();

// Set the width of thead columns
$table.find('thead tr').children().each(function(i, v) {
    $(v).width(colWidth[i]);
});    

そしてここに出力があります(Windows 7 Chrome 32で)

tbody内の垂直スクロール

ワーキングデモ

全幅テーブル、相対幅列

元のポスターが必要だったので、コンテナのtable100%まで拡大し、テーブルの各列にwidth相対(パーセンテージwidthを使用できます。

table {
    width: 100%; /* Optional */
}

tbody td, thead th {
    width: 20%;  /* Optional */
}

テーブルには(一種の)流動的なレイアウトがあるためがあるためthead、コンテナーのサイズが変更されたときに列の幅を調整する必要があります。

したがって、ウィンドウのサイズが変更されたら、列の幅を設定する必要があります。

// Adjust the width of thead cells when *window* resizes
$(window).resize(function() {
    /* Same as before */ 
}).resize(); // Trigger the resize handler once the script runs

出力は次のようになります。

Tbody内に垂直スクロールがある流体表

ワーキングデモ


ブラウザのサポートと代替

私は主要なWebブラウザー(IE10 +を含む)の新しいバージョンを介してWindows 7で上記の2つの方法をテストし、それが機能しました。

しかし、それはしない 作業 正しく IE9上および下に。

これは、テーブルレイアウトでは、すべての要素が同じ構造プロパティに従う必要があるためです。

と要素を使用display: block;すること<thead><tbody>、テーブル構造を壊しました。

JavaScriptを介してレイアウトを再設計する

1つのアプローチは、(全体の)テーブルレイアウトを再設計することです。JavaScriptを使用してその場で新しいレイアウトを作成し、セルの幅/高さを動的に処理および調整します。

たとえば、次の例を見てください。

ネストテーブル

このアプローチでは、divを含む2つのネストされたテーブルを使用します。table1つ目は、1つのセルのみを持ちdiv、2つ目のテーブルはその中に配置されますdiv要素ます。

CSS Play垂直スクロールテーブルを確認する

これは、ほとんどのWebブラウザーで機能します。JavaScriptを介して上記のロジックを動的に実行することもできます。

スクロール時にヘッダーが固定されたテーブル

に垂直スクロールバーを追加する目的は、各行の上部に<tbody>テーブルヘッダーを表示することので、thead要素を固定して配置できます。fixed代わりに画面の上部にます。

ここでワーキングデモによって行われるこのアプローチのジュリアン
有望なWebブラウザーのサポートがあります。

そして、ここでWillem Van Bockstalによる純粋なCSS実装。


純粋なCSSソリューション

これが古い答えです。もちろん、新しいメソッドを追加し、CSS宣言を改良しました。

固定幅のテーブル

この場合、はtable固定されている必要がwidth あります(列の幅の合計と垂直スクロールバーの幅を含む)

列は、特定の持っている必要があり最後の列thead要素が大きいの必要他人に等しい + 垂直スクロールバーのを。

したがって、CSSは次のようになります。

table {
    width: 716px; /* 140px * 5 column + 16px scrollbar width */
    border-spacing: 0;
}

tbody, thead tr { display: block; }

tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}

tbody td, thead th {
    width: 140px;
}

thead th:last-child {
    width: 156px; /* 140px + 16px scrollbar width */
}

出力は次のとおりです。

固定幅のテーブル

ワーキングデモ

100%幅のテーブル

このアプローチでtableは、の幅が100%あり、それぞれのthおよびtdに対して、widthプロパティの値はより小さい必要があり100% / number of colsます。

また、我々は削減する必要があるのをtheadの値としての垂直スクロールバーの。

そのためには、calc()次のようにCSS3 関数を使用する必要があります。

table {
    width: 100%;
    border-spacing: 0;
}

thead, tbody, tr, th, td { display: block; }

thead tr {
    /* fallback */
    width: 97%;
    /* minus scroll bar width */
    width: -webkit-calc(100% - 16px);
    width:    -moz-calc(100% - 16px);
    width:         calc(100% - 16px);
}

tr:after {  /* clearing float */
    content: ' ';
    display: block;
    visibility: hidden;
    clear: both;
}

tbody {
    height: 100px;
    overflow-y: auto;
    overflow-x: hidden;
}

tbody td, thead th {
    width: 19%;  /* 19% is less than (100% / 5 cols) = 20% */
    float: left;
}

こちらがオンラインデモです。

注:このアプローチは、各列のコンテンツが行を分割する場合、つまり各セルのコンテンツが十分に短い場合に失敗します。


以下に、私がこの質問に答えたときに私が作成した純粋なCSSソリューションの 2つの簡単な例があります。

ここにjsFiddle Demo v2があります。

古いバージョン:jsFiddle Demo v1


17
ではdisplay: blockあなたは、テーブルのプロパティを失う列の幅は、thead要素とTBODYの間で共有として。設定によってこれを修正したことはわかっていますがwidth: 19.2%、各列の幅が事前にわからない場合、これは機能しません。
サンブ2014年

10
このコードは、ボディセルが常にヘッダーセルよりも広いと想定しているようです。
アダムドナヒュー2015年

2
ときに機能しませんheight: 100%(テーブルをページの下部まで拡張する場合)。
AlikElzin-kilaka

2
これは、AngularJS ng-repeatテーブルとの相性も抜群です。なぜテーブルヘッダーが固定されたライブラリがすべて存在するのか、またこのソリューションがある場合はどうなのかわかりません。
chakeda 2016年

2
box-sizingプロパティを使用してこれをもう少し改善して、2つの異なる太さの境界線が存在しても列の配置が失われないようにすることができます。
Ricca

89

次のソリューションでは、テーブルは親コンテナの100%を占め、絶対サイズは必要ありません。純粋なCSSであり、フレックスレイアウトが使用されます。

これがどのように見えるかです: ここに画像の説明を入力してください

考えられる欠点:

  • 垂直スクロールバーは、必要かどうかに関係なく常に表示されます。
  • テーブルのレイアウトは修正されました-コンテンツの幅に応じて列のサイズが変更されません(必要な列の幅を明示的に設定できます)。
  • 絶対サイズは1つあります。スクロールバーの幅です。これは、確認できたブラウザでは約0.9emです。

HTML(短縮):

<div class="table-container">
    <table>
        <thead>
            <tr>
                <th>head1</th>
                <th>head2</th>
                <th>head3</th>
                <th>head4</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>content1</td>
                <td>content2</td>
                <td>content3</td>
                <td>content4</td>
            </tr>
            <tr>
                <td>content1</td>
                <td>content2</td>
                <td>content3</td>
                <td>content4</td>
            </tr>
            ...
        </tbody>
    </table>
</div>

CSS、明確にするために一部の装飾を省略:

.table-container {
    height: 10em;
}
table {
    display: flex;
    flex-flow: column;
    height: 100%;
    width: 100%;
}
table thead {
    /* head takes the height it requires, 
    and it's not scaled when table is resized */
    flex: 0 0 auto;
    width: calc(100% - 0.9em);
}
table tbody {
    /* body takes all the remaining available space */
    flex: 1 1 auto;
    display: block;
    overflow-y: scroll;
}
table tbody tr {
    width: 100%;
}
table thead, table tbody tr {
    display: table;
    table-layout: fixed;
}

jsfiddleの完全なコード

LESSと同じコードなので、次のコードを混在させることができます。

.table-scrollable() {
  @scrollbar-width: 0.9em;
  display: flex;
  flex-flow: column;

  thead,
  tbody tr {
    display: table;
    table-layout: fixed;
  }

  thead {
    flex: 0 0 auto;
    width: ~"calc(100% - @{scrollbar-width})";
  }

  tbody {
    display: block;
    flex: 1 1 auto;
    overflow-y: scroll;

    tr {
      width: 100%;
    }
  }
}

2
解決策をありがとう!わずかなバグがありました... theadの幅を2回設定したところ、幅のラインから1.05emを引くと少し良くなることがわかり
TigerBear

1
キャラクターのコンテンツ数はどうですか?列のセル内に文字や単語を追加すると、混乱する
Limon

いくつかの適切なラッピングポリシーをオンに設定するとtd役立つと思います
tsayen

このような解決策はありますが、100%幅の必要性をなくしていますか?
Alexandre Pereira Nunes 2016年

2
@tsayenウィンドウのサイズを変更するときに、どのように縮小して重なり合わないようにしますか?
clearshot66 2017年

31

最近のブラウザーでは、単にcssを使用できます。

th {
  position: sticky;
  top: 0;
  z-index: 2;
}

8
この呪文は不完全です...例を投稿するか、少なくとも詳しく説明してください。
リアム

正常に動作していますが、thにのみ適用されます。位置を粘着性に設定すると機能しません。
Vishal

theadがW3Cに追加されるように修正しました!
sonichy

2
この答えは、あなたが<table>持っ<div>ているものoverflow-y: auto;といくつかのものをラップしたときに機能しますmax-height。例:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
Minwork

2020年の時点で、これが選択された回答になります(@Minworkの更新に沿って)
Christophe Vidal

18

とを使用display:blocktheadていtbodyます。そのための幅thead列列は異なりtbodyます。

table {
    margin:0 auto; 
    border-collapse:collapse;
}
thead {
    background:#CCCCCC;
    display:block
}
tbody {
    height:10em;overflow-y:scroll;
    display:block
}

これを修正するには、小さな jQueryコードますが、それだけで実行できますJavaScript

var colNumber=3 //number of table columns    

for (var i=0; i<colNumber; i++) {
  var thWidth=$("#myTable").find("th:eq("+i+")").width();
  var tdWidth=$("#myTable").find("td:eq("+i+")").width();      
  if (thWidth<tdWidth)                    
      $("#myTable").find("th:eq("+i+")").width(tdWidth);
  else
      $("#myTable").find("td:eq("+i+")").width(thWidth);           
}  

これが私の作業デモです:http : //jsfiddle.net/gavroche/N7LEF/

IE 8では機能しません


これは、固定されていない列幅を許容する、私が見つけた最良/最も簡単なソリューションです(例:.NET DataGridコントロール)。「本番」の場合、colNumber変数は代わりに見つかった実際のセルを反復するコードに置き換えることができます。また、s がある場合は正しく処理されないことに注意してくださいcolspan(必要に応じてコードで改善することもできますが、このスクロール機能が必要になる可能性が高いテーブル)。
JonBrave 14

これは(ある方法で)機能しますが、ウィンドウサイズがテーブルよりも小さい場合は(スクロールバーの幅を無視するため)対応しません。
コーディング終了

テーブルの幅が設定された幅に制限されている場合、ヘッダーとセルは一致しなくなりました
Craig

ここで最も良い答えは、最も簡単なものでもあります
Charles Okwuagwu

18

CSSのみ

以下のためのクロム、Firefoxの、エッジ(およびその他の常緑ブラウザ)

単にposition: sticky; top: 0;あなたのth要素:

/* Fix table head */
.tableFixHead    { overflow-y: auto; height: 100px; }
.tableFixHead th { position: sticky; top: 0; }

/* Just common table stuff. */
table  { border-collapse: collapse; width: 100%; }
th, td { padding: 8px 16px; }
th     { background:#eee; }
<div class="tableFixHead">
  <table>
    <thead>
      <tr><th>TH 1</th><th>TH 2</th></tr>
    </thead>
    <tbody>
      <tr><td>A1</td><td>A2</td></tr>
      <tr><td>B1</td><td>B2</td></tr>
      <tr><td>C1</td><td>C2</td></tr>
      <tr><td>D1</td><td>D2</td></tr>
      <tr><td>E1</td><td>E2</td></tr>
    </tbody>
  </table>
</div>

PS:TH要素の境界線が必要な場合th {box-shadow: 1px 1px 0 #000; border-top: 0;}役立ちます(スクロール時にデフォルトの境界線が正しく描画されないため)。

IE11に対応するためにJSを少しだけ使用する上記のバリアントについては、この回答を参照してくださいhttps://stackoverflow.com/a/47923622/383904


th要素のボーダーがある場合、「border-collapse:collapse」を使用すると、ボーダーがヘッダーではなく本文に貼り付けられます。この問題を回避するには、「border-collapse:Separate」を使用する必要があります。stackoverflow.com/a/53559396を
mrod

@mrodを使用separateすると、火に油を追加します。jsfiddle.net/RokoCB/o0zL4xywここで解決策を参照してください:固定THに境界線を追加 -何かを見逃した場合のOFCの提案を歓迎します
Roko C. Buljan

11

2つのテーブルを次々に作成し、2番目のテーブルを固定高さのdivに配置して、overflowプロパティをautoに設定します。また、2番目のテーブルのthead内のすべてのtdを空のままにします。

<div>
    <table>
        <thead>
            <tr>
                <th>Head 1</th>
                <th>Head 2</th>
                <th>Head 3</th>
                <th>Head 4</th>
                <th>Head 5</th>
            </tr>
        </thead>
    </table>
</div>

<div style="max-height:500px;overflow:auto;">
    <table>
        <thead>
            <tr>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
                <th></th>
            </tr>
        </thead>
        <tbody>
        <tr>
            <td>Content 1</td>
            <td>Content 2</td>
            <td>Content 3</td>
            <td>Content 4</td>
            <td>Content 5</td>
        </tr>
        </tbody>
    </table>    
</div>

8
この場合、2番目のテーブル列は最初のテーブルの幅に追従できません。
kat1330 2017年

2
良くない!2つのテーブルの列の幅の同期が失われます。
Zafar

1
このソリューションを完了するには、ヘッダー列の幅を同期せるために@Hashem Qolamiスクリプト(上記の説明)を追加する必要があります
Elhay Avichzer

6

次の手順に従って、純粋なCSSで最終的に正しくなりました。

http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/

最初のステップは、<tbody>display:ブロックを設定して、オーバーフローと高さを適用できるようにすることです。そこから、<thead>必要に応じて行をposition:relativeおよびdisplay:blockに設定して、現在スクロール可能なの上に配置されるようにします<tbody>

tbody, thead { display: block; overflow-y: auto; }

<thead>は相対的に配置されているため、各テーブルセルには明示的な幅が必要です。

td:nth-child(1), th:nth-child(1) { width: 100px; }
td:nth-child(2), th:nth-child(2) { width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }

しかし、残念ながらそれだけでは不十分です。スクロールバーが存在する場合、ブラウザはそのためにスペースを割り当てます。そのため、最終的に、スクロールバー<tbody>よりも使用可能なスペースが少なくなります<thead>。これが作成するわずかなずれに注意してください...

私が思いつくことができる唯一の回避策は、最後のものを除くすべての列に最小幅を設定することでした。

td:nth-child(1), th:nth-child(1) { min-width: 100px; }
td:nth-child(2), th:nth-child(2) { min-width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }

以下のコードペン全体の例:

CSS:

.fixed_headers {
  width: 750px;
  table-layout: fixed;
  border-collapse: collapse;
}
.fixed_headers th {
  text-decoration: underline;
}
.fixed_headers th,
.fixed_headers td {
  padding: 5px;
  text-align: left;
}
.fixed_headers td:nth-child(1),
.fixed_headers th:nth-child(1) {
  min-width: 200px;
}
.fixed_headers td:nth-child(2),
.fixed_headers th:nth-child(2) {
  min-width: 200px;
}
.fixed_headers td:nth-child(3),
.fixed_headers th:nth-child(3) {
  width: 350px;
}
.fixed_headers thead {
  background-color: #333333;
  color: #fdfdfd;
}
.fixed_headers thead tr {
  display: block;
  position: relative;
}
.fixed_headers tbody {
  display: block;
  overflow: auto;
  width: 100%;
  height: 300px;
}
.fixed_headers tbody tr:nth-child(even) {
  background-color: #dddddd;
}
.old_ie_wrapper {
  height: 300px;
  width: 750px;
  overflow-x: hidden;
  overflow-y: auto;
}
.old_ie_wrapper tbody {
  height: auto;
}

HTML:

<!-- IE < 10 does not like giving a tbody a height.  The workaround here applies the scrolling to a wrapped <div>. -->
<!--[if lte IE 9]>
<div class="old_ie_wrapper">
<!--<![endif]-->

<table class="fixed_headers">
  <thead>
    <tr>
      <th>Name</th>
      <th>Color</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Apple</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Pear</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Grape</td>
      <td>Purple / Green</td>
      <td>These are purple and green.</td>
    </tr>
    <tr>
      <td>Orange</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Banana</td>
      <td>Yellow</td>
      <td>These are yellow.</td>
    </tr>
    <tr>
      <td>Kiwi</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Plum</td>
      <td>Purple</td>
      <td>These are Purple</td>
    </tr>
    <tr>
      <td>Watermelon</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Tomato</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Cherry</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Cantelope</td>
      <td>Orange</td>
      <td>These are orange inside.</td>
    </tr>
    <tr>
      <td>Honeydew</td>
      <td>Green</td>
      <td>These are green inside.</td>
    </tr>
    <tr>
      <td>Papaya</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Raspberry</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Blueberry</td>
      <td>Blue</td>
      <td>These are blue.</td>
    </tr>
    <tr>
      <td>Mango</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Passion Fruit</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
  </tbody>
</table>

<!--[if lte IE 9]>
</div>
<!--<![endif]-->

編集:テーブル幅100%の代替ソリューション(上記は実際には固定幅であり、質問に答えていません):

HTML:

<table>
  <thead>
    <tr>
      <th>Name</th>
      <th>Color</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Apple</td>
      <td>Red</td>
      <td>These are red.</td>
    </tr>
    <tr>
      <td>Pear</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
    <tr>
      <td>Grape</td>
      <td>Purple / Green</td>
      <td>These are purple and green.</td>
    </tr>
    <tr>
      <td>Orange</td>
      <td>Orange</td>
      <td>These are orange.</td>
    </tr>
    <tr>
      <td>Banana</td>
      <td>Yellow</td>
      <td>These are yellow.</td>
    </tr>
    <tr>
      <td>Kiwi</td>
      <td>Green</td>
      <td>These are green.</td>
    </tr>
  </tbody>
</table>

CSS:

table {
  width: 100%;
  text-align: left;
  min-width: 610px;
}
tr {
  height: 30px;
  padding-top: 10px
}
tbody { 
  height: 150px; 
  overflow-y: auto;
  overflow-x: hidden;
}
th,td,tr,thead,tbody { display: block; }
td,th { float: left; }
td:nth-child(1),
th:nth-child(1) {
  width: 20%;
}
td:nth-child(2),
th:nth-child(2) {
  width: 20%;
  float: left;
}
td:nth-child(3),
th:nth-child(3) {
  width: 59%;
  float: left;
}
/* some colors */
thead {
  background-color: #333333;
  color: #fdfdfd;
}
table tbody tr:nth-child(even) {
  background-color: #dddddd;
}

デモ:http : //codepen.io/anon/pen/bNJeLO


1
この質問では、100%幅のテーブルが特に必要でした。これは、参照した例ではできないことの1つです。
コーディング終了

@TrueBlueAussie Good catch:D 100%幅の代替ソリューションを追加。
ミカエルレピスト

セル行のコンテンツの経度を考慮しない
Limon

2

「ブロック」tbodyで列を正しく表示するためのCss回避策

このソリューションでは、thjQueryによって幅を計算および設定する必要があります。

table.scroll tbody,
table.scroll thead { display: block; }

table.scroll tbody {
    overflow-y: auto;
    overflow-x: hidden;
    max-height: 300px;
}

table.scroll tr {
    display: flex;
}

table.scroll tr > td {
    flex-grow: 1;
    flex-basis: 0;
}

そして、jquery / JavaScript

var $table = $('#the_table_element'),
    $bodyCells = $table.find('tbody tr:first').children(),
    colWidth;

$table.addClass('scroll');

// Adjust the width of thead cells when window resizes
$(window).resize(function () {

    // Get the tbody columns width array
    colWidth = $bodyCells.map(function () {
        return $(this).width();
    }).get();

    // Set the width of thead columns
    $table.find('thead tr').children().each(function (i, v) {
        $(v).width(colWidth[i]);
    });

}).resize(); // Trigger resize handler

@Craigは2019年に、IEをまったく気にしなくてもまったく問題ありません。
Automagisch

2

以下のアプローチを試してください、非常にシンプルで簡単に実装できます

以下はjsfiddleリンクです

http://jsfiddle.net/v2t2k8ke/2/

HTML:

<table border='1' id='tbl_cnt'>
<thead><tr></tr></thead><tbody></tbody>

CSS:

 #tbl_cnt{
 border-collapse: collapse; width: 100%;word-break:break-all;
 }
 #tbl_cnt thead, #tbl_cnt tbody{
 display: block;
 }
 #tbl_cnt thead tr{
 background-color: #8C8787; text-align: center;width:100%;display:block;
 }
 #tbl_cnt tbody {
 height: 100px;overflow-y: auto;overflow-x: hidden;
 }

jquery:

 var data = [
    {
    "status":"moving","vehno":"tr544","loc":"bng","dri":"ttt"
    }, {
    "status":"stop","vehno":"tr54","loc":"che", "dri":"ttt"
    },{    "status":"idle","vehno":"yy5499999999999994","loc":"bng","dri":"ttt"
    },{
    "status":"moving","vehno":"tr544","loc":"bng", "dri":"ttt"
    }, {
    "status":"stop","vehno":"tr54","loc":"che","dri":"ttt"
    },{
    "status":"idle","vehno":"yy544","loc":"bng","dri":"ttt"
    }
    ];
   var sth = '';
   $.each(data[0], function (key, value) {
     sth += '<td>' + key + '</td>';
   });
   var stb = '';        
   $.each(data, function (key, value) {
       stb += '<tr>';
       $.each(value, function (key, value) {
       stb += '<td>' + value + '</td>';
       });
       stb += '</tr>';
    });
      $('#tbl_cnt thead tr').append(sth);
      $('#tbl_cnt tbody').append(stb);
      setTimeout(function () {
      var col_cnt=0 
      $.each(data[0], function (key, value) {col_cnt++;});    
      $('#tbl_cnt thead tr').css('width', ($("#tbl_cnt tbody") [0].scrollWidth)+ 'px');
      $('#tbl_cnt thead tr td,#tbl_cnt tbody tr td').css('width',  ($('#tbl_cnt thead tr ').width()/Number(col_cnt)) + 'px');}, 100)

2
このソリューションは、テーブルの幅より狭いウィンドウには対応していません。それが起こるとき、それは水平スクロールを可能にするべきです。また、見出しがデータセル(Chrome)と正確に揃っていません。
コーディング終了

今日は機能しません
MrHIDEn

2

固定幅の追加、TD回目を行った後のtbodythead要素表示ブロックすることは完璧に動作し、また、我々は、使用することができますslimscrollスクロールバーを美しくするためのプラグイン。

ここに画像の説明を入力してください

<!DOCTYPE html>
<html>

<head>
    <title> Scrollable table </title>
    <style>
        body {
            font-family: sans-serif;
            font-size: 0.9em;
        }
        table {
            border-collapse: collapse;
            border-bottom: 1px solid #ddd;
        }
        thead {
            background-color: #333;
            color: #fff;
        }
        thead,tbody {
            display: block;
        }
        th,td {
            padding: 8px 10px;
            border: 1px solid #ddd;
            width: 117px;
            box-sizing: border-box;
        }
        tbody {
            height: 160px;
            overflow-y: scroll
        }
    </style>
</head>

<body>

    <table class="example-table">
        <thead>
            <tr>
                <th> Header 1 </th>
                <th> Header 2 </th>
                <th> Header 3 </th>
                <th> Header 4 </th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td> Row 1- Col 1 </td>
                <td> Row 1- Col 2 </td>
                <td> Row 1- Col 3 </td>
                <td> Row 1- Col 4 </td>
            </tr>
            <tr>
                <td> Row 2- Col 1 </td>
                <td> Row 2- Col 2 </td>
                <td> Row 2- Col 3 </td>
                <td> Row 2- Col 4 </td>
            </tr>
            <tr>
                <td> Row 3- Col 1 </td>
                <td> Row 3- Col 2 </td>
                <td> Row 3- Col 3 </td>
                <td> Row 3- Col 4 </td>
            </tr>
            <tr>
                <td> Row 4- Col 1 </td>
                <td> Row 4- Col 2 </td>
                <td> Row 4- Col 3 </td>
                <td> Row 4- Col 4 </td>
            </tr>
            <tr>
                <td> Row 5- Col 1 </td>
                <td> Row 5- Col 2 </td>
                <td> Row 5- Col 3 </td>
                <td> Row 5- Col 4 </td>
            </tr>
            <tr>
                <td> Row 6- Col 1 </td>
                <td> Row 6- Col 2 </td>
                <td> Row 6- Col 3 </td>
                <td> Row 6- Col 4 </td>
            </tr>
            <tr>
                <td> Row 7- Col 1 </td>
                <td> Row 7- Col 2 </td>
                <td> Row 7- Col 3 </td>
                <td> Row 7- Col 4 </td>
            </tr>
            <tr>
                <td> Row 8- Col 1 </td>
                <td> Row 8- Col 2 </td>
                <td> Row 8- Col 3 </td>
                <td> Row 8- Col 4 </td>
            </tr>
            <tr>
                <td> Row 9- Col 1 </td>
                <td> Row 9- Col 2 </td>
                <td> Row 9- Col 3 </td>
                <td> Row 9- Col 4 </td>
            </tr>
            <tr>
                <td> Row 10- Col 1 </td>
                <td> Row 10- Col 2 </td>
                <td> Row 10- Col 3 </td>
                <td> Row 10- Col 4 </td>
            </tr>
            <tr>
                <td> Row 11- Col 1 </td>
                <td> Row 11- Col 2 </td>
                <td> Row 11- Col 3 </td>
                <td> Row 11- Col 4 </td>
            </tr>
            <tr>
                <td> Row 12- Col 1 </td>
                <td> Row 12- Col 2 </td>
                <td> Row 12- Col 3 </td>
                <td> Row 12- Col 4 </td>
            </tr>
            <tr>
                <td> Row 13- Col 1 </td>
                <td> Row 13- Col 2 </td>
                <td> Row 13- Col 3 </td>
                <td> Row 13- Col 4 </td>
            </tr>
            <tr>
                <td> Row 14- Col 1 </td>
                <td> Row 14- Col 2 </td>
                <td> Row 14- Col 3 </td>
                <td> Row 14- Col 4 </td>
            </tr>
            <tr>
                <td> Row 15- Col 1 </td>
                <td> Row 15- Col 2 </td>
                <td> Row 15- Col 3 </td>
                <td> Row 15- Col 4 </td>
            </tr>
            <tr>
                <td> Row 16- Col 1 </td>
                <td> Row 16- Col 2 </td>
                <td> Row 16- Col 3 </td>
                <td> Row 16- Col 4 </td>
            </tr>
        </tbody>
    </table>


    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jQuery-slimScroll/1.3.8/jquery.slimscroll.min.js"></script>
    <script>
        $('.example-table tbody').slimscroll({
            height: '160px',
            alwaysVisible: true,
            color: '#333'
        })
    </script>
</body>

</html>


1

これは、スクロール可能なtbodyを使用してテーブル上に粘着性のあるtheadを作成するために機能するコードです。

table ,tr td{
    border:1px solid red
}
tbody {
    display:block;
    height:50px;
    overflow:auto;
}
thead, tbody tr {
    display:table;
    width:100%;
    table-layout:fixed;/* even columns width , fix width of table too*/
}
thead {
    width: calc( 100% - 1em )/* scrollbar is average 1em/16px width, remove it from thead width */
}
table {
    width:400px;
}

1

「overflow:scroll」を使用するには、theadとtbodyに「display:block」を設定する必要があります。そしてそれはそれらの間の列幅を台無しにします。ただし、Javascriptを使用してthead行を複製し、tbodyに非表示の行として貼り付けて、正確なcolの幅を維持できます。

$('.myTable thead > tr').clone().appendTo('.myTable tbody').addClass('hidden-to-set-col-widths');

http://jsfiddle.net/Julesezaar/mup0c5hk/

<table class="myTable">
    <thead>
        <tr>
            <td>Problem</td>
            <td>Solution</td>
            <td>blah</td>
            <td>derp</td>
        </tr>
    </thead>
    <tbody></tbody>
</table>
<p>
  Some text to here
</p>

CSS:

table {
  background-color: #aaa;
  width: 100%;
}

thead,
tbody {
  display: block; // Necessary to use overflow: scroll
}

tbody {
  background-color: #ddd;
  height: 150px;
  overflow-y: scroll;
}

tbody tr.hidden-to-set-col-widths,
tbody tr.hidden-to-set-col-widths td {
  visibility: hidden;
  height: 0;
  line-height: 0;
  padding-top: 0;
  padding-bottom: 0;
}

td {
  padding: 3px 10px;
}

0

このjsfiddleを試してください。これはjQueryを使用しており、Hashem Qolamiの回答から作成されています。まず、通常のテーブルを作成してからスクロール可能にします。

const makeScrollableTable = function (tableSelector, tbodyHeight) {
  let $table = $(tableSelector);
  let $bodyCells = $table.find('tbody tr:first').children();
  let $headCells = $table.find('thead tr:first').children();
  let headColWidth = 0;
  let bodyColWidth = 0;

  headColWidth = $headCells.map(function () {
    return $(this).outerWidth();
  }).get();
  bodyColWidth = $bodyCells.map(function () {
    return $(this).outerWidth();
  }).get();

  $table.find('thead tr').children().each(function (i, v) {
    $(v).css("width", headColWidth[i]+"px");
    $(v).css("min-width", headColWidth[i]+"px");
    $(v).css("max-width", headColWidth[i]+"px");
  });
  $table.find('tbody tr').children().each(function (i, v) {
    $(v).css("width", bodyColWidth[i]+"px");
    $(v).css("min-width", bodyColWidth[i]+"px");
    $(v).css("max-width", bodyColWidth[i]+"px");
  });

  $table.find('thead').css("display", "block");
  $table.find('tbody').css("display", "block");

  $table.find('tbody').css("height", tbodyHeight+"px");
  $table.find('tbody').css("overflow-y", "auto");
  $table.find('tbody').css("overflow-x", "hidden");

};
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.