100% चौड़ाई के साथ HTML तालिका, tbody के अंदर ऊर्ध्वाधर स्क्रॉल के साथ


423

मैं <table>100% चौड़ाई के लिए कैसे सेट कर सकता हूं और <tbody>कुछ ऊंचाई के लिए केवल ऊर्ध्वाधर स्क्रॉल के अंदर रख सकता हूं ?

tbody के अंदर वर्टिकल स्क्रॉल

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

मैं कुछ अतिरिक्त div को जोड़ने से बचना चाहता हूं, मैं चाहता हूं कि इस तरह से सरल तालिका हो और जब मैं प्रदर्शन बदलने की कोशिश कर रहा हूं table-layout, positionऔर सीएसएस तालिका में बहुत अधिक चीजें केवल पीएक्स में निश्चित चौड़ाई के साथ 100% चौड़ाई के साथ अच्छा काम नहीं कर रही हैं।


im वास्तव में सुनिश्चित नहीं है कि आप क्या हासिल करना चाहते हैं। इसे देखें: jsfiddle.net/CrSpu और बताएं कि आप इसे कैसे व्यवहार करना चाहते हैं
x4rf41

2
मुझे पता है लेकिन देखो .. वें और td को पूरी चौड़ाई नहीं दिखाई गई है .. postimg.org/image/mgd630y61
Marko S


जवाबों:


674

<tbody>तत्व को स्क्रॉल करने योग्य बनाने के लिए , हमें पृष्ठ पर प्रदर्शित होने वाले तरीके को बदलने की आवश्यकता है अर्थात display: block;ब्लॉक स्तर के तत्व के रूप में प्रदर्शित करने के लिए।

चूंकि हम displayसंपत्ति को बदलते हैं tbody, इसलिए हमें theadतालिका लेआउट को तोड़ने से रोकने के लिए उस संपत्ति को भी बदलना चाहिए ।

तो हमारे पास:

thead, tbody { display: block; }

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

वेब ब्राउज़र को प्रदर्शित theadऔर tbodyजैसे तत्वों पंक्ति-समूह ( table-header-groupऔर table-row-group) डिफ़ॉल्ट रूप से।

एक बार जब हम इसे बदल देते हैं, तो अंदर के trतत्व अपने कंटेनर के पूरे स्थान को नहीं भरते हैं।

इसे ठीक करने के लिए, हमें tbodyस्तंभों की चौड़ाई की गणना करनी होगी और theadकॉलम के लिए जावास्क्रिप्ट के माध्यम से संबंधित मूल्य को लागू करना होगा।

ऑटो चौड़ाई कॉलम

यहाँ उपरोक्त तर्क का jQuery संस्करण है:

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

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

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

और यहाँ आउटपुट है (विंडोज 7 क्रोम 32 पर) :

tbody के अंदर वर्टिकल स्क्रॉल

काम कर रहा डेमो

पूर्ण चौड़ाई तालिका, सापेक्ष चौड़ाई कॉलम

जैसा कि मूल पोस्टर की जरूरत है, हम इसके कंटेनर के table100% तक विस्तार कर सकते हैं width, और फिर तालिका के प्रत्येक कॉलम के लिए एक रिश्तेदार ( प्रतिशत ) का उपयोग कर सकते हैं width

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

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

चूंकि तालिका में एक (प्रकार) द्रव लेआउट है , इसलिए हमें theadकंटेनर के आकार के अनुसार कॉलम की चौड़ाई को समायोजित करना चाहिए ।

इसलिए हमें विंडो के आकार बदलने के बाद कॉलम की चौड़ाई निर्धारित करनी चाहिए:

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

उत्पादन होगा:

टो के अंदर ऊर्ध्वाधर स्क्रॉल के साथ द्रव तालिका

काम कर रहा डेमो


ब्राउज़र समर्थन और विकल्प

मैंने प्रमुख वेब ब्राउजर (IE10 + सहित) के नए संस्करणों के माध्यम से विंडोज 7 पर दो उपरोक्त तरीकों का परीक्षण किया है और यह काम किया है।

हालाँकि, यह IE9 और उसके नीचे ठीक से काम नहीं करता है

ऐसा इसलिए है क्योंकि एक तालिका लेआउट में , सभी तत्वों को समान संरचनात्मक गुणों का पालन करना चाहिए।

