首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Masonry -滚动到layout -infinite上单击的元素

Masonry -滚动到layout -infinite上单击的元素
EN

Stack Overflow用户
提问于 2013-12-23 21:08:47
回答 1查看 518关注 0票数 0

我正在尝试做两个动作在一个点击的元素使用砖石库。它的工作方式应该是,当我单击元素时,它会展开(我正在添加类以使框更大),同时页面会滚动到该框。问题是,当您展开框时,它可能会向下拉出一行,这意味着调用滚动的函数将滚动到错误的位置。它应该进行布局,并获得元素的新位置,然后移动...

我几乎把它弄好了。它正在扩展框并进行新的布局,完成后将页面滚动到框中……但它看起来有点奇怪,它首先移动新布局的所有框,然后停止并连续移动页面。我更希望这一步就能完成。这是可能的。

下面是我的代码:

代码语言:javascript
复制
$(document).ready(function() {


    var $container = $('#container');
    // initialize

    var msnry = new Masonry( container, {
        columnWidth: 280,
        itemSelector: '.item'
    } );



    $('.openBoks').on('click', function() {

                    // this is my element
                    var thisBox = $(this).parent().parent();

                    // adding the class to expand it
                    thisBox.addClass('opened');

                    // calling method to do new layout
                    msnry.layout();


            msnry.on( 'layoutComplete', function( msnryInstance, laidOutItems ) 
                      {

                $('html, body').animate({
                    scrollTop: (thisBox.offset().top-10)
                    }, 700);

                return true;
              });


    });

});
EN

回答 1

Stack Overflow用户

发布于 2014-03-12 13:42:15

如果您或其他人仍然在寻找这个问题的答案,我做了一些解决方法。想法基本上是一样的,同时做卷轴和砖石的重新定位。这不是最优雅的解决方案,因为我在砖石脚本中添加了几行代码。

masonry.pkgd.js内部,有一个函数_processLayoutQueue,它定位存储在queue数组中的砖石项目,并为每个项目调用_positionItem

代码语言:javascript
复制
Outlayer.prototype._processLayoutQueue = function( queue ) {
  for ( var i=0, len = queue.length; i < len; i++ ) {
    var obj = queue[i];
    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant );
  }
};

我所做的是使用标识masonry类检查项目的迭代,在您的例子中是".opened“。因此,当找到该项目时,我立即使用cointainer div (本例中为“#container_div_id”)作为偏移量并添加项目"y“位置(obj.y)来激活页面滚动。最后,代码看起来像这样:

代码语言:javascript
复制
Outlayer.prototype._processLayoutQueue = function( queue ) {
  for ( var i=0, len = queue.length; i < len; i++ ) {
    var obj = queue[i];

    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant );

    /* ADDED CODE */
    if( $(obj.item.element).hasClass('opened')){
        $('html, body').animate({
            scrollTop: $('#container_div_id').offset().top+obj.y
        }, 600);
    }
    /* END OF ADDED CODE */

  }
};

这使得滚动在项目定位后立即开始,而不必等待layoutComplete事件。正如我所说的,这不是最优雅的解决方案,但它是相当可靠的,它很适合我的情况。

希望它能帮助一些人!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20744269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档