शुद्ध सीएसएस पर निश्चित हेडर और निश्चित कॉलम के साथ तालिका


100

मुझे एक निश्चित हेडर और एक निश्चित पहले कॉलम के साथ एक html तालिका (या कुछ समान दिखने वाली) बनाने की आवश्यकता है।

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

मुझे यहां एक निश्चित कॉलम के लिए एक समाधान मिला: jsfiddle.net/C8Dtf/20/ लेकिन मुझे नहीं पता कि मैं हेडर को भी ठीक करने के लिए इसे कैसे बढ़ा सकता हूं।

मैं चाहता हूं कि यह वेबकिट ब्राउज़र पर काम करे या कुछ css3सुविधाओं का उपयोग करे , लेकिन मैं दोहराता हूं, मैं Javascriptस्क्रॉल करने के लिए उपयोग नहीं करना चाहता ।

EDIT: यह उस व्यवहार का उदाहरण है जिसे मैं प्राप्त करना चाहता हूं: https://web.archive.org/web/20130829032141/http://datatables.net/release-datatables/extras/Fixed-olumns/css_size.html


मैं यह नहीं देख पाया कि <html> <table> फिक्स्ड हैडर के साथ <thead> को फिलहाल css-level-3 के साथ क्या करना है। और क्या है आपके पास ? अब तक तुमने क्या प्रयास किये हैं ?
मिल्के पैटर

मैंने positionपंक्तियों और कोशिकाओं के लिए जटिल व्यवहार को लागू करने की कोशिश की है , लेकिन मुझे यह समझ में नहीं आता है कि यह कहां से लागू है या नहीं।
panfil

2
यह उत्तर आपको stackoverflow.com/questions/14834198/…
गैरी

जवाबों:


146

एक निश्चित हेडर पंक्ति और पहले कॉलम के साथ एक वास्तविक शुद्ध सीएसएस समाधान

मुझे शुद्ध सीएसएस का उपयोग करते हुए एक निश्चित हेडर और एक निश्चित पहले कॉलम के साथ एक तालिका बनानी थी और यहाँ कोई भी उत्तर मुझे पसंद नहीं था।

position: stickyसंपत्ति शीर्ष करने के लिए दोनों चिपका का समर्थन करता है (जैसा कि मैंने देखा है यह सबसे अधिक इस्तेमाल किया) और क्रोम, फायरफॉक्स, और एज के आधुनिक संस्करणों में ओर करने के लिए। इसे आपके पास एक निश्चित तालिका के साथ एक तालिका देने के divलिए overflow: scrollसंपत्ति हो सकती है जिसे आपके पृष्ठ पर कहीं भी रखा जा सकता है:

एक कंटेनर में अपनी मेज रखें:

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

overflow: scrollस्क्रॉलिंग सक्षम करने के लिए अपने कंटेनर पर उपयोग करें :

div.container {
  overflow: scroll;
}

जैसा कि डागमार ने टिप्पणियों में बताया है, कंटेनर को भी ए max-widthऔर ए की आवश्यकता होती है max-height

का प्रयोग करें position: stickyतालिका सेल के लिए स्टिक और किनारे तक top, rightया leftकरने के लिए छड़ी करने के लिए जो बढ़त चुनने के लिए:

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

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

जैसा कि MarredCheese ने टिप्पणियों में उल्लेख किया है, यदि आपके पहले कॉलम में <td>तत्वों के बजाय <th>तत्व हैं, तो आप tbody td:first-childइसके बजाय अपने CSS में उपयोग कर सकते हैंtbody th

पहले कॉलम स्टिक में बाईं ओर हैडर का उपयोग करने के लिए:

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

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


22
यह सबसे अच्छा उत्तर लगता है।
user1190132

9
@PirateApp यदि आप widthअपने पहले कॉलम के बारे में जानते हैं , तो आप position: stickyअपने दूसरे कॉलम की कोशिकाओं पर leftअपने पहले कॉलम के बराबर मूल्य के साथ उपयोग कर सकते हैं width: jsfiddle.net/wvypo83c/794
मैथ्यू श्लेचर

