如何显示通过动画排序的HTML元素

yar*_*rek 3 javascript css jquery css3

这是我的片段:

.item {
  display:inline-block;
  width:120px;
  height:120px;
  border:1px solid red;
}
Run Code Online (Sandbox Code Playgroud)
<div id="listing">
  <div data-value="5" class="item">item 5</div>
  <div data-value="3" class="item">item 3</div>
  <div data-value="2" class="item">item 2</div>
  <div data-value="1" class="item">item 1</div>
  <div data-value="4" class="item">item 4</div>
</div>
Run Code Online (Sandbox Code Playgroud)

我想div根据data-value属性的值对s 进行排序,但我想显示使用动画重新排列的项目.我怎样才能做到这一点?

dav*_*ave 6

以下是如何为排序设置动画:

  1. 循环遍历所有元素并存储其位置
  2. 将元素绝对放置在原始位置
  3. 获取将被替换的项目的位置,并为该位置设置动画.
  4. (可选)动画完成后,您可能希望按排序顺序将常定项目换出绝对定位的项目,因此元素的DOM顺序是正确的.

function animateSort(parent, child, sortAttribute) {
  var promises = [];
  var positions = [];
  var originals = $(parent).find(child);
  var sorted = originals.toArray().sort(function(a, b) {
    return $(a).attr(sortAttribute) > $(b).attr(sortAttribute);
  });

  originals.each(function() {
    //store original positions
    positions.push($(this).position());
  }).each(function(originalIndex) {
    //change items to absolute position
    var $this = $(this);
    var newIndex = sorted.indexOf(this);
    sorted[newIndex] = $this.clone(); //copy the original item before messing with its positioning
    $this.css("position", "absolute").css("top", positions[originalIndex].top + "px").css("left", positions[originalIndex].left + "px");

    //animate to the new position
    var promise = $this.animate({
      top: positions[newIndex].top + "px",
      left: positions[newIndex].left + "px"
    }, 1000);
    promises.push(promise);
  });

  //instead of leaving the items out-of-order and positioned, replace them in sorted order
  $.when.apply($, promises).done(function() {
    originals.each(function(index) {
      $(this).replaceWith(sorted[index]);
    });
  });
}

$(function() {
  $("input").click(function() {
    animateSort("#listing", "div", "data-value");
  });
});
Run Code Online (Sandbox Code Playgroud)
.item {
  display: inline-block;
  width: 120px;
  height: 120px;
  border: 1px solid red;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<input type="button" value="Sort" />
<div id="listing">
  <div data-value="5" class="item">item 5</div>
  <div data-value="3" class="item">item 3</div>
  <div data-value="2" class="item">item 2</div>
  <div data-value="1" class="item">item 1</div>
  <div data-value="4" class="item">item 4</div>
</div>
Run Code Online (Sandbox Code Playgroud)