带有 Firefox/IE 的粘性表头 [英] Sticky table headers with firefox / IE

查看:21
本文介绍了带有 Firefox/IE 的粘性表头的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用带有 display:table 的 div,并且我正在尝试创建粘性标题.Chrome 支持 position:stickydisplay:table-row,但 firefox 和 IE 不支持.因此,我创建了一个代码,将滚动时的 div 位置更改为固定",将顶部更改为 0.这得到了相同的结果.

但是,当将位置更改为固定"时,标题行不再是表格的一部分,因此其宽度发生了变化.(并且不再与其他表格行同步)

我尝试通过保存每列的宽度然后再次设置来修复它,但这非常有问题.

我正在寻找一种解决方案,它可以让我将位置更改为固定",但不会更改顶行的宽度,并且它将与表格的其余部分保持连接.

有什么想法吗?

$(window).scroll(function(){if (window.pageYOffset >= $('.table').offset().top){$('.row_header').css('position','fixed');$('.row_header').css('top',0);}别的{$('.row_header').offset({ top: $('.table').offset().top});$('.row_header').css('position','static');//console.log('satic');}});

.wrapper{填充:10px;显示:弹性;对齐内容:中心;对齐项目:居中;}.桌子{显示:表;边距:0 0 40px 0;最大宽度:100%;}.排 {显示:表格行;}.细胞 {显示:表格单元格;边框:1px纯黑色;填充:2px;}.row_header {显示:表格行;背景:#ADD8E6;}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script><script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min.js"></script><p align=center><b>滚动查看问题...</b><div class="wrapper"><div class="table"><div class="row_header"><div class="cell">名称</div><div class="cell">年龄</div><div class="cell">站点</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

<div class="row"><div class="cell">David</div><div class="cell">33</div><div class="cell">堆栈溢出</div>

解决方案

好吧,这是一个棘手的问题,但是这里是解决方案,我以前在这个问题上花了很多时间.:/

首先在 .row_header 中添加两个 span 元素:

一旦 DOM 加载并呈现表格,您就可以计算每列的单元格大小,因为它们是由表格任意呈现的.在示例中,我从 .row_header 计算 - 这并不重要,因为它首先与所有表格内容一起呈现.然后将此宽度应用于 .row_header 内的 span 元素.

其余的我从你那里拿走了.有点晚了,有点累,但我相信你可以避免任意设置负边距来对齐 .fixed 跨度.然而,整个想法和实现都在这里.

这是一个工作小提琴:

https://jsfiddle.net/k7ep2Lq0/1/

I am using a div with display:table and I am trying to create sticky headers. Chrome supports position:sticky with display:table-row but firefox and IE do not. Therefore, I created a code that changes the div position to "fixed" on scroll and the top to 0. This gets the same result.

However, when changing the position to "fixed" the header row stops being a part of the table and therefore it's width is changed. (And is no longer synced with the other table rows)

I tried to fix it with saving the width of each column and then setting it again, but that's extremely buggy.

I am looking for a solution that will allow me to change the position to "fixed" but will not change the top row width and it will stay connected with the rest of the table.

Any ideas?

$(window).scroll(function() 
{
  	if (window.pageYOffset >= $('.table').offset().top) 
	{
		$('.row_header').css('position','fixed');
		$('.row_header').css('top',0);
	}

	else
	{
	
		$('.row_header').offset({ top: $('.table').offset().top});
		$('.row_header').css('position','static');
		
		//console.log('satic');
	}

});

.wrapper{

padding:10px;


 
  display:flex;
  justify-content:center;
  align-items:center;
}

.table{
  display:table;
  margin: 0 0 40px 0;
 max-width: 100%;
  
}

.row {
  display: table-row;

}

.cell {
  display: table-cell;
  border:1px solid black;
  padding:2px;


}

.row_header {
	display: table-row;

 background: #ADD8E6;


}

<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.11.1/jquery-ui.min.js"></script>

<p align=center><b>Scroll to see the problem...</b>
<div class="wrapper">
<div class="table">
	<div class="row_header">
		<div class="cell">Name</div>
		<div class="cell">Age</div>
		<div class="cell">Site</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	<div class="row">
		<div class="cell">David</div>
		<div class="cell">33</div>
		<div class="cell">Stack overflow</div>
	</div>
	
	
	
	
</div>
</div>

解决方案

Well, here goes, this is a tough one, however here is the solution, I have previously spent a lot of time on this one. :/

First of all you add two span elements inside the .row_header:

As soon as the DOM loads and the table renders, you calculate the cell sizes from each column as they are arbitrarily rendered by the table. In the example I calculate from the .row_header - it doesn't matter since it is rendered alongside all the table content in the first place. Then you apply this width on the span elements inside the .row_header.

The rest I took from you. It's a bit late and am a bit tired, but I am sure you can avoid the arbitrarily set negative margin to align the .fixed spans. However, the whole idea and implementation is here.

Here is a working fiddle:

https://jsfiddle.net/k7ep2Lq0/1/

这篇关于带有 Firefox/IE 的粘性表头的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
前端开发最新文章
热门教程
热门工具
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