Sabit başlıklı HTML tablosu mu?


231

Sütun başlıklarının ekranda sabit kalması ve tablo gövdesiyle kaydırılmaması için uzun bir HTML tablosu görüntülemek için çapraz tarayıcı CSS / JavaScript tekniği var mı? Microsoft Excel'deki "bölmeleri dondur" etkisini düşünün.

Tablonun içeriği arasında dolaşmak istiyorum, ancak her zaman üstteki sütun başlıklarını görebiliyorum.


3
Bunu deneyin: Sabit Üstbilgi EDIT ile Saf CSS Kaydırılabilir Tablo : Bu bir örnekte görüldüğü gibi Internet Explorer 7'de çalışması gerekir : Sabit Üstbilgi ile Kaydırma HTML Tablosu EDIT 2: Kullanılabilecek birkaç ekstra bağlantı buldum: - Aptal fixed header - Bazı sınırlamaları olan bir jQuery eklentisi. - [Sabit Tablo Başlıkları] ( cross-browser.com/x/examp
gcores

Ben genellikle çalışan birçok çözüm rastladım ama hiçbiri div kaydırma çalıştı. Yani, tablonuz kaydırılabilir bir div içinde ve yine de tablonuzun üstbilgisinin hala bu div içinde olmasını istiyorsunuz. Bunu çözdüm ve çözümü burada paylaştım .
Yogee

9
2018 yılında, tüm tarayıcılar Aşağıdaki basit çözümü kullanabilirsiniz: thead th { position: sticky; top: 0; }. Safari'nin bir satıcı ön ekine ihtiyacı var:-webkit-sticky
Daniel Waltrip

1
@DanielWaltrip bunu en üst noktaya kadar oy alabilmek için bir cevap eklemelisiniz - diğer tüm cevaplar pozisyonla gereksizdir: yapışkan bugünlerde daha iyi destek olmak
Peter Kerr

Yanıtlar:


88

Bir süre bunun için bir çözüm arıyordum ve cevapların çoğunun durumum için uygun olmadığını veya uygun olmadığını buldum, bu yüzden jQuery ile basit bir çözüm yazdım.

Çözüm taslağı şöyledir:

  1. Sabit bir üstbilgiye sahip olması gereken tabloyu kopyalayın ve klonlanmış kopyayı orijinalin üstüne yerleştirin.
  2. Masa gövdesini üst tabladan çıkarın.
  3. Tablo başlığını alt tablodan çıkarın.
  4. Sütun genişliklerini ayarlayın. (Orijinal sütun genişliklerini takip ediyoruz)

Aşağıda çalıştırılabilir bir demoda kod bulunmaktadır.

function scrolify(tblAsJQueryObject, height) {
  var oTbl = tblAsJQueryObject;

  // for very large tables you can remove the four lines below
  // and wrap the table with <div> in the mark-up and assign
  // height and overflow property  
  var oTblDiv = $("<div/>");
  oTblDiv.css('height', height);
  oTblDiv.css('overflow', 'scroll');
  oTbl.wrap(oTblDiv);

  // save original width
  oTbl.attr("data-item-original-width", oTbl.width());
  oTbl.find('thead tr td').each(function() {
    $(this).attr("data-item-original-width", $(this).width());
  });
  oTbl.find('tbody tr:eq(0) td').each(function() {
    $(this).attr("data-item-original-width", $(this).width());
  });


  // clone the original table
  var newTbl = oTbl.clone();

  // remove table header from original table
  oTbl.find('thead tr').remove();
  // remove table body from new table
  newTbl.find('tbody tr').remove();

  oTbl.parent().parent().prepend(newTbl);
  newTbl.wrap("<div/>");

  // replace ORIGINAL COLUMN width				
  newTbl.width(newTbl.attr('data-item-original-width'));
  newTbl.find('thead tr td').each(function() {
    $(this).width($(this).attr("data-item-original-width"));
  });
  oTbl.width(oTbl.attr('data-item-original-width'));
  oTbl.find('tbody tr:eq(0) td').each(function() {
    $(this).width($(this).attr("data-item-original-width"));
  });
}

