단일 기능을 추가하기 위해 HTML 테이블의 프레젠테이션을 “조정”할 수 있기를 원합니다. 페이지를 아래로 스크롤하여 테이블이 화면에 있지만 머리글 행이 화면에 표시되지 않도록하려면 머리글을 유지하고 싶습니다. 보기 영역 상단에 표시됩니다.
이것은 개념적으로 Excel의 “고정 창”기능과 같습니다. 그러나 HTML 페이지에는 여러 테이블이 포함될 수 있으며 현재보기 인 테이블에서만 볼 수 있습니다.
참고 : 헤더가 스크롤되지 않는 동안 테이블 데이터 영역을 스크롤 할 수있는 솔루션을 보았습니다. 그것은 내가 찾고있는 해결책이 아닙니다.
답변
jQuery.floatThead ( 데모 사용 가능 )를 확인하십시오. 매우 훌륭하고 DataTables 와 함께 작업 할 수 있으며 overflow: auto
컨테이너 내부에서도 작업 할 수 있습니다 .
답변
jQuery를 사용하여 개념 증명 솔루션을 만들었습니다 .
이제이 코드를 Mercurial bitbucket 저장소에 있습니다. 기본 파일은 tables.html
입니다.
테이블에 앵커가 있고 브라우저에서 지정된 앵커로 URL을 열면 페이지가로드 될 때 앵커가있는 행이 부동 헤더에 의해 가려 질 수 있습니다.
2017-12-11 업데이트 : 현재 Firefox (57) 및 Chrome (63)에서는 작동하지 않습니다. 언제, 왜 이것이 작동을 멈췄는지, 어떻게 고쳐야하는지 잘 모르겠습니다. 그러나 지금, 나는 Hendy Irawan의 대답 이 우수 하다고 생각합니다 .
답변
크레이그, 나는 당신의 코드를 조금 수정하고 (현재 위치 : 고정을 사용하는 몇 가지 다른 것들 중에서) jQuery 플러그인으로 래핑했다.
여기에서 사용해보십시오 : http://jsfiddle.net/jmosbech/stFcx/
그리고 여기에서 소스를 얻으십시오 : https://github.com/jmosbech/StickyTableHeaders
답변
최신 css3 호환 브라우저 ( 브라우저 지원 : https://caniuse.com/#feat=css-sticky )를 대상으로하는 경우을 사용할 수 있습니다 position:sticky
.이 경우 JS가 필요하지 않으며 정렬되지 않은 테이블 레이아웃이 손상되지 않습니다. 그리고 같은 열의 td. 또한 제대로 작동하기 위해 고정 열 너비가 필요하지 않습니다.
단일 헤더 행의 예 :
thead th
{
position: sticky;
top: 0px;
}
행이 1 ~ 2 개인 광고의 경우 다음과 같이 사용할 수 있습니다.
thead > :last-child th
{
position: sticky;
top: 30px; /* This is for all the the "th" elements in the second row, (in this casa is the last child element into the thead) */
}
thead > :first-child th
{
position: sticky;
top: 0px; /* This is for all the the "th" elements in the first child row */
}
첫 번째 행의 높이 (+ 여백 + 테두리 + 패딩 (있는 경우))와 일치하도록 픽셀 수를 변경하는 마지막 자식 의 top 속성으로 비트를 재생해야 할 수도 있으므로 두 번째 행은 바로 아래로 붙어 있습니다. 첫 번째를 울리십시오.
또한 같은 페이지에 둘 이상의 테이블이 있어도 두 솔루션 모두 작동합니다. th
각 위치 의 요소는 상단 위치가 CSS 정의에 표시된 위치에서 고정되기 시작하고 모든 테이블이 아래로 스크롤되면 사라집니다. 따라서 더 많은 테이블이 있으면 모두 같은 방식으로 아름답게 작동합니다.
왜 마지막 아이 사용하기 전에 먼저 아이를 한 후에 는 CSS에?
CSS 규칙은 CSS 파일에 작성하는 것과 동일한 순서로 브라우저에서 렌더링되기 때문에 thead 요소에 단 하나의 행이 있으면 첫 번째 행도 동시에 마지막 행이며 첫 번째 자식 규칙이 필요합니다. 마지막 자식을 재정의합니다. 그렇지 않으면 원하지 않는 상단 여백에서 30px 행의 오프셋을 갖게됩니다.
알려진 위치 문제 : 고정은 광고 요소 또는 테이블 행에서 작동하지 않는다는 것입니다. 요소를 타겟팅해야합니다. 이 문제를 호핑하면 향후 브라우저 버전에서 해결 될 것입니다.
답변
가능한 대안
JS 플로팅 테이블 헤더
js-floating-table-headers (Google 코드)
드루팔에서
Drupal 6 사이트가 있습니다. 관리자 “모듈”페이지에 있었고 테이블에 정확한 기능이 있다는 것을 알았습니다.
코드를 보면이라는 파일로 구현 된 것 같습니다 tableheader.js
. 클래스가있는 모든 테이블에 기능을 적용합니다 sticky-enabled
.
Drupal 사이트의 경우 tableheader.js
사용자 콘텐츠에 대해 해당 모듈을 그대로 사용할 수 있기를 바랍니다 . tableheader.js
Drupal의 사용자 콘텐츠 페이지에없는 것 같습니다. Drupal 테마를 사용할 수 있도록 수정하는 방법을 묻는 포럼 메시지 를 게시했습니다 . 응답에 따르면, tableheader.js
사용 Drupal 테마에 추가 할 수 있습니다 drupal_add_js()
년대 테마 template.php
로 다음과 같습니다 :
drupal_add_js('misc/tableheader.js', 'core');
답변
최근에이 문제가 발생했습니다. 불행히도, 나는 머리글과 몸통에 대한 두 개의 테이블을 수행해야했습니다. 아마도 가장 좋은 방법은 아니지만 여기에갑니다.
<html>
<head>
<title>oh hai</title>
</head>
<body>
<table id="tableHeader">
<tr>
<th style="width:100px; background-color:#CCCCCC">col header</th>
<th style="width:100px; background-color:#CCCCCC">col header</th>
</tr>
</table>
<div style="height:50px; overflow:auto; width:250px">
<table>
<tr>
<td style="height:50px; width:100px; background-color:#DDDDDD">data1</td>
<td style="height:50px; width:100px; background-color:#DDDDDD">data1</td>
</tr>
<tr>
<td style="height:50px; width:100px; background-color:#DDDDDD">data2</td>
<td style="height:50px; width:100px; background-color:#DDDDDD">data2</td>
</tr>
</table>
</div>
</body>
</html>
이것은 나를 위해 일했습니다. 아마도 우아한 방법은 아니지만 작동합니다. 더 나은 것을 할 수 있는지 조사해 볼 것이지만 여러 테이블을 허용합니다.
오버 플로우 특성을 읽어 보고 필요에 맞는지 확인하십시오.
답변
이것은 테이블에 끈적 끈적한 헤더를 갖는 것이 까다로운 일입니다. 나는 asp : GridView 와 동일한 요구 사항을 가지고 있었고 gridview에 끈적 끈적한 헤더가 있다고 생각했습니다. 사용할 수있는 솔루션이 많이 있으며 모든 솔루션을 시도하는 데 3 일이 걸렸지 만 어느 것도 만족할 수 없었습니다.
이러한 솔루션의 대부분에 직면 한 주요 문제는 정렬 문제였습니다. 헤더를 플로팅하려고하면 헤더 셀과 바디 셀의 정렬이 어긋납니다.
일부 솔루션을 사용하면 헤더가 본문의 처음 몇 행에 겹치는 문제가 발생하여 본문 행이 부동 헤더 뒤에 숨겨집니다.
이제는 이것을 달성하기 위해 내 자신의 논리를 구현해야했지만 완벽한 솔루션으로 간주하지는 않지만 누군가에게 도움이 될 수 있습니다.
아래는 샘플 테이블입니다.
<div class="table-holder">
<table id="MyTable" cellpadding="4" cellspacing="0" border="1px" class="customerTable">
<thead>
<tr><th>ID</th><th>First Name</th><th>Last Name</th><th>DOB</th><th>Place</th></tr>
</thead>
<tbody>
<tr><td>1</td><td>Customer1</td><td>LastName</td><td>1-1-1</td><td>SUN</td></tr>
<tr><td>2</td><td>Customer2</td><td>LastName</td><td>2-2-2</td><td>Earth</td></tr>
<tr><td>3</td><td>Customer3</td><td>LastName</td><td>3-3-3</td><td>Mars</td></tr>
<tr><td>4</td><td>Customer4</td><td>LastName</td><td>4-4-4</td><td>Venus</td></tr>
<tr><td>5</td><td>Customer5</td><td>LastName</td><td>5-5-5</td><td>Saturn</td></tr>
<tr><td>6</td><td>Customer6</td><td>LastName</td><td>6-6-6</td><td>Jupitor</td></tr>
<tr><td>7</td><td>Customer7</td><td>LastName</td><td>7-7-7</td><td>Mercury</td></tr>
<tr><td>8</td><td>Customer8</td><td>LastName</td><td>8-8-8</td><td>Moon</td></tr>
<tr><td>9</td><td>Customer9</td><td>LastName</td><td>9-9-9</td><td>Uranus</td></tr>
<tr><td>10</td><td>Customer10</td><td>LastName</td><td>10-10-10</td><td>Neptune</td></tr>
</tbody>
</table>
</div>
참고 : 테이블은 클래스 속성이 ‘table-holder’인 DIV로 랩핑됩니다.
아래는 html 페이지 헤더에 추가 한 JQuery 스크립트입니다.
<script src="../Scripts/jquery-1.7.2.min.js" type="text/javascript"></script>
<script src="../Scripts/jquery-ui.min.js" type="text/javascript"></script>
<script type="text/javascript">
$(document).ready(function () {
//create var for table holder
var originalTableHolder = $(".table-holder");
// set the table holder's with
originalTableHolder.width($('table', originalTableHolder).width() + 17);
// Create a clone of table holder DIV
var clonedtableHolder = originalTableHolder.clone();
// Calculate height of all header rows.
var headerHeight = 0;
$('thead', originalTableHolder).each(function (index, element) {
headerHeight = headerHeight + $(element).height();
});
// Set the position of cloned table so that cloned table overlapped the original
clonedtableHolder.css('position', 'relative');
clonedtableHolder.css('top', headerHeight + 'px');
// Set the height of cloned header equal to header height only so that body is not visible of cloned header
clonedtableHolder.height(headerHeight);
clonedtableHolder.css('overflow', 'hidden');
// reset the ID attribute of each element in cloned table
$('*', clonedtableHolder).each(function (index, element) {
if ($(element).attr('id')) {
$(element).attr('id', $(element).attr('id') + '_Cloned');
}
});
originalTableHolder.css('border-bottom', '1px solid #aaa');
// Place the cloned table holder before original one
originalTableHolder.before(clonedtableHolder);
});
</script>
마지막에는 채색 목적의 CSS 클래스가 있습니다.
.table-holder
{
height:200px;
overflow:auto;
border-width:0px;
}
.customerTable thead
{
background: #4b6c9e;
color:White;
}
따라서이 논리의 전체 아이디어는 테이블을 테이블 홀더 div에 배치하고 페이지가로드 될 때 클라이언트 측에서 해당 홀더의 복제본을 만드는 것입니다. 이제 클론 홀더 내부의 테이블 본문을 숨기고 나머지 헤더 부분을 원래 헤더에 놓습니다.
동일한 솔루션이 asp : gridview에서도 작동합니다. gridview에서이를 달성하려면 두 단계를 더 추가해야합니다.
-
웹 페이지의 gridview 객체의 OnPrerender 이벤트에서 머리글 행의 테이블 섹션을 TableHeader와 동일하게 설정하십시오.
if (this.HeaderRow != null) { this.HeaderRow.TableSection = TableRowSection.TableHeader; }
-
그리고 당신의 그리드를로 감싸십시오
<div class="table-holder"></div>
.
참고 : 헤더에 클릭 가능한 컨트롤이있는 경우 복제 된 헤더에서 발생한 이벤트를 원래 헤더로 전달하기 위해 더 많은 jQuery 스크립트를 추가해야 할 수도 있습니다. 이 코드는 jmosbech에서 생성 한 jQuery sticky-header 플러그인에서 이미 사용 가능합니다.