4
यह जवाब साबित करता है कि यह नीचे तक सभी तरह से पढ़ने के लिए लायक है!
मार्लेली

4
यह कंटेनर पर सेट की गई अधिकतम-चौड़ाई और अधिकतम-ऊंचाई के बिना काम नहीं करता है।
डागमार

9
यह उत्तर एक प्रकाशस्तंभ है जो हमें खराबी के अंतहीन समुद्र के माध्यम से घर की ओर मार्गदर्शन करता है, अति-आश्चर्य की बात है, आश्चर्यजनक रूप से आत्मविश्वास से भरे हुए उत्तर, एसओ और वेब पर यहां-वहां पोस्ट-अपटेड पोस्टर। ध्यान दें कि यदि आपके पहले कॉलम में <td>तत्वों के बजाय <th>तत्व हैं, तो आप tbody td:first-childअपने सीएसएस में इसके बजाय उपयोग कर सकते हैं tbody th
18 मार्च को MarredCheese

33

आजकल, संपत्ति के साथ केवल सीएसएस का उपयोग करना संभव है ।position: sticky

यहाँ एक स्निपेट मिलता है:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  </div>
</div>

अनुकूलता के संबंध में। यह सभी प्रमुख ब्राउज़रों में काम करता है, लेकिन IE में नहीं। के लिए एक पॉलीफ़िल है, position: stickyलेकिन मैंने कभी इसकी कोशिश नहीं की।


2
यह बहुत अच्छा है, इसे प्यार करो!
कैप्टन लू

3
किसी भी तरह से इसे प्राप्त करने के लिए <table> -tags और <div>
Andreas

1
मुझे लगता है कि यदि आप किसी एप्लिकेशन को विकसित कर रहे हैं और इस तालिका को प्रिंट करने के लिए रिकॉर्ड के माध्यम से लूप करने की आवश्यकता नहीं है तो यह अच्छा प्रदर्शन नहीं होने वाला है क्योंकि तालिका के प्रत्येक कॉलम के लिए, आपको पूरे रिकॉर्ड के सरणी के माध्यम से लूप करना होगा। यह HTML कॉलम द्वारा कॉलम काम करता है।
इगैसपेर्टो

@igasparetto आप वास्तव में पंक्तियों / स्तंभों को दूसरे तरीके से व्यवस्थित कर सकते हैं और समाधान अभी भी काम करेगा। अगर मेरे पास कुछ समय बाद मैं ग्रिड ऑर्डर की गई पंक्ति -> कॉलम के साथ एक स्निपेट बना सकता हूं।
अल्वारो

2
मैं <तालिका> और संबंधित टैग का उपयोग किए बिना सारणीबद्ध डेटा प्रदर्शित करने के खिलाफ सलाह दूंगा। इस तरह से HTML के इच्छित उपयोग को तोड़ने के साथ कई मुद्दे हैं, जिसमें पहुंच-योग्यता भी शामिल है। इसे भी देखें: w3.org/WAI/tutorials/tables
बेन मोरिस 12

15

यह कोई आसान उपलब्धि नहीं है।

निम्नलिखित लिंक एक कार्यशील डेमो के लिए है:

लैनोक्स की टिप्पणी के अनुसार अपडेट किया गया लिंक

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

बस इन्हें जोड़ना याद रखें:

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

मैं इसे प्राप्त करने का कोई अन्य तरीका नहीं देखता। विशेष रूप से केवल सीएसएस का उपयोग करके नहीं।

इससे बहुत कुछ जाना है। उम्मीद है की यह मदद करेगा :)


फ़िल्टर के उपयोग पर स्विच करने के लिए: "bFilter": false
lanoxx

6
यह है केवल सीएसएस के साथ इस लक्ष्य को हासिल करने के लिए संभव। आसान नहीं है लेकिन संभव है।
जिम्मी टी।

लगभग 10 समाधानों में से यह एकमात्र ऐसा काम था। Btw, कॉल "bInfo" : falseमें जोड़ने के लिए "1 से 57 प्रविष्टियों में से 1 दिखा रहा है" हटाने के लिए.dataTable()
हंसपूल


