এইচটিএমএল টেবিলে স্ক্রোল বারটি কীভাবে প্রদর্শিত হবে display


86

আমি একটি পৃষ্ঠা লিখছি যেখানে আমার একটি সেট আকার বজায় রাখতে এইচটিএমএল টেবিলের প্রয়োজন। আমাকে সর্বদা সেখানে থাকতে টেবিলের শীর্ষে শিরোনামগুলি প্রয়োজন তবে টেবিলটিতে কতগুলি সারি যুক্ত করা হোক না কেন স্ক্রোল করার জন্য আমার টেবিলের বডিও প্রয়োজন।

আমি এই url এ এটি 2 পদ্ধতির মতো দেখতে চাই: http://www.cssplay.co.uk/menu/tablescrol.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>দুর্ভাগ্যক্রমে আপনি ব্যবহার করতে পারবেন না ।
মাইক পার্ক

উত্তর:


164

এটার মতো কিছু?

http://jsfiddle.net/TweNm/

ধারণাটি হ'ল <table>স্থায়ীভাবে অবস্থানযুক্ত <div>যাতে একটি overflow:autoসিএসএস সম্পত্তি রয়েছে in তারপরে <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
কোনও প্রস্থ-স্থির কলামগুলি কীভাবে?
ফ্র্যাক্টালাইস্ট

4
আমি আপনার উত্তরের চেষ্টা করেছি কিন্তু শিরোনাম কলামগুলি সারিবদ্ধ হয় না। আমি কেবল আপনার সিএসএসকে বডি ট্যাগের অভ্যন্তরে স্টাইল ট্যাগে ব্যবহার করেছি যেখানে আমি আপনার টেবিলটি অনুলিপি করেছি
অ্যান্টোনিও

দুর্দান্ত সমাধান, তবে আমি এটি নিয়ে সমস্যা করছি। যখন কোনও সারিটি লুকানোর চেষ্টা করুন এবং প্রদর্শন সেট করুন: সারিগুলির মধ্যে কোনও সাদা জায়গা নেই। নিয়মিত টেবিলের ক্ষেত্রে এটি হয় না। কোন ধারণা, পরামর্শ বা পরামর্শ?
ড্যানিল শেভলেভ

@ অ্যান্টোনিও: আমারও একই সমস্যা ছিল (কেন্দ্রিক * শিরোনাম কলামগুলি নন-প্রান্তিক বলে মনে হচ্ছে) তবে transform: translateX(-50%)আমার পক্ষে কৌশলটি যুক্ত করা হয়েছে [* ফায়ারফক্সে স্ট্যান্ডার্ড স্টাইলিং হচ্ছে এই উত্তরটির জেএসফিডেলের "নরমাল সিএসএস" অপশন দ্বারা মুছে ফেলা]
সোরা।

46

আপনাকে এটির <table>একটি <div>নির্দিষ্ট আকারের আকারে sertোকাতে হবে এবং <div>শৈলীতে আপনাকে সেট করতে হবে overflow: scroll


4
আমার ডিভের জন্য 500px হিসাবে উচ্চতা দিয়েছে এবং এটি দুর্দান্ত কাজ করেছে। <ডি স্টাইল = "ওভারফ্লো: স্ক্রোল; উচ্চতা: 500px;">
জিগ্লার

4
সবাই কেন এতো জটিল করে তুলেছে তা জানেন না। এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
অমল্লার্ড

4
এটি এখন পর্যন্ত সবচেয়ে সহজ সমাধান। ওভারফ্লো এবং স্থির উচ্চতার সাথে একটি ডিভি যোগ করার ক্ষেত্রে সতর্কতা থাকতে পারে তবে এই সমাধানটি আপনাকে কমপক্ষে সঠিক দিকে এগিয়ে নিয়ে যাবে।
lsimonetti

4
দুর্দান্ত উত্তর সাথী! আপনাকে চিয়ার্স:) -
সান্দেকপু

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত। সরল, সোজা বিন্দুতে এবং আমি এটি দিয়ে অন্য কোনও কিছুই ধ্বংস করি না।
আমি খুব চেষ্টা করি কিন্তু

40

গৃহীত উত্তরটি একটি ভাল সূচনা পয়েন্ট সরবরাহ করেছে, তবে আপনি যদি ফ্রেমটির আকার পরিবর্তন করেন, কলামের প্রস্থ পরিবর্তন করেন বা সারণির ডেটা পরিবর্তন করেন তবে শিরোনামগুলি বিভিন্ন উপায়ে বিভ্রান্ত হবে। অন্যান্য প্রতিটি উদাহরণ আমি দেখেছি একই রকম সমস্যা রয়েছে বা টেবিলের বিন্যাসে কিছু গুরুতর বিধিনিষেধ আরোপ করে।

যদিও আমি মনে করি আমি শেষ পর্যন্ত এই সমস্ত সমস্যার সমাধান করেছি। এটি অনেকগুলি সিএসএস নিয়েছে, তবে চূড়ান্ত পণ্যটি সাধারণ টেবিলের মতো নির্ভরযোগ্য এবং সহজেই ব্যবহারযোগ্য।