$(document).ready(function() {
  scrolify($('#tblNeedsScrolling'), 160); // 160 is height
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script>

<div style="width:300px;border:6px green solid;">
  <table border="1" width="100%" id="tblNeedsScrolling">
    <thead>
      <tr><th>Header 1</th><th>Header 2</th></tr>
    </thead>
    <tbody>
      <tr><td>row 1, cell 1</td><td>row 1, cell 2</td></tr>
      <tr><td>row 2, cell 1</td><td>row 2, cell 2</td></tr>
      <tr><td>row 3, cell 1</td><td>row 3, cell 2</td></tr>
      <tr><td>row 4, cell 1</td><td>row 4, cell 2</td></tr>			
      <tr><td>row 5, cell 1</td><td>row 5, cell 2</td></tr>
      <tr><td>row 6, cell 1</td><td>row 6, cell 2</td></tr>
      <tr><td>row 7, cell 1</td><td>row 7, cell 2</td></tr>
      <tr><td>row 8, cell 1</td><td>row 8, cell 2</td></tr>			
    </tbody>
  </table>
</div>

Bu çözüm Chrome ve IE'de çalışır. Bu jQuery dayalı olduğundan, bu diğer jQuery destekli tarayıcılarda da çalışması gerekir.


4
ve içerik genişlikten daha büyük olduğunda sorunu nasıl çözebiliriz?
Maertz

1
@ tetra td {maksimum genişlik: 30 piksel; } Bu, geliştiricinin satırların nasıl görüntüleneceğini denetlemenize olanak tanır.
Lyuben Todorov

Ancak, bazı başlık hücresindeki içerikler td hücrelerinden daha uzunsa ne olur? IE7 denedim ve width () her şeyi kırar. IE8 ve IE9 iyi çalışıyor ...
JustAMartin

4
Ne yazık ki, sütunların mükemmel piksel hizalaması gerekiyorsa, bu işe yaramaz: jsbin.com/elekiq/1 ( kaynak kodu ). Bazı üstbilgilerin olması gereken yerden dengelendiğini görebilirsiniz. Arka plan kullanıyorsanız, etki daha açıktır: jsbin.com/elekiq/2 ( kaynak kodu ). (Aynı satırlar boyunca çalışıyordum, kodumda bu işe girdim, seninkini buldum ve "Ah, o benim için çözüp çözmediğini merak ediyorum!" Ne yazık ki hayır. :-)) Tarayıcılar, kontrol etmek isteme konusunda bir acı hücre genişlikleri ...
TJ Crowder

Bu yatay kaydırma ile çalışmaz - başlığı oluşturur, ancak kaydırılabilir alanın ötesine (görünür şekilde) uzanır ve içerikle kaydırma yapmaz.
Crash

183

Bu, dört kod satırında temiz bir şekilde çözülebilir.

Yalnızca modern tarayıcıları önemsiyorsanız, sabit bir başlık CSS dönüşümleri kullanılarak çok daha kolay bir şekilde elde edilebilir. Kulağa tuhaf geliyor, ama harika çalışıyor:

  • HTML ve CSS olduğu gibi kalır.
  • Harici JavaScript bağımlılığı yok.
  • Dört satır kod.
  • Tüm yapılandırmalar için çalışır (tablo düzeni: sabit vb.).
document.getElementById("wrap").addEventListener("scroll", function(){
   var translate = "translate(0,"+this.scrollTop+"px)";
   this.querySelector("thead").style.transform = translate;
});

CSS dönüşümleri desteği, Internet Explorer 8 dışında yaygın olarak bulunmaktadır .

İşte referans için tam örnek:


8
Önceki yorumuma rağmen, bu gördüğüm mükemmel bir çözüme en yakın şey olduğunu söylemeliyim. Yatay kaydırma bile mükemmel (kendi çözümümden daha iyi). Aşağıda kenarlıklara sahip bir örnek (border-collapse kullanamazsınız) ve kap yerine tabloya yapışan bir kaydırma çubuğu vardır: jsfiddle
DoctorDestructo

11
Tespit edildi, işe yarıyor ama dönüşümü th / td'ye uygulamak zorunda, yerine değil.
redhead

5
@AlexAlexeev, çözümünüz inanılmaz. Teşekkür ederim. Ortaya çıkan sabit başlığın sütunları ayıran kenarlık çizgileri olmadığını fark ettim. Varsayılan CSS stili kaybolur. Bunu dahil etsem bile ... $(this).addClass('border')tablonun geri kalanını sınır sınıfında geçirdiğim yazı tipleri, boyut, renk özelliklerini değiştirir. Ancak, sabit başlığa satır eklemez. Takdir, bu düzeltmek için herhangi bir girdi
user5249203

5
@ user5249203 Birkaç ay önce sorduğunuzu biliyorum ama aynı sorunu yaşadım ve bunun nedeni sınır çöküşüydü: buna bakın: stackoverflow.com/questions/33777751/… .
archz

6
Bu, herhangi bir IE sürümünde veya Edge'de çalışmaz. İşte @ redhead'in yorumuna
rob

58

Sadece geçerli HTML kullanarak bir tek jQuery eklentisi koyarak tamamladım (bir thead ve tbody olması gerekir) ve sabit başlıklar, klonlanmış bir başlık veya herhangi bir isteğe bağlı sabit altbilgi olan bir tablo çıktı seçtiğiniz içerik (sayfalandırma vb.). Daha büyük monitörlerden yararlanmak istiyorsanız, tarayıcı yeniden boyutlandırıldığında tabloyu yeniden boyutlandırır. Tablo sütunlarının tümü görünüme sığamazsa, eklenen başka bir özellik de yan kaydırma yapabilir.

http://fixedheadertable.com/

github'da: http://markmalek.github.com/Fixed-Header-Table/

Kurulumu son derece kolaydır ve bunun için kendi özel stillerinizi oluşturabilirsiniz. Ayrıca tüm tarayıcılarda yuvarlatılmış köşeler kullanır. Yeni yayınladığımı unutmayın, bu yüzden hala teknik olarak beta ve ütülediğim çok az sayıda küçük sorun var.

Internet Explorer 7, Internet Explorer 8, Safari, Firefox ve Chrome'da çalışır.


Teşekkürler! Bugün işten eve döndüğümde yeni bir sürüm ekliyorum. İşte eklediğim şey ile blog girişime
Mark

Bunun için teşekkür ederim. Bu sorunun bir yıldan daha eski olduğunu biliyorum, ancak yerleşik siltini karıştırma riski altında bile, çalışmanızın takdir edildiğini söylemek istiyorum
sova


4
En son sürüm IE6'da çalışmıyor. Artık IE6'yı desteklemiyorum.
Mark

harika iş Mark - ne yazık ki mobil cihazlarda (iPad, Android tablet) sabit başlık ve sütunun kaydırılmasında bazı sorunlar var - içeriği kaydırdığımda bu sabit parçalar kaymıyor - kaydırmayı bırakıp masaya bir kez dokunduğumda , sabit parçalar uygun pozisyonlara "atlama" - bunu düzeltmek için basit bir yolu var mı?
Okizb

23

Ayrıca bu sorunu gideren bir eklenti oluşturdum. Projem - jQuery.floatThead 4 yıldan uzun bir süredir var ve çok olgun.

Dış stil gerektirmez ve tablonuzun herhangi bir şekilde şekillendirilmesini beklemez. Internet Explorer9 + ve Firefox / Chrome'u destekler.

Şu anda (2018-05) var:

GitHub'da 405 taahhüt ve 998 yıldız


Buradaki cevapların çoğu (hepsi değil), bir kişinin yaşadığı sorunu çözmüş olabilen hızlı saldırılardır, ancak her tablo için işe yaramaz.

Diğer eklentilerin bazıları eski ve muhtemelen Internet Explorer ile harika çalışıyor, ancak Firefox ve Chrome'da kırılacak.


1
Büyük eklenti, iç içe tabloları ve ofsetleri destekler.
Mihai Alex

2
Harika. Çok teşekkürler. Eklenti, Firefox 45.2, Chromium 51 ve IE 11'de iyi çalıştı. Ayrıca, aynı sayfada oluşturulan çok sayıda JS ve jQuery koduna müdahale etmez.
Aldo Paradiso

Teşekkür ederim. Projenin bu noktada her 4 ayda bir 1 hata raporu aldığını bildirmekten mutluluk duyuyorum. Çok fazla değişiklik yapmıyorum. Oldukça sağlam ve işe yarıyor.
mkoryak

20

TL; DR

Modern tarayıcıları hedefliyorsanız ve abartılı stil gereksinimleriniz yoksa: http://jsfiddle.net/dPixie/byB9d/3/ ... Büyük dört sürüm oldukça tatlı olmasına rağmen bu sürüm de sıvı genişliğini çok daha iyi işler.

Herkese iyi haberlerimiz var!

HTML5 ve CSS3'ün ilerlemesiyle bu en azından modern tarayıcılar için artık mümkün. Ortaya koyduğum biraz hileli uygulama burada bulunabilir: http://jsfiddle.net/dPixie/byB9d/3/ . FX 25, Chrome 31 ve IE 10'da test ettim ...

Alakalı HTML (belgenizin üst kısmına bir HTML5 dokümanı ekleyin):

html,
body {
  margin: 0;
  padding: 0;
  height: 100%;
}

section {
  position: relative;
  border: 1px solid #000;
  padding-top: 37px;
  background: #500;
}

section.positioned {
  position: absolute;
  top: 100px;
  left: 100px;
  width: 800px;
  box-shadow: 0 0 15px #333;
}

.container {
  overflow-y: auto;
  height: 200px;
}

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

td+td {
  border-left: 1px solid #eee;
}

td,
th {
  border-bottom: 1px solid #eee;
  background: #ddd;
  color: #000;
  padding: 10px 25px;
}

th {
  height: 0;
  line-height: 0;
  padding-top: 0;
  padding-bottom: 0;
  color: transparent;
  border: none;
  white-space: nowrap;
}

th div {
  position: absolute;
  background: transparent;
  color: #fff;
  padding: 9px 25px;
  top: 0;
  margin-left: -25px;
  line-height: normal;
  border-left: 1px solid #800;
}

th:first-child div {
  border: none;
}
<section class="positioned">
  <div class="container">
    <table>
      <thead>
        <tr class="header">
          <th>
            Table attribute name
            <div>Table attribute name</div>
          </th>
          <th>
            Value
            <div>Value</div>
          </th>
          <th>
            Description
            <div>Description</div>
          </th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>align</td>
          <td>left, center, right</td>
          <td>Not supported in HTML5. Deprecated in HTML 4.01. Specifies the alignment of a table according to surrounding text</td>
        </tr>
        <tr>
          <td>bgcolor</td>
          <td>rgb(x,x,x), #xxxxxx, colorname</td>
          <td>Not supported in HTML5. Deprecated in HTML 4.01. Specifies the background color for a table</td>
        </tr>
        <tr>
          <td>border</td>
          <td>1,""</td>
          <td>Specifies whether the table cells should have borders or not</td>
        </tr>
        <tr>
          <td>cellpadding</td>
          <td>pixels</td>
          <td>Not supported in HTML5. Specifies the space between the cell wall and the cell content</td>
        </tr>
        <tr>
          <td>cellspacing</td>
          <td>pixels</td>
          <td>Not supported in HTML5. Specifies the space between cells</td>
        </tr>
        <tr>
          <td>frame</td>
          <td>void, above, below, hsides, lhs, rhs, vsides, box, border</td>
          <td>Not supported in HTML5. Specifies which parts of the outside borders that should be visible</td>
        </tr>
        <tr>
          <td>rules</td>
          <td>none, groups, rows, cols, all</td>
          <td>Not supported in HTML5. Specifies which parts of the inside borders that should be visible</td>
        </tr>
        <tr>
          <td>summary</td>
          <td>text</td>
          <td>Not supported in HTML5. Specifies a summary of the content of a table</td>
        </tr>
        <tr>
          <td>width</td>
          <td>pixels, %</td>
          <td>Not supported in HTML5. Specifies the width of a table</td>
        </tr>
      </tbody>
    </table>
  </div>
</section>

Ama nasıl?!

Basitçe, sabit başlık olarak kullanılan div'leri de içeren 0 piksel yüksekliğinde görsel olarak gizlediğiniz bir tablo başlığınız var. Tablonun kabı, kesinlikle konumlandırılmış başlığı sağlamak için üstte yeterli alan bırakır ve kaydırma çubuklu masa beklediğiniz gibi görünür.

Yukarıdaki kod, tabloyu kesinlikle konumlandırmak için konumlandırılmış sınıfı kullanır (bir açılır pencere stili iletişim kutusunda kullanıyorum), ancak positionedsınıfı kaptan kaldırarak belgenin akışında da kullanabilirsiniz .

Fakat ...

Mükemmel değil. Firefox başlık satırını 0px yapmayı reddediyor (en azından herhangi bir yol bulamadım) ama inatla en az 4px'de tutuyor ... Bu büyük bir sorun değil, ancak stilinize bağlı olarak sınırlarınızla karışacaktır.

Tablo ayrıca, kabın kendisinin arka plan renginin, başlık div'lerinin arka planı olarak saydam olan sahte sütun yaklaşımı kullanmaktadır.

özet

Sonuçta, gereksinimlerinize, özellikle de sınırlara veya karmaşık arka planlara bağlı olarak stil sorunları olabilir. Hesaplanabilirlik ile ilgili sorunlar da olabilir, henüz çok çeşitli tarayıcılarda kontrol etmedim (denerseniz deneyimlerinizi yorumlayın), ancak böyle bir şey bulamadım, bu yüzden göndermeye değer olduğunu düşündüm neyse ...


Yatay kaydırma başlatılana kadar pencerenin genişliğini daraltırsanız, başlık gövdeyle yatay olarak kaydırılmaz. Lanet.
dlaliberte

@dlaliberte - Üstbilgi ve tablo aslında iki farklı unsur olduğu için, tuhaflık içine girebilirsiniz. Ancak örneğim tablo sütunlarında taşmaya izin vermiyor ve üstbilgilerin kontrolü genellikle tablo içeriğinden daha kolay. Bununla birlikte, tablonun sağına yapışıp ciddi bir şekilde kırık görünecekse, başlığın "taşmasına" neden olursanız. Siz de sayfayı taşmaya zorlayarak, masada bir dk genişliğini ayarlayarak çözeriz diye ... Ama mükemmel olmayacak bu yüzden ... Bir kesmek
Jonas Schubert Erlandsson

1
Bunun, sabit yükseklikli bir tablonun belirtilebileceği bir tasarım gerektirdiğini belirtmek gerekir.
Cheekysoft

1
@Cheekysoft - Hayır, tablo ve satır içeriği serbestçe akabilir. Örneğimdeki kap, <section>yalnızca taşması ve kaydırmayı göstermesi için yüksekliği kısıtlanmış olmalıdır. Kap taşmasını sağlayacak her düzen çalışır. Eğer bir dava bulursanız lütfen bir keman bağlantısı gönderin.
Jonas Schubert Erlandsson

Sabit kodlanmış padding-topdeğer ayrıca, tablo başlığı metni birden fazla satırdaysa tablo hücrelerinin üstünde görüneceği anlamına gelir. Yazık, çünkü bu çoğu zaman bir cazibe gibi çalışıyor. Gerçekten güzel hüner diviçinde thdiğer birçok çözümler var sütun boyutlandırma sorunu aşmanın.
Bernhard Hofmann

19

Bunu CSS şartnamesi dışından çözmeye yönelik tüm girişimler, gerçekten istediğimiz şeyin soluk gölgeleridir: THEAD'ın zımni vaadiyle teslim.

Bu tablo için dondurulmuş başlıklar sorunu uzun süredir HTML / CSS'de açık bir yara olmuştur.

Mükemmel bir dünyada, bu sorun için saf bir CSS çözümü olurdu. Ne yazık ki, yerinde iyi bir şey yok gibi görünüyor.

Bu konuyla ilgili standartlar-tartışmalar şunları içerir:

GÜNCELLEME : Firefox position:sticky32. sürümde gönderildi . Herkes kazanır!


Sütunları aynı şekilde tilki yapmak harika olurdu
Csaba Toth

4
Yeniden. Firefox ve pozisyon: yapışkan, tablo başlıkları için işe yaramıyor: bugzilla.mozilla.org/show_bug.cgi?id=925259#c8 ... Bu hatanın yaması açıkça şöyle diyor: "Şu anda göreli konumlandırmayı desteklemiyoruz iç tablo öğelerinin, bu nedenle onları yapışkan konumlandırma dışında tutuyoruz. "
Jonas Schubert Erlandsson

2
Bu artık tüm tarayıcılarda çalışır: thead th { position: sticky; top: 0; }. Bunu açıkça belirtmek için bu cevabı güncelleyebilir miyiz?
Daniel Waltrip

1
@DanielWaltrip tüm tarayıcılar? stackoverflow.com/a/37646284/3640407 Kenarlardan daha fazla MSIE var
edc65


14

İşte sabit tablo başlıkları için bir jQuery eklentisi. Tüm sayfanın kaydırılmasını sağlar, üste ulaştığında başlığı dondurur. Twitter Bootstrap tablolarıyla iyi çalışır .

GitHub deposu: https://github.com/oma/table-fixed-header

O mu değil sadece masa içeriği ilerleyin. Bunun için diğer araçlara bakın, bu diğer cevaplardan biri olarak. Davanıza en uygun olana siz karar verirsiniz.


1
Bummer - örnek bağlantı öldü. "Hata! Denne siden ble ikke funnet ..." Kodun buraya yapıştırılmasını dilerim.
JosephK

evet ... bunun için üzgünüm. bağlantı kaldırıldı. Proje artık devam etmiyor
oma

Endişelenmeyin - önceden hazırlanmış bu iddia edilen çözümlerden birkaçını denedim - hiçbiri ekran genişliğini aşan bir esnek-col-genişlik tablosu ile çalışmadı. Kendi çözümümü yazarken yaralandım.
JosephK

9

Burada yayınlanan çözümlerin çoğu jQuery gerektirir. Eğer çerçeveden bağımsız bir çözüm arıyorsanız Izgarayı deneyin: http://www.matts411.com/post/grid/

Github'da burada barındırılıyor: https://github.com/mmurph211/Grid

Yalnızca sabit üstbilgileri desteklemekle kalmaz, diğer şeylerin yanı sıra sabit sol sütunları ve altbilgileri de destekler.


İhtiyaçlarınızı karşılıyorsa bu gerçekten temiz, ben bugün onunla oynadım. Ne yazık ki, dikdörtgen bir ızgaradır (aslında adından da anlaşılacağı gibi) ve satır yüksekliği içeriğe göre ayarlanmış gerçek bir tablo değildir. Ve bireysel sıraları şekillendirmek zor görünüyordu. Zebra çizgili bir masa oluşturmayı başaramadım ama ihtiyaçlarım daha karmaşık olduğu için çok uğraşmadım. Her neyse, iyi iş çıkardın.
mplwork

1
Hey seni tanıyorum! Çok benzer bir bok yazmış gibiydik ( github.com/mkoryak/floatThead ) - Misha
mkoryak

9

CSS özelliği position: sticky, çoğu modern tarayıcıda büyük desteğe sahiptir (Edge ile ilgili sorunlar yaşadım, aşağıya bakın).

Bu, sabit üstbilgiler sorununu kolayca çözmemizi sağlar:

thead th { position: sticky; top: 0; }

Safari bir satıcı öneki gerekir: -webkit-sticky.

Firefox için, min-height: 0bir ana öğeyi eklemek zorunda kaldım . Bunun neden gerekli olduğunu tamamen unutuyorum.

Ne yazık ki, Microsoft Edge uygulaması sadece yarı çalışıyor gibi görünüyor. En azından testlerimde titrek ve yanlış hizalanmış tablo hücreleri vardı. Masa hala kullanılabilir, ancak önemli estetik sorunları vardı.


Kullanılması position: sticky;sahip bir div içine tabloyla overflow: scroll;, overflow-x: scroll;ya overflow-y: scroll;. modern tarayıcılardaki sabit tablo başlıkları ve sütunları için en iyi ve en basit çözüm gibi görünüyor. Bu cevabın en üste oylanması gerekiyor.
Aberrant

Basit ama etkilidir. Aradığım şey bu. Teşekkürler.
Catbuilts

6

Daha rafine bir CSS kaydırma masası

Şimdiye kadar gördüğüm tüm saf CSS çözümleri - akıllı olsalar da - belli bir seviyede ciladan yoksundur, ya da bazı durumlarda doğru çalışmaz. Ben de kendiminkini yaratmaya karar verdim ...

Özellikleri:

  • Saf CSS olduğundan, jQuery gerekmez (veya herhangi bir JavaScript kodu)
  • Tablo genişliğini yüzde (aka "akışkan") veya sabit bir değere ayarlayabilir veya içeriğin genişliğini belirlemesine izin verebilirsiniz (diğer adıyla "otomatik")
  • Sütun genişlikleri sıvı, sabit veya otomatik olabilir.
  • Sütunlar yatay kaydırma (başlıkların sabit genişlik gerektirmeyen diğer tüm CSS tabanlı çözümlerinde oluşan bir sorun) nedeniyle hiçbir zaman yanlış hizalanmayacaktır.
  • Internet Explorer da dahil olmak üzere tüm popüler masaüstü tarayıcılarıyla uyumludur
  • Temiz, parlak görünüm; özensiz görünümlü 1 piksel boşlukları veya hizalanmamış kenarlıklar yok; tüm tarayıcılarda aynı görünüyor

Akıcı ve otomatik genişlik seçeneklerini gösteren birkaç keman:

  • Sıvı Genişliği ve Yüksekliği (ekran boyutuna uyum sağlar): jsFiddle (Kaydırma çubuğunun yalnızca bu yapılandırmada gerektiğinde göründüğünü unutmayın, bu nedenle görmek için çerçeveyi daraltmanız gerekebilir)

  • Otomatik Genişlik, Sabit Yükseklik (diğer içeriklerle entegrasyonu daha kolay): jsFiddle

Otomatik Genişlik, Sabit Yükseklik yapılandırmasının muhtemelen daha fazla kullanım durumu vardır, bu nedenle aşağıdaki kodu göndereceğim.

/* 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;
}
.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: 16px;
  line-height: 20px;
  padding: 20px 0 20px 0; /* Need enough padding to make room for caption */
  text-align: left;
  color: black;
}
.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"/></th>
            <th><div label="Column 2"/></th>
            <th><div label="Column 3"/></th>
            <th>
              <!-- More versatile way of doing column label; requires two 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]-->

