फिक्स्ड हेडर के साथ HTML टेबल?


231

क्या एक लंबी HTML तालिका प्रदर्शित करने के लिए क्रॉस-ब्राउज़र सीएसएस / जावास्क्रिप्ट तकनीक है ताकि कॉलम हेडर स्क्रीन पर स्थिर रहें और टेबल बॉडी के साथ स्क्रॉल न करें। Microsoft Excel में "फ़्रीज़ पैन" प्रभाव के बारे में सोचें।

मैं तालिका की सामग्री के माध्यम से स्क्रॉल करने में सक्षम होना चाहता हूं, लेकिन हमेशा शीर्ष पर कॉलम हेडर देखने में सक्षम हो सकता हूं।


3
इसे आज़माएं: फिक्स्ड हैडर EDIT के साथ प्योर सीएसएस स्क्रॉल टेबल : यह इंटरनेट एक्सप्लोरर 7 में काम करना चाहिए जैसा कि उदाहरण में देखा गया है : फिक्स्ड हेडर EDIT 2 के साथ स्क्रॉलिंग HTML टेबल : मुझे कुछ अतिरिक्त लिंक मिले हैं जो उपयोग में हो सकते हैं: - Stadid फिक्स्ड हेडर - कुछ सीमाओं के साथ एक jQuery प्लगइन। - [फिक्स्ड टेबल हेडर्स
gcores

मैं कई समाधानों पर आया हूं जो आम तौर पर काम करता है लेकिन उनमें से किसी ने भी स्क्रॉलिंग डिव का काम नहीं किया है। मेरा मतलब है, आपकी तालिका स्क्रॉल करने योग्य div के अंदर है और फिर भी आप चाहते हैं कि आपका टेबल शीर्षलेख अभी भी उस div के अंदर है। मैंने इसका हल निकाल लिया है और समाधान यहाँ साझा करता हूँ ।
योगी

9
2018 में, सभी ब्राउज़र निम्नलिखित सरल समाधान का उपयोग कर सकते हैं thead th { position: sticky; top: 0; }:। सफारी को एक विक्रेता उपसर्ग की आवश्यकता है:-webkit-sticky
डैनियल वाल्ट्रिप

1
@DanielWaltrip आपको इसे एक उत्तर जोड़ना चाहिए ताकि वह शीर्ष स्थान पर मतदान कर सके - अन्य सभी उत्तर स्थिति से बेमानी हैं: आजकल चिपचिपा बेहतर समर्थन है
पीटर केर

जवाबों:


88

मैं थोड़ी देर के लिए इसके लिए एक समाधान की तलाश में था और पाया कि अधिकांश उत्तर काम नहीं कर रहे हैं या मेरी स्थिति के लिए उपयुक्त नहीं हैं, इसलिए मैंने jQuery के साथ एक सरल समाधान लिखा।

यह समाधान की रूपरेखा है:

  1. उस तालिका को क्लोन करें जिसमें एक निश्चित हेडर होना आवश्यक है, और क्लोन कॉपी को मूल के शीर्ष पर रखें।
  2. शीर्ष तालिका से तालिका निकाय निकालें।
  3. तालिका शीर्ष लेख को नीचे की तालिका से निकालें।
  4. कॉलम की चौड़ाई समायोजित करें। (हम मूल स्तंभ चौड़ाई का ट्रैक रखते हैं)

नीचे एक रन करने योग्य डेमो में कोड है।

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>

यह समाधान Chrome और IE में काम करता है। चूंकि यह jQuery पर आधारित है, इसलिए इसे अन्य jQuery समर्थित ब्राउज़रों में भी काम करना चाहिए।


4
और सामग्री की चौड़ाई से बड़ी होने पर हम समस्या का समाधान कैसे कर सकते हैं?
मर्त्ज़

1
@ टेट्रा टीडी {अधिकतम-चौड़ाई: 30 पीएक्स; } यह आपको डेवलपर को नियंत्रित करने की अनुमति देगा कि पंक्तियों को कैसे प्रदर्शित किया जाए।
हुसैन टोडोरोव

लेकिन क्या होगा अगर कुछ हेडर सेल में सामग्री td कोशिकाओं की तुलना में लंबी हो? मैंने कोशिश की कि IE7 में, और चौड़ाई () सब कुछ तोड़ देती है। IE8 और IE9 ठीक काम करते हैं, हालांकि ...
जस्टामार्टिन

4
दुर्भाग्य से, यदि आपको स्तंभों के पिक्सेल-पूर्ण संरेखण की आवश्यकता होती है, तो यह काम नहीं करता है: jsbin.com/elekiq/1 ( स्रोत कोड )। आप देख सकते हैं कि कुछ हेडर ऑफसेट हैं जहां से उन्हें होना चाहिए, बस थोड़ा सा। यदि आप पृष्ठभूमि का उपयोग कर रहे हैं तो प्रभाव अधिक स्पष्ट है: jsbin.com/elekiq/2 ( स्रोत कोड )। (मैं इन लाइनों के साथ काम कर रहा था, मेरे कोड में इस में भाग गया, तुम्हारा पाया और सोचा "ओह, मुझे आश्चर्य है कि अगर वह मेरे लिए है!" अफसोस की बात नहीं है :-)) ब्राउज़रों एक दर्द को नियंत्रित करने के लिए चाहते हैं के बारे में दर्द है। कोशिकाओं की चौड़ाई ...
टीजे क्राउडर

यह क्षैतिज स्क्रॉलिंग के साथ काम नहीं करता है- यह हेडर बनाता है, लेकिन यह स्क्रॉल करने योग्य क्षेत्र (दृष्टि से परे) तक विस्तारित होता है और सामग्री के साथ स्क्रॉल नहीं करता है।
क्रैश

183

इसे कोड की चार लाइनों में आसानी से हल किया जा सकता है।

यदि आप केवल आधुनिक ब्राउज़रों की परवाह करते हैं, तो सीएसएस ट्रांसफ़ॉर्म का उपयोग करके एक निश्चित हेडर को बहुत आसान बनाया जा सकता है। अजीब लगता है, लेकिन महान काम करता है:

  • HTML और CSS जैसा है वैसा ही रहता है।
  • कोई बाहरी जावास्क्रिप्ट निर्भरता नहीं।
  • कोड की चार लाइनें।
  • सभी कॉन्फ़िगरेशन (तालिका-लेआउट: फिक्स्ड, आदि) के लिए काम करता है।