इस समाधान को नीचा दिखाना क्योंकि यह खराब है। theadअपनी ही तालिका जिनमें से परिवर्तन करने के लिए बाध्य नहीं है में है tdतत्व है, इसलिए यदि एक सेल पाठ लंबा है, thचौड़ाई के हिसाब से समायोजित नहीं करेंगी।
vsync

14

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

यदि यह करना संभव था, तो आपको एक स्क्रॉल के साथ एक दूसरे के अंदर कई स्क्रॉल करने वाले divs को घोंसला बनाने की आवश्यकता होगी। फिर आपको अपनी तालिका को तीन भागों में विभाजित करने की आवश्यकता होगी - फिक्स्ड हेडर, फिक्स्ड कॉलम और बाकी डेटा।

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

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

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


9

मैंने jsfiddle में कुछ बदलाव किए हैं। यह वही हो सकता है जो आप करने की कोशिश कर रहे हैं।

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

मैंने जैसे शीर्षक को हार्डकोड किया है:

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

और मैंने कुछ शैलियों को भी जोड़ा।

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

आशा है कि आप यही चाहते हैं :)


1
मुझे इसकी सामग्री के साथ स्क्रॉल करने के लिए सही तालिका के शीर्षलेख की आवश्यकता है।
panfil

यहाँ URL: jsfiddle.net/C8Dtf/84 है । आपको बस दो टेबल को संरेखित करने के लिए दाईं ओर की तालिका के लिए स्टाइल के साथ खेलना होगा।
फिलिप-जुआन

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

तो चाहते हैं कि दाएं हाथ की टेबल का हेडर लंबवत स्क्रॉल करते समय तय किया जाए, और स्क्रॉल करते समय क्षैतिज रूप से स्क्रॉल किया जाए?
फिलिप-जुआन

यह उस व्यवहार का उदाहरण है जिसे मैं प्राप्त करना चाहता हूं: datatables.net/release-datatables/extras/FixedColumns/…
panfil

9

केवल CSS का उपयोग करके एक उदाहरण:

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

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

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

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

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

  <table class="table">

    <thead class="header">

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

    </thead>
  </table>

  <div class="body_panel">

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

      </tbody>
    </table>

  </div>

</body>


3
मुझे न केवल हेडर तय करने की जरूरत थी, बल्कि पहला कॉलम भी।
panfil

यह उदाहरण HTML में दो तालिकाओं के साथ एक दृष्टिकोण दिखाता है: एक तालिका केवल हेडर को प्रस्तुत करती है; दूसरी तालिका केवल पंक्तियों को प्रस्तुत करती है लेकिन एक के भीतर ऐसा करती है div। यह वह है divजो शीर्ष-स्क्रॉलिंग की अनुमति देता है जबकि हेडर एक ही स्थान पर रहता है। इस दृष्टिकोण ने मेरी जरूरतों के लिए काम किया।
डेविड टैन्से

यदि क्षैतिज स्क्रॉलिंग भी है, तो आपको तालिकाओं की स्क्रॉल स्थिति को सिंक्रनाइज़ करने के लिए कुछ JS की आवश्यकता होगी।
Zoltán Tamási

4

मुझे इस मुद्दे के लिए पॉल ओ ब्रायन द्वारा एक उत्कृष्ट समाधान मिला और वह लिंक साझा करना चाहेंगे: https://codepen.io/paulobrien/pen/LBrMxa

मैंने पाद लेख के लिए शैली निकाली:

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

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

4

हेडर और कॉलम दोनों को ठीक करने के लिए, आप निम्न प्लगइन का उपयोग कर सकते हैं:


जुलाई 2019 में अपडेट किया गया

हाल ही में उभरा एक शुद्ध सीएसएस समाधान भी है जो सीएसएस संपत्ति पर आधारित है position: sticky;( यहां इसके बारे में अधिक जानकारी के लिए) प्रत्येक THआइटम (उनके मूल कंटेनर के बजाय ) पर लागू होता है