का उपयोग करके display: block;के लिए <thead>और <tbody>तत्वों, हम तालिका संरचना टूट गए हैं।

जावास्क्रिप्ट के माध्यम से नया स्वरूप

एक दृष्टिकोण (संपूर्ण) तालिका लेआउट को फिर से डिज़ाइन करना है। मक्खी और हैंडल पर एक नया लेआउट बनाने और / या कोशिकाओं की चौड़ाई / ऊंचाइयों को गतिशील रूप से समायोजित करने के लिए जावास्क्रिप्ट का उपयोग करना।

उदाहरण के लिए, निम्नलिखित उदाहरणों पर एक नज़र डालें:

घोंसले के शिकार टेबल

यह दृष्टिकोण एक युक्त div के साथ दो नेस्टेड तालिकाओं का उपयोग करता है। पहली tableमें केवल एक कक्ष होता है जिसमें एक होता है div, और दूसरी तालिका उस divतत्व के अंदर रखी जाती है ।

CSS Play पर वर्टिकल स्क्रॉलिंग टेबल की जाँच करें ।

यह अधिकांश वेब ब्राउज़र पर काम करता है। हम उपरोक्त तर्क को जावास्क्रिप्ट के माध्यम से गतिशील रूप से भी कर सकते हैं।

स्क्रॉल पर निश्चित हेडर के साथ तालिका

ऊर्ध्वाधर स्क्रॉल पट्टी को जोड़ने के उद्देश्य से जब से <tbody>तालिका प्रदर्शित कर रहा है हैडर प्रत्येक पंक्ति के शीर्ष पर, हम कर सकता है स्थितिthead रहने के लिए तत्व fixedके बजाय स्क्रीन के शीर्ष पर।

यहाँ जूलियन द्वारा निष्पादित इस दृष्टिकोण का एक कार्यशील डेमो है । इसमें एक आशाजनक वेब ब्राउज़र समर्थन है।

और यहां विलेम वैन बॉकस्टल द्वारा एक शुद्ध सीएसएस कार्यान्वयन ।


शुद्ध सीएसएस समाधान

यहाँ पुराना जवाब है। बेशक मैंने एक नई विधि जोड़ी है और सीएसएस घोषणाओं को परिष्कृत किया है।

निश्चित चौड़ाई वाली तालिका

इस मामले में, tableएक निश्चित होना चाहिए width (स्तंभों की चौड़ाई का योग और ऊर्ध्वाधर स्क्रॉल-बार की चौड़ाई सहित)

प्रत्येक स्तंभ की एक विशिष्ट चौड़ाई होनी चाहिए और तत्व के अंतिम स्तंभ को theadअधिक से अधिक चौड़ाई की आवश्यकता होती है जो दूसरों की चौड़ाई + ऊर्ध्वाधर स्क्रॉल-बार की चौड़ाई के बराबर होती है ।

इसलिए, सीएसएस होगा:

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

tbody, thead tr { display: block; }

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

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

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

यहाँ उत्पादन है:

निश्चित चौड़ाई वाली तालिका

काम कर रहा डेमो

100% चौड़ाई वाली तालिका

इस दृष्टिकोण में, की tableचौड़ाई है 100%और प्रत्येक के लिए thऔर td, widthसंपत्ति का मूल्य इससे कम होना चाहिए 100% / number of cols

इसके अलावा, हम कम करने की जरूरत चौड़ाई के theadके मूल्य के रूप में चौड़ाई ऊर्ध्वाधर स्क्रॉल पट्टी के।

ऐसा करने के लिए, हमें CSS3 calc()फ़ंक्शन का उपयोग करने की आवश्यकता है , इस प्रकार है:

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

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

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

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

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

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

यहाँ ऑनलाइन डेमो है

नोट: यह दृष्टिकोण विफल हो जाएगा यदि प्रत्येक कॉलम की सामग्री लाइन को तोड़ती है, अर्थात प्रत्येक सेल की सामग्री पर्याप्त रूप से कम होनी चाहिए


निम्नलिखित में, शुद्ध सीएसएस समाधान के दो सरल उदाहरण हैं जो मैंने उस समय बनाया था जब मैंने इस प्रश्न का उत्तर दिया था।

यहाँ jsField Demo v2 है

