分页器

作者: 正在成长的切图仔 | 来源:发表于2021-12-11 01:34 被阅读0次

<!DOCTYPE html>
<html>
   <head>
       <meta charset="utf-8">
       <title>javascript原生手动分页组件</title>
       <style>
           /** * { margin:0;padding: 0;}会导致每个标签一开始就初始化,耗性能不适用 **/
           body, div, ul, ol, li, p, img, a, span{ 
               margin:0;
               padding:0;
           }
           #pagenation { 
               text-align: center;
               margin: 20px;
           }
           #pagenation [class$=_pager]{ 
               user-select: none;
               list-style: none;
               display: inline-block;
               vertical-align: top;
               font-size: 0;
               padding: 0;
               margin: 0;
            }
           #pagenation button, #pagenation li {
               display: inline-block;vertical-align: top;font-size: 13px;box-sizing: border-box;text-align: center;cursor: pointer;padding: 0 4px;height: 28px;line-height: 28px;
               border: none;margin: 0 5px;background-color: #f4f4f5;color: #606266;min-width: 30px;border-radius: 2px;
           }
           #pagenation button:disabled { color: #c0c4cc;cursor: not-allowed;}
           #pagenation li:hover { color: #409EFF;}
           #pagenation .number.active { background-color: #409EFF;color: #fff;cursor: default;}
           #pagenation li.btn-quicknext, #pagenation li.btn-quickprev { font-weight: bold;line-height: 20px;}
           #pagenation li.btn-quicknext.active, #pagenation li.btn-quickprev.active { font-size: 12px;letter-spacing: -2px;line-height: 26px;}
       </style>
   </head>
   <body>
       <div id="pagenation"></div>
   </body>
   
   <script type="text/javascript">
       /**
        * 分页组件
        * @params obj 配置参数
        * @author hmt
        */
       function Pagenation(obj) {
           this.wrap = obj.wrap; //容器
           this.page = obj.page || 1; //默认初始页
           this.size = obj.size || 10; //默认页面固定条数
           this.total = obj.total || 0; //默认总条数
           this.pages = Math.ceil(this.total / this.size); //默认总页数
           this.callback = obj.callback; //默认回调函数
           this.quickPages = 5; //默认快速翻页的页数
           this.interval = obj.interval ? (obj.interval < 3 ? obj.interval : 4) : 4; //默认间隔的数字是4+1=5个
           this.init(); //初始化
       }
       Pagenation.prototype = {
           constructor: Pagenation, //构造函数指向原函数
           init: function() { //创建dom结构
               this.wrap.innerHTML = ''; //渲染元素前先清空之前的所有元素
               this.wrap.appendChild(this.prevBtn()); //添加上一页按钮
               if (this.pages > 0) {
                   this.wrap.appendChild(this.pageNum()); //添加页数按钮
               }
               this.wrap.appendChild(this.nextBtn()); //添加下一页按钮
               this.switchPage(); //绑定按钮事件
           },
           changeSize: function (s) { //设置新的页码显示条数
               this.size = s || 10;
               this.pages = Math.ceil(this.total / this.size);
               this.init();
           },
           changeTotal: function (t) { //设置新的总条数
               this.total = t || 0;
               this.pages = Math.ceil(this.total / this.size);
               this.init();
           },
           switchPage: function() { //绑定按钮事件
               var _this = this; //声明变量指向当前构造函数
               let numbers = this.wrap.querySelectorAll('.number');
               for (let i = 0, len = numbers.length; i < len; i++) {
                   numbers[i].onclick = function () { //数字按钮点击事件
                       if (_this.page != this.innerText) {
                           console.log(_this.page, this.innerText)
                           _this.page = Number(this.innerText);
                           _this.init();
                           _this.callback(_this.page); //按钮事件回调函数
                       }
                   };
               }
               this.wrap.querySelector('.btn-prev').onclick = function() { //上一页按钮点击事件
                   _this.page = --_this.page;
                   _this.init();
                   _this.callback(_this.page); //按钮事件回调函数
               };
               this.wrap.querySelector('.btn-next').onclick = function() { //下一页按钮点击事件
                   _this.page = ++_this.page;
                   _this.init();
                   _this.callback(_this.page); //按钮事件回调函数
               };
               let quickprev = this.wrap.querySelector('.btn-quickprev')
               if (quickprev) {
                   quickprev.onclick = function() { //快速向上翻多页按钮点击事件
                       _this.page = _this.page - _this.quickPages < 0 ? 1 : _this.page - _this.quickPages;
                       _this.init();
                       _this.callback(_this.page); //按钮事件回调函数
                   };
                   quickprev.onmouseenter = function(e) { //快速向上翻多页按钮鼠标移入事件
                       e.target.classList.add('active');
                       e.target.innerText = '<<';
                   };
                   quickprev.onmouseleave = function(e) { //快速向上翻多页按钮鼠标移出事件
                       e.target.classList.remove('active');
                       e.target.innerText = '...';
                   };
               }
               let quicknext = this.wrap.querySelector('.btn-quicknext')
               if (quicknext) {
                   quicknext.onclick = function() { //快速向下翻多页按钮点击事件
                       _this.page = _this.page + _this.quickPages > _this.pageT ? _this.pageT : _this.page + _this.quickPages;
                       _this.init();
                       _this.callback(_this.page); //按钮事件回调函数
                   };
                   quicknext.onmouseenter = function(e) { //快速向下翻多页按钮鼠标移入事件
                       e.target.classList.add('active');
                       e.target.innerText = '>>';
                   };
                   quicknext.onmouseleave = function(e) { //快速向下翻多页按钮鼠标移出事件
                       e.target.classList.remove('active');
                       e.target.innerText = '...';
                   };
               }
           },
           prevBtn: function() { //添加上一页按钮
               let btnprev = document.createElement('button');
               btnprev.setAttribute('class', 'btn-prev');
               btnprev.setAttribute('type', 'button');
               btnprev.innerText = '<';
               if (this.page === 1 || this.pages <= 0) {
                   btnprev.setAttribute('disabled', true);
               } else {
                   btnprev.removeAttribute('disabled');
               }
               return btnprev;
           },
           nextBtn: function() { //添加下一页按钮
               let btnnext = document.createElement('button');
               btnnext.setAttribute('class', 'btn-next');
               btnnext.setAttribute('type', 'button');
               btnnext.innerText = '>';
               if (this.page === this.pages || this.pages <= 0) {
                   btnnext.setAttribute('disabled', true);
               } else {
                   btnnext.removeAttribute('disabled');
               }
               return btnnext;
           },
           pageNum: function() { //添加页数按钮
               let ol = document.createElement('ol'); //数字按钮区域容器
               ol.classList.add(this.wrap.id + '_pager');
               let currentPage = this.page;
               let resetPages = this.pages;
               let first = currentPage <= this.interval ? 1 : currentPage > (resetPages - this.interval) ? resetPages - (this.interval + 1) : currentPage - (this.interval - 1);
               first = first === 0 ? 1 : first;
               ol.appendChild(this.renderNum(1));
               if (first - 1 >= 1){
                   ol.appendChild(this.renderButton('btn-quickprev'));
               }
               let last = first + this.interval + 2;
               for (let i = first + 1; i < last; i++) {
                   if (i === resetPages - this.interval && last > resetPages) {
                       ol.appendChild(this.renderNum(first));
                   }
                   if (i <= resetPages) {
                       ol.appendChild(this.renderNum(i));
                   }
                   if (i === last -1 && resetPages - i > 1) {
                       ol.appendChild(this.renderButton('btn-quicknext'));
                       ol.appendChild(this.renderNum(resetPages));
                   }
               }
               return ol;
           },
           renderNum: function(i) { //渲染数字按钮结构
               let number = document.createElement('li');
               number.classList.add('number');
               number.innerText = i;
               if (i === this.page) {
                   number.classList.add('active');
               }
               return number;
           },
           renderButton: function(name) { //渲染翻页按钮结构
               let button = document.createElement('li');
               button.classList.add(name);
               button.innerText = '...';
               return button;
           }
       }
   </script>
   <script type="text/javascript">
       var pagenation = new Pagenation({ //实例化组件
           wrap: document.getElementById('pagenation'), //容器
           page: 10, //当前页,默认初始为1 
           size: 1, //页面条数,默认为10
           callback: function(page) {  
               ajaxtest()
           }
       });
       
       function ajaxtest() {
           console.log('页码:', pagenation.page);
           pagenation.changeTotal(100);
       }
       ajaxtest()
       
       
   </script>