এখানে একটি উদাহরণ রয়েছে যা ওপির দ্বারা উল্লিখিত টেবিলটির প্রতিলিপি করতে সমস্ত প্রয়োজনীয় বৈশিষ্ট্য রয়েছে: জেএসফিডাল

রঙ এবং সীমানাগুলি এটিকে রেফারেন্সের মতো করে তুলতে পরিবর্তন করতে হবে। সিএসএস মন্তব্যে এই ধরণের পরিবর্তন কীভাবে করা যায় সে সম্পর্কিত তথ্য সরবরাহ করা হয়।

কোডটি এখানে:

/*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>স্পষ্টভাবে নির্মাণের পুনরাবৃত্তি কার্যকর হয় না। ধন্যবাদ
ডেভিড আই ম্যাকইনটোশ

@ ডেভিডআই.এমসিআইনটোস এই কৌশলটি ব্যবহার করে একটি বহু-সারি শিরোনামটি মুশকিল হবে। সারি যুক্ত করা সহজ হবে তবে আপনি কীভাবে তাদের মধ্যে অনুভূমিক সীমানা পাবেন তা আমি নিশ্চিত নই। আপনি জাভাস্ক্রিপ্ট সমাধানটি আমার আগের মন্তব্যে লিঙ্ক করে চেষ্টা করতে পারেন আপনি যদি কোনও কারণে জেএস ব্যবহার করতে না পারেন তবে।
ডক্টরডেষ্টস্ট্রো

3

আমি আমার কন্টেন্টকে দুটি টেবিলের মধ্যে পৃথক করে এই সমস্যার সমাধান করেছি।

একটি সারণী শিরোনাম সারি।

সেকেন্ডগুলিও <table>ট্যাগ থাকে তবে <div>স্থির উচ্চতা এবং ওভারফ্লো স্ক্রোল দিয়ে মোড়ানো হয় ।


1

লক্ষণীয় যে, আপনার উদ্দেশ্য অনুসারে (আমার একটি অনুসন্ধানবারের অটোফিলের ফলাফলগুলি ছিল) আপনি উচ্চতাটি পরিবর্তনযোগ্য হতে চাইতে পারেন এবং যদি উচ্চতাটি অতিক্রম করে তবে কেবল স্ক্রোলবারের উপস্থিতি থাকতে পারে।

যদি আপনি এটি চান তবে এটির height: x;সাথে max-height: x;এবং overflow:scrollসাথে প্রতিস্থাপন করুন overflow:auto

অতিরিক্ত হিসাবে, আপনি ব্যবহার করতে পারেন overflow-xএবং overflow-yআপনি যদি চান এবং স্পষ্টত একই জিনিসটি অনুভূমিকভাবে কাজ করেwidth : x;


0

যদি আপনি সেই জায়গায় পৌঁছে যান যেখানে উল্লিখিত সমস্ত সমাধানগুলি কাজ করে না (যেমন এটি আমার জন্য পেয়েছে), এটি করুন:

  • দুটি টেবিল তৈরি করুন। একটি শিরোনামের জন্য এবং অন্যটি শরীরের জন্য
  • দুটি টেবিলকে বিভিন্ন পিতামাতার পাত্রে / ডিভগুলি দিন
  • এর সামগ্রীর উল্লম্ব স্ক্রোলটিকে মঞ্জুরি দেওয়ার জন্য দ্বিতীয় সারণির ডিভ স্টাইল করুন।

এই মত, আপনার 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>

শৈলী = "ওভারফ্লো-এক্স: অটো;" ``


কলামের শিরোনামটি রাখা অবস্থায় কীভাবে একটি টেবিলের বডিটি উল্লম্বভাবে স্ক্রোল করা যায় তা প্রশ্ন।
জিরাফেদটা

0

খুব সহজ, কেবল একটি ডিভের মধ্যে টেবিলটি জড়িয়ে রাখুন যা বৈশিষ্ট্য রয়েছে overflow-y:scroll;এবং overflow-x:scrollডিভের প্রস্থ এবং দৈর্ঘ্যটি টেবিলের চেয়ে ছোট করুন। এটি কাজ করবে !!!


ঠিক আছে, আমি এটি পরবর্তী উত্তরে যুক্ত করব।
অতিথি

ঠিক আছে, এটি করেছেন, স্ট্যাক ওভারফ্লোতে এখনও কীভাবে সঠিকভাবে কোডটি ইনডেন্ট করতে হয় তা আমি জানি না।
অতিথি

0

সিএসএস: div{ overflow-y:scroll; overflow-x:scroll; width:20px; height:30px; } table{ width:50px; height:50px; }

আপনি টেবিলের চারপাশে টেবিল এবং ডিআইভি আপনার পছন্দ মতো আকারের করতে পারেন, কেবল ডিভিআইটি টেবিলের চেয়ে ছোট কিনা তা নিশ্চিত করুন। আপনার অবশ্যই ডিআইভির অভ্যন্তরের টেবিলটি থাকা উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.