純粋なCSSの固定ヘッダーと固定列のあるテーブル


97

固定のヘッダーと固定の最初の列を含むhtmlテーブル(または同様の外観)を作成する必要があります。

これまでに見てきたすべてのソリューションはJavascriptを使用するかjQuery、scrollTop / scrollLeftを設定しますが、モバイルブラウザーではスムーズに機能しないため、純粋なCSSソリューションを探しています。

ここで固定列の解決策を見つけました:jsfiddle.net/C8Dtf/20/ですが、ヘッダーを固定するためにそれを拡張する方法もわかりません。

Webkitブラウザーで動作したり、いくつかのcss3機能を使用したりJavascriptしたいのですが、繰り返しますが、スクロールには使用したくありません。

編集:これは私が達成したい動作の例です:https : //web.archive.org/web/20130829032141/http : //datatables.net/release-datatables/extras/FixedColumns/css_size.html


今のところ、固定ヘッダー<thead>を含む<html> <table>がcss-level-3と関係している場所がわかりません。他に何がありますか?これまでに何を試しましたか?
Milche Patern 2013

position行とセルに複雑な動作を適用しようとしましたが、どこに適用できるかわかりません。
panfil 2013

回答:


140

ヘッダー行と最初の列が固定された実際の純粋なCSSソリューション

純粋なCSSを使用して、固定ヘッダーと固定の最初の列の両方を含むテーブルを作成する必要があり、ここでの答えはどれも私が望んでいたものとまったく同じではありませんでした。

このposition: stickyプロパティは、Chrome、Firefox、およびEdgeの最新バージョンの上部(側面で最もよく使用することを確認した)と側面の両方をサポートします。これdivは、overflow: scrollプロパティを持つと組み合わせることができ、ページのどこにでも配置できる固定ヘッダー付きのテーブルを提供します。

テーブルをコンテナに配置します。

<div class="container">
  <table></table>
</div>

overflow: scrollコンテナーで使用してスクロールを有効にします。

div.container {
  overflow: scroll;
}

以下のようダグマーはコメントで指摘し、コンテナも必要ですmax-widthし、max-height

使用position: stickyテーブルセルがエッジに固執し、持っているtoprightまたはleftに固執しているエッジを選択します:

thead th {
  position: -webkit-sticky; /* for Safari */
  position: sticky;
  top: 0;
}

tbody th {
  position: -webkit-sticky; /* for Safari */
  position: sticky;
  left: 0;
}

MarredCheeseとしてコメントで述べたあなたの最初の列が含まれている場合は、<td>代わりの要素<th>の要素を、あなたは使用することができtbody td:first-child、あなたのCSSではなく、tbody th

最初の列のヘッダーを左側に固定するには、以下を使用します。

thead th:first-child {
  left: 0;
  z-index: 1;
}

https://jsfiddle.net/qwubvg9m/1/


22
これが最良の答えのようです。
user1190132

9
@PirateApp width最初の列がわかっている場合position: stickyは、2番目の列のセルでleft、最初の列の値と等しい値を使用できます。jsfiddle.netwidth / wvypo83c
Matthew Schlachter

4
この答えは、一番下まで読んでおく価値があることを証明しています!
mlerley 2018年

4
これは、コンテナーに最大幅と最大高さを設定しないと機能しません。
ダグマー

9
この答えは、ここSOとWeb全体で驚くほど自信を持っており、不可解に支持されているポスターからの、機能不全で複雑すぎて時間を浪費する答えの果てしない海へと私たちを導く灯台です。最初の列に<td>要素ではなく<th>要素が含まれている場合は、のtbody td:first-child代わりにCSSで使用できますtbody th
MarredCheese

32

最近で、プロパティでのみCSSを使用してこれを実現できposition: stickyます。

ここにスニペットがあります:

