一、需求描述
有些报表会很宽,浏览器水平放不下,需要水平滚动显示,这个可以设置overflow-y:hidden实现,很基本的实现,没什么难度。
但是,如果同时希望垂直滚动的时候,表格头是固定的。此时该如何实现呢?
此时,使用传统的position:fixed定位是不行的,因为此时水平滚动也会纹丝不动。
此时可以试试position:sticky粘性定位试试。
实现的原理其实挺简单的:
使用同一个滚动容器;
导航元素设置如下CSS属性:
.header {
position: sticky;
top: 0;
}
三、表格头同样支持
如果是<table>表格,同样可以实现类似的效果。
需要注意的是,position:sticky粘性定位设置在tr或者thead标签上是没有效果的,所幸设置在th标签上是可以的,因此,如果希望表格头水平滚动,垂直不滚动,可以使用下面的CSS代码:
th {
position: sticky;
top: 0;
}
四、滚动嵌套也是一种选择
就是水平滚动和垂直滚动通过嵌套实现,这个效果的局限比较大,需要对HTML类型和结构有要求,以及比较适合移动端,或者需要隐藏滚动条的场景。
假设HTML如下:
<div class="box-1">
<div class="box-2">
<div class="header">
<nav>导航1</nav>
<nav>导航2</nav>
<nav>导航3</nav>
</div>
<div class="content">
< img src="1.jpg">
< img src="1.jpg">
< img src="1.jpg">
</div>
</div>
</div>
CSS是这样的:
.box-1 {
max-width: 600px;
overflow-y: hidden;
}
.box-2 {
display: inline-table;
}
.header {
display: flex;
}
.header nav {
flex: auto;
background: #333;
color: #fff;
}
.content {
height: 200px;
overflow: auto;
white-space: nowrap;
}
如果宽度已知
如果宽度已知,还可以利用绝对定位元素的包含块规则,实现水平滚动,垂直不滚动的效果。
HTML结构同上,CSS这里发生变化:
.box-1 {
max-width: 600px;
overflow-y: hidden;
position: relative;
}
.box-2 {
width: 800px; height: 200px;
overflow: auto;
}
.header {
display: flex;
position: absolute;
width: inherit;
}
.header nav {
flex: auto;
background: #333;
color: #fff;
border: 1px solid;
}