在網上找了一大圈分頁實現,沒有找到,這個問題本來也一直想研究卻拖了很久,於是就傻傻自己寫了一套 JS。后來才發現其實好多前端框架的代碼都是現成的。
參考了 LayUI 的分頁風格,將 Bootstrap4 的分頁完整地實現了出來。
代碼如下,將頭部引用的 jQuery 和 Bootstrap4 鏈接替換后可立即看到效果。

1 <!doctype html> 2 <html lang="en"> 3 <head> 4 <title>temp</title> 5 <link rel="stylesheet" href="../lib/bootstrap-4.3.1/bootstrap.min.css"> 6 <script src="../lib/jquery-3.4.1/jquery-3.4.1.js"></script> 7 <script src="../lib/bootstrap-4.3.1/bootstrap.min.js"></script> 8 </head> 9 <body> 10 <nav> 11 <ul id="pagination" class="pagination"> 12 <li class="page-item disabled"><a class="page-link" href="#">上一頁</a></li> 13 <li class="page-item disabled"><a class="page-link" href="#">1</a></li> 14 <li class="page-item disabled"><a class="page-link" href="#">下一頁</a></li> 15 </ul> 16 </nav> 17 </body> 18 <script> 19 let currPage = 1, // 當前頁碼 20 pageSize = 10; // 頁大小 21 22 search(1); // 測試代碼 23 24 // 向后端請求數據 25 function search(destPage) { 26 currPage = handlePage(destPage, currPage); 27 28 // 此處寫 Ajax 向后端發送 currPage 和 pageSize 請求最大頁碼(和需要的業務數據) 29 let totalPage = 25; // 此處模擬返回的最大頁碼 30 31 $("#pagination").html(buildPagination(currPage, totalPage, 'search')); 32 } 33 34 35 36 /* 以下代碼可放入公共 JS 文件以便服務各個需要分頁的頁面 */ 37 38 // 返回請求的目標頁碼 39 function handlePage(destPage, currPage) { 40 currPage = Number(currPage); 41 if (destPage === 'pre') { 42 currPage--; 43 } else if (destPage === 'next') { 44 currPage++; 45 } else { 46 currPage = destPage || 1; 47 } 48 return currPage; 49 } 50 // 構建翻頁組件 51 function buildPagination(currPage, totalPage, funcName) { 52 currPage = Number(currPage); 53 totalPage = Number(totalPage); 54 let pageStr = ''; 55 if (totalPage > 1) { 56 if (totalPage <= 5) { 57 pageStr += prePage(currPage, funcName); 58 pageStr += startNPage(currPage, totalPage, funcName); 59 pageStr += nextPage(currPage, totalPage, funcName); 60 } else if (totalPage > 5) { 61 if (currPage < 5) { 62 pageStr += prePage(currPage, funcName); 63 pageStr += startNPage(currPage, totalPage, funcName); 64 pageStr += lastPage(totalPage, funcName); 65 pageStr += nextPage(currPage, totalPage, funcName); 66 } else { 67 if (currPage <= (totalPage - 5)) { 68 pageStr += prePage(currPage, funcName); 69 pageStr += firstPage(funcName); 70 pageStr += plusAndMinusTwoPages(currPage, funcName); 71 pageStr += lastPage(totalPage, funcName); 72 pageStr += nextPage(currPage, totalPage, funcName); 73 } else { 74 pageStr += prePage(currPage, funcName); 75 pageStr += firstPage(funcName); 76 pageStr += endNPage(currPage, totalPage, funcName); 77 pageStr += nextPage(currPage, totalPage, funcName); 78 } 79 } 80 } 81 } else { 82 pageStr += initPage(); 83 } 84 return pageStr; 85 } 86 // 初始狀態 87 function initPage() { 88 return '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">上一頁</a></li>' + 89 '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">1</a></li>' + 90 '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">下一頁</a></li>'; 91 } 92 // 上一頁 93 function prePage(currPage, funcName) { 94 let str = ''; 95 if (currPage === 1) { 96 str += '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">上一頁</a></li>'; 97 } else { 98 str += '<li class="page-item"><a class="page-link" href="javascript: ' + funcName + '(\'pre\');">上一頁</a></li>'; 99 } 100 return str; 101 } 102 // 固定首頁 103 function firstPage(funcName) { 104 return '<li class="page-item"><a class="page-link" href="javascript: ' + funcName + '(1);">1</a></li>' + 105 '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">...</a></li>'; 106 } 107 // 開頭的連續 n 頁【注意判斷總頁數是否大於5】 108 function startNPage(currPage, totalPage, funcName) { 109 let str = '', total; 110 if (totalPage > 5) { 111 total = 5; 112 } else { 113 total = totalPage; 114 } 115 for (let i = 1; i < total + 1; i++) { 116 if (i === currPage) { 117 str += '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">' + i + '</a></li>'; 118 } else { 119 str += '<li class="page-item"><a class="page-link" href="javascript: ' + funcName + '(' + i + ');">' + i + '</a></li>'; 120 } 121 } 122 return str; 123 } 124 // 前后正負 2 頁 125 function plusAndMinusTwoPages(currPage, funcName) { 126 let str = '', start = currPage - 2, end = currPage + 3; 127 for (let i = start; i < end; i++) { 128 if (i === currPage) { 129 str += '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">' + i + '</a></li>'; 130 } else { 131 str += '<li class="page-item"><a class="page-link" href="javascript: ' + funcName + '(' + i + ');">' + i + '</a></li>'; 132 } 133 } 134 return str; 135 } 136 // 末尾的連續 n 頁 137 function endNPage(currPage, totalPage, funcName) { 138 let str = '', start = totalPage - 5 + 1, end = totalPage + 1; 139 for (let i = start; i < end; i++) { 140 if (i === currPage) { 141 str += '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">' + i + '</a></li>'; 142 } else { 143 str += '<li class="page-item"><a class="page-link" href="javascript: ' + funcName + '(' + i + ');">' + i + '</a></li>'; 144 } 145 } 146 return str; 147 } 148 // 固定末頁 149 function lastPage(totalPage, funcName) { 150 return '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">...</a></li>' + 151 '<li class="page-item"><a class="page-link" href="javascript: ' + funcName + '(' + totalPage + ');">' + totalPage + '</a></li>'; 152 } 153 // 下一頁 154 function nextPage(currPage, totalPage, funcName) { 155 let str = ''; 156 if (currPage === totalPage) { 157 str += '<li class="page-item disabled"><a class="page-link" href="javascript: void(0);">下一頁</a></li>'; 158 } else { 159 str += '<li class="page-item"><a class="page-link" href="javascript: ' + funcName + '(\'next\');">下一頁</a></li>'; 160 } 161 return str; 162 } 163 </script> 164 </html>
附:當總頁數大於1時的設計思路分析
當 totalPage 小於等於 5 頁時
【上一頁】【開頭的連續 n 頁(n<=5)】【下一頁】
當 totalPage 大於 5 頁時
如果 currPage 小於 5
【上一頁】【開頭的連續 5 頁】【……固定末頁】【下一頁】
如果 currPage 大於等於 5
如果 currPage 小於等於(totalPage - 5)
【上一頁】【固定首頁……】【前后正負 2 頁】【……固定末頁】【下一頁】
如果 currPage 大於(totalPage - 5)
【上一頁】【固定首頁……】【末尾的連續 5 頁】【下一頁】