Üstbilgi satırını dondurmak için kullandığım yöntem d-Pixie'ye benzer, bu yüzden açıklama için yazısına bakın. Bu teknikte sadece ek CSS yığınları ve ekstra bir div kabı veya iki tane ile düzeltilebilecek bir takım hatalar ve sınırlamalar vardı.


Bu cevap çok takdir edilmez! Özellikle can sıkıcı durumuma çalışmak için günlerce başka çözümler bulmaya çalıştım. Her biri şu ya da bu şekilde hizada kalamadı. Bu nihayet başardı! İlk başta aşırı karmaşık görünüyor, ama bir kez asmak olsun, harika. Sıvı genişliği vb. Kullanmadığınızda, sonunda ihtiyacınız olmayan biraz şeyi kaldırabilirsiniz.
Justin Sane

1
@ JustinSane Hoşuna gitti! Takdir eksikliğinin, sayfayı Maximilian Hils'in şaşırtıcı çözümü ile paylaşması nedeniyle tahmin ediyorum . Küçük bir JS kullanmaya karşı değilseniz, kesinlikle kontrol etmelisiniz.
DoctorDestructo

Lanet olsun, bu ise gerçekten neredeyse mükemmel bir çözüm. Ben zaten jQuery kullanıyordum, seninkini bulmadan önce onunla çalışmaya çalıştım (başka bir soruya yorum yoluyla). Bir kaydırma dinleyici düşünmüyordum ve tercüme etmedim ... Eh, basit çözümler bulmanın bir dahi olduğunu söylüyorlar;) Projeyi bitirdim ve js olmadan mükemmel çalışıyor, ama bunu içinde tutacağım gelecek için zihin. Yine de, harika olduğunuz için size şapkalar!
Justin Sane

Küçük bir sorun, ancak farklı Sistem Renkleri kullanıyorsanız, metin renginin başlıklar dışında bir şey için ayarlanmadığını, ancak tablo arka planının açık bir arka plan rengine sahip olduğunu görebilirsiniz. Bu tablo için beyaz ve gri zemin üzerine sarı metin var.
Matt Arnold

1
@MattArnold Sabit. Bahşiş için teşekkürler!
DoctorDestructo

5

Basit bir jQuery eklentisi

Bu Mahes'in çözümünde bir varyasyon. Şöyle diyebilirsiniz$('table#foo').scrollableTable();

Fikir:

  • Bölünmüş theadve tbodyayrı içine tableelemanları
  • Hücre genişliklerini tekrar eşleştirin
  • İkinciyi tablebirdiv.scrollable
  • div.scrollableGerçekten kaydırma yapmak için CSS kullanın

CSS şunlar olabilir:

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

Uyarılar

  • Açıkçası, bu tabloları bölmek biçimlendirmeyi daha az anlamsız hale getirir. Bunun erişilebilirlik üzerindeki etkisini bilmiyorum.
  • Bu eklenti altbilgiler, birden çok üstbilgi vb. İle ilgilenmez.
  • Yalnızca Chrome sürüm 20'de test ettim.

Bununla birlikte, benim amacım için işe yarıyor ve onu almak ve değiştirmekte özgürsünüz.

İşte eklenti:

jQuery.fn.scrollableTable = function () {
  var $newTable, $oldTable, $scrollableDiv, originalWidths;
  $oldTable = $(this);

  // Once the tables are split, their cell widths may change. 
  // Grab these so we can make the two tables match again.
  originalWidths = $oldTable.find('tr:first td').map(function() {
    return $(this).width();
  });

  $newTable = $oldTable.clone();
  $oldTable.find('tbody').remove();
  $newTable.find('thead').remove();

  $.each([$oldTable, $newTable], function(index, $table) {
    $table.find('tr:first td').each(function(i) {
      $(this).width(originalWidths[i]);
    });
  });

  $scrollableDiv = $('<div/>').addClass('scrollable');
  $newTable.insertAfter($oldTable).wrap($scrollableDiv);
};

1
Güzel senaryo, bu benim çevremde en iyi çalıştı. Komut dosyanızı sabit altbilgi desteğiyle uzattım, aşağıdan yazımı kontrol et.
gitaarik

4

:)

Çok temiz değil, saf HTML / CSS çözümü.

table {
    overflow-x:scroll;
}

tbody {
    max-height: /*your desired max height*/
    overflow-y:scroll;
    display:block;
}

IE8 + JSFiddle örneği için güncellendi


2
Sadece bu hücrelerin yüzdüğünden ve içeriğe göre farklı yüksekliklerde olabileceğinden bahsetmek için iyi bir çözüm, onları sınırlarsanız görünür: jsfiddle.net/ZdeEH/15
Stano

3

Sabit altbilgi desteği

Sabit bir altbilgi ve maksimum yüksekliği desteklemek için Nathan'ın işlevini genişlettim. Ayrıca, işlev CSS'nin kendisini ayarlar ve yalnızca bir genişliği desteklemeniz gerekir.

Kullanımı:

Sabit yükseklik:

$('table').scrollableTable({ height: 100 });

Maksimum yükseklik (tarayıcı CSS 'maksimum yükseklik' seçeneğini destekliyorsa):

$('table').scrollableTable({ maxHeight: 100 });

Senaryo:

jQuery.fn.scrollableTable = function(options) {

    var $originalTable, $headTable, $bodyTable, $footTable, $scrollableDiv, originalWidths;

    // Prepare the separate parts of the table
    $originalTable = $(this);
    $headTable = $originalTable.clone();

    $headTable.find('tbody').remove();
    $headTable.find('tfoot').remove();

    $bodyTable = $originalTable.clone();
    $bodyTable.find('thead').remove();
    $bodyTable.find('tfoot').remove();

    $footTable = $originalTable.clone();
    $footTable.find('thead').remove();
    $footTable.find('tbody').remove();

    // Grab the original column widths and set them in the separate tables
    originalWidths = $originalTable.find('tr:first td').map(function() {
        return $(this).width();
    });

    $.each([$headTable, $bodyTable, $footTable], function(index, $table) {
        $table.find('tr:first td').each(function(i) {
            $(this).width(originalWidths[i]);
        });
    });

    // The div that makes the body table scroll
    $scrollableDiv = $('<div/>').css({
        'overflow-y': 'scroll'
    });

    if(options.height) {
        $scrollableDiv.css({'height': options.height});
    }
    else if(options.maxHeight) {
        $scrollableDiv.css({'max-height': options.maxHeight});
    }

    // Add the new separate tables and remove the original one
    $headTable.insertAfter($originalTable);
    $bodyTable.insertAfter($headTable);
    $footTable.insertAfter($bodyTable);
    $bodyTable.wrap($scrollableDiv);
    $originalTable.remove();
};