1
पहला लिंक टूट गया है। दूसरा एक jQuery का उपयोग करता है।
पूसबूट्स 20

मृत लिंक को हटाने के लिए अपडेट किया गया जवाब
लुका डेटोमी

2

मुझे हाल ही में एक निश्चित हेडर समूह और एक निश्चित पहले कॉलम के साथ एक समाधान बनाना था। मैंने अपनी तालिका को div के विभाजन में विभाजित कर दिया और खिड़की स्क्रॉलिंग पर कब्जा करने के लिए jquery का उपयोग किया।

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

var prevTop = 0;
var prevLeft = 0;

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

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

1

एक सहकर्मी और मैंने अभी एक नया GitHub प्रोजेक्ट जारी किया है जो एक कोणीय निर्देश की आपूर्ति करता है जिसका उपयोग आप निश्चित हेडर के साथ अपनी मेज को सजाने के लिए कर सकते हैं: https://github.com/objectcomputing/FixedHeader

यह केवल सीएसएस और कोणीय पर निर्भर करता है, एक निर्देश के साथ जो कुछ divs जोड़ता है। कोई jQuery की आवश्यकता नहीं है।

यह कार्यान्वयन कुछ अन्य कार्यान्वयन के रूप में पूरी तरह से चित्रित नहीं है, लेकिन यदि आपकी आवश्यकता केवल निश्चित तालिकाओं को जोड़ने के लिए है, तो हमें लगता है कि यह एक अच्छा विकल्प हो सकता है।


1

दो दिनों के बाद इंटरनेट एक्सप्लोरर 9 + क्रोम + फ़ायरफ़ॉक्स (विंडोज) और सफारी (मैक) के साथ लड़ने के बाद, मुझे एक सिस्टम मिला है

  • इन सभी ब्राउज़रों के साथ संगत
  • जावास्क्रिप्ट का उपयोग किए बिना
  • केवल une div और एक टेबल का उपयोग करना
  • स्क्रॉल किए गए शरीर के साथ फिक्स्ड हेडर और फुटर (IE को छोड़कर)। हेडर और शरीर एक ही कॉलम चौड़ाई के साथ

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

HTML:

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

सीएसएस:

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

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

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

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

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

div.cost_center table thead{
  display:block;
}

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

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

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

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

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

अच्छी कोशिश, लेकिन मेरे लिए बहुत अच्छी तरह से काम नहीं करता है। इस छूट ( jsfiddle.net/5ka6e ) में, हेडर सही ढंग से आकार नहीं देता है। इस तरह की त्रुटि अंत में डेटा और हेडर बेमेल हो सकती है।
Darkzangel

1
आप जोड़ना भूल जाते हैं div.cost_center table{border-collapse: collapse;}और तीसरा कैप्शन कुछ ऐसा होना चाहिए जो 60px (इस उदाहरण में) के भीतर फिट बैठता है
अल्बर्ट कैटालि

1

मौजूदा उत्तर अधिकांश लोगों पर सूट करेंगे, लेकिन उन लोगों के लिए जो छाया जोड़ना चाहते हैं फिक्स्ड हेडर के नीचे और पहले (निश्चित) कॉलम के दाईं ओर , यहां काम का उदाहरण (शुद्ध सीएसएस) है:

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

इसे काम करने के लिए मुख्य चाल का उपयोग ::afterप्रत्येक में पहले के दाईं ओर छाया जोड़ने के लिए tdकिया जाता है tr:

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

मुझे थोड़ी देर लगी (बहुत लंबी ...) यह सब काम करने के लिए तो मुझे लगा कि मैं उन लोगों के लिए साझा करूँगा जो एक समान स्थिति में हैं।


क्या आपने किसी को जवाब देने के लिए आधार बनाया और छाया को जोड़ा?
पूसबूट्स

1

शीर्ष लेख पाद लेख को ठीक करने की आवश्यकता है


0

ऐसा कुछ आपके लिए काम कर सकता है ... शायद आपको अपनी हेडर पंक्ति के लिए कॉलम की चौड़ाई निर्धारित करनी होगी।

thead { 
    position: fixed;
}

