スクロールバーをhtmlテーブルに表示する方法


86

設定されたサイズを維持するためにhtmlテーブルが必要なページを書いています。テーブルの上部にあるヘッダーを常に表示する必要がありますが、テーブルに追加された行数に関係なく、テーブルの本体もスクロールする必要があります。

このURLのメソッド2のように見せたい:http//www.cssplay.co.uk/menu/tablescroll.html

これを試しましたが、スクロールバーが表示されません。

tbody {
  height: 80em;
  overflow: scroll;
}
<table border=1 id="qandatbl" align="center">
  <tr>
    <th class="col1">Question No</th>
    <th class="col2">Option Type</th>
    <th class="col1">Duration</th>
  </tr>

  <tbody>
    <tr>
      <td class='qid'></td>
      <td class="options"></td>
      <td class="duration"></td>
    </tr>
  </tbody>
</table>


サンプルメソッドのコードを使用してみませんか?<tbody>残念ながらご利用いただけません。
マイクパーク

回答:


164

このようなもの?

http://jsfiddle.net/TweNm/

アイデアは、CSSプロパティを持つ<table>非静的に配置されたでラップすることです。次に、要素を絶対に配置します。<div>overflow:auto<thead>

#table-wrapper {
  position:relative;
}
#table-scroll {
  height:150px;
  overflow:auto;  
  margin-top:20px;
}
#table-wrapper table {
  width:100%;

}
#table-wrapper table * {
  background:yellow;
  color:black;
}
#table-wrapper table thead th .text {
  position:absolute;   
  top:-20px;
  z-index:2;
  height:20px;
  width:35%;
  border:1px solid red;
}
<div id="table-wrapper">
  <div id="table-scroll">
    <table>
        <thead>
            <tr>
                <th><span class="text">A</span></th>
                <th><span class="text">B</span></th>
                <th><span class="text">C</span></th>
            </tr>
        </thead>
        <tbody>
          <tr> <td>1, 0</td> <td>2, 0</td> <td>3, 0</td> </tr>
          <tr> <td>1, 1</td> <td>2, 1</td> <td>3, 1</td> </tr>
          <tr> <td>1, 2</td> <td>2, 2</td> <td>3, 2</td> </tr>
          <tr> <td>1, 3</td> <td>2, 3</td> <td>3, 3</td> </tr>
          <tr> <td>1, 4</td> <td>2, 4</td> <td>3, 4</td> </tr>
          <tr> <td>1, 5</td> <td>2, 5</td> <td>3, 5</td> </tr>
          <tr> <td>1, 6</td> <td>2, 6</td> <td>3, 6</td> </tr>
          <tr> <td>1, 7</td> <td>2, 7</td> <td>3, 7</td> </tr>
          <tr> <td>1, 8</td> <td>2, 8</td> <td>3, 8</td> </tr>
          <tr> <td>1, 9</td> <td>2, 9</td> <td>3, 9</td> </tr>
          <tr> <td>1, 10</td> <td>2, 10</td> <td>3, 10</td> </tr>
          <!-- etc... -->
          <tr> <td>1, 99</td> <td>2, 99</td> <td>3, 99</td> </tr>
        </tbody>
    </table>
  </div>
</div>


15
幅が固定されていない列はどうですか?
Fractaliste 2014

3
私はあなたの答えを試しましたが、ヘッダー列が整列されていません。私はあなたのテーブルをコピーしたbodyタグ内のスタイルタグであなたのcssのみを使用しました
Antonio

素晴らしい解決策ですが、問題があります。行を非表示にしてdisplay:noneを設定しようとすると、行の間に空白があります。これは通常のテーブルには当てはまりません。アイデア、ヒント、提案はありますか?
Daniil Shevelev 2018

@Antonio:同じ問題がありました(中央に配置された*ヘッダー列が整列されていないように見えます)が、追加することでtransform: translateX(-50%)うまくいきました[*中央に配置されたのはFirefoxの標準スタイルで、この回答のJSFiddleの「正規化CSS」オプションによって削除されます]
ソラ。

46