(jsFiddle:https ://jsfiddle.net/hbqzdzdt/5/ )

.grid-container {
  display: grid; /* This is a (hacky) way to make the .grid element size to fit its content */
  overflow: auto;
  height: 300px;
  width: 600px;
}
.grid {
  display: flex;
  flex-wrap: nowrap;
}
.grid-col {
  width: 150px;
  min-width: 150px;
}

.grid-item--header {
  height: 100px;
  min-height: 100px;
  position: sticky;
  position: -webkit-sticky;
  background: white;
  top: 0;
}

.grid-col--fixed-left {
  position: sticky;
  left: 0;
  z-index: 9998;
  background: white;
}
.grid-col--fixed-right {
  position: sticky;
  right: 0;
  z-index: 9998;
  background: white;
}

.grid-item {
  height: 50px;
  border: 1px solid gray;
}
<div class="grid-container">
  <div class="grid">
    <div class="grid-col grid-col--fixed-left">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
      <div class="grid-item">
        <p>Hello</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
      <div class="grid-item">
        <p>P</p>
      </div>
    </div>

    <div class="grid-col grid-col--fixed-right">
      <div class="grid-item grid-item--header">
        <p>HEAD</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
      <div class="grid-item">
        <p>9</p>
      </div>
    </div>

  </div>
</div>

互換性について。すべての主要なブラウザで動作しますが、IEでは動作しません。ポリフィルがありますが、試しposition: stickyたことはありません。


2
これは素晴らしいです、大好きです!
Luキャプテン

3
<div>ではなく<table> -tagsでこれを実現する方法
Andreas

1
アプリケーションを開発していて、このテーブルを印刷するためにレコードをループする必要がある場合、これは良いパフォーマンスにはならないと思います。テーブルのすべての列について、レコードの配列全体をループする必要があるためです。このHTMLは列ごとに機能します。
igasparetto 2018

@igasparetto実際に行/列を逆に配置しても、ソリューションは機能します。後で時間があれば、グリッド順の行->列のスニペットを作成できます。
Alvaro

2
<table>と関連するタグを使用せずに表形式のデータを表示しないことをお勧めします。アクセシビリティを含め、HTMLの使用目的をこのように壊すことにはいくつかの問題があります。参照:w3.org/WAI/tutorials/tables
Ben Morris

15

これは簡単なことではありません。

次のリンクは、実際のデモへのリンクです。

lanoxxのコメントに応じてリンクを更新

http://jsfiddle.net/C8Dtf/366/

これらを追加することを忘れないでください:

<script type="text/javascript" charset="utf-8" src="http://datatables.net/release-datatables/media/js/jquery.js"></script>
<script type="text/javascript" charset="utf-8" src="http://datatables.net/release-datatables/media/js/jquery.dataTables.js"></script>
<script type="text/javascript" charset="utf-8" src="http://datatables.net/release-datatables/extras/FixedColumns/media/js/FixedColumns.js"></script>

これを達成する他の方法は見ていません。特にcssのみを使用することはできません。

これは、やりがいのあることです。お役に立てれば :)


:フィルタの使用を切り替えるには "bFilter": false
lanoxx

6
これ cssのみで実現できます。簡単ではありませんが可能です。
ジミーT.

約10のソリューションから、これが機能した唯一のものでした。ところで、「57エントリ中1から57を表示」を削除する"bInfo" : falseには、.dataTable()通話に追加します
hansaplast '11年

datatables == "awesome"
ビリーノア2014

このソリューションは悪いため、反対票を投じます。thead変化にバインドされていない独自のテーブル内にあるtd要素を、セルのテキストが長い場合ので、th幅がそれに応じて調整しません。
vsync

14

これらの提案はすべてすばらしいものですが、ヘッダーまたは列のいずれかのみを修正するか、両方を修正するか、JavaScriptを使用しています。その理由-それは純粋なCSSで実行できるとは考えていません。理由:

それが可能である場合は、いくつかのスクロール可能なdivを互いに入れ子にして、それぞれ異なる方向にスクロールする必要があります。次に、テーブルを3つの部分(固定ヘッダー、固定列、残りのデータ)に分割する必要があります。

いいよ しかし今問題は-スクロールするときにそれらの1つをそのままにしておくことができますが、もう1つは最初のスクロール領域内にネストされているため、見えないところにスクロールされる可能性があるため、固定することはできません。スクリーン。「あはは」あなたは「しかし、絶対位置または固定位置を使用してそれを行うことができる」と言います-できません。これを行うとすぐに、そのコンテナーをスクロールする機能を失います。それは鶏と卵の状況です-あなたは両方を持つことはできません、彼らはお互いをキャンセルします。

唯一の解決策はJavaScriptを使用することだと思います。3つの要素を完全に分離し、JavaScriptを介してそれらの位置を同期させる必要があります。このページの他の投稿には良い例があります。これも一見の価値があります:

http://tympanus.net/codrops/2014/01/09/sticky-table-headers-columns/


9

jsfiddleでいくつかの変更を行いました。これはあなたがやろうとしていることかもしれません。

http://jsfiddle.net/C8Dtf/81/

タイトルを次のようにハードコーディングしました。

