JS前端列表加载三种方案:分页、按钮与滚动实现

作者:半夏

时间:2026-10-25

浏览:635

本文总结前端开发中三种常用的页面列表加载方法:分页加载、按钮加载和滚动加载。通过封装JavaScript函数,利用axios获取JSONPlaceholder数据,分别实现固定条数分页、点击按钮追加内容以及滚动到底部自动加载的功能。文章提供完整的HTML结构、CSS样式及JS逻辑代码,帮助开发者快速掌握不同场景下的列表渲染技巧。

文章目录

导语:近期因事务繁忙,技术总结有所延迟。今日得以梳理思路,重点回顾前端开发中常见的页面列表加载方式。本文将详细介绍三种主流方案:分页加载、按钮加载以及滚动加载。

方法简介

在前端开发实践中,列表数据往往过长无法一次性展示,因此需要采用分页机制。每页固定显示指定数量的条目,并在下方展示页码导航,用户点击特定页码即可加载并显示对应页面的内容。

除分页外,点击按钮加载也是一种常见方式。这种方式无需用户切换页码,只需点击“加载更多”按钮,即可在当前列表末尾追加下一页的数据,操作更为便捷直观。

此外,滚动加载应用广泛。下文将对上述三种加载方式进行原理剖析与代码实现总结,供开发者参考使用。

封装实现

接下来,我们将分别解析这三种方法的原理,并提供具体的代码实现方案。

示例列表数据来源于JSONPlaceholder站点,用于模拟真实接口数据。

分页加载

当页面需要展示大量列表或表格数据且无法一次性容纳时,可将全部数据划分为多页。每页显示固定数量的条目,计算总页数后,通过渲染对应页码的数据即可实现分页展示。

页面布局

<div class="wrap">
    <ul id="list"></ul>
    <ul id="pages"></ul>
</div>
.wrap {
    max-width: 960px;
    margin: 0 auto;
    padding: 15px 0;
}
 
.wrap li {
    padding: 5px 0;
    list-style: square;
}
 
.wrap li h3,
.wrap li p {
    text-transform: capitalize;
}
 
.wrap li h3:hover {
    color: #f00;
    cursor: pointer;
}
 
#pages li {
    display: inline-block;
    margin-right: 10px;
    list-style: none;
}
 
#pages button {
    width: auto;
    min-width: 40px;
    height: 40px;
    background: #fff;
    box-shadow: 0 0 5px #fff;
    border: 1px solid #ccc;
    border-radius: 5px;
    font-size: 16px;
}
 
#pages button:hover,
#pages button.active {
    color: #fff;
    border-color: #f00;
    background: #f00;
    cursor: pointer;
}
 
#pages button.dis {
    cursor: no-drop;
}
 
.wrap .loading {
    line-height: 70vh;
    text-align: center;
    list-style: none;
}
 
.wrap .nodata {
    list-style: none;
    text-align: center;
}

定义变量

let datas = [], // 分组列表
current = 1, // 当前页
pages = 0, // 总页数
total = 0, // 总数
listElem = document.getElementById('list'), // 列表内容
pageElem = document.getElementById('pages'); // 页数按钮

处理数据

我们使用axios库获取JSON数据,以此模拟从服务器接口抓取数据的过程。

// 获取列表
async function getList (page = 1) {
    let res = await axios.get('https://jsonplaceholder.typicode.com/posts');
    if (res.status === 200) {
        let data = sliceData(res.data);
        pages = data.pages;
        total = res.data.length;
        datas = [...data.list];
        return {
            code: 200,
            msg: 'get_succ',
            data: {
                list: data.list[page-1],
                current: page,
                pages: data.pages,
                total: list.length,
            }
        }
    }
}

编写一个数组切割方法,将原始数据分割为大小相等的多个子数组。

// 处理数据
function sliceData (list) {  
    let newArr = [],step = 10,pages = Math.ceil(list.length/10);
    for (let i = 0; i < list.length; i+=step) {
        let item = list.slice(i, i+step);
        newArr.push(item);
    }
    return {
        list: newArr,
        pages,
    };
}

显示列表

showList(current);
 
// 显示列表
async function showList (current) {
    let data = null;
    listElem.innerHTML = '';
    listElem.innerHTML = '<li class="loading">加载中...</li>';
    if (datas && datas.length) {
        data = {
            code: 200,
            msg: 'get_succ',
            data: {
                list: datas[current-1],
                current: current,
                pages,
                total,
            }
        }
    } else {
        data = await getList(current);
    }
    if (data.code === 200) {
        let list = data.data.list;
        if (list && list.length) {
            let liStr = '',pageStr = '';
            for (const item of list) {
                liStr += `<li>
                    <h3>${item.title}</h3>
                    <p>${item.body}</p>
                </li>`;
            }
            
            setTimeout(() => {
                listElem.innerHTML = liStr;
            }, 1000);
 
            if (pageElem.innerText === '') {
                for (let i = 0; i < data.data.pages; i++) {
                    pageStr += `<li><button class="page" data-id="${i+1}">${i+1}</button></li>`
                }
                pageElem.innerHTML = `
                <li><button id="start" data-id="1">首页</button></li>
                <li><button id="prev">上一页</button></li>
                ${pageStr}
                <li><button id="next">下一页</button></li>
                <li><button id="end" data-id="${data.data.pages}">尾页</button></li>`;
                showHighLight(current);
                addClick();
            }
        } else {
            listElem.innerHTML = '<li class="nodata">暂无数据</li>';
        }
    }
}