document.getElementById("wrap").addEventListener("scroll", function(){
   var translate = "translate(0,"+this.scrollTop+"px)";
   this.querySelector("thead").style.transform = translate;
});

इंटरनेट एक्सप्लोरर 8- को छोड़कर सीएसएस ट्रांसफॉर्म के लिए समर्थन व्यापक रूप से उपलब्ध है

यहाँ संदर्भ के लिए पूर्ण उदाहरण है:


8
मुझे कहना है कि, मेरी पिछली टिप्पणी के बावजूद, मैंने देखा है कि एक सही समाधान के लिए यह निकटतम चीज है। यहां तक ​​कि क्षैतिज स्क्रॉलिंग एकदम सही है (मेरे अपने समाधान से बेहतर)। यहां बॉर्डर्स के साथ एक उदाहरण दिया गया है (आप बॉर्डर-पतन का उपयोग नहीं कर सकते हैं) और एक स्क्रॉलबार जो कंटेनर के बजाय टेबल से चिपक जाता है: jsfiddle
DoctorDestructo

11
पता चला, यह काम करता है लेकिन रूपांतरण को th / td पर लागू करना है, न कि थ्रेड पर।
रेडहेड

5
@AlexAlexeev, आपका समाधान अद्भुत है। धन्यवाद। मैंने देखा है कि, परिणामी निश्चित हेडर में सीमा रेखाएं नहीं होती हैं जो कॉलम को भेद करती हैं। डिफ़ॉल्ट सीएसएस शैली खो गई है। यहां तक ​​कि जब मैं इसे शामिल करता हूं ... $(this).addClass('border')तो तालिका के बाकी हिस्सों में फ़ॉन्ट, आकार, रंग शामिल होते हैं जो मैं सीमा वर्ग में पास करता हूं। लेकिन, फिक्स्ड हैडर में लाइनें नहीं जोड़ता है। सराहना करें, इसे ठीक करने के बारे में कोई भी जानकारी
user5249203

5
@ user5249203 मुझे पता है कि आपने कुछ महीने पहले पूछा था, लेकिन मुझे वही समस्या थी और यह सीमा-पतन के कारण था: इसे देखें: stackoverflow.com/questions/33777751/…
9

6
यह IE या एज के किसी भी संस्करण में काम नहीं करता है। यहाँ एक संस्करण @ रेड इंडियन की टिप्पणी के आधार पर करता है वह यह है कि jsfiddle.net/n6o8ocwb/2
लूटने

58

मैंने अभी-अभी एक jQuery प्लगइन डालकर पूरा किया है जो मान्य HTML का उपयोग करके वैध एकल तालिका लेगा (एक थ्रेड और tbody है) और एक तालिका का उत्पादन करेगा जिसमें निश्चित हेडर, वैकल्पिक फिक्स्ड पाद है जो या तो क्लोन हेडर या कोई भी हो सकता है आपके द्वारा चुनी गई सामग्री (पृष्ठांकन, आदि)। यदि आप बड़े मॉनीटरों का लाभ उठाना चाहते हैं तो यह ब्राउज़र के आकार बदलने पर तालिका का आकार भी बदल देगा। एक और जोड़ा सुविधा स्क्रॉल करने में सक्षम हो रही है यदि टेबल कॉलम सभी देखने में फिट नहीं हो सकते हैं।

http://fixedheadertable.com/

on github: http://markmalek.github.com/Fixed-Header-Table/

इसे सेटअप करना बेहद आसान है और आप इसके लिए अपनी खुद की कस्टम स्टाइल बना सकते हैं। यह सभी ब्राउज़रों में गोल कोनों का भी उपयोग करता है। ध्यान रखें कि मैंने अभी इसे जारी किया है, इसलिए यह अभी भी तकनीकी रूप से बीटा है और बहुत कम मामूली मुद्दे हैं जिन्हें मैं बाहर निकाल रहा हूं।

यह Internet Explorer 7, Internet Explorer 8, Safari, Firefox और Chrome में काम करता है।


धन्यवाद! मैं आज बाद में एक नई रिलीज जोड़ रहा हूं जब मुझे काम से घर मिलेगा। यहाँ मैं जोड़ने के साथ अपने ब्लॉग प्रविष्टि के लिए एक कड़ी हूँ: तय्यारी_शामिल है ।mmalek.com
मार्क

इसके लिए शुक्रिया। मुझे पता है कि यह सवाल एक साल से अधिक पुराना है, लेकिन यहां तक ​​कि सुलझे हुए गाद के हलचल के जोखिम पर, मैं आपको बताना चाहूंगा कि आपके काम की सराहना की जाती है
sova

आपके डेमो में, यानी ie6 में चौड़ाई बंद है। - टेबल हेडर और बॉडी को संरेखित नहीं किया गया है।
Cheekysoft

4
नवीनतम संस्करण IE6 में काम नहीं करता है। मैं अब IE6 का समर्थन नहीं करता।
मार्क

महान काम मार्क - unfortunatelly मोबाइल उपकरणों (आईपैड, एंड्रॉइड टैबलेट) में फिक्स्ड हेडर और कॉलम की स्क्रॉलिंग के साथ कुछ समस्याएं हैं - जब मैं सामग्री को स्क्रॉल करता हूं तो उन निश्चित हिस्सों को स्क्रॉल नहीं करते हैं - जब मैं स्क्रॉल करना बंद कर देता हूं और एक बार तालिका को टैप करता हूं उचित पदों के लिए "कूद" तय भागों - वहाँ यह तय करने के लिए एक आसान तरीका है?
ओकिजब

23

मैंने एक प्लगइन भी बनाया जो इस मुद्दे को संबोधित करता है। मेरी परियोजना - jQuery.floatThead को अब लगभग 4 साल हो गए हैं और यह बहुत परिपक्व है।

इसके लिए किसी बाहरी शैली की आवश्यकता नहीं है और यह आपकी तालिका को किसी विशेष तरीके से स्टाइल करने की उम्मीद नहीं करता है। यह Internet Explorer9 + और फ़ायरफ़ॉक्स / क्रोम का समर्थन करता है।

वर्तमान में (2018-05) इसके पास:

GitHub पर 405 कमिट और 998 स्टार


यहाँ के बहुत से (सभी नहीं) त्वरित हैक हैं जो उस समस्या को हल कर सकते हैं जो एक व्यक्ति कर रहा था, लेकिन हर तालिका के लिए काम नहीं करेगा।