<table id="left_table" class="freeze_table">
    <tr class='tblTitle'>
         <th>Title 1</th>
         <th>Title 2</th>
    </tr>
</table>

そして、いくつかのスタイルも追加しました。

.tblTitle{
   position:absolute;
    top:0px;
    margin-bottom:30px;
    background:lightblue;
}
td, th{
    padding:5px;
    height:40px;
    width:40px;
    font-size:14px;
}

これがあなたが望むものであることを願っています:)


1
コンテンツと一緒にスクロールするには、右のテーブルのヘッダーが必要です。
panfil 2013

URLは次のとおりです:jsfiddle.net/C8Dtf/84。右側のテーブルのスタイルをいじって、2つのテーブルを揃えるだけです。
Phillip-juan

いいえ、よくわかりません。右のテーブルのヘッダーを上部に固定して、テーブルを上下にスクロールしても表示されるようにする必要がありますが、テーブルを右または左にスクロールすると、ヘッダーは右または左にスクロールする必要がありますが、上部に固定されています。英語が下手でごめんなさい。
パンフィル2013

それでは、右側のテーブルのヘッダーを垂直方向にスクロールするときに固定し、水平方向にスクロールするときにスクロールしたいですか?
Phillip-juan 2013

これは私が達成したい行動の例です。datatables.net/release-datatables/extras/FixedColumns/...
panfil

9

CSSのみを使用した例:

.table {
  table-layout: fixed;
  width: 500px;
  border-collapse: collapse;
}

.header th {
  font-family: Calibri;
  font-size: small;
  font-weight: lighter;
  border-left: 1px solid #000;
  background: #d0d0d0;
}

.body_panel {
  display: inline-block;
  width: 520px;
  height: 300px;
  overflow-y: scroll;
}

.body tr {
  border-bottom: 1px solid #d0d0d0;
}

.body td {
  border-left: 1px solid #d0d0d0;
  padding-left: 3px;
  font-family: Calibri;
  font-size: small;
  overflow: hidden;
  white-space: nowrap;
  text-overflow: ellipsis;
}
<body>

  <table class="table">

    <thead class="header">

      <tr>
        <th style="width:20%;">teste</th>
        <th style="width:30%;">teste 2</th>
        <th style="width:50%;">teste 3</th>
      </tr>

    </thead>
  </table>

  <div class="body_panel">

    <table class="table">
      <tbody class="body">

        <tr>
          <td style="width:20%;">asbkj k kajsb ksb kabkb</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

        <tr>
          <td style="width:20%;">2</td>
          <td style="width:30%;">2</td>
          <td style="width:50%;">3</td>
        </tr>

      </tbody>
    </table>

  </div>

</body>


3
ヘダーを修正するだけでなく、最初の列も必要でした。
panfil 2013年

この例は、htmlに2つのテーブルがあるアプローチを示しています。1つのテーブルはヘッダーのみをレンダリングします。2番目のテーブルは行のみをレンダリングしますが、内でレンダリングしますdivdivヘッダーが同じ場所にあるときに行スクロールを許可するのは、です。このアプローチは私のニーズに役立ちました。
David Tansey 2014

水平スクロールもある場合は、テーブルのスクロール位置を同期させるためにJSが必要です。
ゾルタンTamási

4

ヘッダーと列の両方を修正するには、次のプラグインを使用できます。


2019年7月に更新

最近では(親コンテナーの代わりに)各アイテムに適用されたCSSプロパティposition: sticky;(詳細はこちら)に基づく純粋なCSSソリューションも登場していTHます


1
最初のリンクが壊れています。2つ目はjQueryを使用します。
PussInBoots 2018

デッドリンクを削除するために回答を更新
Luca Detomi

3

この問題についてPaul O'Brienが優れた解決策を見つけたので、リンクを共有したい:https : //codepen.io/paulobrien/pen/LBrMxa

フッターのスタイルを削除しました:

html {
  box-sizing: border-box;
}
*,
*:before,
*:after {
  box-sizing: inherit;
}
.intro {
  max-width: 1280px;
  margin: 1em auto;
}
.table-scroll {
  position: relative;
  width:100%;
  z-index: 1;
  margin: auto;
  overflow: auto;
  height: 350px;
}
.table-scroll table {
  width: 100%;
  min-width: 1280px;
  margin: auto;
  border-collapse: separate;
  border-spacing: 0;
}
.table-wrap {
  position: relative;
}
.table-scroll th,
.table-scroll td {
  padding: 5px 10px;
  border: 1px solid #000;
}
.table-scroll thead th {
  position: -webkit-sticky;
  position: sticky;
  top: 0;
}

