全网都找了一遍没有找到符合UI需求的分页动画,于是就主动上手了
需求:
1、分页最多显示9页,总页数最多显示无上限;
2、点击下一页的时候需要有动画效果过度,如果当前页数是当前显示最后的一页,则停了当前显示最后的位置,但是点击下一页的时候需要用户感知
效果如图所示:

1、代码如下:
-
- <template>
- <div><br>当前显示页面{{current}}
- <div class="pagination">
- <div @click="prevPage">上一页</div>
- <div v-for="(item, index) in totalPages" :key="index" :class="{ 'active': current == item }">
- <div v-if="node.indexOf(item) != -1" class="point"></div>
- </div>
- <div @click="nextPage">下一页</div>
- </div>
- </div>
- </template>
-
- <script>
- export default {
- name: 'Pagination',
- props: {
- totalPages: {
- type: Number,
- required: true
- },
- pageSize: {
- type: Number
- }
- },
- data() {
- return {
- current: 1, // 当前选中页
- node: [], // 当前显示的页数组
- }
- },
- methods: {
- prevPage() {
- if (this.current == 1) {
- return
- }
- this.current -= 1
- let noedeIndex = this.node[this.node.length - 1]
- this.$emit('pageChange', this.current)
- if ((noedeIndex - (this.current - 1)) > this.pageSize) {
- this.node.pop() // 删除最后一个
- this.node.unshift(this.current) // 开头插入一个
- }
- },
-
- nextPage() {
- if (this.current == this.totalPages) {
- return
- }
- this.current += 1
- this.$emit('pageChange', this.current)
- let noedeIndex = this.node[this.node.length - 1]
- // 当前页不等于最后一页,当前页大于等于展示页,当前页大于缓存数组的最后一页(确保重复加入)
- if (this.current > this.pageSize && (this.current > noedeIndex)) {
- this.node.shift() // 删除第一个
- this.node.push(this.current) // 最近最新一个
- }
- },
- },
- mounted() {
- for (let i = 1; i <= this.pageSize; i++) {
- this.node.push(i)
- }
- },
- }
- </script>
-
- <style lang="less" scoped>
- .pagination {
- display: flex;
- width: 100%;
- justify-content: center;
- }
-
- .point {
- margin: 0 5px;
- width: 8px;
- height: 8px;
- // margin: -5px 0 0 0;
- border-radius: 50%;
- background: #B5AC97;
- transition: transform 0.3s, background 0.3s;
-
- }
-
- .active .point {
- -webkit-transform: scale3d(1.5, 1.5, 1);
- transform: scale3d(1.5, 1.5, 1);
- // width: 10px;
- // height: 10px;
- background: #FFE6AD;
- box-shadow: 0 0 4px 0 #FFE990;
- animation: 0.3s linear 0s 1 alternate example;
-
- }
-
- @keyframes example {
- 0% {
- transform: scale3d(1, 1, 1);
- }
-
- 25% {
- transform: scale3d(1, 1, 1);
- }
-
- 50% {
- transform: scale3d(1.5, 1.5, 1);
- }
-
- 100% {
- transform: scale3d(1.5, 1.5, 1);
- }
- }
- </style>
2、引用方式
-
- <template>
- <div>
- <pagination :total-pages="totalPages" :page-size="9" @pageChange="handlePageChange" />
- </div>
- </template>
-
- <script>
- import Pagination from './views/Pagination.vue'
-
- export default {
- components: {
- Pagination
- },
- data() {
- return {
- totalPages: 25,
- }
- },
- computed: {
-
- },
- methods: {
- handlePageChange(page) {
- console.log('page: ', page);
- }
- }
- }
- </script>