http://jsfiddle.net/vkhNC/

अपडेट करें:

मुझे यकीन नहीं है कि आपने जो उदाहरण दिया है वह सिर्फ सीएसएस के साथ संभव है। मैं किसी को गलत साबित करने के लिए प्यार करूंगा। यहाँ मेरे पास अभी तक क्या है । यह तैयार उत्पाद नहीं है लेकिन यह आपके लिए एक शुरुआत हो सकती है। मुझे आशा है कि यह आपको एक सहायक दिशा में इंगित करेगा, जहां भी हो सकता है।


मुझे न केवल हेडर चाहिए, बल्कि पहले कॉलम को भी ठीक करना होगा।
पनफिल

5
समस्या हेडर उनकी चौड़ाई ढीली है। यह अलग हेडर कॉलम साइज़ और डेटा कॉलम साइज़ के साथ बदसूरत दिखता है।
आकाश काव

0

एक अन्य उपाय AngularJS का उपयोग करना है। AngularUI मॉड्यूल में एक निर्देश ng-gridहोता है, जो कॉलम पिनिंग नामक एक सुविधा का समर्थन करता है। यह 100% शुद्ध सीएसएस नहीं है और न ही अन्य समाधान हैं।

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


0

शुद्ध सीएसएस उदाहरण:

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


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

</div>

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

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

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

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

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

दोष: निश्चित हेडर संरचना / तर्क विशिष्ट आयामों पर काफी निर्भर है, इसलिए अमूर्तता शायद एक व्यवहार्य विकल्प नहीं है


फिक्स्ड हेडर और फिक्स्ड फर्स्ट कॉलम दोनों की जरूरत है।
पैनफिल

आह ... यह इंगित करने के लिए thx, panfil। मैं एक संपादन करूँगा। चीयर्स
कोडी

0

स्थिति: चिपचिपा क्रोम में कुछ तत्वों (थ्रेड) और सफारी जैसे अन्य वेबकिट ब्राउज़र के लिए काम नहीं करता है।

लेकिन यह (वें) के साथ ठीक काम करता है

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

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

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

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

या मेरे कोडपेन उदाहरण पर जाएँ :


-1

मुझे लगता है कि यह आपकी मदद करेगा: https://datatables.net/release-datatables/extensions/FixedHeader/examples/header_footer.html

संक्षेप में, यदि आप जानते हैं कि डेटाटेबल कैसे बनाया जाए, तो आपको इस jQuery लाइन को अपने निचले हिस्से में जोड़ना होगा:

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

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

नीचे: सच // नीचे हैडर बनाने के लिए भी है।


-2

यदि आप केवल शुद्ध HTML और CSS का उपयोग करना चाहते हैं, तो मुझे आपकी समस्या का हल मिल गया है:
इस jsFiddle में आप एक गैर-स्क्रिप्ट समाधान देख सकते हैं जो एक निश्चित हेडर के साथ एक तालिका प्रदान करता है। यह एक निश्चित पहले कॉलम के लिए मार्कअप को अनुकूलित करने के लिए एक समस्या नहीं होनी चाहिए। आपको hWrapper-div और reposition -div के अंदर पहले कॉलम के लिए एक पूर्ण-स्थित तालिका बनाने की आवश्यकता होगी vWrapper
गतिशील सामग्री प्रदान करना सर्वर-साइड या ब्राउज़र-साइड प्रलोभन-इंजन का उपयोग करने में समस्या नहीं होनी चाहिए, मेरा समाधान IE8 से सभी आधुनिक ब्राउज़रों और पुराने ब्राउज़रों में अच्छी तरह से काम करता है।


-2

बस जरूरत है स्टाइल बदलने की

<table style="position: relative;">
   <thead>
      <thead>
        <tr>
           <th></th>
        </tr>
      </thead>
   </thead>
   <tbody style="position: absolute;height: 300px;overflow:auto;">
      <tr>
         <td></td>
      </tr>
   </tbody>
</table>

डेमो: https://plnkr.co/edit/Qxy5RMJBXmkaJAOjBtQn?p=preview


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