You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

分页组件active类异常:页码>4时无法正确添加active类

分页组件active类异常问题

我的网站分页组件存在异常,点击页码大于4的页面时,页面可正常跳转,但对应的页码无法正确添加active类。我怀疑问题与$startPage和$endPage的计算逻辑有关,但无法确定。

现有代码

<div class="wrapper">
   <nav>
      <ul class="pager">
         <?php
         $totalPages = ceil($totalRows / $limit);
         $maxVisiblePages = 7; // Set the maximum number of page links to display (should be odd)
         $halfMaxVisiblePages = floor($maxVisiblePages / 2);
                
         // Calculate the starting and ending page numbers for limited pagination
         $startPage = max(1, $page - $halfMaxVisiblePages);
         $endPage = min($totalPages, $page + $halfMaxVisiblePages);
                
         // Adjust the starting page number if the ending page exceeds the total pages
         if ($endPage - $startPage + 1 < $maxVisiblePages) {
            $startPage = max(1, $endPage - $maxVisiblePages + 1);
         }

         if ($page > 1) {
            echo '<li class="pager__item pager__item--prev">
               <a class="pager__link" href="?page=' . ($page - 1) . '">
                  <svg xmlns="http://www.w3.org/2000/svg" width="8" height="12" viewbox="0 0 8 12">
                     <g fill="none" fill-rule="evenodd">
                        <path fill="#33313C" d="M7.41 1.41L6 0 0 6l6 6 1.41-1.41L2.83 6z"></path>
                     </g>
                  </svg>
               </a>
            </li>';
         } else {
            echo '<li class="pager__item pager__item--prev">
               <a class="pager__link dis" href="?page=' . ($page - 1) . '">
                  <svg xmlns="http://www.w3.org/2000/svg" width="8" height="12" viewbox="0 0 8 12">
                     <g fill="none" fill-rule="evenodd">
                        <path fill="#c4c4c4" d="M7.41 1.41L6 0 0 6l6 6 1.41-1.41L2.83 6z"></path>
                     </g>
                  </svg>
               </a>
            </li>';
         }

         // Loop through all the page numbers
         for ($i = $startPage; $i <= $endPage; $i++) {
            $isActive = ($i === $page) ? 'active' : '';
            echo '<li class="pager__item"><a class="pager__link ' . $isActive . '" href="?page=' . $i . '">' . $i . '</a></li>';
         }

         if ($page < $totalPages) {
            echo '<li class="pager__item pager__item--next">
               <a class="pager__link" href="?page=' . ($page + 1) . '">
                  <svg xmlns="http://www.w3.org/2000/svg" width="8" height="12" viewbox="0 0 8 12">
                     <g fill="none" fill-rule="evenodd">
                        <path fill="#33313C" d="M7.41 1.41L6 0 0 6l6 6 1.41-1.41L2.83 6z"></path>
                     </g>
                  </svg>
               </a>
              </li>';
         } else {
         echo '<li class="pager__item pager__item--next">
            <a class="pager__link dis" href="?page=' . ($page + 1) . '">
               <svg xmlns="http://www.w3.org/2000/svg" width="8" height="12" viewbox="0 0 8 12">
                  <g fill="none" fill-rule="evenodd">
                     <path fill="#c4c4c4" d="M7.41 1.41L6 0 0 6l6 6 1.41-1.41L2.83 6z"></path>
                  </g>
               </svg>
            </a>
           </li>';
         }
         ?>
      </ul> 
   </nav>
</div>

问题定位与修复

1. 核心问题:页码范围计算逻辑缺失双向调整

当前代码只调整了startPage,没有同步调整endPage,导致当页码超过4后,当前页可能不在startPage到endPage的显示范围内,循环遍历自然不会给当前页加上active类。

2. 修复后的页码计算逻辑

替换原有的页码计算代码为:

$totalPages = ceil($totalRows / $limit);
$maxVisiblePages = 7; // 最多显示的页码数(建议为奇数)
$halfMaxVisiblePages = floor($maxVisiblePages / 2);

// 初始计算起始和结束页码,确保当前页在中间位置
$startPage = max(1, $page - $halfMaxVisiblePages);
$endPage = min($totalPages, $page + $halfMaxVisiblePages);

// 如果显示的页码数不足maxVisiblePages,先从右侧补全
if ($endPage - $startPage + 1 < $maxVisiblePages) {
    $startPage = max(1, $endPage - $maxVisiblePages + 1);
}
// 补全后再检查左侧空间,从左侧补全(避免总页数较多时显示不全)
if ($endPage - $startPage + 1 < $maxVisiblePages) {
    $endPage = min($totalPages, $startPage + $maxVisiblePages - 1);
}

3. 额外修复:确保$page为整数类型

URL传参的page是字符串类型,直接用===比较会失败,在代码最开头添加类型转换:

// 处理当前页码,确保为整数且在合法范围内
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$page = max(1, min($page, $totalPages));

修改后,点击大于4的页码时,当前页会始终处于显示的页码列表中,active类也能正确添加。

内容的提问来源于stack exchange,提问作者user20733481

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 02:52:08