अन्य प्लगइन्स में से कुछ पुराने हैं और शायद इंटरनेट एक्सप्लोरर के साथ काम करते हैं, लेकिन फ़ायरफ़ॉक्स और क्रोम पर टूटेंगे।


1
महान प्लगइन, नेस्टेड टेबल और ऑफ़सेट का समर्थन करता है।
मिहाई एलेक्स

2
महान। बहुत बहुत धन्यवाद। प्लगइन ने फ़ायरफ़ॉक्स 45.2, क्रोमियम 51 और IE 11 में अच्छी तरह से काम किया है। इसके अलावा, यह एक ही पृष्ठ पर निर्मित कई JS और jQuery कोड के साथ हस्तक्षेप नहीं करता है।
Aldo Paradiso

धन्यवाद। मुझे यह बताते हुए खुशी हो रही है कि इस बिंदु पर परियोजना को हर 4 महीने में लगभग 1 बग रिपोर्ट मिलती है। मैं बहुत से बदलाव नहीं कर रहा हूं। यह बहुत ठोस है और काम करता है।
15

20

टी एल; डॉ

यदि आप आधुनिक ब्राउज़रों को लक्षित करते हैं और असाधारण स्टाइल की जरूरत नहीं है: http://jsfiddle.net/dPixie/byB9d/3/ ... हालांकि बड़ा चार संस्करण बहुत मीठा है और साथ ही यह संस्करण द्रव की चौड़ाई को बहुत बेहतर तरीके से संभालता है।

सबके लिए अच्छी खबर है!

HTML5 और CSS3 की प्रगति के साथ यह अब संभव है, कम से कम आधुनिक ब्राउज़रों के लिए। थोड़ा सा हकीम कार्यान्वयन जो मैं यहां आया था, वह यहां पाया जा सकता है: http://jsfiddle.net/dPixie/byB9d/3/ । मैंने इसे एफएक्स 25, क्रोम 31 और आईई 10 में परीक्षण किया है ...

प्रासंगिक HTML (हालांकि अपने दस्तावेज़ के शीर्ष पर HTML5 सिद्धांत डालें):

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>

पर कैसे?!

सीधे शब्दों में कहें तो आपके पास एक टेबल हैडर है, जिसे आप नेत्रहीन रूप से 0px उच्च बनाकर छिपाते हैं, जिसमें निश्चित हेडर के रूप में उपयोग किए गए डिव भी शामिल हैं। तालिका के कंटेनर बिल्कुल तैनात शीर्ष लेख के लिए अनुमति देने के लिए शीर्ष पर पर्याप्त जगह छोड़ देता है, और स्क्रॉलबार के साथ तालिका आपकी अपेक्षा के अनुसार दिखाई देती है।

ऊपर दिए गए कोड का उपयोग टेबल की स्थिति को बिल्कुल सही करने के लिए किया जाता है (मैं इसे पॉपअप स्टाइल डायलॉग में उपयोग कर रहा हूं) लेकिन आप इसे positionedकंटेनर से कक्षा को हटाकर दस्तावेज़ के प्रवाह में भी उपयोग कर सकते हैं ।

परंतु ...

यह सही नहीं है। फ़ायरफ़ॉक्स हेडर पंक्ति 0px बनाने से इंकार करता है (कम से कम मुझे कोई रास्ता नहीं मिला) लेकिन हठपूर्वक इसे न्यूनतम 4 पीएक्स पर रखता है ... यह एक बड़ी समस्या नहीं है, लेकिन आपकी स्टाइल के आधार पर यह आपकी सीमाओं के साथ गड़बड़ कर देगा आदि।

तालिका एक अशुद्ध कॉलम दृष्टिकोण का उपयोग भी कर रही है जहां कंटेनर का पृष्ठभूमि रंग स्वयं हेडर डिव के लिए पृष्ठभूमि के रूप में उपयोग किया जाता है, जो कि पारदर्शी हैं।

सारांश

सभी में आपकी आवश्यकताओं, विशेष रूप से सीमाओं या जटिल पृष्ठभूमि के आधार पर स्टाइलिंग मुद्दे हो सकते हैं। संगणना के साथ समस्याएँ भी हो सकती हैं, मैंने इसे अभी तक कई प्रकार के ब्राउज़रों में नहीं देखा है (कृपया अपने अनुभवों के साथ टिप्पणी करें यदि आप इसे आज़माते हैं), लेकिन मुझे ऐसा कुछ नहीं मिला, इसलिए मुझे लगा कि यह पोस्ट करने लायक था वैसे भी ...


यदि आप विंडो की चौड़ाई को तब तक सिकोड़ते हैं जब तक कि क्षैतिज स्क्रॉलिंग किक न कर दे, तब हेडर क्षैतिज रूप से शरीर के साथ स्क्रॉल नहीं करता है। अरे।
dlaliberte

@dliberiberte - ठीक है, क्योंकि हेडर और टेबल वास्तव में दो अलग-अलग तत्व हैं जो आप कर सकते हैं, टो, अजीबता में। लेकिन मेरा उदाहरण टेबल कॉलम पर अतिप्रवाह की अनुमति नहीं देता है और हेडर आमतौर पर टेबल सामग्री की तुलना में नियंत्रित करना आसान होता है। यदि आपने हेडर को "अतिप्रवाह" का कारण बनाया है, तो टेबल के दाईं ओर चिपक जाएगा और गंभीर रूप से टूट जाएगा। आप इसे टेबल पर एक मिनट की चौड़ाई निर्धारित करके ठीक कर सकते हैं, यह पृष्ठ को भी अतिप्रवाह करने के लिए मजबूर कर सकता है ... लेकिन यह एक हैक है इसलिए यह कभी भी सही नहीं होगा ...
जोनास शूबर्ट एर्लडसन

1
इस बात की ओर इशारा करते हुए कि इसके लिए एक ऐसी डिज़ाइन की आवश्यकता होती है जहाँ एक निश्चित ऊँचाई वाली तालिका निर्दिष्ट की जा सके।
चेकिसॉफ्ट

