原生js分页器

<!DOCTYPE html>
<html lang="zh">
    <head>
        <meta charset="utf-8">
        <title>分页器</title>
        <style type="text/css">
            *{
                margin: 0;
                padding: 0;
                box-sizing: border-box;
            }
            body{
                width: 100vw;
                height: 100vh;
                min-width: 1000px;
                background-color: antiquewhite;
                background-image: url(images/w2.jpg);
                background-size: 100% 100%;
                overflow: hidden;
            }
            #page-container{
                position: relative;
                background-color: whitesmoke;
                border-radius: 10px;
                width: 70%;
                min-width: 1000px;
                height: 60px;
                line-height: 60px;
                margin: 100px auto;
                opacity: .6;
                padding: 0 10px;
                overflow: hidden;
            }
            #page-container .pager{
                position: absolute;
                width: 100%;
                height: 100%;
                top: 0;
                left: 0;
                display: flex;
                flex-flow: row nowrap; 
                align-items: center;
            }
            .pager .page-home,
            .pager .page-upper,
            .pager .page-lower,
            .pager .page-last{
                width: 6%;
                text-align: center;
                cursor: pointer;
            }
            .pager .page-home:hover,
            .pager .page-upper:hover,
            .pager .page-lower:hover,
            .pager .page-last:hover,
            .page-list .page-number:hover{
                color: red;
            }
            .pager .page-list{
                display: flex;
                flex-flow: row nowrap; 
                align-items: center;
                justify-content: space-around;
                width: 36%;
                height: 100%;
                line-height: 100%;
                background-color: rgba(0,0,0,.1);
            }
            .page-list .page-number{
                width: 30px;
                height: 30px;
                line-height: 30px;
                border-radius: 2px;
                text-align: center;
                border: 1px solid black;    
                cursor: pointer;
            }
            .pager .page-sum,
            .pager .page-total{
                width: 20%;
                text-align: center;
                cursor: pointer;
                display: flex;
                align-items: center;
                background-color: darkgray;
                cursor: default;
                padding-left: 5px;
            }
            .pager .page-sum > span,
            .pager .page-total > span{
                border: 1px solid black;    
                width: 65%;
                height: 30px;
                line-height: 30px;
                text-align: left;
                overflow: hidden;
                white-space: nowrap;
                text-overflow: ellipsis;
                padding-left: 3px;
                border-radius: 3px;
                
            }
            /* 当前页高亮显示 */
            .page-activation{
                transform: scale(1.2);
                background-color: rgba(0,0,0,.5);
                outline: 1px solid aqua;
                color: aqua;
            }
        </style>
    </head>
    <body>
        <section id="page-container">
            <div class="pager">
                <div class="page-home">首页</div>
                <div class="page-upper">上一页</div>                
                <div class="page-list">
                    <div class="page-number">1</div>
                    <div class="page-number">2</div>
                    <div class="page-number">3</div>
                    <div class="page-number">4</div>
                    <div class="page-number">5</div>
                    <div class="page-number">6</div>
                    <div class="page-number">7</div>
                    <div class="page-number page-more">...</div>
                </div>
                <div class="page-lower">下一页</div>
                <div class="page-last">尾页</div>
                <div class="page-sum">页数:
                    <span class="sum">0</span>
                </div>
                <div class="page-total">总数据:<span class="total">0</span></div>
            </div>
        </section>
    </body>
    <script src="./js/pager.js"></script>
</html>

js