サイズが固定さ<table>れているにを挿入する必要が<div>あり、<div>スタイルでを設定する必要がありますoverflow: scroll


1
私のdivの高さは500pxで、問題なく動作しました。<div style = "overflow:scroll; height:500px;">
Ziggler

3
なぜみんながそんなに複雑にしたのかわからない。これは受け入れられた答えでなければなりません。
amallard 2018

1
これは断然最も簡単な解決策です。オーバーフローと固定高さのdivを追加することには注意が必要な場合がありますが、このソリューションは少なくとも正しい方向にあなたを設定します。
lsimonetti

1
素晴らしいアンサーメイト!あなたに乾杯:)
Sandepku

1
これは受け入れられた答えでなければなりません。シンプルで、要点をまっすぐに、私はそれで他のものを破壊しません。
私は一生懸命努力しますが、

40

受け入れられた答えは良い出発点を提供しましたが、フレームのサイズを変更したり、列の幅を変更したり、テーブルデータを変更したりすると、ヘッダーがさまざまな方法で混乱します。私が見た他のすべての例にも同様の問題があるか、テーブルのレイアウトにいくつかの重大な制限が課されています。

しかし、私はついにこれらすべての問題を解決したと思います。それは取った多くのCSSのを、しかし、最終的な製品は信頼性が高く、通常のテーブルとして使いやすいようにについてです。

OPによって参照されるテーブルを複製するために必要なすべての機能を備えた例を次に示します。jsFiddle

参照と同じになるように、色と境界線を変更する必要があります。これらの種類の変更を行う方法に関する情報は、CSSコメントに記載されています。

コードは次のとおりです。