1
@Cheekysoft - नहीं, तालिका और पंक्ति सामग्री स्वतंत्र रूप से प्रवाह कर सकती है। कंटेनर, मेरे उदाहरण में <section>तत्व को केवल अतिप्रवाह करने और स्क्रॉल दिखाने के लिए मजबूर करने के लिए ऊँचाई विवश होने की आवश्यकता है। कोई भी लेआउट जो कंटेनर को अतिप्रवाह करेगा, काम करेगा। यदि आपको कोई ऐसा मामला मिलता है, जहां वह कृपया किसी फ़िडेल का लिंक पोस्ट नहीं करता है।
जोनास शूबर्ट एर्लड्सन

हार्ड कोडित padding-topमूल्य का मतलब यह भी है कि यदि टेबल हेडिंग टेक्स्ट एक से अधिक लाइन पर है तो यह टेबल सेल्स के ऊपर दिखाई देगा। अफ़सोस, क्योंकि यह ज्यादातर समय एक आकर्षण की तरह काम करता है। अधिकांश अन्य समाधानों के कॉलम साइज़िंग इश्यू के आसपास पाने divके thलिए वास्तव में अच्छी चाल के साथ ।
बर्नहार्ड हॉफमैन

19

CSS विनिर्देश के बाहर से इसे हल करने के सभी प्रयास हम वास्तव में क्या चाहते हैं की छाया है: THEAD के निहित वादे पर डिलीवरी।

फ्रोजन-हेडर्स-फॉर-ए-टेबल समस्या लंबे समय से HTML / CSS में एक खुला घाव है।

एक आदर्श दुनिया में, इस समस्या के लिए एक शुद्ध-सीएसएस समाधान होगा। दुर्भाग्य से, वहाँ एक अच्छा एक जगह नहीं लगती है।

इस विषय पर प्रासंगिक मानकों-चर्चा में शामिल हैं:

अद्यतन : फ़ायरफ़ॉक्स position:stickyसंस्करण 32 में भेज दिया । हर कोई जीतता है!


यह लोमड़ी की तरह स्तम्भित करने के लिए बहुत अच्छा होगा
Csaba Toth

4
पुन। फ़ायरफ़ॉक्स और स्थिति: चिपचिपा, यह टेबल हेडर के लिए काम नहीं करता है: Bugzilla.mozilla.org/show_bug.cgi?id=925259#c8 ... उस बग के लिए पैच स्पष्ट रूप से बताता है: "हम वर्तमान में सापेक्ष स्थिति का समर्थन नहीं करते हैं आंतरिक तालिका तत्वों की, इसलिए हम उन्हें चिपचिपी स्थिति से भी बाहर रखते हैं। "
जोनास शूबर्ट एर्लडसन

2
यह अब सभी ब्राउज़रों में काम करता है thead th { position: sticky; top: 0; }:। क्या हम इस उत्तर को स्पष्ट रूप से बता सकते हैं?
डेनियल वालट्रिप

1
@DanielWalt सभी ब्राउज़र? stackoverflow.com/a/37646284/3640407 किनारों की तुलना में अभी भी अधिक MSIE हैं
edc65

निष्पक्ष बिंदु। यह वैश्विक वेब उपयोगकर्ताओं के 86% के लिए समर्थित है, caniuse.com/#search=position%3Asticky के
डैनियल

14

यहाँ फिक्स्ड टेबल हेडर के लिए एक jQuery प्लगइन है। यह शीर्ष तक पहुंचने पर पूरे पृष्ठ को स्क्रॉल करने, हेडर को फ्रीज करने की अनुमति देता है। यह ट्विटर बूटस्ट्रैप तालिकाओं के साथ अच्छी तरह से काम करता है ।

गिटहब रिपॉजिटरी: https://github.com/oma/table-fixed-header

यह केवल तालिका सामग्री को स्क्रॉल नहीं करता है। इन अन्य उत्तरों में से एक के रूप में, उसके लिए अन्य टूल देखें। आप तय करें कि आपके मामले में सबसे अच्छा क्या है।


1
बुमेर - उदाहरण लिंक मृत है। "उफ़! डेनी सिडेन ब्लड इक्के फननेट ..." काश कोड यहाँ चिपकाया जाता।
जोसेफ

हाँ ... इस बारे में क्षमा करें। लिंक हटा दिया। इस परियोजना का अब कोई रखरखाव नहीं है
oma

चिंता न करने के लिए - मैंने इनमें से कई पूर्व-निर्मित समाधानों की कोशिश की - किसी ने फ्लेक्स-कॉल-चौड़ाई-तालिका के साथ काम नहीं किया जो स्क्रीन-चौड़ाई से अधिक था। मैं अपना खुद का समाधान लिखने के लिए घाव।
जोसेफ

9

यहां पोस्ट किए गए अधिकांश समाधानों को jQuery की आवश्यकता होती है। यदि आप एक स्वतंत्र समाधान की कोशिश कर रहे हैं तो आप ग्रिड की कोशिश करें: http://www.matts411.com/post/grid/

इसे यहाँ Github पर होस्ट किया गया है: https://github.com/mmurph211/Grid

यह न केवल फिक्स्ड हेडर का समर्थन करता है, बल्कि अन्य चीजों के अलावा फिक्स्ड लेफ्ट कॉलम और फूटर को भी सपोर्ट करता है।


यह वास्तव में साफ है अगर यह आपकी आवश्यकताओं को पूरा करता है, तो मैंने आज इसके साथ खेला। दुर्भाग्य से, यह एक आयताकार ग्रिड है (जैसा कि नाम से पता चलता है, वास्तव में) और सामग्री द्वारा समायोजित पंक्ति ऊंचाई के साथ एक सही तालिका नहीं है। और व्यक्तिगत पंक्तियों को स्टाइल करना मुश्किल लग रहा था। मैं एक ज़ेबरा धारीदार तालिका बनाने का प्रबंधन नहीं कर सकता था, लेकिन बहुत कोशिश नहीं की क्योंकि मेरी ज़रूरतें वास्तव में अधिक जटिल थीं। वैसे भी, अच्छा काम।
mplwork

1
अरे मैं तुम्हें जानता हूँ! हमें लगता है कि उन्होंने बहुत ही समान शिट ( github.com/mkoryak/floatThead ) लिखी थी - मिशा
mkoryak

9

position: stickyअधिकांश आधुनिक ब्राउज़रों में CSS संपत्ति का बहुत समर्थन है (मेरे पास एज के साथ समस्याएं थीं, नीचे देखें)।

इससे हम निश्चित हेडर की समस्या को काफी आसानी से हल कर सकते हैं:

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

सफारी एक विक्रेता उपसर्ग की जरूरत है: -webkit-sticky