// 分页器脚本
(function(){
    class Pager{
        // 每页显示的个数
        pageSize;
        // 当前被选中的页
        pageNo;
        // 总共有多少页
        pageSum;
        // 总共有多少条数据
        pageTotal;
        // 默认显示的当前页的下标
        pageIndex;
        // 构造器
        constructor(pageTotal,pageSize = 5,pageNo = 1){
            // 页码集合
            const pageList = document.querySelectorAll("#page-container .page-list .page-number");
            const pageListParent = document.querySelector("#page-container .page-list");
           if(pageTotal === undefined){
                pageListParent.innerText = "Pager至少需要一个参数,请给定要分页的总数据";
                pageListParent.style.border = "5px solid red";
                pageListParent.style.color = "blue";
                throw new Error("Pager至少需要一个参数,请给定要分页的总数据");
            }
            if(pageNo<1){
                pageListParent.innerText = "当前显示页数不能小于1";
                pageListParent.style.border = "5px solid red";
                pageListParent.style.color = "blue";
                throw new Error("当前显示页数不能小于1");
            }
            if(pageNo >= 7){
                this.pageIndex = 7; 
            }else{
                this.pageIndex = pageNo-1; 
            }
            if(pageTotal < 1){
                pageListParent.innerText = "总数据不能小于1";
                pageListParent.style.border = "5px solid red";
                pageListParent.style.color = "blue";
                throw new Error("总数据不能小于1");
            }
            if(pageSize < 1){
                pageListParent.innerText = "每页至少显示1条数据";
                pageListParent.style.border = "5px solid red";
                pageListParent.style.color = "blue";
                throw new Error("每页至少显示1条数据");
            }
            this.pageSize = pageSize;
            this.pageNo = pageNo;
            this.pageTotal = pageTotal;
            // 根据总数据除以每页显示的数据得到总页数(向上取整)
            this.pageSum = Math.ceil(this.pageTotal/this.pageSize);
            
            if(pageNo > this.pageSum){
                pageListParent.innerText = "当前显示页数不能大于总页数";
                pageListParent.style.border = "5px solid red";
                pageListParent.style.color = "blue";
                throw new Error("当前显示页数不能大于总页数");
            }
            // 数不够七页时删除一些页码
            if(this.pageSum <= 7){
                for(let i = this.pageSum ; i < pageList.length ;i++){
                    pageListParent.removeChild(pageList.item(i));
                }
            }
            // 初始化
            this.pageInit();
            this.pageMore(this.pageIndex);
        }
        
        // 初始化分页器
        pageInit(){
            // 当前页高亮显示css类
            let activ = "page-activation";
            // 表示更多css类,页面中用于显示三个点的页码 ...
            let more = "page-more";
            
            // 首页按钮
            const pageHome = document.querySelector("#page-container .page-home");
            // 尾页按钮
            const pageLast = document.querySelector("#page-container .page-last");
            // 上一页按钮
            const pageUpper = document.querySelector("#page-container .page-upper");
            // 下一页按钮
            const pageLower = document.querySelector("#page-container .page-lower");
            // 页数显示
            const sum = document.querySelector("#page-container .page-sum .sum");
            // 总数据
            const total = document.querySelector("#page-container .page-total .total");
            // 页码集合
            const pageList = document.querySelectorAll("#page-container .page-list .page-number");
            /*初始化一些数据(总页数,总数据,默认显示页数)*/
            // 显示 当前页数 / 总页数
            sum.innerText = this.pageNo + " / " +  this.pageSum; 
            total.innerText = this.pageTotal;
            // 高亮显示默认显示页数
            pageList.item(this.pageIndex).classList.add(activ);
            
            /*
                给 pageList 中的所有页码 设置标签属性的tabIndex
                element.tabIndex:设置或返回元素的标签顺序
                作用:用于更新当前显示的页的 index
            */
            pageList.forEach(function(item,index){
                item.tabIndex = index;
            });
            /*
                给每一个页码绑定点击事件 
                1,获取所有页码的父节点(给父节点绑定事件,事件委派)
            */
            const _this = this;
            pageList.item(0).parentNode.onclick = function(event){
                let e = event || window.event; // 获取事件对象 『兼容ie8及以下浏览器』
                // 返回触发事件对象 (e.srcElement非标准IE 6 - 8 使用)
                let target = e.target || e.srcElement;
                // 带有page-number类的元素节点点击时才触发事件
                if([...target.classList].indexOf("page-number") != -1){
                    // 带有page-more类的元素节点不触发事件
                    if([...target.classList].indexOf("page-more") === -1){
                        // 更新当前页
                        _this.pageNo = target.innerText;
                        _this.pageMore(target.tabIndex);
                    }
                }
                
            };              
            /*
                首页,尾页,上一页,下一页绑定事件
            */
            pageHome.onclick = ()=>{
                this.pageTurning("home"); // 首页
            }
            pageLast.onclick = ()=>{
                this.pageTurning("last"); // 尾页
            }
            pageUpper.onclick = ()=>{
                this.pageTurning("upper"); // 上一页
            }
            pageLower.onclick = ()=>{
                this.pageTurning("lower"); // 下一页
            }
        }
        
        /*
            Page turning翻页
            参数:str,翻页的动作
                str === home:直接翻到首页
                str === last:直接翻到尾页
                str === upper:翻到上一页
                str === lower:翻到下一页
        */ 
        pageTurning(str){
            // 当前页高亮显示css类
            let activ = "page-activation";
            // 表示更多css类,页面中用于显示三个点的页码 ...
            let more = "page-more";
            // 页码集合
            const pageList = document.querySelectorAll("#page-container .page-list .page-number");
            switch(str){
                case "home" :
                    // 更新当前页
                    this.pageNo = 1;
                    this.pageMore(0);
                    break;
                case "last" :
                    // 更新当前页
                    this.pageNo = this.pageSum;
                    if(this.pageSum <= 7){
                        this.pageMore(this.pageSum-1);
                    }else{
                        this.pageMore(7);
                    }
                    
                    break;
                case "upper" :
                    if((this.pageNo -1) < 1){
                        break;
                    }
                    if(this.pageIndex <= 1){
                        this.pageIndex = 1;
                    }
                    // 更新当前页
                    this.pageNo -= 1;
                    this.pageMore(this.pageIndex-1);
                    break;
                case "lower" :
                    this.pageNo = parseInt(this.pageNo)+1;
                    if(this.pageNo >= this.pageSum){
                        this.pageNo = this.pageSum;
                    }
                    if(this.pageSum <= 7){
                        if(this.pageIndex >= this.pageSum-1){
                            this.pageIndex = this.pageSum-2;
                        }
                    }else{
                        if(this.pageIndex >= 7){
                            this.pageIndex = 6;
                        }
                    }
                    this.pageMore(parseInt(this.pageIndex)+1);
                    break;
            }
        }
        
        /*
            点击页为 7 页时,将更多类添加到下标为 2 的元素上
            显示规则 :1 2 ... 5 6 7 8 9
                      1 2 ... 6 7 8 9 10
            参数:newIndex,更新之后的下标
        */
        pageMore(newIndex){            
            // 当前页高亮显示css类
            let activ = "page-activation";
            // 表示更多css类,页面中用于显示三个点的页码 ...
            let more = "page-more";
            // 页数显示
            const sum = document.querySelector("#page-container .page-sum .sum");
            // 页码集合
            const pageList = document.querySelectorAll("#page-container .page-list .page-number");
            
            // 更新当前页数
            sum.innerText = this.pageNo + " / " +  this.pageSum; 
            
            //移除原先高亮显示的页码
            pageList.item(this.pageIndex).classList.remove(activ);
            // 总页数少于 7 页时
            if(this.pageSum <= 7){
                // 更新当前显示页的index
                this.pageIndex = newIndex;
                pageList.item(this.pageIndex).classList.add(activ);
                return;
            }
            // 页数大于或者等于7时
            if(this.pageNo >= 7){
                // 更新要显示的页码下标
                this.pageIndex = newIndex;
                // 给下标为 2 添加更多显示css类 
                pageList.item(2).classList.add(more);
                // 从原先显示更多类的元素上移除css类
                pageList.item(7).classList.remove(more);
                
                // 下标为 2 显示 ...表示更多
                pageList.item(2).innerText = "...";
                // 循坏更新页码
                let count;
                if(this.pageNo > this.pageSum-2){    
                    count = (this.pageSum-2) - 2;
                    pageList.item(5).classList.remove(activ);
                    pageList.item(this.pageIndex).classList.add(activ);
                }else{
                    count = this.pageNo - 2;
                    // 重置高亮显示,高亮显示一直为下标第五的页码
                    pageList.item(5).classList.add(activ);
                }
                
                for(let i = 3;i < pageList.length;i++){
                    pageList.item(i).innerText = count;
                    count++;
                }    
            
            }else{
                if([...pageList.item(2).classList].indexOf("page-more") !=-1){
                    pageList.item(5).classList.remove(activ);    
                    pageList.item(newIndex).classList.remove(activ);
                    this.pageIndex = this.pageNo-1;
                }else{
                    // 更新当前显示页的index
                    this.pageIndex = newIndex;
                }
                // 重置 更多类
                pageList.item(7).classList.add(more);
                pageList.item(2).classList.remove(more);
                pageList.item(7).innerText = "...";
                // 重置 页码
                let count = 3;
                for(let i = 2;i < pageList.length-1;i++){
                    pageList.item(i).innerText = count;
                    count++;
                }    
                pageList.item(this.pageIndex).classList.add(activ);    
            }
        }
    }
    try{
        new Pager(100);
    }catch(e){
        console.error(e.message);
    }
    
})();

效果图

 

 参数传递错误

  // 不传递参数    
  try{ new Pager(); }catch(e){ console.error(e.message); }

 

    // 总数据少于 1 
    try{
        new Pager(0);
    }catch(e){
        console.error(e.message);
    }

 

 

    // 当前显示页数不能大于总页数
    try{
        new Pager(100,5,100);
    }catch(e){
        console.error(e.message);
    }        

 

 

  // 总页数没有超过 7 页(默认每页显示5条信息)
  try
{ new Pager(10); }catch(e){ console.error(e.message); }

 

posted @ 2022-03-17 00:38  想要一个气球  阅读(441)  评论(0)    收藏  举报