</html>

相关文章

  • (五)Swiper分页器

    (1) 本节知识点 使用分页器: pagination 分页器样式: paginationType 分页器可点: ...

  • RuiJi Scraper 分页抽取

    如果想抽取分页结,您需要在规则配置中配置分页选择器,分页选择器位于规则编辑器最下方,如图所示 请注意以下分页选择器...

  • element 分页器修改颜色

    以下记录是个人开发过程中遇到的问题: 分页器修改颜色: 效果 全局分页器样式修改: 全局分页器样式

  • Flask ----- 前端页面分页器对象

    Flask和Django都有的分页器类 Pageinations 分页器对象属性和方法 分页流程示例 借书管理系统...

  • 第20天,分页器

    本篇写了使用Django自有的分页器paginator的用法和自定制分页器 1.1 Django之分页功能 Dj...

  • django rest_framework

    1. 渲染器 渲染器格式如下: 2. 分页器 分页器有如下几种 : (1) PageNumberPaginatio...

  • 013-各种实例化 懒加载

    分页 控制器注意 先设置 分页数 再设置 分页颜色 (UIPageControl *)pageControl ...

  • UIPageViewController的初介绍(1) ---A

    简单介绍:UIPageViewController是iOS 5 开始的分页控制器。使用分页控制器(UIPageVi...

  • 定时器+分页

    定时器+分页

  • mybaits有几种分页方式?

    三.拦截器分页 创建拦截器,拦截mybatis接口方法id以ByPage结束的语句 四.RowBounds实现分页...

网友评论

      本文标题:分页器

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