फ़ायरफ़ॉक्स के लिए, मुझे min-height: 0मूल तत्वों में से एक को जोड़ना था । मैं बिल्कुल भूल जाता हूं कि इसकी आवश्यकता क्यों थी।

दुर्भाग्य से, माइक्रोसॉफ्ट एज कार्यान्वयन केवल अर्ध-काम करने वाला लगता है। कम से कम, मेरे पास मेरे परीक्षण में कुछ चंचल और गलत तरीके से टेबल सेल थे। तालिका अभी भी प्रयोग करने योग्य थी, लेकिन इसमें सौंदर्य संबंधी महत्वपूर्ण मुद्दे थे।


का उपयोग करते हुए position: sticky;एक div है कि अंदर की मेज के साथ overflow: scroll;, overflow-x: scroll;या overflow-y: scroll;। आधुनिक ब्राउज़रों में फिक्स्ड टेबल हेडर और कॉलम के लिए सबसे अच्छा और सरल समाधान प्रतीत होता है। इस जवाब को शीर्ष पर मतदान करने की आवश्यकता है।
अबरैंट

यह सरल लेकिन प्रभावी है। यह वही है जिसकी मुझे तलाश है। धन्यवाद।
कैटरीनाट्स

6

एक अधिक परिष्कृत शुद्ध सीएसएस स्क्रॉलिंग टेबल

सभी शुद्ध सीएसएस समाधान मैंने अब तक देखे हैं - चतुर हालांकि वे हो सकते हैं - एक निश्चित स्तर की पॉलिश की कमी है, या बस कुछ स्थितियों में सही काम नहीं करते हैं। इसलिए, मैंने अपना खुद का निर्माण करने का फैसला किया ...

विशेषताएं:

  • यह शुद्ध सीएसएस है, इसलिए किसी भी jQuery की आवश्यकता नहीं है (या उस मामले के लिए किसी भी जावास्क्रिप्ट कोड)
  • आप तालिका की चौड़ाई एक प्रतिशत (उर्फ "द्रव") या एक निश्चित मान सेट कर सकते हैं, या सामग्री को उसकी चौड़ाई (उर्फ "ऑटो") निर्धारित कर सकते हैं
  • कॉलम की चौड़ाई भी तरल पदार्थ, निश्चित या ऑटो हो सकती है।
  • क्षैतिज स्क्रॉलिंग (प्रत्येक समस्या जो सीएसएस-आधारित समाधान में देखी गई है, जिसे मुझे निश्चित चौड़ाई की आवश्यकता नहीं है) के कारण कॉलम कभी भी हेडर से गलत नहीं बनेगा।
  • सभी लोकप्रिय डेस्कटॉप ब्राउज़रों के साथ संगत, जिसमें इंटरनेट एक्सप्लोरर वापस संस्करण 8 में शामिल है
  • स्वच्छ, पॉलिश उपस्थिति; कोई मैला-दिखने वाला 1-पिक्सेल गैप या मिसलिग्न बॉर्डर्स नहीं; सभी ब्राउज़रों में समान दिखता है

यहाँ कुछ युग्मक हैं जो द्रव और ऑटो चौड़ाई विकल्प दिखाते हैं:

  • द्रव चौड़ाई और ऊँचाई (स्क्रीन के आकार के अनुसार): jsFiddle (ध्यान दें कि स्क्रॉलबार केवल तभी दिखाई देता है जब इस कॉन्फ़िगरेशन में आवश्यक हो, इसलिए आपको इसे देखने के लिए फ़्रेम को सिकोड़ना पड़ सकता है)

  • ऑटो चौड़ाई, निश्चित ऊँचाई (अन्य सामग्री के साथ एकीकृत करने के लिए आसान): jsFiddle

ऑटो चौड़ाई, निश्चित ऊंचाई विन्यास में शायद अधिक उपयोग के मामले हैं, इसलिए मैं नीचे दिए गए कोड को पोस्ट करूंगा।

