关于原生js的表格滚动

博客介绍了前端开发中表格交互效果的实现。在HTML部分,固定thead,让tbody滚动并隐藏溢出;CSS部分设定表格盒子大小;JS部分通过DOM操作处理鼠标事件、数据渲染及背景颜色设置等。

1、html部分:

对thead进行固定

tbody使用盒子scroll进行滚动  ,外面一层盒子启用溢出隐藏

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link href="style.css" rel="stylesheet" type="text/css" />
    <title>InsCode</title>
</head>
<body>
  <div class="right-bottom">
                    <div class="right-bottom-left" id="right-bottom"></div>
                    <div class="right-bottom-right">
                        <table>
                            <thead>
                                <tr>
                                    <th>时间</th>
                                    <th>城市</th>
                                    <th>最高温度</th>
                                    <th>最低气温</th>
                                </tr>
                            </thead>
                        </table>

                        <div style="overflow:hidden;"><!-- //隐藏溢出 -->
                            <div class="scroll"><!-- //控制滚动 -->

                                <table>
                                    <tbody>

                                    </tbody>
                                </table>

                            </div>
                        </div>

                    </div>
    <script src="script.js"></script>
</body>
</html>

2、css部分

对盒子表格进行大小宽高的设定

.right-bottom{
    width: 100vw;
    height: 100vh;
}

.right-bottom-right {
    width:100%;
    overflow: hidden;
    /* 隐藏溢出内容 */
    border-radius: 1vh;

}

thead {

    background-color: #22c77a;
}

.right-bottom-right .scroll {
    width: 100%;
    overflow: hidden;
}


.right-bottom-right table {
    width: 100%;
    border-collapse: collapse;
}

.right-bottom-right table thead tr th {
    width: 25%;
    border: solid 0.25vw #256fa8;
    text-align: center;
}

.right-bottom-right table tbody tr td {
    width: 25%;
    border: solid 0.25vw #256fa8;
    text-align: center;
}

3、js部分

使用dom操作对鼠标经过离开等操作进行操作,数据遍历渲染,背景颜色等等设置

 
 
    const tbody = document.querySelector('.right-bottom-right tbody');
 
 
//数据
jsd={
城市:  ['中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市', '中卫市', '吴忠市', '固原市', '石嘴山市', '银川市'],
年份: [2011, 2011, 2011, 2011, 2011, 2012, 2012, 2012, 2012, 2012, 2013, 2013, 2013, 2013, 2013, 2014, 2014, 2014, 2014, 2014, 2015, 2015, 2015, 2015, 2015, 2016, 2016, 2016, 2016, 2016, 2017, 2017, 2017, 2017, 2017, 2018, 2018, 2018, 2018, 2018, 2019, 2019, 2019, 2019, 2019, 2020, 2020, 2020, 2020, 2020, 2021, 2021, 2021, 2021, 2021, 2022, 2022, 2022, 2022, 2022, 2023, 2023, 2023, 2023, 2023],
最低温:  [-20, -19, -21, -22, -19, -23, -18, -22, -23, -19, -17, -18, -17, -24, -19, -18, -15, -26, -20, -16, -15, -13, -16, -18, -14, -24, -20, -24, -26, -22, -17, -14, -14, -21, -18, -17, -16, -16, -23, -18, -15, -13, -13, -20, -16, -21, -19, -19, -26, -19, -21, -20, -20, -25, -21, -17, -16, -17, -21, -16, -21, -20, -19, -22, -19],
最高温: [36, 37, 31, 37, 37, 35, 36, 30, 35, 35, 36, 36, 31, 36, 36, 37, 38, 32, 38, 38, 36, 38, 32, 38, 37, 36, 37, 31, 37, 37, 38, 40, 32, 40, 39, 35, 36, 29, 37, 36, 36, 36, 31, 36, 36, 35, 37, 29, 37, 37, 37, 39, 33, 39, 38, 38, 38, 31, 38, 37, 36, 35, 31, 37, 36]
}

 for (let n = 0; n < jsd['城市'].length; n++) {
                const tr = document.createElement('tr')
                if (n % 2 === 0) {
                    tr.style.backgroundColor = '#1974b5'
                } else {
                    tr.style.backgroundColor = '#24dcba'
                }
                //获取数据渲染
                tr.innerHTML =
                    `<td>${jsd['年份'][n]}</td>
                     <td>${jsd['城市'][n]}</td>
                     <td>${jsd['最高温'][n]}</td>
                     <td>${jsd['最低温'][n]}</td>`;
                //追加节点到父元素的子节点的最后一位
                tbody.appendChild(tr)
            }

            let scrollBox = document.querySelector('.right-bottom-right .scroll');

            let distance = 0;
            //设置全局变量控制定时器
            let p
            //滚动函数
            function time() {
                p = setInterval(function () {
                    distance += 1;
                    scrollBox.style.transform = 'translateY(-' + distance + 'px)';
                    //当滚动到最底部时跳会最初位置滚动,实现无限滚动
                    if (scrollBox.style.transform == 'translateY(-1500px)') {//translateY(-1500px)设置看数据长度如何
                        distance = 0
                    }
                }, 90);
            }
            //打开大屏执行滚动
            folg = true
            if (folg) {
                {
                    time()
                    folg = !folg
                }
            }

            scrollBox.addEventListener('mouseout', function () {
                //调用滚动函数
                time()

            }



            )
            scrollBox.addEventListener('mouseover', function () {
                //鼠标悬停暂停
                clearInterval(p)
            })

