滚动带阴影效果
代码
<!doctype html>
<html lang="zh">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>table冻结单元格</title>
<style>
body {
background: gray;
}
.box {
width: 800px;
height: 400px;
overflow: auto;
}
table {
border-collapse: collapse;
width: 1000px;
height: auto;
}
td {
width: 100px;
height: 50px;
border: none;
padding: 10px;
box-sizing: border-box;
position: relative;
z-index: 1;
background: #cccccc;
}
td::before {
content: "";
width: 100%;
height: 100%;
position: absolute;
z-index: 1;
top: 0;
left: 0;
border-top: 1px solid #505050;
border-left: 1px solid #505050;
box-sizing: border-box;
}
tr:last-child td::before {
border-bottom: 1px solid #505050;
}
td:last-child::before {
border-right: 1px solid #505050;
}
tr:nth-child(-n + 2) td,
tr:nth-last-child(1) td,
td:nth-child(-n + 2),
td:nth-last-child(1)
{
position: sticky;
background: #00aa00;
z-index: 2;
}
tr:nth-child(1) td {
top: 0;
}
tr:nth-child(2) td {
top: 50px;
}
tr:nth-last-child(1) td {
bottom: 0;
}
td:nth-child(1) {
left: 0;
}
td:nth-child(2) {
left: 100px;
}
td:nth-last-child(1) {
right: 0;
}
tr:nth-child(-n + 2) td:nth-child(-n + 2),
tr:nth-child(-n + 2) td:nth-last-child(1),
tr:nth-last-child(1) td:nth-child(-n + 2),
tr:nth-last-child(1) td:nth-last-child(1)
{
background: red;
z-index: 9 !important;
}
.shadow-top tr:nth-child(2) td::after {
content: "";
position: absolute;
left: 0;
width: 100%;
height: 10px;
bottom: -10px;
background: linear-gradient(to bottom, #505050, transparent);
}
.shadow-bottom tr:nth-last-child(1) td::after {
content: "";
position: absolute;
left: 0;
width: 100%;
height: 10px;
top: -10px;
background: linear-gradient(to top, #505050, transparent);
}
.shadow-left td:nth-child(2)::after {
content: "";
position: absolute;
top: 0;
width: 10px;
height: 100%;
right: -10px;
background: linear-gradient(to right, #505050, transparent);
}
.shadow-right td:nth-last-child(1)::after {
content: "";
position: absolute;
top: 0;
width: 10px;
height: 100%;
left: -10px;
background: linear-gradient(to left, #505050, transparent);
}
.shadow-y td:nth-child(-n + 2),
.shadow-y td:nth-last-child(1)
{
z-index: 3;
}
.shadow-x tr:nth-child(-n + 2) td,
.shadow-x tr:nth-last-child(1) td
{
z-index: 3;
}
</style>
</head>
<body>
<div class="box">
<table>
<tr>
<td>标题1</td>
<td>标题2</td>
<td>标题3</td>
<td>标题4</td>
<td>标题5</td>
<td>标题6</td>
<td>标题7</td>
<td>标题8</td>
<td>标题9</td>
<td>标题10</td>
</tr>
<tr>
<td>栏目1</td>
<td>栏目2</td>
<td>数据3</td>
<td>数据4</td>
<td>数据5</td>
<td>数据6</td>
<td>数据7</td>
<td>数据8</td>
<td>数据9</td>
<td>数据10</td>
</tr>
<tr>
<td>栏目1</td>
<td>栏目2</td>
<td>数据3</td>
<td>数据4</td>
<td>数据5</td>
<td>数据6</td>
<td>数据7</td>
<td>数据8</td>
<td>数据9</td>
<td>数据10</td>
</tr>
<tr>
<td>栏目1</td>
<td>栏目2</td>
<td>数据3</td>
<td>数据4</td>
<td>数据5</td>
<td>数据6</td>
<td>数据7</td>
<td>数据8</td>
<td>数据9</td>
<td>数据10</td>
</tr>
<tr>
<td>栏目1</td>
<td>栏目2</td>
<td>数据3</td>
<td>数据4</td>
<td>数据5</td>
<td>数据6</td>
<td>数据7</td>
<td>数据8</td>
<td>数据9</td>
<td>数据10</td>
</tr>
<tr>
<td>栏目1</td>
<td>栏目2</td>
<td>数据3</td>
<td>数据4</td>
<td>数据5</td>
<td>数据6</td>
<td>数据7</td>
<td>数据8</td>
<td>数据9</td>
<td>数据10</td>
</tr>
<tr>
<td>栏目1</td>
<td>栏目2</td>
<td>数据3</td>
<td>数据4</td>
<td>数据5</td>
<td>数据6</td>
<td>数据7</td>
<td>数据8</td>
<td>数据9</td>
<td>数据10</td>
</tr>
<tr>
<td>栏目1</td>
<td>栏目2</td>
<td>数据3</td>
<td>数据4</td>
<td>数据5</td>
<td>数据6</td>
<td>数据7</td>
<td>数据8</td>
<td>数据9</td>
<td>数据10</td>
</tr>
<tr>
<td>栏目1</td>
<td>栏目2</td>
<td>数据3</td>
<td>数据4</td>
<td>数据5</td>
<td>数据6</td>
<td>数据7</td>
<td>数据8</td>
<td>数据9</td>
<td>数据10</td>
</tr>
<tr>
<td>总计1</td>
<td>总计2</td>
<td>总计3</td>
<td>总计4</td>
<td>总计5</td>
<td>总计6</td>
<td>总计7</td>
<td>总计8</td>
<td>总计9</td>
<td>总计10</td>
</tr>
</table>
</div>
<script>
var box = document.querySelector('.box');
var lastScrollTop = 0, lastScrollLeft = 0;
box.addEventListener('scroll', function (e) {
if (e.target.scrollTop !== lastScrollTop) {
lastScrollTop = e.target.scrollTop;
box.classList.remove('shadow-left');
box.classList.remove('shadow-right');
if (lastScrollTop === 0) {
box.classList.remove('shadow-top');
}
else {
box.classList.add('shadow-top');
}
if (lastScrollTop + box.clientHeight === box.scrollHeight) {
box.classList.remove('shadow-bottom');
}
else {
box.classList.add('shadow-bottom');
}
box.classList.remove('shadow-x');
box.classList.add('shadow-y');
}
else if (e.target.scrollLeft !== lastScrollLeft) {
lastScrollLeft = e.target.scrollLeft;
box.classList.remove('shadow-top');
box.classList.remove('shadow-bottom');
if (lastScrollLeft === 0) {
box.classList.remove('shadow-left');
}
else {
box.classList.add('shadow-left');
}
if (lastScrollLeft + box.clientWidth === box.scrollWidth) {
box.classList.remove('shadow-right');
}
else {
box.classList.add('shadow-right');
}
box.classList.remove('shadow-y');
box.classList.add('shadow-x');
}
});
</script>
</body>
</html>