Html टेबल पर स्क्रॉल बार कैसे प्रदर्शित करें


85

मैं एक पृष्ठ लिख रहा हूं जहां मुझे एक सेट आकार बनाए रखने के लिए एक html तालिका की आवश्यकता है। मुझे हर समय वहाँ रहने के लिए तालिका के शीर्ष पर शीर्ष लेखों की आवश्यकता होती है, लेकिन मुझे तालिका के शरीर की भी आवश्यकता होती है, चाहे कितनी भी पंक्तियाँ तालिका में जोड़ी जाएँ।

मैं चाहता हूं कि यह इस url में विधि 2 की तरह दिखे: http://www.cssplay.co.uk/menu/tablescroll.html

मैंने ऐसा करने की कोशिश की है लेकिन कोई स्क्रॉलबार दिखाई नहीं देता है:

tbody {
  height: 80em;
  overflow: scroll;
}
<table border=1 id="qandatbl" align="center">
  <tr>
    <th class="col1">Question No</th>
    <th class="col2">Option Type</th>
    <th class="col1">Duration</th>
  </tr>

  <tbody>
    <tr>
      <td class='qid'></td>
      <td class="options"></td>
      <td class="duration"></td>
    </tr>
  </tbody>
</table>


आप उदाहरण विधि से कोड का उपयोग क्यों नहीं करते? आप <tbody>दुर्भाग्य से उपयोग नहीं कर सकते ।
माइक पार्क

जवाबों:


163

कुछ इस तरह?

http://jsfiddle.net/TweNm/

यह विचार <table>एक गैर-वैधानिक रूप से स्थित में लपेटने का है <div>जिसमें overflow:autoसीएसएस संपत्ति है। फिर तत्वों को <thead>बिल्कुल में रखें।

#table-wrapper {
  position:relative;
}
#table-scroll {
  height:150px;
  overflow:auto;  
  margin-top:20px;
}
#table-wrapper table {
  width:100%;

}
#table-wrapper table * {
  background:yellow;
  color:black;
}
#table-wrapper table thead th .text {
  position:absolute;   
  top:-20px;
  z-index:2;
  height:20px;
  width:35%;
  border:1px solid red;
}
<div id="table-wrapper">
  <div id="table-scroll">
    <table>
        <thead>
            <tr>
                <th><span class="text">A</span></th>
                <th><span class="text">B</span></th>
                <th><span class="text">C</span></th>
            </tr>
        </thead>
        <tbody>
          <tr> <td>1, 0</td> <td>2, 0</td> <td>3, 0</td> </tr>
          <tr> <td>1, 1</td> <td>2, 1</td> <td>3, 1</td> </tr>
          <tr> <td>1, 2</td> <td>2, 2</td> <td>3, 2</td> </tr>
          <tr> <td>1, 3</td> <td>2, 3</td> <td>3, 3</td> </tr>
          <tr> <td>1, 4</td> <td>2, 4</td> <td>3, 4</td> </tr>
          <tr> <td>1, 5</td> <td>2, 5</td> <td>3, 5</td> </tr>
          <tr> <td>1, 6</td> <td>2, 6</td> <td>3, 6</td> </tr>
          <tr> <td>1, 7</td> <td>2, 7</td> <td>3, 7</td> </tr>
          <tr> <td>1, 8</td> <td>2, 8</td> <td>3, 8</td> </tr>
          <tr> <td>1, 9</td> <td>2, 9</td> <td>3, 9</td> </tr>
          <tr> <td>1, 10</td> <td>2, 10</td> <td>3, 10</td> </tr>
          <!-- etc... -->
          <tr> <td>1, 99</td> <td>2, 99</td> <td>3, 99</td> </tr>
        </tbody>
    </table>
  </div>
</div>


15
बिना चौड़ाई वाले कॉलम के बारे में कैसे?
Fractaliste

3
मैंने आपके उत्तर की कोशिश की लेकिन हेडर कॉलम संरेखित नहीं हैं। मैंने बॉडी टैग के अंदर केवल एक स्टाइल टैग में आपकी सीएसएस का उपयोग किया है जहां मैंने आपकी तालिका की नकल की है
एंटोनियो

महान समाधान, लेकिन मुझे इससे समस्या हो रही है। जब एक पंक्ति और सेट डिस्प्ले को छिपाने की कोशिश करें: कोई भी पंक्तियों के बीच कुछ सफेद स्थान नहीं हैं। यह नियमित तालिका के मामले में नहीं है। कोई विचार, सुझाव या सुझाव?
डेनियल शेवलेव

@Antonio: मुझे एक ही समस्या थी (केंद्रित * शीर्षक वाले कॉलम नॉन-एलाइनिंग लग रहे हैं), लेकिन transform: translateX(-50%)मेरे लिए इस ट्रिक को जोड़ने [* फ़ायरफ़ॉक्स में स्टैण्डर्ड स्टाइलिंग को केन्द्रित किया जा रहा है जो कि इस उत्तर के JSFiddle में "सामान्यीकृत सीएसएस" विकल्प द्वारा हटा दिया गया है]
सोरा।

44

आपको अपना <table>एक में डालना है <div>कि यह निश्चित आकार है, और <div>शैली में आपको सेट करना होगा overflow: scroll


1
मेरे div के लिए 500px की ऊंचाई दी और यह ठीक काम किया। <div style = "overflow: scroll; height: 500px;">
Ziggler

3
पता नहीं क्यों सभी ने इसे इतना जटिल बना दिया। यह स्वीकृत उत्तर होना चाहिए।
amallard