पुराना संस्करण: jsFiddle डेमो v1


17
display: blockथ्रेड और tbody के बीच साझा किए गए स्तंभ की चौड़ाई के रूप में आपके साथ ढीली तालिका के गुण। मुझे पता है कि आपने इसे निर्धारित कर लिया है, width: 19.2%लेकिन अगर हम पहले से प्रत्येक कॉलम की चौड़ाई नहीं जानते हैं, तो यह काम नहीं करेगा।
साम्ब

10
यह कोड लगता है कि शरीर की कोशिकाएं हमेशा हेडर कोशिकाओं की तुलना में व्यापक होंगी।
एडम डोनाह्यू

2
काम नहीं कर रहा है जब height: 100%(जब आप तालिका को पृष्ठ के निचले भाग तक विस्तारित करना चाहते हैं)।
AlikElzin-kilaka

2
यह भी AngularJS ng-repeatतालिकाओं के साथ काल्पनिक रूप से काम करता है । निश्चित नहीं है कि फिक्स्ड टेबल हेडर के साथ वे सभी पुस्तकालय क्यों हैं और जब यह समाधान नहीं है तो क्या होगा।
चक्र

2
आप box-sizingसंपत्ति के साथ इसे थोड़ा और बेहतर कर सकते हैं ताकि दो अलग-अलग मोटाई की सीमाएं कॉलम संरेखण से दूर न हों।
रिक्का

89

निम्नलिखित समाधान में, तालिका 100% मूल कंटेनर में रहती है, किसी भी पूर्ण आकार की आवश्यकता नहीं होती है। यह शुद्ध सीएसएस है, फ्लेक्स लेआउट का उपयोग किया जाता है।

यहाँ है कि यह कैसा दिखता है: यहां छवि विवरण दर्ज करें

संभावित नुकसान:

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

HTML (छोटा):

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

सीएसएस, कुछ सजावट स्पष्टता के लिए छोड़ दिया:

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

jsfiddle पर पूर्ण कोड

LESS में समान कोड ताकि आप इसे इसमें मिला सकें:

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

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

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

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

    tr {
      width: 100%;
    }
  }
}

2
समाधान के लिए धन्यवाद! एक मामूली बग था .... आपने दो बार थ्रेड के लिए चौड़ाई निर्धारित की, और मैंने पाया कि चौड़ाई से 1.05em को थोड़ा बेहतर तरीके से घटाया गया है: jsfiddle.net/xuvsncr2/170
TigerBear

1
चरित्र की सामग्री संख्या के बारे में क्या? डी रो सेल के अंदर अधिक वर्ण या शब्द जोड़ने पर यह गड़बड़ हो जाती है
Limon

मुझे लगता है कि कुछ उपयुक्त रैपिंग नीति को स्थापित करने में tdमदद करनी चाहिए
tsayen

इस तरह से कोई समाधान लेकिन 100% चौड़ाई की आवश्यकता को छोड़ने?
एलेक्जेंडर पेरेरा नून्स

2
@tsayen जब आप विंडो का आकार बदलते हैं, तो आप इसे बंद करने और ओवरलैप करने से कैसे रोकते हैं?
20

31

आधुनिक ब्राउज़रों में, आप बस सीएसएस का उपयोग कर सकते हैं:

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

8
यह झुकाव अधूरा है ... एक उदाहरण पोस्ट करने के लिए देखभाल, या कम से कम विस्तृत?
लियाम

अच्छा काम कर रहा है, लेकिन केवल वें पर लागू होता है। अगर हम थ्रेड पर स्थिति को चिपचिपा सेट करते हैं तो यह काम नहीं करता है।
विशाल

फिक्स्ड थ्रेड W3C को जोड़ना चाहिए!
सनीचरी

2
यह उत्तर तब काम करता है जब आप अपने <table>को लपेटते हैं <div>जिसके पास overflow-y: auto;कुछ होता है max-height। उदाहरण के लिए:<div style="overflow-y: auto; max-height: 400px;"><table>...</table></div>
8

2020 तक, यह चयनित उत्तर होगा (@Minwork के अपडेट के साथ)
क्रिस्टोफ विडाल

18

और के display:blockलिए उपयोग कर रहा हूँtheadtbody । उसके कारण theadस्तंभों की चौड़ाई tbodyस्तंभों की चौड़ाई से भिन्न होती है ।

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

