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>불행히도 사용할 수 없습니다 .
Mike Park

답변:


163

이 같은?

http://jsfiddle.net/TweNm/

아이디어는 CSS 속성 이 <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 2014-08-21

3
답변을 시도했지만 헤더 열이 정렬되지 않았습니다. 테이블을 복사 한 body 태그 내부의 스타일 태그에 CSS 만 사용했습니다
Antonio

훌륭한 솔루션이지만 문제가 있습니다. 행을 숨기고 display : none을 설정하려고 할 때 행 사이에 약간의 공백이 있습니다. 일반 테이블에서는 그렇지 않습니다. 아이디어, 팁 또는 제안이 있습니까?
Daniil Shevelev

@Antonio : 나는 같은 문제가 있었지만 (중간 * 헤더 열이 정렬되지 않은 것처럼 보임) transform: translateX(-50%)나를 위해 트릭을 추가 했습니다.
소라.

44

고정 된 크기 <table>를 가진에 삽입해야 <div>하고 <div>스타일로 설정해야합니다 overflow: scroll.


1
내 div에 대해 높이를 500px로 지정했고 잘 작동했습니다. <div style = "overflow : scroll; height : 500px;">
Ziggler

3
모든 사람들이 왜 그렇게 복잡하게 만들 었는지 모릅니다. 이것은 받아 들여진 대답이어야합니다.
amallard

1
이것이 가장 쉬운 해결책입니다. 오버플로 및 고정 높이가있는 div를 추가하는 데주의가있을 수 있지만이 솔루션은 적어도 올바른 방향으로 설정합니다.
lsimonetti

1
훌륭한 답변 메이트! 건배 :)
Sandepku

1
이것은 받아 들여진 대답이어야합니다. 간단하고 요점에 직결되며 나는 그것으로 다른 것을 파괴하지 않습니다.
열심히 노력하지만

40

받아 들여진 대답은 좋은 시작점을 제공했지만 프레임 크기를 조정하거나 열 너비를 변경하거나 테이블 데이터를 변경하면 헤더가 다양한 방식으로 엉망이됩니다. 내가 본 다른 모든 예에는 유사한 문제가 있거나 테이블 레이아웃에 심각한 제한이 있습니다.

그래도 마침내이 모든 문제가 해결되었다고 생각합니다. CSS 가 많이 필요 했지만 최종 제품은 일반 테이블만큼 안정적이고 사용하기 쉽습니다.

다음은 OP에서 참조하는 테이블을 복제하는 데 필요한 모든 기능이있는 예입니다. jsFiddle

참조와 동일하게 만들려면 색상과 테두리를 변경해야합니다. 이러한 종류의 변경 방법에 대한 정보는 CSS 주석에 제공됩니다.

코드는 다음과 같습니다.

/*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 개의 열이있는 테이블이 있는데 가로 스크롤바 없이는 페이지에 테이블을 포함 할 수없는 것 같습니다. 더 동적 너비의 열을 수용하기 위해 CSS, 아름답게 코딩 된 CSS를 조정하려고 시도했지만 테이블 너비 이외의 변경 사항은 차이가 없습니다. 테이블 너비를 100 %로 변경하면 테이블이 테이블 너비로 렌더링되지만 열 너비가 줄 바꿈되지 않기 때문에 15 개의 데이터 열을 모두 볼 수 없습니다. 나는 거의 엉뚱하게 보이는 스크롤 테이블을 가지고 있으므로 어떤 도움을 주셔서 감사합니다.
nanker

아 잠깐만, 수평 스크롤바가 없어요. 테이블이 잘립니다.
nanker

@nanker 가로 스크롤이 필요하고 약간의 JavaScript를 기꺼이 사용하려는 경우이 답변을 확인해야합니다 . 내가 아는 스크롤 테이블을 만드는 가장 좋은 방법입니다. 이 답변을 게시했을 때 CSS만으로 수평 스크롤을 수행하는 좋은 방법이 없었지만 한동안 조사하지 않았기 때문에 지금 가능한 것이 무엇인지 모르겠습니다.
DoctorDestructo

멋진 일. 여러 헤더 행을 조정하는 방법에 대해 설명해 주시겠습니까? 단순히 <tr><th></th>..</tr>구조를 명확 하게 반복하는 것은 작동하지 않습니다. 감사.
David I. McIntosh

@ DavidI.McIntosh이 기술을 사용하면 다중 행 헤더가 까다로울 수 있습니다. 행을 추가하는 것은 쉽지만 행 사이의 가로 테두리를 어떻게 얻을 수 있는지 잘 모르겠습니다. 어떤 이유로 JS를 사용할 수없는 경우가 아니면 이전 댓글에서 링크 한 JavaScript 솔루션을 사용해 볼 수도 있습니다.
DoctorDestructo

3

콘텐츠를 두 개의 테이블로 분리하여이 문제를 해결했습니다.

하나의 테이블은 헤더 행입니다.

초도 <table>태그이지만 <div>정적 높이 및 오버플로 스크롤로 래핑됩니다 .


1

당신의 목적에 따라 (내가 검색 창의 자동 완성 결과 였음) 높이를 변경할 수 있고 높이가 그 이상일 때만 스크롤바가 존재하기를 원할 수도 있습니다.

당신이 원하는 경우, 교체 height: x;max-height: x;하고 overflow:scrolloverflow:auto.

또한 원하는 경우 overflow-x및 사용할 수 overflow-y있으며 분명히 동일한 것이 수평으로 작동합니다.width : x;


0

언급 된 모든 솔루션이 작동하지 않는 지점에 도달하면 다음과 같이하십시오.

  • 두 개의 테이블을 만듭니다. 하나는 헤더 용이고 다른 하나는 본문 용입니다.
  • 두 테이블에 서로 다른 상위 컨테이너 / div 제공
  • 두 번째 테이블의 div 스타일을 지정하여 내용을 세로로 스크롤 할 수 있습니다.

이렇게, 당신의 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 
    }

이것은 1 년 전 Zvi의 답변과 동일한 구현입니다.
TylerH

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>

style = "overflow-x : auto;"`

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.