js 分页组件简单封装

效果

在这里插入图片描述

简洁版

在这里插入图片描述
在这里插入图片描述

pag = loadPag(pagArr,this.el.pagCSelect,this.el.len,this.el.nuMarea,this.el.pagul,limt,offset,80,4,false,false);
.paging{
    padding: 0;
    font-size: 12px;
}
.flexStart{
    display: flex;
    justify-content: flex-start;
}
#pagCSelect{
    margin: 0 2px;
    width: 40px;
}
.presentPage{
    background-color: rgba(92, 251, 255, 1)
}
.pagination ul>li>a{
    color: white;
    padding: 4px 6px;
    background-color:transparent;
    border:none;
}
.pagination ul>li.omit a{
    padding: 4px 0px;
}

代码

调用测试
let limt = 10,offset = 1,len = 76,pagArr = [10,20,40];
limt = pagArr[0]

this.el.pagSelect = document.querySelector("#pagSelect");
this.el.nuMarea = document.querySelector(".nuMarea");
this.el.len = document.querySelector(".len");
this.el.pagul = document.querySelector(".pagul");
len = 99
let pag = loadPag(pagArr,this.el.pagSelect,this.el.len,this.el.nuMarea,this.el.pagul,limt,offset,len);
 // 页码点击触发事件
pag.pageCode(function(res){
    console.log('pageCode:',res)
})
pag.selecthandle(function(res){
    console.log('selecthandle:',arguments)
})
js
window.loadPag = loadPag
/**
 * 加载分页
 * @param {*} pagArr 显示下拉条数组
 * @param {*} elLen 下拉条容器dom
 * @param {*} elLen 显示数据长度dom
 * @param {*} nuMarea 显示数据区间dom
 * @param {*} pagul 显示页码容器dom
 * @param {*} limt 页面数据条数
 * @param {*} offset 页码
 * @param {*} len 数据总条数
 * @param {*} pageLimt 显示页码个数  简洁版 设置小于5
 * @param {*} prev 是否显示 上一页
 * @param {*} next 是否显示 下一页
 * return obj
 *           upPagul 更新页码容器
 *           pageCode 页面点击事件
 *           selecthandle 切换页面数据条数触发
 */