/*the following html and body rule sets are required only if using a % width or height*/
/*html {
width: 100%;
height: 100%;
}*/
body {
  box-sizing: border-box;
  width: 100%;
  height: 100%;
  margin: 0;
  padding: 0 20px 0 20px;
  text-align: center;
  background: white;
}
.scrollingtable {
  box-sizing: border-box;
  display: inline-block;
  vertical-align: middle;
  overflow: hidden;
  width: auto; /*if you want a fixed width, set it here, else set to auto*/
  min-width: 0/*100%*/; /*if you want a % width, set it here, else set to 0*/
  height: 188px/*100%*/; /*set table height here; can be fixed value or %*/
  min-height: 0/*104px*/; /*if using % height, make this large enough to fit scrollbar arrows + caption + thead*/
  font-family: Verdana, Tahoma, sans-serif;
  font-size: 15px;
  line-height: 20px;
  padding: 20px 0 20px 0; /*need enough padding to make room for caption*/
  text-align: left;
}
.scrollingtable * {box-sizing: border-box;}
.scrollingtable > div {
  position: relative;
  border-top: 1px solid black;
  height: 100%;
  padding-top: 20px; /*this determines column header height*/
}
.scrollingtable > div:before {
  top: 0;
  background: cornflowerblue; /*header row background color*/
}
.scrollingtable > div:before,
.scrollingtable > div > div:after {
  content: "";
  position: absolute;
  z-index: -1;
  width: 100%;
  height: 100%;
  left: 0;
}
.scrollingtable > div > div {
  min-height: 0/*43px*/; /*if using % height, make this large enough to fit scrollbar arrows*/
  max-height: 100%;
  overflow: scroll/*auto*/; /*set to auto if using fixed or % width; else scroll*/
  overflow-x: hidden;
  border: 1px solid black; /*border around table body*/
}
.scrollingtable > div > div:after {background: white;} /*match page background color*/
.scrollingtable > div > div > table {
  width: 100%;
  border-spacing: 0;
  margin-top: -20px; /*inverse of column header height*/
  /*margin-right: 17px;*/ /*uncomment if using % width*/
}
.scrollingtable > div > div > table > caption {
  position: absolute;
  top: -20px; /*inverse of caption height*/
  margin-top: -1px; /*inverse of border-width*/
  width: 100%;
  font-weight: bold;
  text-align: center;
}
.scrollingtable > div > div > table > * > tr > * {padding: 0;}
.scrollingtable > div > div > table > thead {
  vertical-align: bottom;
  white-space: nowrap;
  text-align: center;
}
.scrollingtable > div > div > table > thead > tr > * > div {
  display: inline-block;
  padding: 0 6px 0 6px; /*header cell padding*/
}
.scrollingtable > div > div > table > thead > tr > :first-child:before {
  content: "";
  position: absolute;
  top: 0;
  left: 0;
  height: 20px; /*match column header height*/
  border-left: 1px solid black; /*leftmost header border*/
}
.scrollingtable > div > div > table > thead > tr > * > div[label]:before,
.scrollingtable > div > div > table > thead > tr > * > div > div:first-child,
.scrollingtable > div > div > table > thead > tr > * + :before {
  position: absolute;
  top: 0;
  white-space: pre-wrap;
  color: white; /*header row font color*/
}
.scrollingtable > div > div > table > thead > tr > * > div[label]:before,
.scrollingtable > div > div > table > thead > tr > * > div[label]:after {content: attr(label);}
.scrollingtable > div > div > table > thead > tr > * + :before {
  content: "";
  display: block;
  min-height: 20px; /*match column header height*/
  padding-top: 1px;
  border-left: 1px solid black; /*borders between header cells*/
}
.scrollingtable .scrollbarhead {float: right;}
.scrollingtable .scrollbarhead:before {
  position: absolute;
  width: 100px;
  top: -1px; /*inverse border-width*/
  background: white; /*match page background color*/
}
.scrollingtable > div > div > table > tbody > tr:after {
  content: "";
  display: table-cell;
  position: relative;
  padding: 0;
  border-top: 1px solid black;
  top: -1px; /*inverse of border width*/
}
.scrollingtable > div > div > table > tbody {vertical-align: top;}
.scrollingtable > div > div > table > tbody > tr {background: white;}
.scrollingtable > div > div > table > tbody > tr > * {
  border-bottom: 1px solid black;
  padding: 0 6px 0 6px;
  height: 20px; /*match column header height*/
}
.scrollingtable > div > div > table > tbody:last-of-type > tr:last-child > * {border-bottom: none;}
.scrollingtable > div > div > table > tbody > tr:nth-child(even) {background: gainsboro;} /*alternate row color*/
.scrollingtable > div > div > table > tbody > tr > * + * {border-left: 1px solid black;} /*borders between body cells*/
<div class="scrollingtable">
  <div>
    <div>
      <table>
        <caption>Top Caption</caption>
        <thead>
          <tr>
            <th><div label="Column 1"></div></th>
            <th><div label="Column 2"></div></th>
            <th><div label="Column 3"></div></th>
            <th>
              <!--more versatile way of doing column label; requires 2 identical copies of label-->
              <div><div>Column 4</div><div>Column 4</div></div>
            </th>
            <th class="scrollbarhead"/> <!--ALWAYS ADD THIS EXTRA CELL AT END OF HEADER ROW-->
          </tr>
        </thead>
        <tbody>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
          <tr><td>Lorem ipsum</td><td>Dolor</td><td>Sit</td><td>Amet consectetur</td></tr>
        </tbody>
      </table>
    </div>
    Faux bottom caption
  </div>
</div>

<!--[if lte IE 9]><style>.scrollingtable > div > div > table {margin-right: 17px;}</style><![endif]-->


素晴らしい仕事。15列のテーブルがありますが、水平スクロールバーがないとページにテーブルを含めることができないようです。私はあなたのcss、あなたの美しくコード化されたcssを微調整して、より動的な幅の列に対応しようとしましたが、テーブルの幅以外は何も変更しません。テーブルの幅を100%に変更すると、テーブルはテーブルの幅でレンダリングされますが、列の幅が折り返されないため、15列すべてのデータを表示できません。私はほとんど曲がりくねったように見えるスクロールテーブルを持っているので、どんな助けでもありがたいです。
nanker 2017年

ちょっと待ってください。水平スクロールバーはありません。テーブルが途切れるだけです。
nanker 2017年