添加点击事件

// 添加点击
function addClick () {  
    let btns = document.querySelectorAll('#pages li button');
    for (const item of btns) {
        item.addEventListener('click', toggleList, false);
    }
}

切换页面内容

// 切换页面
function toggleList (event) {  
    let id = event.target.dataset.id,
    bid = event.target.id;
    if (id) {
        current = Number(id);
    }
    if (bid == 'prev') {
        if (current <= 1) {
            current = 1;
        } else {
            current--;
        }
    } else if (bid == 'next') {
        if (current >= pages) {
            current = pages;
        } else {
            current++;
        }
    }
    showHighLight(current, bid);
    showList(current);
}

显示高亮

// 显示高亮
function showHighLight (current, bid) {
    let btns = document.querySelectorAll('.page'),
    startBtn = document.getElementById('start'),
    endBtn = document.getElementById('end');
    for (const item of btns) {
        item.className = 'page';
    }
    btns[current-1].className = 'page active';
    startBtn.className = current == 1 ? 'active dis' : '';
    endBtn.className = current == pages ? 'active dis' : '';
}

在页面渲染完成后,代码中增加了一个定时器,用于模拟从服务器获取数据时的等待效果。在实际生产环境中,无需手动添加此模拟逻辑。

按钮加载

按钮加载的逻辑与分页类似,主要区别在于将页码导航替换为一个“加载更多”按钮。该按钮不断在当前列表末尾追加新内容,其余逻辑与分页加载基本一致。

页面结构

<div class="wrap">
    <ul id="list"></ul>
    <p class="loadmore">加载中...</p>
    <p class="more-box">
        <button id="more">加载更多</button>
    </p>
</div>

页面美化

.more-box {
    text-align: center;
}
 
#more {
    padding: 10px;
    background: none;
    border: 1px solid #ccc;
    border-radius: 5px;
}
 
#more:hover {
    cursor: pointer;
    border-color: #f00;
    background-color: #f00;
    color: #fff;
}
 
.loadmore {
    text-align: center;
}
 
.hide {
    display: none;
}

获取变量

let loadMore = document.querySelector('.loadmore'),
moreBtn = document.getElementById('more');

点击加载更多

// 添加点击
moreBtn.addEventListener('click', addList, false);
 
// 切换页面
function addList () {
    if (current < pages) {
        current+=1;
        showList(current);
    } else {
        moreBtn.innerText = '没有更多了';
    }
}

显示页面

在原有列表显示方法的基础上,仅需修改少量代码即可实现按钮加载功能。

// 显示列表
async function showList (current) {
    let data = null;
    loadMore.className = 'loadmore';
    if (datas && datas.length) {
        data = {
            code: 200,
            msg: 'get_succ',
            data: {
                list: datas[current-1],
                current: current,
                pages,
                total,
            }
        }
    } else {
        data = await getList(current);
    }
    if (data.code === 200) {
        let list = data.data.list;
        if (list && list.length) {
            let liStr = '',pageStr = '';
            for (const item of list) {
                liStr += `<li>
                    <h3>${item.title}</h3>
                    <p>${item.body}</p>
                </li>`;
            }
 
            listElem.innerHTML += liStr;
 
        } else {
 
            listElem.innerHTML = '<li class="nodata">暂无数据<li>';
        }
 
        
        setTimeout(() => {
            loadMore.className = 'loadmore hide';
        }, 1000);
    }
}

滚动加载

滚动加载是指当用户滚动页面至底部时,自动将新一页内容追加到当前列表之后。每次滚动时,通过计算动态添加相应内容。

该方案基于按钮加载修改而来。其核心原理是:当文档滚动到顶部的距离加上文档可视区域的高度大于文档的总滚动高度时,触发页面加载逻辑。

页面结构

<div class="wrap">
    <ul id="list"></ul>
    <p class="loadmore">加载中...</p>
</div>

滚动判断

document.addEventListener('scroll', checkScroll, false);
function checkScroll () {  
    let scrollTop = document.documentElement.scrollTop,
    clientHei = document.documentElement.clientHeight,
    scrollHeight = document.documentElement.scrollHeight;
    if (scrollTop + clientHei >= scrollHeight) {
        addList();
    }
}
 
// 切换页面
function addList () {
    if (current < pages) {
        current+=1;
        showList(current);
    } else {
        loadMore.innerText = '没有更多了';
    }
}

效果预览

分页加载

方法简介

在线预览

按钮加载

方法简介

在线预览

滚动加载

方法简介

在线预览

到此这篇关于JS中页面列表加载的常用方法总结的文章就介绍到这了,更多相关JS页面列表加载内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章