th:first-child {
  position: -webkit-sticky;
  position: sticky;
  left: 0;
  z-index: 2;
  background: #ccc;
}
thead th:first-child {
  z-index: 5;
}

2

私は最近、固定のヘッダーグループと固定の最初の列を使用してソリューションを作成する必要がありました。テーブルをdivに分割し、jqueryを使用してウィンドウのスクロールをキャプチャしました。

http://jsfiddle.net/TinT/EzXub/2346/

var prevTop = 0;
var prevLeft = 0;

$(window).scroll(function(event){
  var currentTop = $(this).scrollTop();
  var currentLeft = $(this).scrollLeft();

  if(prevLeft !== currentLeft) {
    prevLeft = currentLeft;
    $('.header').css({'left': -$(this).scrollLeft()})
  }
  if(prevTop !== currentTop) {
    prevTop = currentTop;
    $('.leftCol').css({'top': -$(this).scrollTop() + 40})
  }
});

1

同僚と私は、固定ヘッダーでテーブルを装飾するために使用できるAngularディレクティブを提供する新しいGitHubプロジェクトをリリースしました。 https //github.com/objectcomputing/FixedHeader

それはいくつかのdivを追加するディレクティブでcssとangularのみに依存しています。jQueryは必要ありません。

この実装は他のいくつかの実装ほど完全には機能していませんが、単に固定テーブルを追加する必要がある場合は、これが適切なオプションであると考えられます。


1

Internet Explorer 9 + Chrome + Firefox(Windows)およびSafari(Mac)との2日間の戦いの後、

  • これらすべてのブラウザと互換性があります
  • JavaScriptを使用しない
  • une divと1つのテーブルのみを使用する
  • ヘッダーとフッターを修正(IEを除く)、スクロール可能なボディ。同じ列幅のヘッダーと本文

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

HTML:

  <thead>
    <tr>
      <th class="nombre"><%= f.label :cost_center %></th>
      <th class="cabecera cc">Personal</th>
      <th class="cabecera cc">Dpto</th>
    </tr>
  </thead>
  <tbody>
    <% @cost_centers.each do |cc| %>
    <tr>
      <td class="nombre"><%= cc.nombre_corto %></td>
      <td class="cc"><%= cc.cacentrocoste %></td>
      <td class="cc"><%= cc.cacentrocoste_dpto %></td>
    </tr>
    <% end %>
  </tbody>
  <tfoot>
    <tr>
      <td colspan="3"><a href="#">Mostrar mas usuarios</a></td>
    </tr>
  </tfoot>
</table>

CSS:

div.cost_center{
  width:320px;
  font-size:75%;
  margin-left:5px;
  margin-top:5px;
  margin-bottom: 2px;
  float: right;
  display: inline-block;
  overflow-y: auto;
  overflow-x: hidden;
  max-height:300px;  
}

div.cost_center label { 
  float:none;
  font-size:14px;
}

div.cost_center table{
  width:300px;
  border-collapse: collapse; 
  float:right;
  table-layout:fixed;
}

div.cost_center table tr{
  height:16px;
}
div.cost_center th{
  font-weight:normal;
}

div.cost_center table tbody{
  display: block;
  overflow: auto;
  max-height:240px;
}

div.cost_center table thead{
  display:block;
}

div.cost_center table tfoot{
  display:block;
}
div.cost_center table tfoot td{
  width:280px;
}
div.cost_center .cc{
  width:60px;
  text-align: center; 
  border: 1px solid #999;
}

div.cost_center .nombre{
  width:150px;
}
div.cost_center tbody .nombre{
  border: 1px solid #999;
}

div.cost_center table tfoot td{
 text-align:center;  
 border: 1px solid #999; 
} 

div.cost_center table th, 
div.cost_center table td { 
  padding: 2px;
  vertical-align: middle; 
}

div.cost_center table tbody td {
  white-space: normal;
  font:  .8em/1.4em Verdana, sans-serif;
  color: #000;
  background-color: white;
}
div.cost_center table th.cabecera { 
  font:  0.8em/1.4em Verdana, sans-serif;
  color: #000;
  background-color: #FFEAB5;
}

うまくいきますが、私にはうまくいきません。この例(jsfiddle.net/5ka6e)では、ヘッダーのサイズが正しく変更されません。この種のエラーは、最終的にはデータとヘッダーが一致しなくなる可能性があります。
darkzangel 14