1
यह अब तक का सबसे आसान उपाय है। एक अतिप्रवाह और निश्चित ऊँचाई के साथ एक डिव को जोड़ने के लिए कोट्स हो सकते हैं लेकिन यह समाधान कम से कम आपको सही दिशा में स्थापित करेगा।
lsimonetti

1
शानदार जवाब दोस्त! आपके लिए
:)

1
यह स्वीकृत उत्तर होना चाहिए। सरल, सीधे बिंदु पर और मैं इसके साथ और कुछ भी नष्ट नहीं करता।
मैं इतनी कोशिश करता हूं लेकिन मैं 19

40

स्वीकृत उत्तर ने एक अच्छा प्रारंभिक बिंदु प्रदान किया, लेकिन यदि आप फ्रेम का आकार बदलते हैं, तो कॉलम की चौड़ाई को बदलें, या यहां तक ​​कि तालिका के डेटा को भी बदल दें, हेडर विभिन्न तरीकों से गड़बड़ हो जाएगा। मेरे द्वारा देखे गए हर दूसरे उदाहरण में समान मुद्दे हैं, या तालिका के लेआउट पर कुछ गंभीर प्रतिबंध लगाए गए हैं।

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

यहां एक उदाहरण दिया गया है जिसमें ओपी द्वारा संदर्भित तालिका: 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;
  background: white;
}
.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: 15px;
  line-height: 20px;
  padding: 20px 0 20px 0; /*need enough padding to make room for caption*/
  text-align: left;
}
.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"></div></th>
            <th><div label="Column 2"></div></th>
            <th><div label="Column 3"></div></th>
            <th>
              <!--more versatile way of doing column label; requires 2 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]-->


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

ओह एक सेकंड रुको, कोई क्षैतिज स्क्रॉलबार नहीं है, तालिका बस काट देती है।
नंकेर

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

अद्भुत कार्य। क्या आप कई हेडर पंक्तियों के लिए ट्वीक करने के बारे में टिप्पणी कर सकते हैं? बस <tr><th></th>..</tr>निर्माण को दोहराते हुए स्पष्ट रूप से काम नहीं करता है। धन्यवाद।
डेविड आई। मैकइंटोश

@ DavidI.McIntosh इस तकनीक का उपयोग करके एक बहु-पंक्ति हेडर मुश्किल हो जाएगा। पंक्तियों को जोड़ना आसान होगा, लेकिन मुझे यकीन नहीं है कि आप उनके बीच क्षैतिज सीमा कैसे प्राप्त करेंगे। जब तक आप किसी कारण से जेएस का उपयोग नहीं कर सकते, आप मेरी पिछली टिप्पणी में लिंक किए गए जावास्क्रिप्ट समाधान को आजमाना चाहेंगे।
डॉक्टरडॉस्ट्रक्टो

3

मैंने अपनी सामग्री को दो तालिकाओं में अलग करके इस समस्या का समाधान किया।

एक तालिका शीर्ष लेख पंक्ति है।

सेकंड भी <table>टैग है, लेकिन <div>स्थिर ऊंचाई और अतिप्रवाह स्क्रॉल के साथ लिपटे ।


1

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

यदि आप चाहते हैं कि, के height: x;साथ max-height: x;और overflow:scrollसाथ बदलें overflow:auto

इसके अतिरिक्त, आप उपयोग कर सकते हैं overflow-xऔर overflow-yयदि आप चाहें, और जाहिर है कि एक ही चीज क्षैतिज रूप से काम करती हैwidth : x;


0

यदि आप उस बिंदु पर पहुँचते हैं जहाँ सभी उल्लिखित समाधान काम नहीं करते हैं (जैसा कि यह मेरे लिए है), ऐसा करें:

  • दो टेबल बनाएं। एक हेडर के लिए और दूसरा बॉडी के लिए
  • दो तालिकाएँ अलग-अलग मूल कंटेनर / divs दें
  • अपनी सामग्री के लंबवत स्क्रॉल की अनुमति देने के लिए दूसरी तालिका के डिव को स्टाइल करें।

इस तरह, अपने में HTML

<div class="table-header-class">
    <table>
       <thead>
          <tr>
            <th>Ava</th>
            <th>Alexis</th>
            <th>Mcclure</th>
          </tr>
       </thead>
    </table>
</div>
<div class="table-content-class">
   <table>
       <tbody>
          <tr>
            <td>I am the boss</td>
            <td>No, da-da is not the boss!</td>
            <td>Alexis, I am the boss, right?</td>
          </tr>
       </tbody>
    </table>
</div>

फिर दूसरी तालिका के माता-पिता को ऊर्ध्वाधर स्क्रॉल करने की अनुमति देने के लिए स्टाइल करें, अपने में CSS

    .table-content-class {
        overflow-y: scroll;    // use auto; or scroll; to allow vertical scrolling; 
        overflow-x: hidden;    // disable horizontal scroll 
    }

यह उसी तरह का कार्यान्वयन है जैसा कि एक साल पहले ज़वी का जवाब था।
टायलरएच

0

बस टेबल पर जोड़ें

style="overflow-x:auto;"

<table border=1 id="qandatbl" align="center" style="overflow-x:auto;">
    <tr>
    <th class="col1">Question No</th>
    <th class="col2">Option Type</th>
    <th class="col1">Duration</th>
    </tr>

   <tbody>
    <tr>
    <td class='qid'></td>
    <td class="options"></td>
    <td class="duration"></td>
    </tr>
    </tbody>
</table>

शैली = "अतिप्रवाह-x: ऑटो;" `

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