3

Her nasılsa Position:Stickybenim durumumda iyi çalıştım:

table{
  width: 100%;
  border: collapse;
}

th{
    position: sticky;
    top: 0px;
    border: 1px solid black;
    background: #ff5722;
    color: #f5f5f5;
    font-weight: 600;
}
td{
    background: #d3d3d3;
    border: 1px solid black;
    color: #f5f5f5;
    font-weight: 600;
}

div{
  height: 150px
  overflow: auto;
  width: 100%
}
<div>
    <table>
        <thead>
            <tr>
                <th>header 1</th>
                <th>header 2</th>
                <th>header 3</th>
                <th>header 4</th>
                <th>header 5</th>
                <th>header 6</th>
                <th>header 7</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
            <tr>
                <td>data 1</td>
                <td>data 2</td>
                <td>data 3</td>
                <td>data 4</td>
                <td>data 5</td>
                <td>data 6</td>
                <td>data 7</td>
            </tr>
        </tbody>
    </table>
</div>


1
Bu şimdiye kadar gördüğüm en temiz çözüm. caniuse , 5/2/2020 itibarıyla düzeltilmemiş pozisyon: yapışkanın% 90,06 küresel desteğe sahip olduğunu gösteriyor. Böylece bu çözüm tüm modern tarayıcılarda iyi çalışır.
AlienKevin

2

Biri başlık, biri veri için olmak üzere iki bölüm. Veri div'ini kaydırılabilir hale getirin ve üstbilgideki sütunların genişliğini, verilerdeki genişliklerle aynı olacak şekilde ayarlamak için JavaScript'i kullanın. Veri sütunlarının genişliklerinin dinamik değil sabit olması gerektiğini düşünüyorum.


3
Erişilebilirlikle ilgileniyorsanız, bu bir başarısızlıktır.
epascarello

1
yeniden erişilebilirlik, belki div kullanımı <thead> ve <tbody> üzerinde stil ile değiştirmek olabilir ??
Cheekysoft

1

Sorunun JavaScript'e izin verdiğini anlıyorum, ancak burada çalıştığım masanın yatay olarak genişlemesine izin veren saf bir CSS çözümü. Internet Explorer 10 ve en son Chrome ve Firefox tarayıcılarıyla test edildi. Altta jsFiddle bağlantısı var.

HTML:

Putting some text here to differentiate between the header
aligning with the top of the screen and the header aligning
with the top of one of its ancestor containers.

<div id="positioning-container">
<div id="scroll-container">
    <table>
        <colgroup>
            <col class="col1"></col>
            <col class="col2"></col>
        </colgroup>
        <thead>
            <th class="header-col1"><div>Header 1</div></th>
            <th class="header-col2"><div>Header 2</div></th>
        </thead>
        <tbody>
            <tr><td>Cell 1.1</td><td>Cell 1.2</td></tr>
            <tr><td>Cell 2.1</td><td>Cell 2.2</td></tr>
            <tr><td>Cell 3.1</td><td>Cell 3.2</td></tr>
            <tr><td>Cell 4.1</td><td>Cell 4.2</td></tr>
            <tr><td>Cell 5.1</td><td>Cell 5.2</td></tr>
            <tr><td>Cell 6.1</td><td>Cell 6.2</td></tr>
            <tr><td>Cell 7.1</td><td>Cell 7.2</td></tr>

        </tbody>
    </table>
</div>
</div>

Ve CSS:

table{
    border-collapse: collapse;
    table-layout: fixed;
    width: 100%;
}
/* Not required, just helps with alignment for this example */
td, th{
    padding: 0;
    margin: 0;
}

tbody{
    background-color: #ddf;
}

thead {
    /* Keeps the header in place. Don't forget top: 0 */
    position: absolute;
    top: 0;
    background-color: #ddd;

    /* The 17px is to adjust for the scrollbar width.
     * This is a new css value that makes this pure
     * css example possible */
    width: calc(100% - 17px);
    height: 20px;
}

/* Positioning container. Required to position the
 * header since the header uses position:absolute
 * (otherwise it would position at the top of the screen) */
#positioning-container{
    position: relative;
}

/* A container to set the scroll-bar and
 * includes padding to move the table contents
 * down below the header (padding = header height) */
#scroll-container{
    overflow-y: auto;
    padding-top: 20px;
    height: 100px;
}
.header-col1{
    background-color: red;
}

/* Fixed-width header columns need a div to set their width */
.header-col1 div{
    width: 100px;
}

/* Expandable columns need a width set on the th tag */
.header-col2{
    width: 100%;
}
.col1 {
    width: 100px;
}
.col2{
    width: 100%;
}

http://jsfiddle.net/HNHRv/3/


1

Maximilian Hils tarafından verilen güzel çözümü deneyen ve Internet Explorer ile çalışmayı başaramayanlar için aynı sorunu yaşadım (Internet Explorer 11) ve sorunun ne olduğunu öğrendim.

Internet Explorer 11'de stil dönüşümü (en azından tercüme ile) çalışmaz <THEAD>. Bunun yerine stili <TH>bir döngüde uygulayarak çözdüm. İşe yaradı. JavaScript kodum şöyle:

document.getElementById('pnlGridWrap').addEventListener("scroll", function () {
  var translate = "translate(0," + this.scrollTop + "px)";
  var myElements = this.querySelectorAll("th");
  for (var i = 0; i < myElements.length; i++) {
    myElements[i].style.transform=translate;
  }
});

Benim durumumda tablo ASP.NET'te bir GridView oldu. İlk önce bunun hiç olmadığı için olduğunu düşündüm <THEAD>, ama sahip olmak zorunda kalsam bile işe yaramadı. Sonra yukarıda yazdıklarımı öğrendim.

Çok güzel ve basit bir çözüm. Chrome'da mükemmel, Firefox'ta biraz sarsıntılı ve Internet Explorer'da daha da sarsıntılı. Ama sonuçta iyi bir çözüm.


0

Keşke @ Mark'ın çözümünü daha önce bulmuş olsaydım, ama bu SO sorusunu görmeden önce kendim yazdım ...

Mine, sabit üstbilgi, altbilgi, sütun bölme (colspan), yeniden boyutlandırma, yatay kaydırma ve kaydırma başlamadan önce görüntülenecek isteğe bağlı sayıda satırı destekleyen çok hafif bir jQuery eklentisidir.

jQuery.scrollTableBody (GitHub)

Sürece bir tablo var gibi uygun <thead>, <tbody>ve (isteğe bağlı) <tfoot>, yapmanız gereken tüm şudur:

$('table').scrollTableBody();

0

Bu geçici çözümü buldum - üstbilgi satırını tablo içeren bir tabloda veri ile taşı:

<html>
<head>
	<title>Fixed header</title>
	<style>
		table td {width:75px;}
	</style>
</head>

<body>
<div style="height:auto; width:350px; overflow:auto">
<table border="1">
<tr>
	<td>header 1</td>
	<td>header 2</td>
	<td>header 3</td>
</tr>
</table>
</div>

<div style="height:50px; width:350px; overflow:auto">
<table border="1">
<tr>
	<td>row 1 col 1</td>
	<td>row 1 col 2</td>
	<td>row 1 col 3</td>		
</tr>
<tr>
	<td>row 2 col 1</td>
	<td>row 2 col 2</td>
	<td>row 2 col 3</td>		
</tr>
<tr>
	<td>row 3 col 1</td>
	<td>row 3 col 2</td>
	<td>row 3 col 3</td>		
</tr>
<tr>
	<td>row 4 col 1</td>
	<td>row 4 col 2</td>
	<td>row 4 col 3</td>		
</tr>
<tr>
	<td>row 5 col 1</td>
	<td>row 5 col 2</td>
	<td>row 5 col 3</td>		
</tr>
<tr>
	<td>row 6 col 1</td>
	<td>row 6 col 2</td>
	<td>row 6 col 3</td>		
</tr>
</table>
</div>


</body>
</html>


küçük tablolar için çalışır, ancak yatay kaydırmanız varsa bu çözüm çalışmaz.
crh225

Tablo sütunları hizalanmadığından da düzgün çalışmaz. Burada td için genişlik zorluyorsun ama yapmamalıyız ...
Ziggler

0

StickyTableHeaders jQuery eklentisini tabloya uyguladığınızda, sütun başlıkları aşağı kaydırdıkça görünümün üst kısmına yapışır.

Misal:

$(function () {
    $("table").stickyTableHeaders();
});

/*! Copyright (c) 2011 by Jonas Mosbech - https://github.com/jmosbech/StickyTableHeaders
	MIT license info: https://github.com/jmosbech/StickyTableHeaders/blob/master/license.txt */

