三分钟带你用纯CSS实现分页,又简单又酷

背景

先看一下要实现的效果:

欢迎关注公众号《前端界》,文章会同步更新,也可快速加入前端交流群!

在静态页面实现分页效果,我们之前的思路一般都是使用HTMLCSSJavaScript来实现分页,通过点击不同的分页导航,显示不同的内容。简单梳理一下采用JavaScript实现的思路:

  1. 搭建静态页面
  2. 给分页导航添加点击事件,点击时传入页码,设置要显示的内容
  3. 结合当前页码,调用点击事件实现上一页、下一页效果

JS部分代码如下:

html 复制代码
要在前端静态页面上实现分页效果,您可以使用HTML、CSS和JavaScript来创建分页导航和显示不同页的内容。以下是一个简单的示例,演示如何实现基本的前端分页效果:

```html
    <ul class="pagination">
        <li><a href="#" onclick="showPage(1)">1</a></li>
        <li><a href="#" onclick="showPage(2)">2</a></li>
        <!-- 可以根据需要添加更多分页按钮 -->
    </ul>

    <div class="content" id="page1">
        <!-- 第一页的内容 -->
        <p>这是第一页的内容。</p>
    </div>

    <div class="content" id="page2">
        <!-- 第二页的内容 -->
        <p>这是第二页的内容。</p>
    </div>
    <script>
        function showPage(pageNumber) {
            // 隐藏所有内容区域
            const contentElements = document.querySelectorAll('.content');
            contentElements.forEach((element) => {
                element.classList.remove('active');
            });

            // 显示选定页的内容区域
            const selectedPage = document.getElementById(`page${pageNumber}`);
            if (selectedPage) {
                selectedPage.classList.add('active');
            }
        }

        // 默认显示第一页
        showPage(1);
    </script>

这个示例创建了一个包含分页导航按钮和分页内容区域的简单静态页面。当用户点击不同的分页按钮时,JavaScript 函数 showPage() 会根据用户的选择来显示相应的内容区域,并隐藏其他内容区域。

您可以根据需要添加更多分页按钮和内容区域,以适应您的项目。此外,您还可以改进样式、添加动画效果或连接到后端数据来扩展分页功能。

xml 复制代码
## 纯CSS方案
相信用`JavaScript`方案来实现大家都会,有的场景下,我们只需要实现静态页面时,真没必要用`JavaScript`来实现,一起看一下使用CSS怎么实现。

### 静态布局
首先搭建静态页面布局,效果如下:

![image.png](https://p9-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/df119a31464949e1ad4923ae82e36373~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=453&h=615&s=51976&e=png&b=f9f8f8)

我这里贴一些重要代码,方便理解,全部代码请在[这里]()查看
```html
 <div class="container">
    <h1>精选用户</h1>
    <div class="featured">
      <ul class="list">
        <li>
          <img src="https://picsum.photos/id/237/200/300" />
          <span>芝士</span>
        </li>
       ...
      </ul>
      <!-- Page 1 -->

      <ul class="list">
        <li>
          <img src="https://fastly.picsum.photos/id/730/200/200.jpg?hmac=wK_2ZX79XZRP1wVJ-dW_r-OkOjiz1kK8eHIyTw2Lr6s" />
          <span>看雪</span>
        </li>
        ...
      </ul>
      <!-- Page 2 -->
      ...

    </div>
    <div class="pagination">
      <a href="#page-1" id="page-1" class="page-btn">1</a>
      <a href="#page-2" id="page-2" class="page-btn">2</a>
      <a href="#page-3" id="page-3" class="page-btn">3</a>
      <a href="#page-4" id="page-4" class="page-btn">4</a>
    </div>
    <!-- 分页器 -->
  </div>

实现分页切换

接下来使用CSS实现分页效果:

scss 复制代码
@for $i from 1 through 5 {
	.container:has(#page-#{$i}:target) {
		& > .featured > .list {
			transform: translateX(($i - 1) * -100%);
		}
	}
}

