分页实现效果图 总数量:523 页码数:9 左右偏移量:4(根据页码数9计算左右偏移量) 分页默认开头:2 分页默认结尾:2 每页记录数:10 第1页 当第1页时候: 左偏移=1-4(偏移量) =-3 左偏移默认1 右偏移=1+4(偏移量) = 5 分页开头默认显示页面数量0 分页结尾默认显示页面数量2 第2页 当第2页时候: 左偏移=2-4(偏移量) = -2 左偏移默认1 右偏移=2+4(偏移量) = 6 分页开头默认显示页面数量0 分页结尾默认显示页面数量2 第5页 当第5页时候: 左偏移=5-4(偏移量) = 1 右偏移=5+4(偏移量) = 9 分页开头默认显示页面数量0 分页结尾默认显示页面数量2 第6页 当第6页时候: 左偏移=6-4(偏移量) = 2 右偏移=6+4(偏移量) = 10 分页开头默认显示页面数量1(本来应该是2) 分页结尾默认显示页面数量2 第8页 当第8页时候: 左偏移=8-4(偏移量) = 4 右偏移=8+4(偏移量) = 12 分页开头默认显示页面数量2 分页结尾默认显示页面数量2 第46页 当第46页时候: 左偏移=46-4(偏移量) = 42 右偏移=46+4(偏移量) = 50 分页开头默认显示页面数量2 分页结尾默认显示页面数量2 第47页 当第47页时候: 左偏移=47-4(偏移量) = 43 右偏移=47+4(偏移量) = 51 分页开头默认显示页面数量2 分页结尾默认显示页面数量1(默认应该是2) 第48页 当第48页时候: 左偏移=48-4(偏移量) = 44 右偏移=48+4(偏移量) = 52 分页开头默认显示页面数量2 分页结尾默认显示页面数量0 第49页 当第49页时候: 左偏移=49-4(偏移量) = 45 右偏移=49+4(偏移量) = 53 > 52(总页数) 右偏移52 分页开头默认显示页面数量2 分页结尾默认显示页面数量0 第52页(尾页) 当第52页时候: 左偏移=52-4(偏移量) = 48 右偏移=52+4(偏移量) = 56 > 52(总页数) 右偏移52 分页开头默认显示页面数量2 分页结尾默认显示页面数量0 分页代码 /** * 分页函数 * * @param page 当前页数 * @param total 总数 * @param pagelen 页码个数 * @param pagesize 每页显示条数 * @param first_pagelen 分页开头最少显示页码 * @param last_pagelen 分页末尾最少显示页码 * @return string */ function getPageQuery($page = 0, $total, $pagelen=3, $first_pagelen=2, $last_pagelen=2, $pagesize = 10) { $pagecode = ''; //定义变量,存放分页生成的HTML $page = intval($page); //避免非数字页码 $total = intval($total); //保证总记录数值类型正确 if( !$total ) return;//总记录数为零返回 $pages = ceil($total/$pagesize);//计算总分页 //处理页码合法性 if($page<1) $page = 1; if($page>$pages) $page = $pages; $pagelen = ( $pagelen%2 ) ? $pagelen : $pagelen+1;//页码个数 $pageoffset = ( $pagelen-1 ) / 2;//页码个数左右偏移量 //1:第一种情况,总页数小于等于需要显示页码数.则所有分页页码全部显示 if($pages <= $pagelen) { //生成html for( $i=1; $i<=$pages; $i++ ){ if( $i==$page ){ $pagecode.='<span class="page-cur">'.$i.'</span>'; } else { $pagecode.='<a href="javascript:turnListPage(/''.$i.'/');">'.$i.'</a>'; } } } //2:第二种情况,总页数大于需要显示页码数. if( $pages > $pagelen ) { //如果当前页-左边偏移量小于0,则起始页则为分页的首页即第1页(而不是当前页-左边偏移量) if( $page - $pageoffset <0 ) { $init = 1; } else { //如果当前页-左边偏移量大于等于0(init可能为0的情况,但是分页是从1页开始..为0则init指定为1) $init = $page-$pageoffset ? $page-$pageoffset : 1; //尽管获得左边偏移量,(可能的情况是: $init的位置左边,可能还有页码) for($first=1; $first < $init; $first++) { //从分页第一页到左边偏移量的数量, 如果大于默认的分页开头数量 输出 ...并跳出 if( $first > $first_pagelen) { $first_pagecode.='<span class="page-break">...</span>'; break; } $first_pagecode.='<a href="javascript:turnListPage(/''.$first.'/');" >'.$first.'</a>'; } } //如果当前页+右边偏移量大于总页数,则结束页为总页数(而不是当前页面+右边偏移量) if( $page + $pageoffset > $pages ) { $max = $pages; } else { //如果当前页+右边偏移量小于等于总页数 $max = $page+$pageoffset; //尽管获得右边偏移量,(可能的情况是: $last的位置右边,可能还有页码) for($last = $max+1; $last <= $pages; $last++) { //此处可能不太好理解. 为什么是要大于总页数呢 //因为此处是实现分页末尾 //$last_pagelen 假设 2是默认最少应该显示的结尾页码 //比如当前页为8,右边偏移量为(8+4=12) 总页数为52 //结尾页码最少为2 //12+2>=52 false 跳过 //13+2>=52 false 跳过 //...... //50+2>=52 true 进入 输出 ... //51+2>=52 true 进入 输出 51 //52+2>=52 true 进入 输出 52 //结果就是 ...51 52 //也就是如果右边偏移量到总页数数量大于默认的分页结尾数量 输出应该输出的结尾(并不能保证输出的就是分页末尾数量数目) if( $last + $last_pagelen >=$pages) { if( $last+$last_pagelen == $pages) { $last_pagecode.='<span class="page-break">...</span>'; continue; } $last_pagecode.='<a href="javascript:turnListPage(/''.$last.'/');" '.$last.'</a>'; } } 事例图: //接上面代码 } //此处迭代的是:当前页的左右偏移 for (;$init <= $max; $init++) { $pagecode.='<a href="javascript:turnListPage(/''.$init.'/');">'.$init.'</a>'; } $pagecode=$first_pagecode.$pagecode.$last_pagecode; } return $pagecode; }