【问题标题】:jQuery quicksand sortingjQuery流沙排序
【发布时间】:2012-11-02 22:09:00
【问题描述】:

在包含 120 张图片 (130x130 像素) 的长面板上使用 iosslider 进行触摸滑动滑动。我正在使用 jQuery quicksand 对 4 列中的块集合进行排序。所以我需要克隆它们,提取项目块,对它们进行排序并将它们重新添加到列(面板)中。

<div id="tiles_viewport">
  <div id="mouseSwipeScroll">
    <div class="panel">
        <div class="item" data-id="1" data-state="1"><img src="xxx" /></div>
        <div class="item" data-id="2" data-state="1"><img src="xxx" /></div>
        <div class="item" data-id="3" data-state="1"><img src="xxx" /></div>
        <div class="item" data-id="4" data-state="0"><img src="xxx" /></div>
    </div>
    <div class="panel">
        <div class="item" data-id="5" data-state="1"><img src="xxx" /></div>
        <div class="item" data-id="6" data-state="1"><img src="xxx" /></div>
        <div class="item" data-id="7" data-state="1"><img src="xxx" /></div>
        <div class="item" data-id="8" data-state="0"><img src="xxx" /></div>
    </div>
    <div class="panel">...

CSS...

#tiles_viewport {
  position: relative;
  top: 0;
  left: 0;
  width: 100%;
  height: 535px;
  margin: 5px 0;
  padding: 0;
  overflow: hidden;
  z-index: 10;
}

#mouseSwipeScroll {
  -webkit-user-select: none;
  -moz-user-select: none;
  position: relative;
  margin: 0;
  padding: 0;
  width: 100%;
  height: 100%;
}

#mouseSwipeScroll .panel {
  float: left;
  margin: 0;
  padding: 0;
  width: 130px;
  height: 535px;
  overflow: hidden;
}

#mouseSwipeScroll .panel .item {
  position: relative;
  margin: 0;
  padding: 0 5px 5px 5px;
  width: 120px;
  height: 130px;
}

Javascript:

$(function() { 
  sortTiles = function() {
        var panels = $('.panel');
        var items = $(panels).children('.item');
        var sortedItems = $(items).clone();

        // sort //
        sortedItems.sort(function(a, b) {
            return parseInt($(b).data('state')) - parseInt($(a).data('state'));
        });

        // wrap into panels again //
        $.each(sortedItems, function(i, el) {
            if(i % 4 == 0) {
                sortedItems.slice(i , i+4).wrapAll('<div class="panel">');
            }
        });

        // animate //
        $(panels).quicksand(sortedItems, {
            duration: 800,
            easing: 'easeInOutQuad'
        });
      }
});

$(document).ready(function() {

      $('#tiles_viewport').iosSlider({
        snapToChildren: true,
        desktopClickDrag: true,
        startAtSlide: 4
      });
});

排序不起作用,并且 wrapAll 也没有添加封闭面板 div。 关注这个问题已经有一段时间了,希望能得到一些建议。

非常感谢,

抢劫。

