美文网首页
jquery虚拟滚动插件

jquery虚拟滚动插件

作者: 海豚先生的博客 | 来源:发表于2024-10-14 11:01 被阅读0次

复制完,用vscode,Go-Live直接运行查看效果
可自行改造,比如类名、高度重写,增加入参等
html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>虚拟滚动示例</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <script src="./a.js"></script> <!-- 插件路径 -->
    <style>
        .item {
            background-color: #f9f9f9;
            border: 1px solid #ccc;
        }
    </style>
</head>
<body>

<div id="virtual-scroll-container"></div>

<script>
    $(document).ready(function() {
        var items = [];
        for (var i = 1; i <= 100; i++) {
            items.push({name:'Item ' + i, id: i});
        }
console.log(items);

        $('#virtual-scroll-container').virtualScroll({
            itemHeight: 30, // 每个项目的高度
            items: items,    // 数据数组
            visibleItems: 10, // 可见项目数量
            onClickItem: (itemData) => {
                console.log('111',itemData);
                
            }
        });
    });
</script>

</body>
</html>

js

(function($) {
    $.fn.virtualScroll = function(options) {
        // 默认设置
        var settings = $.extend({
            itemHeight: 20, // 每个项的高度
            items: [],      // 列表数据
            visibleItems: 10 // 可见项数量
        }, options);

        // 插件初始化
        return this.each(function() {
            var $container = $(this);
            $container.css({
                position: 'relative',
                overflow: 'auto',
                height: settings.itemHeight * settings.visibleItems
            });

            // 计算总高度
            var totalHeight = settings.itemHeight * settings.items.length;

            // 创建一个虚拟列表
            var $viewport = $('<div class="viewport"></div>').css({
                position: 'absolute',
                height: totalHeight,
                width: '100%',
                top: 0
            }).appendTo($container);

            // 渲染可见的列表项
            function renderItems(startIndex) {
                // 清空视口内容
                var $itemsContainer = $('<div class="items-container"></div>').css({
                    position: 'absolute',
                    top: startIndex * settings.itemHeight + 'px',
                    width: '100%'
                });

                var endIndex = Math.min(startIndex + settings.visibleItems, settings.items.length);

                for (let i = startIndex; i < endIndex; i++) {
                    var $item = $('<div class="item"></div>').css({
                        height: settings.itemHeight,
                    }).text(settings.items[i].name);
                    $item.on('click', (e)=> {
                        console.log('index', i, settings.items[i]);
                        options.onClickItem(settings.items[i])
                    })
                    $itemsContainer.append($item);
                }

                // 添加项目容器到视口
                $viewport.empty().append($itemsContainer);
            }

            // 滚动事件
            $container.on('scroll', function() {
                var scrollTop = $container.scrollTop();
                var startIndex = Math.floor(scrollTop / settings.itemHeight);
                renderItems(startIndex);
            });

            // 初始化渲染
            renderItems(0);
        });
    };
}(jQuery));

相关文章

网友评论

      本文标题:jquery虚拟滚动插件

      本文链接:https://www.haomeiwen.com/subject/goaarjtx.html