;
(function ($, window, undefined) {
    'use strict';

    var name = 'stickyTableHeaders',
        id = 0,
        defaults = {
            fixedOffset: 0,
            leftOffset: 0,
            marginTop: 0,
            scrollableArea: window
        };

    function Plugin(el, options) {
        // To avoid scope issues, use 'base' instead of 'this'
        // to reference this class from internal events and functions.
        var base = this;

        // Access to jQuery and DOM versions of element
        base.$el = $(el);
        base.el = el;
        base.id = id++;
        base.$window = $(window);
        base.$document = $(document);

        // Listen for destroyed, call teardown
        base.$el.bind('destroyed',
        $.proxy(base.teardown, base));

        // Cache DOM refs for performance reasons
        base.$clonedHeader = null;
        base.$originalHeader = null;

        // Keep track of state
        base.isSticky = false;
        base.hasBeenSticky = false;
        base.leftOffset = null;
        base.topOffset = null;

        base.init = function () {
            base.$el.each(function () {
                var $this = $(this);

                // remove padding on <table> to fix issue #7
                $this.css('padding', 0);

                base.$originalHeader = $('thead:first', this);
                base.$clonedHeader = base.$originalHeader.clone();
                $this.trigger('clonedHeader.' + name, [base.$clonedHeader]);

                base.$clonedHeader.addClass('tableFloatingHeader');
                base.$clonedHeader.css('display', 'none');

                base.$originalHeader.addClass('tableFloatingHeaderOriginal');

                base.$originalHeader.after(base.$clonedHeader);

                base.$printStyle = $('<style type="text/css" media="print">' +
                    '.tableFloatingHeader{display:none !important;}' +
                    '.tableFloatingHeaderOriginal{position:static !important;}' +
                    '</style>');
                $('head').append(base.$printStyle);
            });

            base.setOptions(options);
            base.updateWidth();
            base.toggleHeaders();
            base.bind();
        };

        base.destroy = function () {
            base.$el.unbind('destroyed', base.teardown);
            base.teardown();
        };

        base.teardown = function () {
            if (base.isSticky) {
                base.$originalHeader.css('position', 'static');
            }
            $.removeData(base.el, 'plugin_' + name);
            base.unbind();

            base.$clonedHeader.remove();
            base.$originalHeader.removeClass('tableFloatingHeaderOriginal');
            base.$originalHeader.css('visibility', 'visible');
            base.$printStyle.remove();

            base.el = null;
            base.$el = null;
        };

        base.bind = function () {
            base.$scrollableArea.on('scroll.' + name, base.toggleHeaders);
            if (!base.isWindowScrolling) {
                base.$window.on('scroll.' + name + base.id, base.setPositionValues);
                base.$window.on('resize.' + name + base.id, base.toggleHeaders);
            }
            base.$scrollableArea.on('resize.' + name, base.toggleHeaders);
            base.$scrollableArea.on('resize.' + name, base.updateWidth);
        };

        base.unbind = function () {
            // unbind window events by specifying handle so we don't remove too much
            base.$scrollableArea.off('.' + name, base.toggleHeaders);
            if (!base.isWindowScrolling) {
                base.$window.off('.' + name + base.id, base.setPositionValues);
                base.$window.off('.' + name + base.id, base.toggleHeaders);
            }
            base.$scrollableArea.off('.' + name, base.updateWidth);
        };

        base.toggleHeaders = function () {
            if (base.$el) {
                base.$el.each(function () {
                    var $this = $(this),
                        newLeft,
                        newTopOffset = base.isWindowScrolling ? (
                        isNaN(base.options.fixedOffset) ? base.options.fixedOffset.outerHeight() : base.options.fixedOffset) : base.$scrollableArea.offset().top + (!isNaN(base.options.fixedOffset) ? base.options.fixedOffset : 0),
                        offset = $this.offset(),

                        scrollTop = base.$scrollableArea.scrollTop() + newTopOffset,
                        scrollLeft = base.$scrollableArea.scrollLeft(),

                        scrolledPastTop = base.isWindowScrolling ? scrollTop > offset.top : newTopOffset > offset.top,
                        notScrolledPastBottom = (base.isWindowScrolling ? scrollTop : 0) < (offset.top + $this.height() - base.$clonedHeader.height() - (base.isWindowScrolling ? 0 : newTopOffset));

                    if (scrolledPastTop && notScrolledPastBottom) {
                        newLeft = offset.left - scrollLeft + base.options.leftOffset;
                        base.$originalHeader.css({
                            'position': 'fixed',
                                'margin-top': base.options.marginTop,
                                'left': newLeft,
                                'z-index': 3 // #18: opacity bug
                        });
                        base.leftOffset = newLeft;
                        base.topOffset = newTopOffset;
                        base.$clonedHeader.css('display', '');
                        if (!base.isSticky) {
                            base.isSticky = true;
                            // make sure the width is correct: the user might have resized the browser while in static mode
                            base.updateWidth();
                        }
                        base.setPositionValues();
                    } else if (base.isSticky) {
                        base.$originalHeader.css('position', 'static');
                        base.$clonedHeader.css('display', 'none');
                        base.isSticky = false;
                        base.resetWidth($('td,th', base.$clonedHeader), $('td,th', base.$originalHeader));
                    }
                });
            }
        };

        base.setPositionValues = function () {
            var winScrollTop = base.$window.scrollTop(),
                winScrollLeft = base.$window.scrollLeft();
            if (!base.isSticky || winScrollTop < 0 || winScrollTop + base.$window.height() > base.$document.height() || winScrollLeft < 0 || winScrollLeft + base.$window.width() > base.$document.width()) {
                return;
            }
            base.$originalHeader.css({
                'top': base.topOffset - (base.isWindowScrolling ? 0 : winScrollTop),
                    'left': base.leftOffset - (base.isWindowScrolling ? 0 : winScrollLeft)
            });
        };

        base.updateWidth = function () {
            if (!base.isSticky) {
                return;
            }
            // Copy cell widths from clone
            if (!base.$originalHeaderCells) {
                base.$originalHeaderCells = $('th,td', base.$originalHeader);
            }
            if (!base.$clonedHeaderCells) {
                base.$clonedHeaderCells = $('th,td', base.$clonedHeader);
            }
            var cellWidths = base.getWidth(base.$clonedHeaderCells);
            base.setWidth(cellWidths, base.$clonedHeaderCells, base.$originalHeaderCells);

            // Copy row width from whole table
            base.$originalHeader.css('width', base.$clonedHeader.width());
        };

        base.getWidth = function ($clonedHeaders) {
            var widths = [];
            $clonedHeaders.each(function (index) {
                var width, $this = $(this);

                if ($this.css('box-sizing') === 'border-box') {
                    width = $this[0].getBoundingClientRect().width; // #39: border-box bug
                } else {
                    var $origTh = $('th', base.$originalHeader);
                    if ($origTh.css('border-collapse') === 'collapse') {
                        if (window.getComputedStyle) {
                            width = parseFloat(window.getComputedStyle(this, null).width);
                        } else {
                            // ie8 only
                            var leftPadding = parseFloat($this.css('padding-left'));
                            var rightPadding = parseFloat($this.css('padding-right'));
                            // Needs more investigation - this is assuming constant border around this cell and it's neighbours.
                            var border = parseFloat($this.css('border-width'));
                            width = $this.outerWidth() - leftPadding - rightPadding - border;
                        }
                    } else {
                        width = $this.width();
                    }
                }

                widths[index] = width;
            });
            return widths;
        };

        base.setWidth = function (widths, $clonedHeaders, $origHeaders) {
            $clonedHeaders.each(function (index) {
                var width = widths[index];
                $origHeaders.eq(index).css({
                    'min-width': width,
                        'max-width': width
                });
            });
        };

        base.resetWidth = function ($clonedHeaders, $origHeaders) {
            $clonedHeaders.each(function (index) {
                var $this = $(this);
                $origHeaders.eq(index).css({
                    'min-width': $this.css('min-width'),
                        'max-width': $this.css('max-width')
                });
            });
        };

        base.setOptions = function (options) {
            base.options = $.extend({}, defaults, options);
            base.$scrollableArea = $(base.options.scrollableArea);
            base.isWindowScrolling = base.$scrollableArea[0] === window;
        };

        base.updateOptions = function (options) {
            base.setOptions(options);
            // scrollableArea might have changed
            base.unbind();
            base.bind();
            base.updateWidth();
            base.toggleHeaders();
        };

        // Run initializer
        base.init();
    }

    // A plugin wrapper around the constructor,
    // preventing against multiple instantiations
    $.fn[name] = function (options) {
        return this.each(function () {
            var instance = $.data(this, 'plugin_' + name);
            if (instance) {
                if (typeof options === 'string') {
                    instance[options].apply(instance);
                } else {
                    instance.updateOptions(options);
                }
            } else if (options !== 'destroy') {
                $.data(this, 'plugin_' + name, new Plugin(this, options));
            }
        });
    };

})(jQuery, window);
body {
    margin: 0 auto;
    padding: 0 20px;
    font-family: Arial, Helvetica, sans-serif;
    font-size: 11px;
    color: #555;
}
table {
    border: 0;
    padding: 0;
    margin: 0 0 20px 0;
    border-collapse: collapse;
}
th {
    padding: 5px;
    /* NOTE: th padding must be set explicitly in order to support IE */
    text-align: right;
    font-weight:bold;
    line-height: 2em;
    color: #FFF;
    background-color: #555;
}
tbody td {
    padding: 10px;
    line-height: 18px;
    border-top: 1px solid #E0E0E0;
}
tbody tr:nth-child(2n) {
    background-color: #F7F7F7;
}
tbody tr:hover {
    background-color: #EEEEEE;
}
td {
    text-align: right;
}
td:first-child, th:first-child {
    text-align: left;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<div style="width:3000px">some really really wide content goes here</div>
<table>
    <thead>
        <tr>
            <th colspan="9">Companies listed on NASDAQ OMX Copenhagen.</th>
        </tr>
        <tr>
            <th>Full name</th>
            <th>CCY</th>
            <th>Last</th>
            <th>+/-</th>
            <th>%</th>
            <th>Bid</th>
            <th>Ask</th>
            <th>Volume</th>
            <th>Turnover</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>A.P. Møller...</td>
            <td>DKK</td>
            <td>33,220.00</td>
            <td>760</td>
            <td>2.34</td>
            <td>33,140.00</td>
            <td>33,220.00</td>
            <td>594</td>
            <td>19,791,910</td>
        </tr>
        <tr>
            <td>A.P. Møller...</td>
            <td>DKK</td>
            <td>34,620.00</td>
            <td>640</td>
            <td>1.88</td>
            <td>34,620.00</td>
            <td>34,700.00</td>
            <td>9,954</td>
            <td>346,530,246</td>
        </tr>
        <tr>
            <td>Carlsberg A</td>
            <td>DKK</td>
            <td>380</td>
            <td>0</td>
            <td>0</td>
            <td>371</td>
            <td>391.5</td>
            <td>6</td>
            <td>2,280</td>
        </tr>
        <tr>
            <td>Carlsberg B</td>
            <td>DKK</td>
            <td>364.4</td>
            <td>8.6</td>
            <td>2.42</td>
            <td>363</td>
            <td>364.4</td>
            <td>636,267</td>
            <td>228,530,601</td>
        </tr>
        <tr>
            <td>Chr. Hansen...</td>
            <td>DKK</td>
            <td>114.5</td>
            <td>-1.6</td>
            <td>-1.38</td>
            <td>114.2</td>
            <td>114.5</td>
            <td>141,822</td>
            <td>16,311,454</td>
        </tr>
        <tr>
            <td>Coloplast B</td>
            <td>DKK</td>
            <td>809.5</td>
            <td>11</td>
            <td>1.38</td>
            <td>809</td>
            <td>809.5</td>
            <td>85,840</td>
            <td>69,363,301</td>
        </tr>
        <tr>
            <td>D/S Norden</td>
            <td>DKK</td>
            <td>155</td>
            <td>-1.5</td>
            <td>-0.96</td>
            <td>155</td>
            <td>155.1</td>
            <td>51,681</td>
            <td>8,037,225</td>
        </tr>
        <tr>
            <td>Danske Bank</td>
            <td>DKK</td>
            <td>69.05</td>
            <td>2.55</td>
            <td>3.83</td>
            <td>69.05</td>
            <td>69.2</td>
            <td>1,723,719</td>
            <td>115,348,068</td>
        </tr>
        <tr>
            <td>DSV</td>
            <td>DKK</td>
            <td>105.4</td>
            <td>0.2</td>
            <td>0.19</td>
            <td>105.2</td>
            <td>105.4</td>
            <td>674,873</td>
            <td>71,575,035</td>
        </tr>
        <tr>
            <td>FLSmidth &amp; Co.</td>
            <td>DKK</td>
            <td>295.8</td>
            <td>-1.8</td>
            <td>-0.6</td>
            <td>295.1</td>
            <td>295.8</td>
            <td>341,263</td>
            <td>100,301,032</td>
        </tr>
        <tr>
            <td>G4S plc</td>
            <td>DKK</td>
            <td>22.53</td>
            <td>0.05</td>
            <td>0.22</td>
            <td>22.53</td>
            <td>22.57</td>
            <td>190,920</td>
            <td>4,338,150</td>
        </tr>
        <tr>
            <td>Jyske Bank</td>
            <td>DKK</td>
            <td>144.2</td>
            <td>1.4</td>
            <td>0.98</td>
            <td>142.8</td>
            <td>144.2</td>
            <td>78,163</td>
            <td>11,104,874</td>
        </tr>
        <tr>
            <td>Københavns ...</td>
            <td>DKK</td>
            <td>1,580.00</td>
            <td>-12</td>
            <td>-0.75</td>
            <td>1,590.00</td>
            <td>1,620.00</td>
            <td>82</td>
            <td>131,110</td>
        </tr>
        <tr>
            <td>Lundbeck</td>
            <td>DKK</td>
            <td>103.4</td>
            <td>-2.5</td>
            <td>-2.36</td>
            <td>103.4</td>
            <td>103.8</td>
            <td>157,162</td>
            <td>16,462,282</td>
        </tr>
        <tr>
            <td>Nordea Bank</td>
            <td>DKK</td>
            <td>43.22</td>
            <td>-0.06</td>
            <td>-0.14</td>
            <td>43.22</td>
            <td>43.25</td>
            <td>167,520</td>
            <td>7,310,143</td>
        </tr>
        <tr>
            <td>Novo Nordisk B</td>
            <td>DKK</td>
            <td>552.5</td>
            <td>-3.5</td>
            <td>-0.63</td>
            <td>550.5</td>
            <td>552.5</td>
            <td>843,533</td>
            <td>463,962,375</td>
        </tr>
        <tr>
            <td>Novozymes B</td>
            <td>DKK</td>
            <td>805.5</td>
            <td>5.5</td>
            <td>0.69</td>
            <td>805</td>
            <td>805.5</td>
            <td>152,188</td>
            <td>121,746,199</td>
        </tr>
        <tr>
            <td>Pandora</td>
            <td>DKK</td>
            <td>39.04</td>
            <td>0.94</td>
            <td>2.47</td>
            <td>38.8</td>
            <td>39.04</td>
            <td>350,965</td>
            <td>13,611,838</td>
        </tr>
        <tr>
            <td>Rockwool In...</td>
            <td>DKK</td>
            <td>492</td>
            <td>0</td>
            <td>0</td>
            <td>482</td>
            <td>492</td>
            <td></td>
            <td></td>
        </tr>
        <tr>
            <td>Rockwool In...</td>
            <td>DKK</td>
            <td>468</td>
            <td>12</td>
            <td>2.63</td>
            <td>465.2</td>
            <td>468</td>
            <td>9,885</td>
            <td>4,623,850</td>
        </tr>
        <tr>
            <td>Sydbank</td>
            <td>DKK</td>
            <td>95</td>
            <td>0.05</td>
            <td>0.05</td>
            <td>94.7</td>
            <td>95</td>
            <td>103,438</td>
            <td>9,802,899</td>
        </tr>
        <tr>
            <td>TDC</td>
            <td>DKK</td>
            <td>43.6</td>
            <td>0.13</td>
            <td>0.3</td>
            <td>43.5</td>
            <td>43.6</td>
            <td>845,110</td>
            <td>36,785,339</td>
        </tr>
        <tr>
            <td>Topdanmark</td>
            <td>DKK</td>
            <td>854</td>
            <td>13.5</td>
            <td>1.61</td>
            <td>854</td>
            <td>855</td>
            <td>38,679</td>
            <td>32,737,678</td>
        </tr>
        <tr>
            <td>Tryg</td>
            <td>DKK</td>
            <td>290.4</td>
            <td>0.3</td>
            <td>0.1</td>
            <td>290</td>
            <td>290.4</td>
            <td>94,587</td>
            <td>27,537,247</td>
        </tr>
        <tr>
            <td>Vestas Wind...</td>
            <td>DKK</td>
            <td>90.15</td>
            <td>-4.2</td>
            <td>-4.45</td>
            <td>90.1</td>
            <td>90.15</td>
            <td>1,317,313</td>
            <td>121,064,314</td>
        </tr>
        <tr>
            <td>William Dem...</td>
            <td>DKK</td>
            <td>417.6</td>
            <td>0.1</td>
            <td>0.02</td>
            <td>417</td>
            <td>417.6</td>
            <td>64,242</td>
            <td>26,859,554</td>
        </tr>
    </tbody>
</table>
<div style="height: 4000px">lots of content down here...</div>


0

Maximillian Hils'in cevabını seviyorum ama bazı sorunlarım vardı:

  1. th'ye uygulamadığınız sürece dönüşüm Edge veya IE'de çalışmaz
  2. Edge ve IE'de kaydırma sırasında başlık titriyor
  3. benim tablo ajax kullanılarak yüklenir, bu yüzden sarıcı kaydırma olay yerine pencere kaydırma olay eklemek istedim

Titremeden kurtulmak için kullanıcı kaydırmayı bitirene kadar beklemek için bir zaman aşımı kullanıyorum, sonra dönüşümü uyguluyorum - böylece kaydırma sırasında başlık görünmüyor.

Ben de jQuery kullanarak bu yazdım, bir avantajı jQuery sizin için satıcı önekleri işlemeli olması

    var isScrolling, lastTop, lastLeft, isLeftHidden, isTopHidden;

    //Scroll events don't bubble https://stackoverflow.com/a/19375645/150342
    //so can't use $(document).on("scroll", ".table-container-fixed", function (e) {
    document.addEventListener('scroll', function (event) {
        var $container = $(event.target);
        if (!$container.hasClass("table-container-fixed"))
            return;    

        //transform needs to be applied to th for Edge and IE
        //in this example I am also fixing the leftmost column
        var $topLeftCell = $container.find('table:first > thead > tr > th:first');
        var $headerCells = $topLeftCell.siblings();
        var $columnCells = $container
           .find('table:first > tbody > tr > td:first-child, ' +
                 'table:first > tfoot > tr > td:first-child');

        //hide the cells while returning otherwise they show on top of the data
        if (!isLeftHidden) {
            var currentLeft = $container.scrollLeft();
            if (currentLeft < lastLeft) {
                //scrolling left
                isLeftHidden = true;
                $topLeftCell.css('visibility', 'hidden');
                $columnCells.css('visibility', 'hidden');
            }
            lastLeft = currentLeft;
        }

        if (!isTopHidden) {
            var currentTop = $container.scrollTop();
            if (currentTop < lastTop) {
                //scrolling up
                isTopHidden = true;
                $topLeftCell.css('visibility', 'hidden');
                $headerCells.css('visibility', 'hidden');
            }
            lastTop = currentTop;
        }

        // Using timeout to delay transform until user stops scrolling
        // Clear timeout while scrolling
        window.clearTimeout(isScrolling);

        // Set a timeout to run after scrolling ends
        isScrolling = setTimeout(function () {
            //move the table cells. 
            var x = $container.scrollLeft();
            var y = $container.scrollTop();

            $topLeftCell.css('transform', 'translate(' + x + 'px, ' + y + 'px)');
            $headerCells.css('transform', 'translateY(' + y + 'px)');
            $columnCells.css('transform', 'translateX(' + x + 'px)');

            isTopHidden = isLeftHidden = false;
            $topLeftCell.css('visibility', 'inherit');
            $headerCells.css('visibility', 'inherit');
            $columnCells.css('visibility', 'inherit');
        }, 100);

    }, true);

Tablo, sınıfla birlikte bir div içine sarılır table-container-fixed.

.table-container-fixed{
    overflow: auto;
    height: 400px;
}

Kenarlık-daraltmayı ayırmak için ayarladım çünkü aksi takdirde çeviri sırasında kenarlıkları kaybediyoruz ve kaydırma sırasında kenarlığın bulunduğu hücrenin hemen üzerinde görüntülenen içeriği durdurmak için tablodaki kenarlığı kaldırıyorum.

.table-container-fixed > table {
   border-collapse: separate;
   border:none;
}

thAltındaki hücreleri kaplamak için arka planı beyaz yapıyorum ve Tablo kenarlığına uyan bir kenarlık ekliyorum - Bootstrap kullanılarak stilize edildi ve görünümden kaydırıldı.

 .table-container-fixed > table > thead > tr > th {
        border-top: 1px solid #ddd !important;
        background-color: white;        
        z-index: 10;
        position: relative;/*to make z-index work*/
    }

            .table-container-fixed > table > thead > tr > th:first-child {
                z-index: 20;
            }

.table-container-fixed > table > tbody > tr > td:first-child,
.table-container-fixed > table > tfoot > tr > td:first-child {
    background-color: white;        
    z-index: 10;
    position: relative;
}

0

JQuery'nin en son sürümünü kullanın ve aşağıdaki JavaScript kodunu ekleyin.

$(window).scroll(function(){
  $("id of the div element").offset({top:$(window).scrollTop()});
});

1
Bu işe yaramıyor gibi görünüyor. Belki ne yapmamızı istediğini açıklığa kavuşturabilirsin?
Chris

1
Ne div? Burada masalardan bahsediyoruz
isapir

0

Bu, sabit başlık satırına kesin bir çözüm değildir, ancak başlık satırını uzun tablo boyunca yinelemek için oldukça dahice bir yöntem oluşturdum, ancak yine de sıralama yeteneğini korudum.

Bu temiz küçük seçenek jQuery tablesortereklentisi gerektirir . Şöyle çalışır:

HTML

<table class="tablesorter boxlist" id="pmtable">
    <thead class="fixedheader">
        <tr class="boxheadrow">
            <th width="70px" class="header">Job Number</th>
            <th width="10px" class="header">Pri</th>
            <th width="70px" class="header">CLLI</th>
            <th width="35px" class="header">Market</th>
            <th width="35px" class="header">Job Status</th>
            <th width="65px" class="header">Technology</th>
            <th width="95px;" class="header headerSortDown">MEI</th>
            <th width="95px" class="header">TEO Writer</th>
            <th width="75px" class="header">Quote Due</th>
            <th width="100px" class="header">Engineer</th>
            <th width="75px" class="header">ML Due</th>
            <th width="75px" class="header">ML Complete</th>
            <th width="75px" class="header">SPEC Due</th>
            <th width="75px" class="header">SPEC Complete</th>
            <th width="100px" class="header">Install Supervisor</th>
            <th width="75px" class="header">MasTec OJD</th>
            <th width="75px" class="header">Install Start</th>
            <th width="30px" class="header">Install Hours</th>
            <th width="75px" class="header">Revised CRCD</th>
            <th width="75px" class="header">Latest Ship-To-Site</th>
            <th width="30px" class="header">Total Parts</th>
            <th width="30px" class="header">OEM Rcvd</th>
            <th width="30px" class="header">Minor Rcvd</th>
            <th width="30px" class="header">Total Received</th>
            <th width="30px" class="header">% On Site</th>
            <th width="60px" class="header">Actions</th>
        </tr>
    </thead>
        <tbody class="scrollable">
            <tr data-job_id="3548" data-ml_id="" class="odd">
                <td class="c black">FL-8-RG9UP</td>
                <td data-pri="2" class="priority c yellow">M</td>
                <td class="c">FTLDFLOV</td>
                <td class="c">SFL</td>
                <td class="c">NOI</td>
                <td class="c">TRANSPORT</td>
                <td class="c"></td>
                <td class="c">Chris Byrd</td>
                <td class="c">Apr 13, 2013</td>
                <td class="c">Kris Hall</td>
                <td class="c">May 20, 2013</td>
                <td class="c">May 20, 2013</td>
                <td class="c">Jun 5, 2013</td>
                <td class="c">Jun 7, 2013</td>
                <td class="c">Joseph Fitz</td>
                <td class="c">Jun 10, 2013</td>
                <td class="c">TBD</td>
                <td class="c">123</td>
                <td class="c revised_crcd"><input readonly="true" name="revised_crcd" value="Jul 26, 2013" type="text" size="12" class="smInput r_crcd c hasDatepicker" id="dp1377194058616"></td>
                <td class="c">TBD</td>
                <td class="c">N/A</td>
                <td class="c">N/A</td>
                <td class="c">N/A</td>
                <td class="c">N/A</td>
                <td class="c">N/A</td>
                <td class="actions"><span style="float:left;" class="ui-icon ui-icon-folder-open editJob" title="View this job" s="" details'=""></span></td>
            </tr>
            <tr data-job_id="4264" data-ml_id="2959" class="even">
                <td class="c black">MTS13009SF</td>
                <td data-pri="2" class="priority c yellow">M</td>
                <td class="c">OJUSFLTL</td>
                <td class="c">SFL</td>
                <td class="c">NOI</td>
                <td class="c">TRANSPORT</td>
                <td class="c"></td>
                <td class="c">DeMarcus Stewart</td>
                <td class="c">May 22, 2013</td>
                <td class="c">Ryan Alsobrook</td>
                <td class="c">Jun 19, 2013</td>
                <td class="c">Jun 27, 2013</td>
                <td class="c">Jun 19, 2013</td>
                <td class="c">Jul 4, 2013</td>
                <td class="c">Randy Williams</td>
                <td class="c">Jun 21, 2013</td>
                <td class="c">TBD</td>
                <td class="c">95</td>
                <td class="c revised_crcd"><input readonly="true" name="revised_crcd" value="Aug 9, 2013" type="text" size="12" class="smInput r_crcd c hasDatepicker" id="dp1377194058632"></td><td class="c">TBD</td>
                <td class="c">0</td>
                <td class="c">0.00%</td>
                <td class="c">0.00%</td>
                <td class="c">0.00%</td>
                <td class="c">0.00%</td>
                <td class="actions"><span style="float:left;" class="ui-icon ui-icon-folder-open editJob" title="View this job" s="" details'=""></span><input style="float:left;" type="hidden" name="req_ship" class="reqShip hasDatepicker" id="dp1377194058464"><span style="float:left;" class="ui-icon ui-icon-calendar requestShip" title="Schedule this job for shipping"></span><span class="ui-icon ui-icon-info viewOrderInfo" style="float:left;" title="Show material details for this order"></span></td>
            </tr>
            .
            .
            .
            .
            <tr class="boxheadrow repeated-header">
                <th width="70px" class="header">Job Number</th>
                <th width="10px" class="header">Pri</th>
                <th width="70px" class="header">CLLI</th>
                <th width="35px" class="header">Market</th>
                <th width="35px" class="header">Job Status</th>
                <th width="65px" class="header">Technology</th>
                <th width="95px;" class="header">MEI</th>
                <th width="95px" class="header">TEO Writer</th>
                <th width="75px" class="header">Quote Due</th>
                <th width="100px" class="header">Engineer</th>
                <th width="75px" class="header">ML Due</th>
                <th width="75px" class="header">ML Complete</th>
                <th width="75px" class="header">SPEC Due</th>
                <th width="75px" class="header">SPEC Complete</th>
                <th width="100px" class="header">Install Supervisor</th>
                <th width="75px" class="header">MasTec OJD</th>
                <th width="75px" class="header">Install Start</th>
                <th width="30px" class="header">Install Hours</th>
                <th width="75px" class="header">Revised CRCD</th>
                <th width="75px" class="header">Latest Ship-To-Site</th>
                <th width="30px" class="header">Total Parts</th>
                <th width="30px" class="header">OEM Rcvd</th>
                <th width="30px" class="header">Minor Rcvd</th>
                <th width="30px" class="header">Total Received</th>
                <th width="30px" class="header">% On Site</th>
                <th width="60px" class="header">Actions</th>
            </tr>

Tabii ki, masamın bundan daha fazla satırı var. 193 tam olarak, ancak başlık satırının nerede tekrarlandığını görebilirsiniz. Yinelenen başlık satırı bu işlevle ayarlanır:

jQuery

// Clone the original header row and add the "repeated-header" class
var tblHeader = $('tr.boxheadrow').clone().addClass('repeated-header');

// Add the cloned header with the new class every 34th row (or as you see fit)
$('tbody tr:odd:nth-of-type(17n)').after(tblHeader);

// On the 'sortStart' routine, remove all the inserted header rows
$('#pmtable').bind('sortStart', function() {
    $('.repeated-header').remove();
    // On the 'sortEnd' routine, add back all the header row lines.
}).bind('sortEnd', function() {
    $('tbody tr:odd:nth-of-type(17n)').after(tblHeader);
});

0

Birçok insan bu cevabı arıyor gibi görünüyor. Burada başka bir sorunun cevabına gömüldüğünü fark ettim: İki farklı çerçevedeki tablolar arasındaki sütun genişliğini senkronize etme vb.

Denediğim düzinelerce yöntem, aynı genişliğe sahip başlık tablosu ile kayan bir alt tablonuz olmasını sağlamak için güvenilir bir şekilde bulduğum tek yöntemdir.

İşte böyle yaptım, ilk önce hem jsfiddle üzerinde hem de üzerinde çalışan bu işlevi oluşturmak için geliştirdim tdve th( thbaşlık satırlarının stilini kullanmak için başkalarını açması durumunda ).

var setHeaderTableWidth= function (headertableid,basetableid) {
            $("#"+headertableid).width($("#"+basetableid).width());
            $("#"+headertableid+" tr th").each(function (i) {
                $(this).width($($("#"+basetableid+" tr:first td")[i]).width());
            });
            $("#" + headertableid + " tr td").each(function (i) {
                $(this).width($($("#" + basetableid + " tr:first td")[i]).width());
            });
        }

Ardından, iki tablo oluşturmanız gerekir, NOT başlık tablosunun TDkaydırma çubuğunun üst tablosunda yer bırakmak için fazladan bir değere sahip olması gerekir , örneğin:

 <table id="headertable1" class="input-cells table-striped">
        <thead>
            <tr style="background-color:darkgray;color:white;"><th>header1</th><th>header2</th><th>header3</th><th>header4</th><th>header5</th><th>header6</th><th></th></tr>
        </thead>
     </table>
    <div id="resizeToBottom" style="overflow-y:scroll;overflow-x:hidden;">
        <table id="basetable1" class="input-cells table-striped">
            <tbody >
                <tr>
                    <td>testdata</td>
                    <td>2</td>
                    <td>3</td>
                    <td>4</span></td>
                    <td>55555555555555</td>
                    <td>test</td></tr>
            </tbody>
        </table>
    </div>

Sonra şöyle bir şey yapın:

        setHeaderTableWidth('headertable1', 'basetable1');
        $(window).resize(function () {
            setHeaderTableWidth('headertable1', 'basetable1');
        });

Bu, Yığın Taşması'nda bulduğum, gönderilen tüm benzer sorulardan, tüm durumlarımda çalışan tek çözümdür.

Örneğin, durandal ile çalışmayan jQuery yapışkan eklentisini ve Google Kod projesini burada denedim https://code.google.com/p/js-scroll-table-header/issues/detail?id=2

Tabloların klonlanmasını, performansının düşmesini veya emilmesini içeren diğer çözümler her durumda çalışmaz.

Bu aşırı karmaşık çözümlere gerek yoktur. Sadece aşağıdaki örnekler gibi iki tablo yapın ve burada açıklandığı gibi setHeaderTableWidth işlevini çağırın ve işiniz bitti .

Bu sizin için işe yaramazsa, muhtemelen CSS kutu boyutlandırma özelliğinizle oynuyordunuz ve doğru şekilde ayarlamanız gerekiyor. CSS içeriğinizi kazayla vidalamak kolaydır. Yanlış gidebilecek birçok şey var, bu yüzden bunun farkında olun / dikkatli olun. Bu yaklaşım benim için işe yarıyor .


0

Burada çalıştığımız bir çözüm var (Internet Explorer'ın bazı son durumları ve eski sürümleriyle başa çıkmak için, sonunda kaydırma çubuğundaki başlık çubuğunu da söndükten sonra kaydırma bittiğinde geri döndük, ancak Firefox ve WebKit tarayıcılarında Bu çözüm işe yarıyor, sınır çöküşü: çöküşü varsayıyor.

Bu çözümün anahtarı, kenar-daraltmayı uyguladıktan sonra , CSS dönüşümlerinin başlıkta çalışmasını sağlamasıdır; Hiçbir şeyi kopyalamanıza gerek yok. Bu davranışın tarayıcıda düzgün bir şekilde uygulanmadığı için, daha hafif bir çözüm hayal etmek zor.

JSFiddle: http://jsfiddle.net/podperson/tH9VU/2/

Basit bir jQuery eklentisi olarak uygulanır. Sadece $ ('thead') .sticky () gibi bir çağrı ile yerinizin yapışkan olmasını sağlarsınız ve takılırlar. Bir sayfada birden çok tablo için çalışır ve büyük tabloların yarısında baş bölümleri.

$.fn.sticky = function(){
    $(this).each( function(){
        var thead = $(this),
            tbody = thead.next('tbody');

        updateHeaderPosition();

        function updateHeaderPosition(){
            if(
                thead.offset().top < $(document).scrollTop()
                && tbody.offset().top + tbody.height() > $(document).scrollTop()
            ){
                var tr = tbody.find('tr').last(),
                    y = tr.offset().top - thead.height() < $(document).scrollTop()
                        ? tr.offset().top - thead.height() - thead.offset().top
                        : $(document).scrollTop() - thead.offset().top;

                thead.find('th').css({
                    'z-index': 100,
                    'transform': 'translateY(' + y + 'px)',
                    '-webkit-transform': 'translateY(' + y + 'px)'
                });
            } else {
                thead.find('th').css({
                    'transform': 'none',
                    '-webkit-transform': 'none'
                });
            }
        }

        // See http://www.quirksmode.org/dom/events/scroll.html
        $(window).on('scroll', updateHeaderPosition);
    });
}

$('thead').sticky();

iyi bir çözüm, ancak sütunlar arasında sütun kenarlıklarını nasıl eklersiniz (her ikisi de sabit başlıkta, td verilerine hizalanmış)?
user5249203

Sorununu anladığımdan emin değilim. border-collapse, kenarlıklar, kenar boşlukları vb. kullanmanızı engellemez, sadece vudu tablosu metriklerini kaldırır.
podperson

1
Ekle border: 2px solid red;için thkaydırma, ve sorunu göreceksiniz. Bu daha temel çözümü kendim buldum: jsfiddle.net/x6pLcor9/19
calandoa

Aynı boyutlandırılmış kenarlığı td'ye ekleyin ve sorun yok. Ne demek istediğini anlamıyorum. Sürümünüz çok daha temiz ve jQuery kullanmıyor, bu yüzden kesinlikle bugün böyle bir şeyle giderdim. (Açıkçası, bugün bir tablo kullanacağımı sanmıyorum.)
podperson

0

İşte Maximilian Hils tarafından verilen cevap için geliştirilmiş bir cevap .

Bu, herhangi bir titreşim olmadan Internet Explorer 11'de çalışır:

var headerCells = tableWrap.querySelectorAll("thead td");
for (var i = 0; i < headerCells.length; i++) {
    var headerCell = headerCells[i];
    headerCell.style.backgroundColor = "silver";
}
var lastSTop = tableWrap.scrollTop;
tableWrap.addEventListener("scroll", function () {
    var stop = this.scrollTop;
    if (stop < lastSTop) {
        // Resetting the transform for the scrolling up to hide the headers
        for (var i = 0; i < headerCells.length; i++) {
            headerCells[i].style.transitionDelay = "0s";
            headerCells[i].style.transform = "";
        }
    }
    lastSTop = stop;
    var translate = "translate(0," + stop + "px)";
    for (var i = 0; i < headerCells.length; i++) {
        headerCells[i].style.transitionDelay = "0.25s";
        headerCells[i].style.transform = translate;
    }
});

0

İyi biçimlendirilmiş bir HTML tablosunu sabit tablo başlığı ve sütunlarla kaydırılabilir bir tabloya dönüştürmek için basit bir hafif jQuery eklentisi geliştirdim.

Eklenti, sabit bölümü kaydırılabilir bölümle pikselden piksele eşleştirmek için iyi çalışır. Ayrıca, yatay kaydırırken her zaman görüntülenecek sütun sayısını da dondurabilirsiniz.

Demo ve Dokümantasyon: http://meetselva.github.io/fixed-table-rows-cols/

GitHub deposu: https://github.com/meetselva/fixed-table-rows-cols

Aşağıda, sabit bir başlığa sahip basit bir tablo kullanımı,

$(<table selector>).fxdHdrCol({
    width:     "100%",
    height:    200,
    colModal: [{width: 30, align: 'center'},
               {width: 70, align: 'center'}, 
               {width: 200, align: 'left'}, 
               {width: 100, align: 'center'}, 
               {width: 70, align: 'center'}, 
               {width: 250, align: 'center'}
              ]
});

Nedir "iyi HTML tablosu" ?
Peter Mortensen

@PeterMortensen "iyi biçimlendirilmiş HTML" olmalıdır. Düzenlendi, teşekkürler.
Selvakumar Arumugam

0
<html>
<head>
    <script src="//cdn.jsdelivr.net/npm/jquery@3.2.1/dist/jquery.min.js"></script>
    <script>
        function stickyTableHead (tableID) {
            var $tmain = $(tableID);
            var $tScroll = $tmain.children("thead")
                .clone()
                .wrapAll('<table id="tScroll" />')
                .parent()
                .addClass($(tableID).attr("class"))
                .css("position", "fixed")
                .css("top", "0")
                .css("display", "none")
                .prependTo("#tMain");

            var pos = $tmain.offset().top + $tmain.find(">thead").height();


            $(document).scroll(function () {
                var dataScroll = $tScroll.data("scroll");
                dataScroll = dataScroll || false;
                if ($(this).scrollTop() >= pos) {
                    if (!dataScroll) {
                        $tScroll
                            .data("scroll", true)
                            .show()
                            .find("th").each(function () {
                                $(this).width($tmain.find(">thead>tr>th").eq($(this).index()).width());
                            });
                    }
                } else {
                    if (dataScroll) {
                        $tScroll
                            .data("scroll", false)
                            .hide()
                        ;
                    }
                }
            });
        }

        $(document).ready(function () {
            stickyTableHead('#tMain');
        });
    </script>
</head>

<body>
    gfgfdgsfgfdgfds<br/>
    gfgfdgsfgfdgfds<br/>
    gfgfdgsfgfdgfds<br/>
    gfgfdgsfgfdgfds<br/>
    gfgfdgsfgfdgfds<br/>
    gfgfdgsfgfdgfds<br/>

    <table id="tMain" >
        <thead>
        <tr>
            <th>1</th> <th>2</th><th>3</th> <th>4</th><th>5</th> <th>6</th><th>7</th> <th>8</th>

        </tr>
        </thead>
        <tbody>
            <tr><td>11111111111111111111111111111111111111111111111111111111</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
            <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5555555</td><td>66666666666</td><td>77777777777</td><td>8888888888888888</td></tr>
        </tbody>
    </table>
</body>
</html>

0

@Daniel Waltrip yanıtına ek olarak. Tablo ile position: relativeçalışmak için div ile örtmek gerekirposition:sticky . Bu yüzden örnek kodumu buraya göndermek istiyorum.

CSS

/* Set table width/height as you want.*/
div.freeze-header {
  position: relative;
  max-height: 150px;
  max-width: 400px;
  overflow:auto;
}

/* Use position:sticky to freeze header on top*/
div.freeze-header > table > thead > tr > th {
  position: sticky;
  top: 0;
  background-color:yellow;
}

/* below is just table style decoration.*/
div.freeze-header > table {
  border-collapse: collapse;
}

div.freeze-header > table td {
  border: 1px solid black;
}

HTML

<html>
<body>
  <div>
   other contents ...
  </div>
  <div>
   other contents ...
  </div>
  <div>
   other contents ...
  </div>

  <div class="freeze-header">
    <table>
       <thead>
         <tr>
           <th> header 1 </th>
           <th> header 2 </th>
           <th> header 3 </th>
           <th> header 4 </th>
           <th> header 5 </th>
           <th> header 6 </th>
           <th> header 7 </th>
           <th> header 8 </th>
           <th> header 9 </th>
           <th> header 10 </th>
           <th> header 11 </th>
           <th> header 12 </th>
           <th> header 13 </th>
           <th> header 14 </th>
           <th> header 15 </th>
          </tr>
       </thead>
       <tbody>
         <tr>
           <td> data 1 </td>
           <td> data 2 </td>
           <td> data 3 </td>
           <td> data 4 </td>
           <td> data 5 </td>
           <td> data 6 </td>
           <td> data 7 </td>
           <td> data 8 </td>
           <td> data 9 </td>
           <td> data 10 </td>
           <td> data 11 </td>
           <td> data 12 </td>
           <td> data 13 </td>
           <td> data 14 </td>
           <td> data 15 </td>
          </tr>         
         <tr>
           <td> data 1 </td>
           <td> data 2 </td>
           <td> data 3 </td>
           <td> data 4 </td>
           <td> data 5 </td>
           <td> data 6 </td>
           <td> data 7 </td>
           <td> data 8 </td>
           <td> data 9 </td>
           <td> data 10 </td>
           <td> data 11 </td>
           <td> data 12 </td>
           <td> data 13 </td>
           <td> data 14 </td>
           <td> data 15 </td>
          </tr>         
         <tr>
           <td> data 1 </td>
           <td> data 2 </td>
           <td> data 3 </td>
           <td> data 4 </td>
           <td> data 5 </td>
           <td> data 6 </td>
           <td> data 7 </td>
           <td> data 8 </td>
           <td> data 9 </td>
           <td> data 10 </td>
           <td> data 11 </td>
           <td> data 12 </td>
           <td> data 13 </td>
           <td> data 14 </td>
           <td> data 15 </td>
          </tr>         
         <tr>
           <td> data 1 </td>
           <td> data 2 </td>
           <td> data 3 </td>
           <td> data 4 </td>
           <td> data 5 </td>
           <td> data 6 </td>
           <td> data 7 </td>
           <td> data 8 </td>
           <td> data 9 </td>
           <td> data 10 </td>
           <td> data 11 </td>
           <td> data 12 </td>
           <td> data 13 </td>
           <td> data 14 </td>
           <td> data 15 </td>
          </tr>         
         <tr>
           <td> data 1 </td>
           <td> data 2 </td>
           <td> data 3 </td>
           <td> data 4 </td>
           <td> data 5 </td>
           <td> data 6 </td>
           <td> data 7 </td>
           <td> data 8 </td>
           <td> data 9 </td>
           <td> data 10 </td>
           <td> data 11 </td>
           <td> data 12 </td>
           <td> data 13 </td>
           <td> data 14 </td>
           <td> data 15 </td>
          </tr>         
         <tr>
           <td> data 1 </td>
           <td> data 2 </td>
           <td> data 3 </td>
           <td> data 4 </td>
           <td> data 5 </td>
           <td> data 6 </td>
           <td> data 7 </td>
           <td> data 8 </td>
           <td> data 9 </td>
           <td> data 10 </td>
           <td> data 11 </td>
           <td> data 12 </td>
           <td> data 13 </td>
           <td> data 14 </td>
           <td> data 15 </td>
          </tr>         
         <tr>
           <td> data 1 </td>
           <td> data 2 </td>
           <td> data 3 </td>
           <td> data 4 </td>
           <td> data 5 </td>
           <td> data 6 </td>
           <td> data 7 </td>
           <td> data 8 </td>
           <td> data 9 </td>
           <td> data 10 </td>
           <td> data 11 </td>
           <td> data 12 </td>
           <td> data 13 </td>
           <td> data 14 </td>
           <td> data 15 </td>
          </tr>         
         <tr>
           <td> data 1 </td>
           <td> data 2 </td>
           <td> data 3 </td>
           <td> data 4 </td>
           <td> data 5 </td>
           <td> data 6 </td>
           <td> data 7 </td>
           <td> data 8 </td>
           <td> data 9 </td>
           <td> data 10 </td>
           <td> data 11 </td>
           <td> data 12 </td>
           <td> data 13 </td>
           <td> data 14 </td>
           <td> data 15 </td>
          </tr>         
       </tbody>
    </table>
  </div>
</body>
</html>

gösteri

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.