इसे ठीक करने के लिए मैं छोटा प्रयोग करता हूं jQuery कोड का लेकिन यह JavaScriptकेवल किया जा सकता है ।

var colNumber=3 //number of table columns    

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

यहाँ मेरा काम करने वाला डेमो है: http://jsfiddle.net/gavroche/N7LEF/

IE 8 में काम नहीं करता है


यह मैंने पाया सबसे अच्छा / सरल समाधान है जो गैर-निश्चित कॉलम चौड़ाई (जैसे .NET डेटाग्रिड नियंत्रण) के लिए अनुमति देता है। "उत्पादन" के लिए, colNumberचर को कोड द्वारा प्रतिस्थापित किया जा सकता है जो इसके बजाय पाए गए वास्तविक कोशिकाओं के माध्यम से पुनरावृत्ति करता है, और ध्यान दें कि यह सही ढंग से सामना नहीं करता है यदि कोई colspanएस हैं (कोड में भी सुधार किया जा सकता है, यदि आवश्यक हो, लेकिन इस तरह की संभावना नहीं है टेबल स्क्रॉलिंग सुविधा चाहते हैं)।
जॉनब्र्वे

यह काम करता है (एक फैशन में), लेकिन सामना नहीं करता है जब खिड़की का आकार तालिका से छोटा होता है (क्योंकि यह स्क्रॉलबार की चौड़ाई को अनदेखा करता है)।
कोडिंग किया

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

यहाँ सबसे अच्छा जवाब, सबसे सरल भी
चार्ल्स ओक्वागुवू

18

सीएसएस-केवल

के लिए क्रोम, फायरफॉक्स, एज (और अन्य सदाबहार ब्राउज़र)

बस position: sticky; top: 0;अपने thतत्वों:

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

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

