• Swiper 自定义分页器 并实现多个用省略号显示


    在实际开发中,使用Swiper滚动页,常常也会用到它内置强大的分页器,但是,如果出现Swiper-slide数据较多,比如20条以上的时候,如果再强制使用它本身内置的分页器,那就显得太密密麻麻了

    所以,像是平常中,遇到多页内容,一般都会进行分页处理,而分页器内容太多的话就会用省略号处理,比如下面这种样子:

    在使用Swiper时也不例外。

    先看一下实现的效果图吧:

    css写得有点简陋,不过这不重要,看代码就好了。

    首先把Swiper部分搞定,这部分简单,省略可以吗?当然不可以:O(∩_∩)O哈哈~

    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge"/>
        <meta
                name="viewport"
                content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"
        />
        <title>swiper分页</title>
        <link rel="stylesheet" href="./css库/swiper.min.css">
        <style>
            *{
                margin: 0;
                padding: 0;
            }
            .content{
                width: 375px;
            }
            .item{
                box-sizing: border-box;
                width: 96%;
                height: 150px;
                background-color: #f2f2f2;
            }
        </style>
    </head>
    <body>
    <div class="content swiper-container">
        <div class="swiper-wrapper">
            <div class="swiper-slide item">
                1
            </div>
            <div class="swiper-slide item">
                2
            </div>
            <div class="swiper-slide item">
                3
            </div>
            <div class="swiper-slide item">
                4
            </div>
            <div class="swiper-slide item">
                5
            </div>
            <div class="swiper-slide item">
                6
            </div>
            <div class="swiper-slide item">
                7
            </div>
            <div class="swiper-slide item">
                8
            </div>
            <div class="swiper-slide item">
                9
            </div>
            <div class="swiper-slide item">
                10
            </div>
            <div class="swiper-slide item">
                11
            </div>
            <div class="swiper-slide item">
                12
            </div>
            <div class="swiper-slide item">
                13
            </div>
            <div class="swiper-slide item">
                14
            </div>
            <div class="swiper-slide item">
                15
            </div>
        </div>
    </div>
    </body>
    <script src="./JS库/swiper.min.js"></script>
    <script>
        const mySwiper = new Swiper('.swiper-container',{
            autoplay: false,
            /*slidesPerView: "auto",*/
            on: {
                slideChangeTransitionEnd: function () {
                    console.log(this.activeIndex);
                }
            }
        });
    </script>
    </html>

    一个简单的Swiper滚动页就做好了,其中on中的slideChangeTransitionEnd方法是监听滑动Swiper-slide结束之后执行的方法,比如我现在需要打印当前滑动到的item。这个方法对后面大有用处

    那么下一步当然是写一个强大的分页器了:

    var ms = {
        init: function(obj, args) {
            return (function() {
                ms.fillHtml(obj, args);
                ms.bindEvent(obj, args);
            })();
        },
        fillHtml: function(obj, args) {
            return (function() {
                obj.empty();
                if (args.current > 1) {
                    obj.append('<a href="javascript:;" class="prevPage">上</a>');
                } else {
                    obj.remove('.prevPage');
                    obj.append('<span class="disabled">上</span>');
                }
                if (args.current != 1 && args.current >= 4 && args.pageCount != 4) {
                    obj.append('<a href="javascript:;" class="tcdNumber">' + 1 + '</a>');
                }
                if (args.current - 2 > 2 && args.current <= args.pageCount && args.pageCount > 5) {
                    obj.append('<span>...</span>');
                }
                var start = args.current - 2,
                    end = args.current + 2;
                if ((start > 1 && args.current < 4) || args.current == 1) {
                    end++;
                }
                if (args.current > args.pageCount - 4 && args.current >= args.pageCount) {
                    start--;
                }
                for (; start <= end; start++) {
                    if (start <= args.pageCount && start >= 1) {
                        if (start != args.current) {
                            obj.append('<a href="javascript:;" class="tcdNumber">' + start + '</a>');
                        } else {
                            obj.append('<span class="current">' + start + '</span>');
                        }
                    }
                }
                if (args.current + 2 < args.pageCount - 1 && args.current >= 1 && args.pageCount > 5) {
                    obj.append('<span>...</span>');
                }
                if (args.current != args.pageCount && args.current < args.pageCount - 2 && args.pageCount != 4) {
                    obj.append('<a href="javascript:;" class="tcdNumber">' + args.pageCount + '</a>');
                }
                if (args.current < args.pageCount) {
                    obj.append('<a href="javascript:;" class="nextPage">下</a>');
                } else {
                    obj.remove('.nextPage');
                    obj.append('<span class="disabled">下</span>');
                }
                obj.append('<span class="pagecount">共' + args.pageCount + '页</span>');
                if (args.turndown == 'true') {
                    obj.append('<span class="countYe">到第<input type="text" maxlength=' + args.pageCount.toString().length + '>页<a href="javascript:;" class="turndown">确定</a><span>');
                }
            })();
        },
        bindEvent: function(obj, args) {
            return (function() {
                obj.on("click", "a.tcdNumber",
                    function() {
                        var current = parseInt($(this).text());
                        ms.fillHtml(obj, {
                            "current": current,
                            "pageCount": args.pageCount,
                            "turndown": args.turndown
                        });
                        if (typeof(args.backFn) == "function") {
                            args.backFn(current);
                        }
                    });
                obj.on("click", "a.prevPage",
                    function() {
                        var current = parseInt(obj.children("span.current").text());
                        ms.fillHtml(obj, {
                            "current": current - 1,
                            "pageCount": args.pageCount,
                            "turndown": args.turndown
                        });
                        if (typeof(args.backFn) == "function") {
                            args.backFn(current - 1);
                        }
                    });
                obj.on("click", "a.nextPage",
                    function() {
                        var current = parseInt(obj.children("span.current").text());
                        ms.fillHtml(obj, {
                            "current": current + 1,
                            "pageCount": args.pageCount,
                            "turndown": args.turndown
                        });
                        if (typeof(args.backFn) == "function") {
                            args.backFn(current + 1);
                        }
                    });
                obj.on("click", "a.turndown",
                    function() {
                        var page = $("span.countYe input").val();
                        if (page > args.pageCount) {
                            alert("您的输入有误,请重新输入!");
                        }
                        ms.fillHtml(obj, {
                            "current": page,
                            "pageCount": args.pageCount,
                            "turndown": args.turndown
                        });
                    });
            })();
        }
    }

    简单说一下:init方法,应该都能看明白了,初始化并执行两个函数。

    fillHTML是自动填充分页器节点,里面有一堆的样式判断,就不一一解释了,有空的朋友可以研究一下。

    bindEvent是绑定里面的点击方法,这里面利用了闭包函数,使得在for循环注册点击事件的时候,让每个方法都能执行到相应的部分。(不懂闭包的可以自行把百度)

    写好上面之后,下一步,用jQuery原型声明一个函数

    $.fn.createPage = function(options) {
        var args = $.extend({
                pageCount: 10,
                current: 1,
                turndown: true,
                backFn: function() {}
            },
            options);
        ms.init(this, args);
    }

    然后就大功告成了。

    在上面的HTML那里声明一个分页器盒,最好在content后面添加。

    <div class="pagesDiv">
    
    </div>

    然后呢,就是引用这个方法了,记得引用JQuery插件。

    const mySwiper = new Swiper('.swiper-container',{
            autoplay: false,
            /*slidesPerView: "auto",*/
            on: {
                slideChangeTransitionEnd: function () {
                    console.log(this.activeIndex);
                    ms.fillHtml($('.pagesDiv'), {
                        "current": this.activeIndex + 1,
                        "pageCount": 15,
                        "turndown": false
                    });
                }
            }
        });
        $(".pagesDiv").createPage({
            pageCount: 15, //总页数
            current: 1, //当前页
            turndown: 'true', //是否显示跳转框,显示为true,不现实为false,一定记得加上引号...
            backFn: function (p) {
                mySwiper.slideTo(p - 1, 800, false);
            }
        });

    还差一段css代码:

    .pagesDiv{
                margin-top: 15px;
                width: 100%;
                text-align: center;
                display: flex;
                justify-content: center;
                align-items: center;
                clear: both;
            }
            .disabled{
                display: inline-block;
                height: 25px;
                width: 25px;
                text-align: center;
                line-height: 25px;
                border-radius: 50%;
                margin: 0 2px;
                color: #333;
                background: #f2f2f2;
                border: 1px solid #bfbfbf;
                vertical-align: middle;
            }
            .current{
                display: inline-block;
                height: 25px;
                width: 25px;
                text-align: center;
                line-height: 25px;
                margin: 0 2px;
                color: #a73feb;
                border-radius: 4px;
                vertical-align: middle;
                font-size: 18px;
            }
            .pagesDiv a{
                text-decoration: none;
                display: inline-block;
                color: #ffffff;
                height: 25px;
                line-height: 25px;
                width: 25px;
                text-align: center;
                border-radius: 50%;
                border: 1px solid #ddd;
                background: #999;
                margin: 0 2px;
                vertical-align: middle;
                font-size: 16px;
            }
            .pagecount{
                display: none;
                padding: 0 10px;
                font-size: 16px;
                color: #999999;
                margin-right: -30px;
            }
            .countYe{
                display: none;
                color: #ffffff;
                margin-left: 30px;
                font-size: 14px;
            }
            input{
                outline: none;
                border: 1px solid #ddd;
                height: 25px;
                padding: 3px 10px;
                width: 25px;
                margin: 0 5px;
            }
            .turndown{
                padding: 3px 10px;
            }

    写得实在有点简单,美化就靠大家了,其实上面分页器还有两个要素是没有显示的:

    一个是总页数,还有一个是根据输入的数字跳转,细心的朋友在研究上面ms对象的时候应该会发现还有这两个的,当然,我是把它们给隐藏掉了,因为用不到嘛~

  • 相关阅读:
    【贪心 堆】luoguP2672 推销员
    【贪心 思维题】[USACO13MAR]扑克牌型Poker Hands
    「整理」[图论]最短路系列
    收集到的小玩意儿
    初遇构造函数
    在2440开发板液晶上显示两行字
    error: converting to execution character set: Invalid or incomplete multibyte or wide character
    宽字节
    宽字符wchar_t和窄字符char区别和相互转换
    linux获取文件大小的函数
  • 原文地址:https://www.cnblogs.com/liao123/p/12698035.html
Copyright © 2020-2023  润新知