/* 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]-->

हेडर पंक्ति को फ्रीज करने के लिए मैंने जिस विधि का उपयोग किया है वह डी-पिक्सी के समान है, इसलिए स्पष्टीकरण के लिए उनके पद का संदर्भ लें। उस तकनीक के साथ कीड़े और सीमाएं थीं, जो केवल अतिरिक्त सीएसएस और एक अतिरिक्त डिव कंटेनर या दो के ढेर के साथ तय की जा सकती थीं।


यह जवाब हतोत्साहित तरीका है! मैंने अपने विशेष रूप से कष्टप्रद मामले के लिए काम करने के लिए अन्य समाधान प्राप्त करने की कोशिश में दिन बिताए। उनमें से हर एक एक या दूसरे तरीके से गठबंधन करने में विफल रहा। यह आखिरकार यह किया! पहली बार में अधिक जटिल लगता है, लेकिन एक बार जब आप इसे लटका लेते हैं, तो बहुत बढ़िया। जब आप तरल पदार्थ की चौड़ाई का उपयोग नहीं कर रहे हैं, तो आप काफी सामान को अंत में हटा सकते हैं, इत्यादि
जस्टिन

1
@JustinSane आपको यह पसंद है! मुझे लगता है कि प्रशंसा की कमी इस तथ्य के कारण है कि यह मैक्सिमिलियन हिल्स के अद्भुत समाधान के साथ पृष्ठ साझा करता है । यदि आप JS के एक छोटे से बिट का उपयोग करने का विरोध नहीं कर रहे हैं, तो आपको निश्चित रूप से इसे देखना चाहिए।
डॉक्टरडॉस्ट्रक्टो

अरे, यह वास्तव में एक लगभग सही समाधान है। मैं वैसे भी jQuery का उपयोग कर रहा था, इससे पहले कि मैंने तुम्हारा (किसी अन्य प्रश्न के लिए आपकी टिप्पणी के माध्यम से) काम कर लिया। स्क्रॉल-श्रोता और अनुवाद के बारे में नहीं सोच रहा था ... खैर, वे कहते हैं कि यह सरल समाधान के साथ आने के लिए एक प्रतिभा लेता है ..;) मैंने परियोजना को पूरा किया और यह पूरी तरह से js के बिना काम करता है, लेकिन मैं इसे अंदर रखूंगा भविष्य के लिए मन। फिर भी, भयानक होने के लिए आपसे घृणा करता है!
जस्टिन साने

एक छोटी सी समस्या लेकिन अगर आप अलग-अलग सिस्टम कलर्स का उपयोग कर रहे हैं तो आप देख सकते हैं कि हेडर के अलावा टेक्स्ट कलर किसी भी चीज़ के लिए सेट नहीं किया गया है लेकिन टेबल बैकग्राउंड में स्पष्ट बैकग्राउंड कलर है। मेरे पास इस तालिका के लिए एक सफेद और ग्रे पृष्ठभूमि पर पीला पाठ है।
मैट अर्नाल्ड

1
@MattArnold फिक्स्ड। टिप के लिए Thx!
डॉक्टरडिस्ट्रक्टो

5

एक साधारण jQuery प्लगइन

यह महेस के समाधान पर एक बदलाव है। आप इसे पसंद कर सकते हैं$('table#foo').scrollableTable();

विचार यह है:

  • विभाजित करें theadऔर tbodyअलग-अलग tableतत्वों में
  • उनकी सेल चौड़ाई फिर से मैच करें
  • दूसरे tableको एक में लपेटेंdiv.scrollable
  • div.scrollableवास्तव में स्क्रॉल करने के लिए CSS का उपयोग करें

सीएसएस हो सकता है:

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

चेतावनियां

  • जाहिर है, इन तालिकाओं को विभाजित करने से मार्कअप कम अर्थपूर्ण हो जाता है। मुझे यकीन नहीं है कि एक्सेसिबिलिटी पर इसका क्या प्रभाव पड़ता है।
  • यह प्लगइन पाद लेख, कई हेडर आदि के साथ व्यवहार नहीं करता है।
  • मैंने इसे केवल क्रोम संस्करण 20 में परीक्षण किया है।

उस ने कहा, यह मेरे उद्देश्यों के लिए काम करता है और आप इसे लेने और संशोधित करने के लिए स्वतंत्र हैं।

यहाँ प्लगइन है:

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
अच्छी स्क्रिप्ट, इस एक ने मेरे वातावरण में सबसे अच्छा काम किया। मैंने आपकी स्क्रिप्ट को निश्चित पाद लेख समर्थन के साथ विस्तारित किया, नीचे मेरी पोस्ट देखें।
१२:०२ पर गीताकार

4

:)

साफ-सुथरा नहीं, लेकिन शुद्ध HTML / CSS समाधान।

table {
    overflow-x:scroll;
}

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

IE8 + JSFiddle उदाहरण के लिए अपडेट किया गया


2
अच्छा समाधान, केवल यह उल्लेख करने के लिए, कि ये कोशिकाएँ तैर रही हैं और इसलिए सामग्री के अनुसार एक अलग ऊँचाई हो सकती है, यह दिखाई देता है यदि आप उन्हें सीमाएँ निर्धारित करते हैं: jsfiddle.net/ZdeEH/15
स्टेनो

3

निश्चित पाद लेख के लिए समर्थन

मैंने एक निश्चित पाद लेख और अधिकतम ऊंचाई का समर्थन करने के लिए नाथन के कार्य को बढ़ाया। साथ ही, फ़ंक्शन सीएसएस को स्वयं सेट करेगा, और आपको केवल एक चौड़ाई का समर्थन करना होगा।

उपयोग:

निश्चित ऊंचाई:

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

अधिकतम ऊंचाई (यदि ब्राउज़र सीएसएस 'अधिकतम ऊंचाई' विकल्प का समर्थन करता है):

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

स्क्रिप्ट:

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

किसी तरह मैं Position:Stickyअपने मामले पर ठीक काम कर रहा था:

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
यह अब तक का सबसे साफ समाधान है। कैनिअस दर्शाता है कि 5/2/2020 के रूप में, उपसर्ग की स्थिति: चिपचिपा को 90.06% वैश्विक समर्थन प्राप्त है। तो यह समाधान सभी आधुनिक ब्राउज़रों में अच्छी तरह से काम करता है।
एलियनकेविन

2

दो divs, एक शीर्ष लेख के लिए, एक डेटा के लिए। डेटा को स्क्रॉल करने योग्य बनाएं, और हेडर में कॉलम की चौड़ाई सेट करने के लिए जावास्क्रिप्ट का उपयोग करें डेटा में चौड़ाई के समान हो। मुझे लगता है कि डेटा कॉलम की चौड़ाई को गतिशील के बजाय ठीक करने की आवश्यकता है।


3
यदि आप पहुंच की परवाह करते हैं, तो यह विफल है।
epascarello

1
पहुँच क्षमता, शायद हम <thead> और <tbody> पर स्टाइल के साथ divs के उपयोग को बदल सकते हैं ??
Cheekysoft

1

मुझे पता है कि सवाल जावास्क्रिप्ट की अनुमति देता है, लेकिन यहां एक शुद्ध सीएसएस समाधान है जो मैंने काम किया है जो तालिका को क्षैतिज रूप से विस्तारित करने की अनुमति देता है। यह इंटरनेट एक्सप्लोरर 10 और नवीनतम क्रोम और फ़ायरफ़ॉक्स ब्राउज़रों के साथ परीक्षण किया गया था। JsFiddle का लिंक सबसे नीचे है।

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>

और सीएसएस:

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

उन लोगों के लिए जिन्होंने मैक्सिमिलियन हिल्स द्वारा दिए गए अच्छे समाधान की कोशिश की, और इंटरनेट एक्सप्लोरर के साथ काम करने में सफल नहीं हुए, मुझे वही समस्या थी (इंटरनेट एक्सप्लोरर 11) और पता चला कि समस्या क्या थी।

इंटरनेट एक्सप्लोरर 11 में शैली रूपांतरण (कम से कम अनुवाद के साथ) काम नहीं करता है <THEAD>। मैंने <TH>लूप में सभी को स्टाइल लागू करने के बजाय इसे हल किया । वह काम किया। मेरा जावास्क्रिप्ट कोड इस तरह दिखता है:

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;
  }
});

मेरे मामले में तालिका ASP.NET में एक ग्रिड व्यू थी। पहले मुझे लगा कि यह नहीं है क्योंकि यह नहीं था <THEAD>, लेकिन जब मैंने इसे एक होने के लिए मजबूर किया, तब भी यह काम नहीं किया। फिर मुझे पता चला कि मैंने ऊपर क्या लिखा है।

यह बहुत अच्छा और सरल उपाय है। क्रोम पर यह सही है, फ़ायरफ़ॉक्स पर थोड़ा झटकेदार, और इंटरनेट एक्सप्लोरर पर और भी अधिक झटकेदार। लेकिन सभी एक अच्छा समाधान में।


0

काश, मुझे पहले भी मार्क का हल मिल जाता, लेकिन मैंने इस SO प्रश्न को देखने से पहले अपना खुद का लिखा और लिखा ...

मेरा एक बहुत हल्का jQuery प्लगइन है, जो स्क्रॉलिंग शुरू होने से पहले प्रदर्शित करने के लिए फिक्स्ड हेडर, फुटर, कॉलम स्पैनिंग (कोलस्पैन), आकार, क्षैतिज स्क्रॉलिंग और वैकल्पिक पंक्तियों का समर्थन करता है।

jQuery.scrollTableBody (GitHub)

जब तक आप के साथ एक मेज है के रूप में उचित <thead>, <tbody>और (वैकल्पिक) <tfoot>, तुम सब करने की जरूरत है यह है:

$('table').scrollTableBody();

0

मुझे यह वर्कअराउंड मिला - डेटा के साथ तालिका के ऊपर तालिका में हेडर पंक्ति ले जाएँ:

<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>


छोटे तालिकाओं के लिए काम करता है, लेकिन अगर आपके पास क्षैतिज स्क्रॉलिंग है तो यह समाधान काम नहीं करेगा।
crh225

यह भी ठीक से काम नहीं करेगा क्योंकि टेबल कॉलम संरेखित नहीं करेगा। यहाँ आप td के लिए चौड़ाई मजबूर कर रहे हैं, लेकिन हमें ऐसा नहीं करना चाहिए ...
Ziggler

0

StickyTableHeaders jQuery प्लगइन को टेबल पर लगाने से , कॉलम हेडर नीचे स्क्रॉल करते ही व्यूपोर्ट के शीर्ष पर चिपक जाएगा।

उदाहरण:

$(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

मुझे मैक्सिमिलियन हिल्स का जवाब पसंद है लेकिन मेरे पास कुछ मुद्दे थे:

  1. रूपांतरण एज या IE में तब तक काम नहीं करता है जब तक आप इसे वें पर लागू नहीं करते हैं
  2. एज और IE में स्क्रॉलिंग के दौरान हेडर फ्लिकर करता है
  3. मेरी तालिका को अजाक्स का उपयोग करके लोड किया गया है, इसलिए मैं आवरण के स्क्रॉल घटना के बजाय विंडो स्क्रॉल घटना में संलग्न करना चाहता था

झिलमिलाहट से छुटकारा पाने के लिए, मैं प्रतीक्षा करने के लिए एक समयसीमा का उपयोग करता हूं जब तक कि उपयोगकर्ता ने स्क्रॉलिंग समाप्त नहीं कर दी हो, तब मैं ट्रांसफॉर्मेशन लागू करता हूं - इसलिए स्क्रॉलिंग के दौरान हेडर दिखाई नहीं देता है।

मैंने इसे jQuery का उपयोग करके भी लिखा है, इसका एक फायदा यह है कि jQuery को आपके लिए विक्रेता-उपसर्गों को संभालना चाहिए

    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);

तालिका को कक्षा के साथ एक div में लपेटा गया है table-container-fixed

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

मैंने सीमा-पतन को अलग करने के लिए सेट किया क्योंकि अन्यथा हम अनुवाद के दौरान सीमाओं को खो देते हैं, और मैं मेज पर सीमा को हटा देता हूं ताकि सेल के ऊपर दिखाई देने वाली सामग्री को रोका जा सके जहां सीमा स्क्रॉल के दौरान थी।

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

मैं thपृष्ठभूमि को नीचे की कोशिकाओं को कवर करने के लिए सफेद बनाता हूं , और मैं एक सीमा जोड़ता हूं जो टेबल बॉर्डर से मेल खाता है - जिसे बूटस्ट्रैप का उपयोग करके स्टाइल किया गया है और दृश्य से बाहर स्क्रॉल किया गया है।

 .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 के नवीनतम संस्करण का उपयोग करें, और निम्न जावास्क्रिप्ट कोड शामिल करें।

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

1
यह काम नहीं लगता है। शायद आप स्पष्ट कर सकते हैं कि आप हमसे क्या चाहते हैं?
क्रिस

1
क्या div? हम यहाँ तालिकाओं के बारे में बात कर रहे हैं
isapir

0

यह निश्चित हेडर पंक्ति के लिए एक सटीक समाधान नहीं है, लेकिन मैंने लंबे टेबल के दौरान हेडर पंक्ति को दोहराने के बजाय एक सरल तरीका बनाया है, फिर भी अभी भी सॉर्ट करने की क्षमता रखता है।

यह छोटा सा विकल्प jQuery tablesorterप्लगइन की आवश्यकता है । यहां देखिए यह कैसे काम करता है:

एचटीएमएल

<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>

जाहिर है, मेरी तालिका में इससे कई अधिक पंक्तियाँ हैं। 193 सटीक होने के लिए, लेकिन आप देख सकते हैं कि हेडर पंक्ति कहां दोहराती है। इस फ़ंक्शन द्वारा रिपीटिंग हेडर पंक्ति की स्थापना की जाती है:

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

बहुत सारे लोग इस जवाब की तलाश में लग रहे हैं। मैंने इसे एक अन्य प्रश्न के उत्तर में दफन पाया: दो अलग-अलग फ्रेमों में तालिकाओं के बीच कॉलम की चौड़ाई को सिंक करना, आदि

मैंने जिन दर्जनों तरीकों की कोशिश की है, उनमें से यह एकमात्र तरीका है जो मैंने पाया कि हेडली टेबल के साथ स्क्रॉलिंग टेबल के समान चौड़ाई के साथ आपको अनुमति देने के लिए मज़बूती से काम करता है।

यहाँ है कि मैंने इसे कैसे किया, पहले मैंने इस फ़ंक्शन को बनाने के लिए ऊपर दिए गए jsfiddle पर सुधार किया, जो दोनों पर काम करता है tdऔर th(यदि thवे उन शीर्ष लेखों की यात्रा करते हैं जो अपनी हेडर पंक्तियों की स्टाइलिंग के लिए उपयोग करते हैं)।

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());
            });
        }

इसके बाद, आपको दो तालिकाएँ बनाने की आवश्यकता है, नोट करें कि शीर्ष लेख तालिका TDमें स्क्रॉलबार के लिए शीर्ष तालिका में एक अतिरिक्त कमरा होना चाहिए , जैसे:

 <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>

फिर कुछ ऐसा करें:

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

यह एकमात्र समाधान है जो मैंने स्टैक ओवरफ्लो पर पाया है जो कि पोस्ट किए गए कई समान प्रश्नों में से काम करता है, जो मेरे सभी मामलों में काम करता है।

उदाहरण के लिए, मैंने jQuery के स्टिकिटैबल्स प्लगइन की कोशिश की, जो ड्यूरंडल के साथ काम नहीं करता है, और यहां Google कोड प्रोजेक्ट https://code.google.com/p/js-scroll-table-header/issues/detail?id=2

तालिकाओं की क्लोनिंग से जुड़े अन्य समाधान, खराब प्रदर्शन, या चूसना और सभी मामलों में काम नहीं करते हैं।

इन अत्यधिक जटिल समाधानों की कोई आवश्यकता नहीं है। बस नीचे दिए गए उदाहरणों की तरह दो टेबल बनाएं और सेटहेडटेबलटेबिडथ फ़ंक्शन को कॉल करें जैसे कि यहां वर्णित है और बूम, आप कर रहे हैं

यदि यह आपके लिए काम नहीं करता है, तो आप शायद अपने सीएसएस बॉक्स-आकार की संपत्ति के साथ खेल रहे थे और आपको इसे सही तरीके से सेट करने की आवश्यकता है। दुर्घटना से आपकी सीएसएस सामग्री को पेंच करना आसान है। ऐसी कई चीजें हैं जो गलत हो सकती हैं, इसलिए बस उसके बारे में जागरूक / सावधान रहें। यह दृष्टिकोण मेरे लिए काम करता है


0

यहां एक समाधान है जिसे हमने काम करना समाप्त कर दिया है (कुछ एज मामलों और इंटरनेट एक्सप्लोरर के पुराने संस्करणों से निपटने के लिए, हमने अंततः स्क्रॉल पर शीर्षक पट्टी को फीका कर दिया, फिर स्क्रॉलिंग समाप्त होने पर इसे वापस फीका कर दिया, लेकिन फ़ायरफ़ॉक्स और वेबकीट ब्राउज़र में यह समाधान बस काम करता है । यह सीमा-पतन: पतन को मानता है।

इस समाधान के लिए महत्वपूर्ण है कि एक बार आप लागू है सीमा-पतन , सीएसएस रूपांतरण , हैडर पर काम तो यह सिर्फ स्क्रॉल ईवेंट में अवरोध डालने और सही ढंग से बदलने की स्थापना की बात है। आपको कुछ भी डुप्लिकेट करने की आवश्यकता नहीं है। ब्राउज़र में इस व्यवहार को ठीक से लागू करने के बाद, अधिक हल्के वजन वाले समाधान की कल्पना करना कठिन है।

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

यह एक साधारण jQuery प्लगइन के रूप में लागू किया गया है। आप बस $ ('thead') जैसे कॉल के साथ अपने थ्रेड का स्टिकी बनाते हैं। स्टिकी (), और वे चारों ओर लटकेंगे। यह एक पेज पर कई टेबल के लिए काम करता है और हेड सेक्शन बड़े टेबल से आधा नीचे।

$.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();

अच्छा समाधान लेकिन आप कॉलम के बीच कॉलम सीमाएं कैसे तय करते हैं (दोनों निश्चित हेडर में, td डेटा के साथ संरेखित)?
user5249203

मुझे यकीन नहीं है कि मैं आपकी समस्या को समझता हूं। बॉर्डर-पतन आपको सीमाओं, मार्जिन आदि का उपयोग करने से नहीं रोकता है, यह सिर्फ योरो के वूडू टेबल मैट्रिक्स को हटाता है।
पॉडपर्सन

1
जोड़े border: 2px solid red;को th, स्क्रॉल, और आप समस्या देखेंगे। मैं खुद इस अधिक बुनियादी समाधान के साथ आया: jsfiddle.net/x6pLcor9/19
calandoa

Td में समान आयाम वाली सीमा जोड़ें और कोई समस्या नहीं है। मैं आपकी बात नहीं देखता। आपका संस्करण बहुत साफ-सुथरा है और jQuery का उपयोग नहीं करता है, इसलिए मैं निश्चित रूप से आज की तरह कुछ और के साथ जाना होगा। (हालांकि, स्पष्ट रूप से, मुझे नहीं लगता कि मैं आज एक तालिका का उपयोग
करूंगा

0

यहाँ मैक्सिमिलियन हिल्स द्वारा पोस्ट किए गए एक बेहतर जवाब है ।

यह इंटरनेट एक्सप्लोरर 11 में काम करता है जिसमें कोई टिमटिमाता नहीं है:

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

मैंने एक अच्छी लाइट-स्वरूपित jQuery प्लग-इन को एक अच्छी तरह से स्वरूपित HTML तालिका को एक निश्चित तालिका शीर्ष लेख और स्तंभों के साथ स्क्रॉल करने योग्य तालिका में परिवर्तित करने के लिए विकसित किया है।

प्लग-इन-पिक्सेल को स्क्रॉल करने योग्य सेक्शन के साथ तय सेक्शन से मिलान करने के लिए प्लगइन अच्छी तरह से काम करता है। इसके अतिरिक्त, आप क्षैतिज रूप से स्क्रॉल करते समय हमेशा देखने वाले कॉलम की संख्या को भी फ्रीज कर सकते हैं।

डेमो और प्रलेखन: http://meetselva.github.io/fixed-table-rows-cols/

गिटहब भंडार: https://github.com/meetselva/fixed-table-rows-cols

नीचे एक निश्चित शीर्ष लेख के साथ एक साधारण तालिका के लिए उपयोग है,

$(<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'}
              ]
});

क्या है "एक अच्छी तरह से HTML तालिका" ?
पीटर मोर्टेंसन

@PeterMortensen को "अच्छी तरह से स्वरूपित HTML" होना चाहिए था। संपादित, धन्यवाद।
सेल्वकुमार अरुमुगम

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

@ डैनियल वालट्रिप के जवाब के लिए अतिरिक्त। तालिका के साथ position: relativeकाम करने के लिए डिव के साथ संलग्न करने की आवश्यकता है position:sticky। इसलिए मैं यहां अपना नमूना कोड पोस्ट करना चाहूंगा।

सीएसएस

/* 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>
<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>

डेमो

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.