上面代码使用的是sass的循环来生成实现的,下面是对代码的解释:

  1. @for $i from 1 through 5:这是一个 Sass 的 @for 循环,从 1 循环到 5,其中 $i 是循环变量。

  2. .container:has(#page-#{$i}:target):这是一个 CSS 选择器,使用了 :has() 伪类选择器,表示选中包含具有 id 为 "page-X"(其中 X 是 1 到 5 中的一个数字)且处于被点击目标状态的 .container 元素。

    • transform: translateX(($i - 1) * -100%);:根据循环变量 $i 的值,将 .list 元素水平平移。实现滑动式的内容切换,每次点击不同的分页导航,内容列表向左或向右滑动以显示不同的页面。

总的来说,这段代码通过循环,根据被点击目标状态的不同,设置了 .container 元素下子元素 .list 的平移效果。

看一下效果:

设置分页器默认效果

就这么easy就实现了简单的分页切换,接下来优化分页导航,使分页器显示当前选中的页码,增加css如下:

scss 复制代码
+ @mixin active() {
+ 	color: #ffffff;
+ 	background-color: #1b95ff;
+ }
+ .pagination {
+ 	...
+ 	&:not(:has(.page-btn:target)) {
+ 		#page-1 {
+ 			@include active();
+ 		}
+ 	}
+ }

使用mixin定义一个元素在active状态下的样式,字体颜色设置为白色,背景为蓝色; &:not(:has(.page-btn:target)):表示选中.pagination元素,但排除在不具有.page-btn:target 的子元素的情况。也就是说.pagination元素中没有点击状态的元素,然后设置第一个元素的默认样式为active

设置分页切换效果

在分页按钮上设置css:

scss 复制代码
.page-btn {
        ...
        text-decoration: none;
        background-color: #ffffff;
        border-radius: 50%;
        cursor: pointer;
        transition: color 128ms ease-out, background-color 128ms ease-out;

        &:not(:target):hover,
        &:not(:target):focus,
        &:not(:target):active {
                background-color: #dfdfdf;
        }

        &:target {
                @include active();
        }
}

&:not(:target):hover, &:not(:target):focus, &:not(:target):active:这是一个组合的伪类选择器,表示不处于被点击状态的元素在鼠标悬停、获得焦点和激活(点击)时的样式。 &:target则表示处于被点击状态的元素。

至此,分页效果就已经实现了,但是我们还可以继续追求完美,增加上一页,下一页的点击效果。

实现上一页/下一页

首先增加上一页和下一页的元素:

html 复制代码
  <div class="pagination">
+      <!-- 上一页 -->
+      <span class="page-btn page-step" data-shown="1"><<</span>
+      <a href="#page-1" class="page-btn page-step" data-shown="2"><<</a>
+      <a href="#page-2" class="page-btn page-step" data-shown="3"><<</a>
+      <a href="#page-3" class="page-btn page-step" data-shown="4"><<</a>
       ....
+     <!-- 下一页 -->
+      <a href="#page-2" class="page-btn page-step" data-shown="1">>></a>
+      <a href="#page-3" class="page-btn page-step" data-shown="2">>></a>
+      <a href="#page-4" class="page-btn page-step" data-shown="3">>></a>
+      <span class="page-btn page-step" data-shown="5">>></span>
    </div>

然后为其增加样式,让其显示在页面中:

scss 复制代码
+ .page-step {
+ 	display: none;
+ }
 .pagination {
	...
	&:not(:has(.page-btn:target)) {
+ 		.page-step[data-shown="1"] {
+ 			display: inline-flex;
+ 		}
		
		#page-1 {
			@include active();
		}
	}
}

其实我们要做的就是点击时,控制上一页/下一页按钮们切换隐藏与显示。我们还是在sass的for循环控制.page-step元素的隐藏与显示:

scss 复制代码
@for $i from 1 through 5 {
	.container:has(#page-#{$i}:target) {
		...
+		.page-step[data-shown="#{$i}"] {
+			display: inline-flex;
+		}
	}
}

好了,到这里就大功告成了,看一下效果是不是和我们预期的一模一样。

其实使用CSS来实现分页真的非常简单,为了方便大家理解,我是把代码拆分的非常详细进行解析的,核心思想就是通过CSS的for循环来控制元素的切换就可以实现啦!over~

欢迎关注公众号《前端界》,文章会同步更新,也可快速加入前端交流群!

相关推荐
耶啵奶膘1 小时前
uniapp-是否删除
linux·前端·uni-app
王哈哈^_^3 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie3 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic4 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿4 小时前
webWorker基本用法
前端·javascript·vue.js
cy玩具4 小时前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
qq_390161775 小时前
防抖函数--应用场景及示例
前端·javascript
John.liu_Test6 小时前
js下载excel示例demo
前端·javascript·excel
Yaml46 小时前
智能化健身房管理:Spring Boot与Vue的创新解决方案
前端·spring boot·后端·mysql·vue·健身房管理
PleaSure乐事6 小时前
【React.js】AntDesignPro左侧菜单栏栏目名称不显示的解决方案
前端·javascript·react.js·前端框架·webstorm·antdesignpro