@nanker水平スクロールが必要で、JavaScriptを少し使用したい場合は、この回答を確認する必要があります。これは、私が知っているスクロールテーブルを作成するための最良の方法です。この回答を投稿したとき、CSSだけで水平スクロールを行う良い方法はありませんでしたが、しばらく調べていなかったので、今何ができるのかわかりません。
DoctorDestructo 2017年

お見事。複数のヘッダー行を微調整する方法についてコメントしていただけますか?<tr><th></th>..</tr>構成を繰り返すだけでは明らかに機能しません。ありがとう。
デビッドI.マッキントッシュ2017

@ DavidI.McIntoshこの手法を使用すると、複数行のヘッダーが扱いにくくなります。行を追加するのは簡単ですが、行の間に水平方向の境界線をどのように取得するかはわかりません。何らかの理由でJSを使用できない場合を除いて、前のコメントでリンクしたJavaScriptソリューションを試してみることをお勧めします。
DoctorDestructo 2017

3

コンテンツを2つのテーブルに分割することで、この問題を解決しました。

1つのテーブルはヘッダー行です。

秒も<table>タグ付けされ<div>ていますが、静的な高さとオーバーフロースクロールでラップされています。


1

注目に値するのは、目的(私の場合は検索バーの自動入力結果)に応じて、高さを変更可能にし、高さがそれを超える場合にのみスクロールバーが存在するようにすることです。

あなたがそれをしたい場合は、交換するheight: x;max-height: x;、とoverflow:scrolloverflow:auto

また、あなたが使用することができますoverflow-xし、overflow-y必要に応じて、明らかに同じことをして水平に動作しますwidth : x;


0

上記のすべての解決策が機能しない(私にとっては)ようになった場合は、次のようにします。

  • 2つのテーブルを作成します。1つはヘッダー用、もう1つは本体用です。
  • 2つのテーブルに異なる親コンテナ/ divを指定します
  • 2番目のテーブルのdivのスタイルを設定して、その内容を垂直方向にスクロールできるようにします。

このように、あなたの中で HTML

<div class="table-header-class">
    <table>
       <thead>
          <tr>
            <th>Ava</th>
            <th>Alexis</th>
            <th>Mcclure</th>
          </tr>
       </thead>
    </table>
</div>
<div class="table-content-class">
   <table>
       <tbody>
          <tr>
            <td>I am the boss</td>
            <td>No, da-da is not the boss!</td>
            <td>Alexis, I am the boss, right?</td>
          </tr>
       </tbody>
    </table>
</div>

次に、2番目のテーブルの親のスタイルを設定して、垂直スクロールを許可します。 CSS

    .table-content-class {
        overflow-y: scroll;    // use auto; or scroll; to allow vertical scrolling; 
        overflow-x: hidden;    // disable horizontal scroll 
    }

これは、1年前のZviの回答と同じ実装です。
TylerH 2018年

0

テーブルに追加するだけ

style="overflow-x:auto;"

<table border=1 id="qandatbl" align="center" style="overflow-x:auto;">
    <tr>
    <th class="col1">Question No</th>
    <th class="col2">Option Type</th>
    <th class="col1">Duration</th>
    </tr>

   <tbody>
    <tr>
    <td class='qid'></td>
    <td class="options"></td>
    <td class="duration"></td>
    </tr>
    </tbody>
</table>

style = "overflow-x:auto;" `


問題は、列ヘッダーを配置したまま、テーブル本体を垂直方向にスクロールさせる方法でした。
giraffedata

0

非常に簡単、ちょうど持っているのdiv内のテーブルをラップoverflow-y:scroll;し、overflow-x:scrollプロパティ、およびdiv要素がテーブルよりも狭い幅と長さを持たせます。それが動作します!!!


さて、次の回答で追加します。
ゲスト

さて、それをしました、私はまだスタックオーバーフローでコードを正しくインデントする方法をまだ知りません。
ゲスト

0

CSS: div{ overflow-y:scroll; overflow-x:scroll; width:20px; height:30px; } table{ width:50px; height:50px; }

テーブルとテーブルの周囲のDIVは任意のサイズにすることができますが、DIVがテーブルよりも小さいことを確認してください。DIV内にテーブルを含める必要があります。

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