在单击按钮时使用同位素对数据进行排序,目前只运行一次动画

Sorting data with isotope on button click, currently only runs animation once

本文关键字:运行 目前 动画 一次 排序 按钮 单击 同位素 数据      更新时间:2023-09-26

问题

当一个人点击某个特定科目的.btn按钮时:数学、英语、科学或社会研究,我希望使用Isotope.js $grid.isotope({ sortBy: "percentage" });来按分数从高到低的顺序排列。

  • 目前,它只排序一次,您将看到动画更改.schools的顺序。但当你第二次点击时,从技术上讲,它们已经按从高到低的顺序排列了,所以你只看到了这个小反弹,但实际上什么都没有发生
  • 我想让它看起来像是在重新排序因此,在这种情况下,我是否应该在if语句的某处包含$grid.isotope({ sortBy: "original-order" });,以便每次单击按钮时都运行动画

scripts.js

$(function(){
    function printData() {
        // Generates zero-indexed numbers from one through nineteen
        for(var i = 0; i < schools.length; i++) {
            // console.log(i);
            // Each school will have data pertaining to their name, district and crest
            var schoolName = $(".school__name").eq(i).html(schools[i].name);
            var schoolDistrict = $(".school__district").eq(i).html(schools[i].district);
            var schoolCrest = $(".school__image").eq(i).attr("src", schools[i].crest);
            // English is shown as the default subject as it has a class 'is-selected'
            var percentEnglish = $(".school__percentage").eq(i).html(schools[i].percentEnglish);
        }
    }
    function pickSubject() {
        $(".btn").click(function(){
            // A default class of is-selected is removed
            // It is then added onto whatever button you just clicked
            $(".btn").removeClass("is-selected");
            $(this).addClass("is-selected");
            // Set a variable to indicate the grid container
            // Select what items will be used in the layout
            var $grid = $(".schools").isotope({
                itemSelector: ".school",
                layoutMode: 'fitRows',
                // Reference the class of the specific div
                // parseInt or the numbers will be out of order
                getSortData: {
                    percentage: ".school__percentage parseInt",
                },
                // True is the default order
                // Sort in ascending order 1,2,3 = true
                // Sort in descending order 3,2,1 = false
                sortAscending: {
                    percentage: false
                }
            });
            // Sort by percentage
            $grid.isotope({ sortBy: "percentage" });
            // If the button you just click has a specific class
            // Then present all the data associated with those schools
            if ($(this).hasClass("btn-english")) {
                $(".school__percentage").each(function(i, element) {
                    $(element).html(schools[i].percentEnglish);
                });
            } else if ($(this).hasClass("btn-math")) {
                $(".school__percentage").each(function(i, element) {
                    $(element).html(schools[i].percentMath);
                });
            } else if ($(this).hasClass("btn-science")) {
                $(".school__percentage").each(function(i, element) {
                    $(element).html(schools[i].percentScience);
                });
            } else if ($(this).hasClass("btn-social")) {
                $(".school__percentage").each(function(i, element) {
                    $(element).html(schools[i].percentSocial);
                });
            }
        });
    }
    printData();
    pickSubject();
});

index.html

<!-- Elementary school -->
    <div class="widget high-school">
        <div class="widget__info">
            <p class="widget__category">Elementary school</p>
            <p class="widget__title">Missouri Assessment Program standouts</p>
        </div>
        <div class="widget__buttons">
            <p class="widget__rank">Rank by:</p>
            <button class="btn btn-english is-selected">English</button>
            <button class="btn btn-math">Math</button>
            <button class="btn btn-science">Science</button>
            <button class="btn btn-social">Social Studies</button>
        </div>
        <div class="wrapper">
            <div class="schools">
                <div class="school" data-id="1">
                    <img src="src/img/crest-clayton.jpg" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="2">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="3">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="4">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="5">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="6">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="7">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="8">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="9">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="10">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="11">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="12">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="13">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="14">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="15">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="16">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="17">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="18">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="19">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
                <div class="school" data-id="20">
                    <img src="" class="school__image">
                    <div class="school__details">
                        <div class="school__name">tk-name</div>
                        <div class="school__district">tk-district</div>
                    </div>
                    <div class="school__percentage">-%</div>
                </div> <!-- school -->
            </div><!-- schools -->
        </div>
        <div class="all__container">
            <div class="all__container--right">
                <button class="btn btn-download"><i class="fa fa-download" aria-hidden="true"></i> Download</button>
                <button class="btn btn-embed"><i class="fa fa-share" aria-hidden="true"></i>Embed</button>
            </div>
        </div>
        <div class="branding">
            <img src="">
        </div>
    </div><!-- widget -->

您需要使用

$grid.isotope('updateSortData').isotope();

在SortBy方法之后,因此您"在对项元素进行更改后更新排序数据",符合文档

这个问题可能很老,但同位素排序只出现过一次问题。修复涉及破坏和重新初始化同位素
在.click事件函数之外实例化此

var isOptions = {
                itemSelector: ".school",
                layoutMode: 'fitRows',
                // Reference the class of the specific div
                // parseInt or the numbers will be out of order
                getSortData: {
                    percentage: ".school__percentage parseInt",
                },
                // True is the default order
                // Sort in ascending order 1,2,3 = true
                // Sort in descending order 3,2,1 = false
                sortAscending: {
                    percentage: false
                }
            }
$grid.isotope(isOptions);

在$(".btn"(.点击函数中,在调用排序函数之前添加这两行

$grid.isotope('destroy')
$grid.isotope(isOptions);
//Sort by percentage
$grid.isotope({ sortBy: "percentage" });

你本质上是在破坏和重新初始化同位素。