【问题讨论】:

    标签: jquery sorting quicksand


    【解决方案1】:

    您的代码中的缺陷是sort() 仅对 jQuery 对象进行排序,但不会更改 DOM。下面简单的添加一行来清空现有的内容并将wrapAll的概念更改为创建一个新的div并立即将其插入到DOM中

    var panels = $('.panel');
    var items = $(panels).children('.item');
    var sortedItems = $(items).clone(); // sort //
    
    $('#content').empty();
    
    sortedItems.sort(function(a, b) {
        return parseInt($(b).data('state')) - parseInt($(a).data('state'));
    });
    
    $.each(sortedItems, function(i, el) {
        if (i % 4 == 0) {
            $('<div class="panel">').append(  sortedItems.slice(i, i + 4)).appendTo('#content')
        }
    });
    

    演示:http://jsfiddle.net/yMtwp/

    【讨论】:

      【解决方案2】:

      我认为您的问题主要与跨多个面板对项目进行沙子排序有关,这会导致沙子排序插件行为异常。如果您可以不使用面板,我建议您只将它们放入 1 个面板中,一切都会正常工作。

      如果不是,我建议下面的解决方案,您有一个用于所有面板的容器,在这个超级面板上进行沙子分类,然后在沙子分类完成后重建面板。我在下面放了一个工作示例:

      <html>
      <head>
      <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
      <script type="text/javascript" src="http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js"></script>
      <script type="text/javascript" src="https://github.com/razorjack/quicksand/raw/master/jquery.quicksand.js"></script>
      <script type="text/javascript">
          function sortTiles() {
              var superpanel = $('.superpanel');
              var items = superpanel.find('.item');
              var sortedItems = items.clone();
      
              // sort //
              sortedItems.sort(function(a, b) {
                  return parseInt($(b).data('state')) - parseInt($(a).data('state'));
              });
      
              // animate //
              superpanel.quicksand(sortedItems, {
                  duration: 800
              }, function() {
                 // wrap into panels again //
                 var items = $('.superpanel .item');
                 for(i=0; i<items.length; i+=4) {
                      items.slice(i , i+4).wrapAll('<div class="panel">');
                 }
              });
      
          }   
          $(function() {
              sortTiles();
          });
          </script>     
      </head>
      <html>
      <body>
          <div class="superpanel">
              <div class="panel">
                  <div class="item" data-id="4" data-state="4">Content 4</div>
                  <div class="item" data-id="1" data-state="1">Content 1</div>
                  <div class="item" data-id="3" data-state="3">Content 3</div>
                  <div class="item" data-id="2" data-state="2">Content 2</div>
              </div>
              <div class="panel">
                  <div class="item" data-id="8" data-state="8">Content 8</div>
                  <div class="item" data-id="5" data-state="5">Content 5</div>
                  <div class="item" data-id="7" data-state="7">Content 7</div>
                  <div class="item" data-id="6" data-state="6">Content 6</div>
              </div>
          </div>
      </body>
      </html>
      

      编辑

      这是另一种建议,即制作列并同时将它们放在一个面板中,而不是重新组合会使动画变得丑陋。

      <html>
      <head>
      <style>
          .item {
              display: inline-block;
              width: 40%;
          }
      </style>
      
      <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.1/jquery.min.js"></script>
      <script type="text/javascript" src="http://gsgd.co.uk/sandbox/jquery/easing/jquery.easing.1.3.js"></script>
      <script type="text/javascript" src="https://github.com/razorjack/quicksand/raw/master/jquery.quicksand.js"></script>
      <script type="text/javascript">
          function sortTiles() {
              var superpanel = $('.superpanel');
              var items = superpanel.find('.item');
              var sortedItems = items.clone();
      
              // sort //
              sortedItems.sort(function(a, b) {
                  return parseInt($(b).data('state')) - parseInt($(a).data('state'));
              });
      
              // animate //
              superpanel.quicksand(sortedItems, {
                  duration: 800
              });
      
          }   
          $(function() {
              window.setTimeout(sortTiles, 1000);
          });
          </script>     
      </head>
      <html>
      <body>
          <div class="superpanel">
                  <div class="item" data-id="4" data-state="4">Content 4</div>
                  <div class="item" data-id="1" data-state="1">Content 1</div>
                  <div class="item" data-id="3" data-state="3">Content 3</div>
                  <div class="item" data-id="2" data-state="2">Content 2</div>
                  <div class="item" data-id="8" data-state="8">Content 8</div>
                  <div class="item" data-id="5" data-state="5">Content 5</div>
                  <div class="item" data-id="7" data-state="7">Content 7</div>
                  <div class="item" data-id="6" data-state="6">Content 6</div>
          </div>
      </body>
      </html>
      

      【讨论】:

      • 非常好...非常感谢。我还在内容上使用 iosSlider,每个块中都有一个图像......这不能很好地处理它。浏览器也不能很好地处理动画。
      • 如果您可以添加更多详细信息和代码,也许我们可以提供更好的帮助
      • 我在我的问题中添加了更多细节。我发现的主要问题是排序会破坏 iosslider。浏览器也无法处理动画……一次移动 120 张图像。开发站点是dev.garvald.sugarshaker.com
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多