1
あなたは追加することを忘れ div.cost_center table{border-collapse: collapse;}及び第三のキャプションは、その何か(この例では)60PX内に収まるように持っている
アルバートCatalàの

1

既存の回答はほとんどの人に適していますが、影を付けたい人は、固定ヘッダーの下と最初の(固定)列の右側に、実際の例を示します(純粋なcss):

http://jsbin.com/nayifepaxo/1/edit?html,output

仕事にこれを得ることに主なトリックは、使用している::after最初のそれぞれの右側に影を追加するためにtd、各中tr

tr td:first-child:after {
  box-shadow: 15px 0 15px -15px rgba(0, 0, 0, 0.05) inset;
  content: "";
  position:absolute;
  top:0;
  bottom:0;
  right:-15px;
  width:15px;
}

すべてが機能するようになるまでしばらく(長すぎる...)かかったので、同じような状況にある人のために共有したいと思いました。


他の誰かの答えに基づいてこれを作り、影を付けましたか?
PussInBoots 2018

1

ヘッダーフッターを修正する必要がある


0

このような何かがあなたのために働くかもしれません...それはおそらくあなたのヘッダー行のために列幅を設定することを必要とするでしょう。

thead { 
    position: fixed;
}

http://jsfiddle.net/vkhNC/

更新:

あなたが挙げた例がCSSだけで可能だとは思いません。私は誰かが私を間違っていることを証明してくれるのが大好きです。 これが私がこれまで持ってきたものです。それは完成品ではありませんが、あなたのスタートになるかもしれません。これにより、どこにいても役立つ方向性が示されることを願っています。


ヘッダーだけでなく、最初の列も修正する必要があります。
パンフィル2013

5
問題は、ヘッダーの幅が緩んでいることです。ヘッダー列のサイズとデータ列のサイズが異なると見苦しくなります。
Akash Kava

0

別の解決策は、AngularJSを使用することです。AngularUIモジュールには、ng-grid列固定と呼ばれる機能をサポートすると呼ばれるディレクティブがあります。これは100%純粋なCSSではありませんが、他のソリューションでもありません。

http://angular-ui.github.io/ng-grid/#columnPinning


0

純粋なCSSの例:

<div id="cntnr">
    <div class="tableHeader">
        <table class="table-header table table-striped table-bordered">
            <thead>
                <tr>
                    <th>this</th>
                    <th>transmission</th>
                    <th>is</th>
                    <th>coming</th>
                    <th>to</th>
                    <th>you</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>we've got it...</td>
                    <td>alright you are go</td>
                    <td>uh, we see the Earth now</td>
                    <td>we've got it...</td>
                    <td>alright you are go</td>
                    <td>uh, we see the Earth now</td>
                </tr>
            </tbody>
        </table>
    </div>


    <div class="tableBody">
        <table class="table-body table table-striped table-bordered">
            <thead>
                <tr>
                    <th>this</th>
                    <th>transmission</th>
                    <th>is</th>
                    <th>coming</th>
                    <th>to</th>
                    <th>you</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>we've got it...</td>
                    <td>alright you are go</td>
                    <td>uh, we see the Earth now</td>
                    <td>we've got it...</td>
                    <td>alright you are go</td>
                    <td>uh, we see the Earth now</td>
                </tr>
            </tbody>
        </table>
    </div>

</div>

#cntnr {
    width: auto;
    height: 200px;
    border: solid 1px #444;
    overflow: auto;
}

.tableHeader {
    position: fixed;
    height: 40px;
    overflow: hidden;
    margin-right: 18px;
    background: white;
}

.table-header tbody {
    height: 0;
    visibility: hidden;
}

.table-body thead {
    height: 0;
    visibility: hidden;
}

http://jsfiddle.net/cCarlson/L98m854d/

欠点:固定ヘッダー構造/ロジックは特定の次元にかなり依存しているため、抽象化はおそらく実行可能なオプションではありません


固定ヘッダーと固定最初の列の両方が必要です。
panfil 2014

これを指摘してくれてありがとう、パンフィル。編集します。乾杯
コーディ

0

位置:stickyは、Chromeの(thead)などの一部の要素や、Safariなどの他のWebkitブラウザでは機能しません。

しかし、それは(th)でうまく機能します

body {
  background-color: rgba(0, 255, 200, 0.1);
}

.intro {
  color: rgb(228, 23, 23);
}

.wrapper {
  overflow-y: scroll;
  height: 300px;
}