<think>好的,用户的问题是关于如何在HTML原生表格中实现滚动效果,特别是使用CSS来控制溢出。我需要先回忆一下相关的知识,然后结合提供的引用内容来整理答案。 首先,用户提到了原生表格滚动效果,可能他们不想使用JavaScript库,而是用纯HTML和CSS实现。根据引用中的信息,特别是引用[2]和[3],里面有提到通过CSS控制滚动条样式和粘性定位,以及通过调整margin-top来实现轮询滚动。不过用户可能更想要的是固定表头、滚动表格内容,或者水平滚动整个表格而不影响垂直方向。 引用[2]中的方法是使用JS控制margin-top来轮询数据,这可能适用于行级滚动,但用户可能想要的是纯CSS的解决方案。引用[3]提到了使用position: sticky来实现表头固定,但需要注意在th上应用而不是thead或tr。引用[4]则关于调整列宽,可能不相关,但可以忽略。 接下来,我需要确定如何用CSS实现表格滚动。通常,表格溢出滚动需要将表格包裹在一个容器中,设置容器的overflow属性为auto或scroll,并限制其高度或宽度。例如,垂直滚动可以设置容器高度,overflow-y: auto;水平滚动则设置overflow-x: auto。对于固定表头,可能需要将thead和tbody分开,或者使用position: sticky来固定表头。 根据引用[3],position: sticky在th上有效,所以可以这样实现表头固定。同时,水平滚动需要容器宽度受限,overflow-x: auto。如果同时需要垂直和水平滚动,可能需要不同的结构。例如,固定表头垂直滚动,而整个表格水平滚动。 可能需要分步骤说明几种情况:垂直滚动表格内容、水平滚动整个表格、固定表头滚动内容。同时,用户可能希望表格标题不滚动,而数据部分滚动,这需要结构上的调整,比如将thead和tbody分开,并设置tbody在一个滚动容器内。 另外,引用[2]中的轮询滚动是通过JS实现的,但用户可能不需要动态内容,只是静态滚动。所以应该专注于CSS的overflow属性和容器设置。 总结步骤: 1. 垂直滚动表格内容:将表格包裹在div中,设置固定高度和overflow-y: auto。 2. 水平滚动整个表格:同样用div包裹,设置overflow-x: auto。 3. 固定表头:使用position: sticky在th元素上,并确保父容器有overflow: auto。 4. 组合垂直和水平滚动,可能需要嵌套容器或调整布局。 需要检查每个方法的代码示例是否正确,并确保引用的信息准确。例如,引用[3]提到sticky定位在th上有效,所以可以应用在表头固定。而垂直滚动可能需要将tbody单独设置为可滚动区域,但原生table结构可能不支持直接对tbody设置overflow,因此可能需要使用div包裹表格或调整display属性。 可能的解决方案包括: - 使用div包裹整个表格,设置overflow为auto,并固定高度或宽度。 - 拆分thead和tbody,将tbody放入可滚动的div中,但这样可能破坏表格结构,需要使用display: block等属性,但可能影响表格布局。 需要确认哪种方法更可行。例如,将表格的display设置为block,使得tbody可以滚动。例如: ```css .table-container { overflow-y: auto; height: 300px; } table { width: 100%; } thead, tbody { display: block; } tbody { overflow-y: auto; } ``` 但这种方法可能会导致列对齐问题,需要固定列宽。 综合引用内容,正确的做法可能是使用position: sticky来固定表头,并结合overflow属性实现滚动。例如: ```html <div class="table-wrapper"> <table> <thead> <tr><th style="position: sticky; top: 0;">标题</th></tr> </thead> <tbody> <!-- 数据行 --> </tbody> </table> </div> <style> .table-wrapper { max-height: 300px; overflow: auto; } th { position: sticky; top: 0; background: white; } </style> ``` 这样,当表格内容超过容器高度时,垂直滚动会出现,而表头会固定在顶部。同时,引用[3]中提到sticky在th上有效,所以这个方法是可行的。 对于水平滚动,可以设置.table-wrapper的overflow-x: auto,并确保表格宽度足够宽,或者设置表格宽度为100%。 总结答案时,需要分点说明不同滚动需求的方法,并提供代码示例,同时引用相关的引用内容,如引用[3]关于sticky定位的应用。</think>### 如何在HTML原生表格中实现滚动效果? 在原生HTML表格中实现滚动效果,需通过CSS控制容器尺寸和溢出属性,结合表格结构调整。以下是具体方法: --- #### 方法1:垂直滚动(固定表头,内容滚动) 1. **将表格包裹在容器中**,限制容器高度并启用垂直滚动: ```html <div class="table-container"> <table> <thead> <tr><th>标题1</th><th>标题2</th></tr> </thead> <tbody> <!-- 多行数据 --> </tbody> </table> </div> ``` ```css .table-container { max-height: 300px; /* 限制高度 */ overflow-y: auto; /* 垂直滚动 */ } th { position: sticky; /* 固定表头 */ top: 0; background: white; /* 避免透明重叠 */ } ``` 2. **原理**:容器高度超出时触发滚动,`position: sticky`使表头固定[^3]。 --- #### 方法2:水平滚动(整表横向滚动) 1. **包裹表格并启用水平滚动**: ```html <div class="table-scroll-x"> <table style="min-width: 800px;"> <!-- 表格宽度超出容器 --> <!-- 表头和数据 --> </table> </div> ``` ```css .table-scroll-x { overflow-x: auto; /* 水平滚动 */ } ``` 2. **适用场景**:列数过多时,保持容器宽度固定,拖动滚动条查看内容。 --- #### 方法3:组合滚动(水平+垂直) ```html <div class="table-wrapper" style="max-height: 300px; overflow: auto;"> <table style="min-width: 1000px;"> <thead> <tr><th style="position: sticky; top: 0;">标题</th></tr> </thead> <tbody><!-- 数据 --></tbody> </table> </div> ``` - **效果**:垂直和水平方向均可滚动,表头固定[^3]。 --- #### 方法4:仅内容区域滚动(分离表头与数据) ```css table { display: block; height: 200px; overflow-y: auto; } thead, tbody { display: block; } ``` - **注意**:需为列设置固定宽度,否则可能出现错位。 --- ### 关键点总结 1. **容器包裹**:通过`overflow: auto`或`overflow-x/overflow-y`控制滚动方向。 2. **固定表头**:使用`position: sticky`实现,需指定`top`值。 3. **兼容性**:`sticky`定位在现代浏览器中支持良好,IE不兼容。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值