【问题标题】:Isotope Layout with Pagination? Or incremental loading at least?带分页的同位素布局?或者至少是增量加载?
【发布时间】:2013-12-29 00:05:16
【问题描述】:

我正在帮助客户使用在砌体布局中使用 Isotope.js 的 Wordpress 模板。

Isotope.min.js:http://isotope.metafizzy.co/ 或此处的源代码:http://isotope.metafizzy.co/jquery.isotope.js

基础模板:http://themetrust.com/demos/ink/

问题是他们有成百上千的项目需要在该投资组合中,因此显示它们成为一个问题。显然,我们不希望所有这些都一次加载。即使集成了某种形式的延迟加载,它仍然会很大。

问题:是否有可能改变 Isotope 以包括某种分页?也许在最底部有一个“点击这里加载更多”的 div,然后加载下一批项目?甚至更好 - 主循环中的某些内容,以便每 20 个块只显示“加载更多项目”,然后单击它将前 19 个项目替换为接下来的 19 个项目(19 个项目 + 加载更多块,以便始终有一个网格20)?

基本上,我只是想找出仍然使用 Isotope 的最佳方法(因此我们不必完全重做客户喜欢的模板部分),而是让它逐步加载它的项目,以便加载时间和页面大小受到不利影响。任何帮助将不胜感激!

【问题讨论】:

  • 据我所知,Isotope 没有任何内置的分页系统。这意味着您必须从头开始执行 ui 和逻辑,并根据您的规则从同位素容器中添加/删除项目。
  • 它有一个 append 方法:isotope.metafizzy.co/beta/methods.html#appended 我想也许这只是弄清楚如何只加载一定数量的条目,然后用 a 追加或重新加载下一个项目的情况按钮。

标签: javascript jquery wordpress pagination jquery-isotope


【解决方案1】:

我遇到了同样的问题,最后设法为同位素添加了分页。虽然我的解决方案有效,但在管理大数据时却无济于事,因为所有数据都已加载并因此被过滤。

首先,我将所有内容分成页面,并为每个项目分配匹配的 css 类(page1、page2、page3、...)。然后我在前端添加了分页,并使用 JavaScript 设置了匹配过滤器。以下是我的 TYPO3 Extbase 设置中的一些代码示例:

Controller 中的 PHP 计算页面过滤器的 css 类:

$itemsPerPage = 6;
$c = 1;
$catPages = array(); // needed for categories, so that both filters (page and category) work together
foreach ( $projects AS $key => $project ) {
    $page = ceil( $c / $itemsPerPage );
    $projects[ $key ]->pageClass = 'page' . $page;
    $c++;

    // Get all categories of project to calculate the category-related page
    $cats = $project->getCategories();
    foreach ( $cats AS $cat ) {
        /* @var $cat \TYPO3\CMS\Extbase\Domain\Model\Category */
        $catid = $cat->getUid();
        $catPages[ $catid ]++;
        $catPage = ceil( $catPages[ $catid ] / $itemsPerPage );
        $projects[ $key ]->pageClass .= ' cat' . $catid . 'page' . $catPage;
    }
}
$nrPages = ceil( count( $projekts ) / $itemsPerPage );

$nrCatPages = array();
foreach ( $catPages AS $key => $value ) {
    $object = new \stdClass();
    $object->catid = $key;
    $object->nrPages = ceil( $value / $itemsPerPage );
    $nrCatPages[] = $object;
}

$this->view->assign( 'projects', $projects );
$this->view->assign( 'kategorien', $kategorien );
$this->view->assign( 'nrPages', $nrPages );
$this->view->assign( 'nrCatPages', $nrCatPages );

使用这段代码,我计算出了所有需要的 css 类。

模板中的 HTML

在 HTML 代码中,我为每个项目分配了 CSS 类,这是在控制器中使用 <div class="item {project.pageClass}">... 计算的

然后我为分页添加了 HTML 代码:

<div id="pagination-wrap">

    <!-- Pagination for all items (no category selected) -->
    <f:if condition="{nrPages}>1">
        <ul class="pagination-cm all">
            <li class="pageinfo">Page <span class="currentPage">1</span> of {nrPages}</li>
            <li class="prev"><a class="page-selector inactive" data-page="prev">&lt;</a></li>
            <v:iterator.for from="1" to="{nrPages}" iteration="i">
                <f:if condition="{i.isFirst}">
                    <f:then><li><a class="page-selector inactive" data-page-nr="{i.index}" data-page="page{i.index}">{i.index}</a></li></f:then>
                    <f:else><li><a class="page-selector" data-page-nr="{i.index}" data-page="page{i.index}">{i.index}</a></li></f:else>
                </f:if>
            </v:iterator.for>
            <li class="next"><a class="page-selector" data-page="next">&gt;</a></li>
        </ul>
    </f:if>

    <!-- Paginations for each category -->
    <f:if condition="{nrCatPages}">
        <f:for each="{nrCatPages}" as="catpages">
            <f:if condition="{catpages.nrPages}>1">
                <ul class="pagination-cm category cat{catpages.catid}">
                    <li class="pageinfo">Page <span class="currentPage">1</span> of {catpages.nrPages}</li>
                    <li class="prev"><a class="page-selector inactive" data-page="prev">&lt;</a></li>
                    <v:iterator.for from="1" to="{catpages.nrPages}" iteration="i">
                        <f:if condition="{i.isFirst}">
                            <f:then><li><a class="page-selector inactive" data-page-nr="{i.index}" data-page="cat{catpages.catid}page{i.index}">{i.index}</a></li></f:then>
                            <f:else><li><a class="page-selector" data-page-nr="{i.index}" data-page="cat{catpages.catid}page{i.index}">{i.index}</a></li></f:else>
                        </f:if>
                    </v:iterator.for>
                    <li class="next"><a class="page-selector" data-page="next">&gt;</a></li>
                </ul>
            </f:if>
        </f:for>
    </f:if>

</div>

JavaScript

最后,我只需要下面的 JavaScript,就可以使用同位素进行分页(所有 JS,无需重新加载页面!):

jQuery(document).ready(function () {
    /* Isotope Pagination */
    var $container = jQuery('.portfolio');
    // start by showing page 1 on page load
    $container.isotope({
        filter: '.page1'
    });

    /* when changing category, display correct pagination */
    jQuery('.port-filter li a').click(function () {
        jQuery('.pagination-cm').hide();
        var pagination = jQuery(this).parent().attr("data-pagination");
        jQuery('.pagination-cm.' + pagination).find("li.pageinfo > span.currentPage").text(1);
        jQuery('.pagination-cm.' + pagination).show();
        refreshPagination();
    });

    /* when pagination item is clicked, use isotope filter to show correct items */
    jQuery('.portfolio-container').on('click', '.page-selector:not(.inactive)', function () {
        var $pagination = jQuery(this).closest("ul");
        var $currentPage = $pagination.find("li.pageinfo > span.currentPage");
        var page = jQuery(this).attr("data-page");
        var current = parseInt($currentPage.text());

        var newPage = 1;
        if (page == 'next') {
            newPage = current + 1;
            page = (($pagination.find("li:not(.next):not(.prev) .page-selector").attr("data-page")).slice(0, -1) + newPage);
        }
        else if (page == 'prev') {
            newPage = current - 1;
            page = (($pagination.find("li:not(.next):not(.prev) .page-selector").attr("data-page")).slice(0, -1) + newPage);
        }
        else {
            newPage = jQuery(this).text();
        }

        $currentPage.text(newPage);
        $container.isotope({
            filter: '.' + page,
            animationOptions: {
                duration: 750,
                easing: 'linear',
                queue: false
            },
            layoutMode: 'fitRows'
        });

        refreshPagination();

        return false;
    });

    /* refresh pagination display: disable current page button and prev/next buttons if necessary */
    function refreshPagination() {
        jQuery('.portfolio-container .pagination-cm:visible').each(function (index, value) {
            var $pagination = jQuery(value);
            var currentPage = parseInt($pagination.find("li.pageinfo > span.currentPage").text());
            $pagination.find("a.page-selector").removeClass("inactive");

            // Aktuelle Seite
            $pagination.find("li a.page-selector[data-page-nr=" + currentPage + "]").addClass("inactive");

            // Prev-Button
            if (currentPage == 1) $pagination.find("li.prev a.page-selector").addClass("inactive");
            else $pagination.find("li.prev a.page-selector").removeClass("inactive");

            // Next-Button
            var lastPage = $pagination.find("li:not(.next):last .page-selector").attr("data-page-nr");
            if (currentPage < lastPage) $pagination.find("li.next a.page-selector").removeClass("inactive");
            else $pagination.find("li.next a.page-selector").addClass("inactive");
        });
    }

});

就像我说的,这来自 TYPO3 上下文。我在基于 extbase 的自定义扩展中实现了这段代码。如果不进行调整,这些代码片段将无法移植到其他项目中,但我希望它们仍然会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-20
    • 2013-10-22
    相关资源
    最近更新 更多