पुनश्च: यदि आपको TH तत्वों के लिए सीमाओं की आवश्यकता हैth {box-shadow: 1px 1px 0 #000; border-top: 0;} (चूंकि डिफ़ॉल्ट सीमाएं स्क्रॉल पर सही ढंग से चित्रित नहीं हैं)।

IE11 के लिए समायोजित करने के लिए जेएस के एक बिट का उपयोग करने वाले उपरोक्त संस्करण के लिए यह उत्तर देखें https://stackoverflow.com/a/47923622/383904


यदि आपके पास "बॉर्डर-पतन: पतन" का उपयोग करते हुए वें तत्वों की सीमाएँ हैं, तो हेडर के बजाय बॉडी से बॉर्डर चिपक जाएगा। इस समस्या से बचने के लिए आपको "सीमा-पतन: अलग" का उपयोग करना चाहिए। देखें stackoverflow.com/a/53559396
mrod

@ का उपयोग करते समय separateआप आग में तेल जोड़ रहे हैं। jsfiddle.net/RokoCB/o0zL4xyw और यहां एक समाधान देखें : तय सीमा में सीमाएँ जोड़ें - अगर मैं कुछ चूक गया तो मैं OFC के सुझावों का स्वागत करता हूँ।
रोको सी। बुल्जन

11

एक के बाद एक दो टेबल बनाएं, दूसरी टेबल को निर्धारित ऊंचाई के एक हिस्से में रखें और ऑटो को ओवरफ्लो संपत्ति सेट करें। इसके अलावा टीडी के अंदर के सभी थ्रेड को दूसरी टेबल में खाली रखें।

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

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

8
इस स्थिति में, दूसरे तालिका स्तंभ पहली तालिका की चौड़ाई का पालन नहीं कर सकते हैं।
kat1330

2
अच्छा नही! आप दो तालिकाओं पर स्तंभों के लिए चौड़ाई सिंक्रनाइज़ेशन खो देते हैं।
जफर

1
इस समाधान को पूरा करने के लिए हमें हेडर कॉलम की चौड़ाई को जोड़ने के लिए @Hashem Qolami स्क्रिप्ट ( ऊपर वर्णित ) को जोड़ना होगा
Elhay Avichzer

6

मैं इन निर्देशों का पालन करके शुद्ध सीएसएस के साथ अंत में सही हो गया:

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

पहला कदम <tbody>प्रदर्शन को सेट करना है: एक अतिप्रवाह को अवरुद्ध करें और ऊंचाई को लागू किया जा सकता है। वहां से पंक्तियों <thead>को स्थिति में सेट करने की आवश्यकता है: सापेक्ष और प्रदर्शन: ब्लॉक करें ताकि वे अब स्क्रॉल के शीर्ष पर बैठें <tbody>

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

क्योंकि <thead>अपेक्षाकृत प्रत्येक टेबल सेल को एक स्पष्ट चौड़ाई की आवश्यकता होती है

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

लेकिन दुर्भाग्य से यह पर्याप्त नहीं है। जब एक स्क्रॉलबार मौजूद <tbody>होता है , तो ब्राउज़र इसके लिए जगह आवंटित करते हैं, इसलिए, छोरों की तुलना में कम जगह उपलब्ध होती है <thead>। नोटिस थोड़ा misalignment यह बनाता है ...

एकमात्र समस्या यह है कि मैं आखिरी कॉलम को छोड़कर सभी कॉलमों पर न्यूनतम चौड़ाई निर्धारित कर सकता था।

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

नीचे पूरा कोड उदाहरण:

सीएसएस:

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

एचटीएमएल:

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

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

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

संपादित करें: तालिका चौड़ाई 100% के लिए वैकल्पिक समाधान (वास्तव में निश्चित चौड़ाई के लिए और प्रश्न का उत्तर नहीं दिया गया है):

HTML:

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

सीएसएस:

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

डेमो: http://codepen.io/anon/pen/bNJeLO


1
प्रश्न विशेष रूप से एक 100% चौड़ाई तालिका चाहता था, जो एक चीज है जिसका उदाहरण आपने संदर्भित किया है वह नहीं करता है।
कोडिंग किया

@TrueBlueAussie अच्छा पकड़: 100% चौड़ाई के लिए वैकल्पिक समाधान जोड़ा गया।
मिकेल लेपिस्टो

आप सेल पंक्ति सामग्री देशांतर पर विचार नहीं करते
Limon

2

कॉलम को 'ब्लॉक' tbody के साथ सही ढंग से प्रदर्शित करने के लिए मजबूर करने के लिए Css वर्कअराउंड

इस समाधान के लिए अभी भी thचौड़ाई की गणना और jQuery द्वारा निर्धारित की आवश्यकता है

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

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

table.scroll tr {
    display: flex;
}

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

और जक्वरी / जावास्क्रिप्ट

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

$table.addClass('scroll');

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

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

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

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

2019 में @ क्रेग, यह IE के बारे में परवाह नहीं करने के लिए पूरी तरह से ठीक है।
ऑटोमैगिस्क

2

दृष्टिकोण के नीचे की कोशिश करो, लागू करने के लिए बहुत आसान है

नीचे jsfiddle लिंक है

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

HTML:

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

सीएसएस:

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

jQuery:

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

2
यह समाधान तालिका की चौड़ाई की तुलना में खिड़की के संकीर्ण होने का सामना नहीं करता है। ऐसा होने पर क्षैतिज स्क्रॉलिंग को सक्षम करना चाहिए। इसके अलावा हेडिंग डेटा सेल (क्रोम) के साथ बिल्कुल संरेखित नहीं हैं।
कोडिंग

यह आजकल काम नहीं करता है
MrHIDEn

2

एक निश्चित चौड़ाई को जोड़ना , वें टीडी करने के बाद tbody और thead प्रदर्शन ब्लॉक पूरी तरह से काम करता है और हम भी उपयोग कर सकते हैं slimscroll प्लगइन स्क्रॉल पट्टी सुंदर बनाने के लिए।

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

<!DOCTYPE html>
<html>

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

<body>

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


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

</html>


1

यह वह कोड है जो मेरे लिए एक स्क्रॉल थ्रेड के साथ एक स्टिकी थ्रेड बनाने के लिए काम करता है:

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

1

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

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

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

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

सीएसएस:

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

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

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

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

td {
  padding: 3px 10px;
}

0

इस jsfiddle की कोशिश करो । यह jQuery का उपयोग कर रहा है और हशेम कोलोमी के उत्तर से बना है। सबसे पहले, एक नियमित तालिका बनाएं और फिर इसे स्क्रॉल करने योग्य बनाएं।

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

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

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

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

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

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