function loadPag(pagArr,pagSelect,elLen,nuMarea,pagul,limt,offset,len,pageLimt,prev=true,next=true){
    
    // 加载分页
    pagSelect.innerHTML = ""
    pagArr.forEach((item,index)=>{
        var option = document.createElement("option")
        option.innerText = item
        option.value = item
        pagSelect.appendChild(option)
    })
    
    pagSelect.selectedIndex = pagArr.findIndex(item=>item==limt)||0
    elLen.innerText = len

    function createLi(text,index){
        var li = document.createElement('li')
        var a = document.createElement('a')
        a.href = "#"
        a.dataset.index = index
        a.innerText = text
        li.classList.add(index)
        li.appendChild(a)
        return li
    }
    
    let selectFun = null
    function selecthandle(fun){
        selectFun = fun
    }
   
    pagSelect.addEventListener("change",pagSelectChange)
    function pagSelectChange(e){
        limt = pagArr[this.selectedIndex]
        upnuMarea()
        selectFun && selectFun(this.selectedIndex,limt)
    }

    function upnuMarea(){
        limt = pagArr[pagSelect.selectedIndex]
        let end = offset*limt > len ? len : offset*limt
        nuMarea.innerText = (offset-1)*limt+1 +'-'+ end +"条"
    }

    upPagul(len,limt)
    function upPagul(leng=len,lim=limt){
        upnuMarea()
        pagul.innerHTML = ""
      
        if(prev){
            var liprev = createLi('«','prev')
            if(offset == 1){
                liprev.children[0].style.cursor = 'no-drop'
            }
            pagul.appendChild(liprev)
        }
       
        let omit = false
        let pages = Math.ceil(leng/lim)
        //只显示6个
        let f = pageLimt|| 7;
        let condition = ''
        for(var i = 0; i < pages; i++){

            if(f > 5){
                // 判断单前页位置
                if(offset <= 3){ // 在 0-3之间
                    condition = i < f-2 || i>= pages-1
                }else if(offset > 3 && offset < pages-1 ){ // 在 3 - pages-1之间
                    condition = i < 2 || i == offset || i == offset-2 || i == offset-1 || i>= pages-1
                }else if(offset >=  pages-1){ //在最后
                    condition = i < 2 || i == offset || i == offset-2 || i == offset-1 || i>= pages-4
                }
            }
            if(f < 5){ //简洁版
                condition = i < 1 || i == offset || i == offset-2 || i == offset-1 || i>= pages-1 || i == 0
            }
            
            // offset = 1
            // 12 ... 9
            // offset = 2
            // 123... 9
            // offset = 3
            // 1..345... 9
            // offset = 4
            // 1..456... 9
            
            
            if(condition){
                var li = createLi(i+1,i+1)
                if(i == offset-1){//单前页
                    li.classList.add("presentPage")
                }
                if(pages-1-offset >= 2 && omit){
                    omit = false
                }
                
                pagul.appendChild(li)
            }else{
                if(!omit){  // 过长处理
                    omit = true
                    var li = createLi('...','...')
                    li.classList = "omit"
                    pagul.appendChild(li)
                }
            }

            // if(i >= pages-(f/2) || i < f/2){
            //     // 判断单前页位置
            //     var li = createLi(i+1,i+1)
            //     if(i == offset-1){//单前页
            //         li.classList.add("presentPage")
            //     }
            //     pagul.appendChild(li)
            // }else{
            //     if(!omit){  // 过长处理
            //         omit = true
            //         var li = createLi('...','...')
            //         li.classList = "omit"
            //         pagul.appendChild(li)
            //     }
            // }
        }
        if(next){
            var linext = createLi('»','next')
            if(offset == pages){
                console.dir(liprev);
                linext.children[0].style.cursor = 'no-drop'
            }
            pagul.appendChild(linext)
        }
    }

    let pagulCallback = null
    // 事件处理
    pagul.addEventListener('click',function(e){
        var target = e.target
        let pages = Math.ceil(len/limt)
        var qieHuan = false
        if(target.nodeName == "A"){
            var index = target.dataset.index
            switch(index){
                case 'prev':
                    if(offset == 1) qieHuan = true
                    offset --
                    next()
                    break;
                case 'next':
                    if(offset == pages) qieHuan = true
                    offset ++
                    next()
                    break;
                case '...':
                    break;
                default:
                    offset = index
                    next()
                    break;
            }

            function next(){
                offset = offset <= 0 ? 1 :offset
                offset = offset >pages ? pages :offset
                if(!qieHuan){
                    upnuMarea() // 更新数据区域
                    upPagul(len,limt)
                    pagulCallback && pagulCallback(index,offset)
                }
            }
        }
    })

    function pageCode(fun){
        pagulCallback = fun
    }

    return{
        upPagul,
        selecthandle,
        pageCode
    }
}



css
.paging{
    display: flex;
    justify-content: space-between;
    padding: 0 5px;
    margin-top: 15px;
}
.left_l select{
    border: 1px solid #3e8687;
    outline: none;
    border-radius:2px;
    background-color: rgba(62, 134, 135, .45);
    margin: 0 4px;
}
.pagination{
    margin:0;
}
.pagination ul{
    border-radius: 3px;
}
.pagination ul>li>a{
    padding: 4px 12px;
    line-height: 20px;
    text-decoration: none;
    background-color: rgba(62, 134, 135, .45);
    border: 1px solid rgba(62, 134, 135, .45);
    border-left-width: 0;
}
.pagination ul>li:first-child a{
    border-left-width: 1px;
}
.nums span{
    color: #FF9B42
}
.pagination ul li.presentPage a{
    background-color: rgba(62, 134, 135, .7);
}
html结构
<div class="paging">
            <div class="left flexStart">
                <div class="left_l flexStart">
                    <div>显示</div>
                    <div> 
                        <select name="" id="pagSelect">
                            <!-- <option value="10">10</option>
                            <option value="20">20</option>
                            <option value="40">40</option> -->
                        </select>
                    </div>
                    <div></div>
                </div>
                <div class="nums">
                    当前显示<span class="nuMarea">1-20</span>条,共<span class="len">26</span></div>
            </div>
            <div class="right">
                <div class="pagination">
                    <ul class="flexStart pagul">
                      <!-- <li><a href="#" data-index="prev">«</a></li>
                      <li><a href="#" data-index="1">1</a></li>
                      <li><a href="#" data-index="2">2</a></li>
                      <li><a href="#" data-index="3">3</a></li>
                      <li><a href="#" data-index="6">4</a></li>
                      <li><a href="#" data-index="5">5</a></li>
                      <li><a href="#" data-index="next">»</a></li> -->
                   </ul>
                  </div>
            </div>
        </div>
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值