我希望能够“调整” HTML表的演示文稿以添加一个功能:向下滚动页面以使表在屏幕上但标题行不在屏幕上时,我希望标题保留在查看区域的顶部可见。
从概念上讲,这将类似于Excel中的“冻结窗格”功能。但是,HTML页面中可能包含多个表,并且我只希望它在当前处于可见状态的表中发生,只有在处于可见状态时才发生。
注意:我已经看到了一种解决方案,其中表数据区域可滚动而标题不滚动。那不是我要找的解决方案。
我希望能够“调整” HTML表的演示文稿以添加一个功能:向下滚动页面以使表在屏幕上但标题行不在屏幕上时,我希望标题保留在查看区域的顶部可见。
从概念上讲,这将类似于Excel中的“冻结窗格”功能。但是,HTML页面中可能包含多个表,并且我只希望它在当前处于可见状态的表中发生,只有在处于可见状态时才发生。
注意:我已经看到了一种解决方案,其中表数据区域可滚动而标题不滚动。那不是我要找的解决方案。
Answers:
查看jQuery.floatThead(演示可用),它非常酷,可以与DataTables一起使用,甚至可以在overflow: auto
容器内工作。
我已经使用jQuery提出了概念验证解决方案。
现在,我在Mercurial bitbucket存储库中获得了此代码。主文件是tables.html
。
我知道一个问题:如果表包含锚点,并且如果您在浏览器中使用指定的锚点打开URL,则在页面加载时,带有锚点的行可能会被浮动标头遮盖。
2017年12月11日更新:我认为这不适用于当前的Firefox(57)和Chrome(63)。不知道什么时候,为什么停止工作,或如何修复它。但是现在,我认为Hendy Irawan接受的答案是优越的。
floatingHeaderRow.css("top", Math.min(scrollTop - offset.top, $(this).height() - floatingHeaderRow.height()) + "px");
到floatingHeaderRow.css("top", scrollTop + "px");
与你的代码有表头进一步跳下页,最终消失在页。
// Copy cell widths from original header
代码的一部分)。@克雷格·麦昆(Craig McQueen),请修改您的答案,以便其他人都不会犯此错误。
Craig,我对您的代码进行了一些改进(它现在使用position:fixed进行了其他操作),并将其包装为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元素只有1行,则第一行同时也是最后一行,并且需要第一个子规则覆盖最后一个孩子。如果不是这样,那么您将使行距上边距有30 px的偏移量,我想这是您不希望的。
位置的一个已知问题:粘性是它不适用于thead元素或表格行:您必须定位到th个元素。跳出此问题将在将来的浏览器版本中解决。
thead tr+tr th
定位第二行。
可能的选择
js-floating-table-headers
js-floating-table-headers(Google代码)
在Drupal中
我有一个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');
我最近遇到了这个问题。不幸的是,我不得不做2张桌子,一张用于标题,另一张用于正文。这可能不是最好的方法,但是可以:
<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>
注意:表被包装到DIV中,其类属性等于“ table-holder”。
以下是我在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粘滞头插件中可用
display: fixed
在thead
部分中使用应该可以,但是因为它仅适用于视图中的当前表,因此您将需要JavaScript的帮助。这将很棘手,因为它将需要找出相对于视口的元素的滚动位置和位置,这是浏览器不兼容的主要方面之一。
看一下流行的JavaScript框架(jQuery,MooTools,YUI等),看看它们是否可以执行您想要的操作或使其更容易执行您想要的操作。
position: fixed
。抱歉,它在Chrome中不起作用。
如果您使用全屏表格,则可能有兴趣将其设置为display:fixed; 和top:0; 或尝试通过CSS非常类似的方法。
更新资料
只需使用iframe(html4.0)快速构建一个可行的解决方案即可。此示例不符合标准,但是您可以轻松修复它:
outside.html
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Outer</title>
<body>
<iframe src="test.html" width="200" height="100"></iframe>
</body>
</html>
test.html
<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Floating</title>
<style type="text/css">
.content{
position:relative;
}
thead{
background-color:red;
position:fixed;
top:0;
}
</style>
<body>
<div class="content">
<table>
<thead>
<tr class="top"><td>Title</td></tr>
</head>
<tbody>
<tr><td>a</td></tr>
<tr><td>b</td></tr>
<tr><td>c</td></tr>
<tr><td>d</td></tr>
<tr><td>e</td></tr>
<tr><td>e</td></tr>
<tr><td>e</td></tr>
<tr><td>e</td></tr>
<tr><td>e</td></tr>
<tr><td>e</td></tr>
</tbody>
</table>
</div>
</body>
</html>
仅使用CSS的最简单答案:D !!!
table {
/* Not required only for visualizing */
border-collapse: collapse;
width: 100%;
}
table thead tr th {
/* you could also change td instead th depending your html code */
background-color: green;
position: sticky;
z-index: 100;
top: 0;
}
td {
/* Not required only for visualizing */
padding: 1em;
}
<table>
<thead>
<tr>
<th>Col1</th>
<th>Col2</th>
<th>Col3</th>
</tr>
</thead>
<tbody>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>data</td>
<td>data</td>
<td>data</td>
</tr>
<tr>
<td>david</td>
<td>castro</td>
<td>rocks!</td>
</tr>
</tbody>
</table>
这概念证明你做是伟大的!但是我也发现这个jQuery插件似乎运行得很好。希望能帮助到你!
令人沮丧的是,在一种浏览器中行之有效的在其他浏览器中行不通。以下内容适用于Firefox,但不适用于Chrome或IE:
<table width="80%">
<thead>
<tr>
<th>Column 1</th>
<th>Column 2</th>
<th>Column 3</th>
</tr>
</thead>
<tbody style="height:50px; overflow:auto">
<tr>
<td>Cell A1</td>
<td>Cell B1</td>
<td>Cell C1</td>
</tr>
<tr>
<td>Cell A2</td>
<td>Cell B2</td>
<td>Cell C2</td>
</tr>
<tr>
<td>Cell A3</td>
<td>Cell B3</td>
<td>Cell C3</td>
</tr>
</tbody>
</table>
px
啊 显示设备使用72 dpi时,是90年代人们使用的传统单位吗?