.sticky {
  position: sticky;
  top: 0;
  color: black;
  background-color: white;
}
<div class="container intro">
  <h1>Sticky Table Header</h1>
  <p>Postion : sticky doesn't work for some elements like (thead) in chrome and other webkit browsers like safari. </p>
  <p>But it works fine with (th)</p>
</div>
<div class="container wrapper">
  <table class="table table-striped">
    <thead>
      <tr>
        <th class="sticky">Firstname</th>
        <th class="sticky">Lastname</th>
        <th class="sticky">Email</th>
      </tr>
    </thead>
    <tbody>
      <tr>
        <td>James</td>
        <td>Vince</td>
        <td>james@example.com</td>
      </tr>
      <tr>
        <td>Jonny</td>
        <td>Bairstow</td>
        <td>jonny@example.com</td>
      </tr>
      <tr>
        <td>James</td>
        <td>Anderson</td>
        <td>james@example.com</td>
      </tr>
      <tr>
        <td>Stuart</td>
        <td>Broad</td>
        <td>stuart@example.com</td>
      </tr>
      <tr>
        <td>Eoin</td>
        <td>Morgan</td>
        <td>eoin@example.com</td>
      </tr>
      <tr>
        <td>Joe</td>
        <td>Root</td>
        <td>joe@example.com</td>
      </tr>
      <tr>
        <td>Chris</td>
        <td>Woakes</td>
        <td>chris@example.com</td>
      </tr>
      <tr>
        <td>Liam</td>
        <td>PLunkett</td>
        <td>liam@example.com</td>
      </tr>
      <tr>
        <td>Jason</td>
        <td>Roy</td>
        <td>jason@example.com</td>
      </tr>
      <tr>
        <td>Alex</td>
        <td>Hales</td>
        <td>alex@example.com</td>
      </tr>
      <tr>
        <td>Jos</td>
        <td>Buttler</td>
        <td>jos@example.com</td>
      </tr>
      <tr>
        <td>Ben</td>
        <td>Stokes</td>
        <td>ben@example.com</td>
      </tr>
      <tr>
        <td>Jofra</td>
        <td>Archer</td>
        <td>jofra@example.com</td>
      </tr>
      <tr>
        <td>Mitchell</td>
        <td>Starc</td>
        <td>mitchell@example.com</td>
      </tr>
      <tr>
        <td>Aaron</td>
        <td>Finch</td>
        <td>aaron@example.com</td>
      </tr>
      <tr>
        <td>David</td>
        <td>Warner</td>
        <td>david@example.com</td>
      </tr>
      <tr>
        <td>Steve</td>
        <td>Smith</td>
        <td>steve@example.com</td>
      </tr>
      <tr>
        <td>Glenn</td>
        <td>Maxwell</td>
        <td>glenn@example.com</td>
      </tr>
      <tr>
        <td>Marcus</td>
        <td>Stoinis</td>
        <td>marcus@example.com</td>
      </tr>
      <tr>
        <td>Alex</td>
        <td>Carey</td>
        <td>alex@example.com</td>
      </tr>
      <tr>
        <td>Nathan</td>
        <td>Coulter Nile</td>
        <td>nathan@example.com</td>
      </tr>
      <tr>
        <td>Pat</td>
        <td>Cummins</td>
        <td>pat@example.com</td>
      </tr>
      <tr>
        <td>Adam</td>
        <td>Zampa</td>
        <td>zampa@example.com</td>
      </tr>
    </tbody>
  </table>
</div>

または私のコードペンの例をご覧ください


-1

これはあなたに役立つと思います:https : //datatables.net/release-datatables/extensions/FixedHeader/examples/header_footer.html

簡単に言うと、dataTableの作成方法がわかっている場合は、このjQuery行を一番下に追加するだけです。

$(document).ready(function() {
    var table = $('#example').DataTable();

    new $.fn.dataTable.FixedHeader( table, {
        bottom: true
    } );
} );

bottom:true // Bottomヘッダーも固定するためのものです。


-2

純粋なHTMLとCSSのみを使用したい場合は、問題の解決策があります。
このjsFiddleでは、固定ヘッダーを持つテーブルを提供する非スクリプトソリューションを確認できます。固定の最初の列にもマークアップを適合させることは問題になりません。hWrapper-div 内の最初の列に絶対配置テーブルを作成し、-divを再配置するvWrapperだけです。
動的コンテンツを提供することは、サーバー側またはブラウザー側の誘惑エンジンを使用しても問題にはなりません。私のソリューションは、すべての最新のブラウザーとIE8以降の古いブラウザーでうまく機能します。


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