利用jQuery制作简易的table上下无缝轮播

<!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">
    <title>Document</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.7.0/jquery.min.js"></script>

    <style>
        .box {
            /* 最外层可显示的高度 */
            height: 200px;
            overflow: hidden;
        }

        .table {
            width: 600px
        }

        .thead,
        .tbody {
            position: relative;
        }

        .thead {
            z-index: 1;
            background: darkgray;
        }

        .tbody {
            z-index: 0;
        }
    </style>
</head>

<body>
    <div class="box">
        <table class="table" border=1 cellspacing=0>
            <thead class="thead">
                <tr>
                    <th>序号</th>
                    <th>名字</th>
                    <th>年龄</th>
                    <th>性别</th>
                    <th>测试1</th>
                </tr>
            </thead>
            <tbody class="tbody">

            </tbody>
        </table>
    </div>
    <script>

        // 加载数据
        for (let i = 0; i < 20; i++) {
            var row = [
                '<tr>',
                '<td title="' + i + 1 + '">' + i + 1 + '</td>',
                '<td>' + '名字' + i + '</td>',
                '<td>' + '年龄' + i + '</td>',
                '<td>' + '性别' + i + '</td>',
                '<td>' + '测试1--' + i + '</td>',
                '</tr>'
            ].join('')
            console.log(row)
            $('.box tbody').append(row)
        }

        startRoll(50)  //50为时间
        function startRoll(time) {
            let timer = null
            //默认初始值为自己本身的top
            let top = $(".tbody").css('top')
            let offsetTop = top.substring(0, top.indexOf('px'))
            startFun(time)
            function startFun(time) {
                timer = setInterval(() => {
                    //比较数据的长度是否超过div的高度,没超过不开始轮播
                    if (!heightComparison()) {
                        clearTimeout(timer)
                        return false
                    }
                    offsetTop -= 1

                    let body_tbody = $("tbody")   //定义 tbody为body_tbody
                    let scrollHeight = body_tbody.find("tr").outerHeight(true);   //获取  tr的高度
                    
                    let tbodyTopPX = body_tbody.css('top');      // 获取tbody的top值
                    let tbodyTop = tbodyTopPX.substring(0, tbodyTopPX.indexOf('px'))
                    
                    body_tbody.css({ 'top': offsetTop + 'px' })     //改变tbody的top    令tbody向上移动
                    
                    if (tbodyTop != 0 && parseInt(tbodyTop) % Math.ceil(scrollHeight) === 0) {         //  tbodyTop的top值是 tr高度的倍数时    将第一个tr移动到最后并让tbodyTop的top值减去tr的高度
                        body_tbody.find("tr:first").appendTo(body_tbody);
                        offsetTop += scrollHeight
                        body_tbody.css({ 'top': offsetTop + 'px' })
                    }

                }, time)
            }
            $(".box").mouseover(function () {
                // 鼠标移入  关闭轮播
                clearTimeout(timer)
            });
            $(".box").mouseout(function () {
                // 鼠标移出  重新开启轮播
                startFun(time)
            });
        }

        function heightComparison() {
            let divHeight = $(".box").height();    //最外层div的高度  用来比较数据的长度是否超过div的高度,没超过不开始轮播
            let tbodyHeight = $(".tbody").height();
            let tHeadHeight = $(".thead").height();
            return tbodyHeight > divHeight - tHeadHeight
        }

    </script>
</body>

</html>

 

posted @ 2023-06-15 15:32  Z-HarOld  阅读(427)  评论(0编辑  收藏  举报