Quicksand


Description: 要素を、アニメーションさせながらソートしたりフィルタリングする事が出来るjQueryプラグインです。ulを使うのでなかなか汎用性もありそうですが、IE6と7ではアニメーションが動作しません。
Sample: demo
Tutorial: Quicksand docs
License: MITとGPL2

Note

(function($) {
	$.fn.sorted = function(customOptions) {
		var options = {
			reversed: false,
			by: function(a) {
				return a.text();
			}
		};
		$.extend(options, customOptions);

		$data = $(this);
		arr = $data.get();
		arr.sort(function(a, b) {

		   	var valA = options.by($(a));
		   	var valB = options.by($(b));
			if (options.reversed) {
				return (valA < valB) ? 1 : (valA > valB) ? -1 : 0;
			} else {
				return (valA < valB) ? -1 : (valA > valB) ? 1 : 0;
			}
		});
		return $(arr);
	};

})(jQuery);

$(function() {

  var read_button = function(class_names) {
    var r = {
      selected: false,
      type: 0
    };
    for (var i=0; i < class_names.length; i++) {
      if (class_names[i].indexOf('selected-') == 0) {
        r.selected = true;
      }
      if (class_names[i].indexOf('segment-') == 0) {
        r.segment = class_names[i].split('-')[1];
      }
    };
    return r;
  };

  var determine_sort = function($buttons) {
    var $selected = $buttons.parent().filter('[class*="selected-"]');
    return $selected.find('a').attr('data-value');
  };

  var determine_kind = function($buttons) {
    var $selected = $buttons.parent().filter('[class*="selected-"]');
    return $selected.find('a').attr('data-value');
  };

  var $preferences = {
    duration: 800,
    easing: 'easeInOutQuad',
    adjustHeight: false
  };

  var $list = $('#list');
  var $data = $list.clone();

  var $controls = $('ul.splitter ul');

  $controls.each(function(i) {

    var $control = $(this);
    var $buttons = $control.find('a');

    $buttons.bind('click', function(e) {

      var $button = $(this);
      var $button_container = $button.parent();
      var button_properties = read_button($button_container.attr('class').split(' '));
      var selected = button_properties.selected;
      var button_segment = button_properties.segment;

      if (!selected) {

        $buttons.parent().removeClass('selected-0').removeClass('selected-1').removeClass('selected-2');
        $button_container.addClass('selected-' + button_segment);

        var sorting_type = determine_sort($controls.eq(1).find('a'));
        var sorting_kind = determine_kind($controls.eq(0).find('a'));

        if (sorting_kind == 'all') {
          var $filtered_data = $data.find('li');
        } else {
          var $filtered_data = $data.find('li.' + sorting_kind);
        }

        if (sorting_type == 'size') {
          var $sorted_data = $filtered_data.sorted({
            by: function(v) {
              return parseFloat($(v).find('span').text());
            }
          });
        } else {
          var $sorted_data = $filtered_data.sorted({
            by: function(v) {
              return $(v).find('strong').text().toLowerCase();
            }
          });
        }

        $list.quicksand($sorted_data, $preferences);

      }

      e.preventDefault();
    });

  }); 

  var high_performance = true;
  var $performance_container = $('#performance-toggle');
  var $original_html = $performance_container.html();

  $performance_container.find('a').live('click', function(e) {
    if (high_performance) {
      $preferences.useScaling = false;
      $performance_container.html('CSS3 scaling turned off. Try the demo again. <a href="#toggle">Reverse</a>.');
      high_performance = false;
    } else {
      $preferences.useScaling = true;
      $performance_container.html($original_html);
      high_performance = true;
    }
    e.preventDefault();
  });
});

マークアップでdata-idを指定します。

<ul id="source">
	<li data-id="iphone">iPhone OS</li>
	<li data-id="android">Android</li>
	<li data-id="winmo">Windows Mobile</li>
</ul>

<ul id="destination" class="hidden">
	<li data-id="macosx">Mac OS X</li>
	<li data-id="macos9">Mac OS 9</li>
	<li data-id="iphone">iPhone OS</li>
</ul>

Related snippet :

  • Description: タブをページ推移無しで切り替えるプラグインです。切替時にも、縦にスライドするアニメーションが施されています。サイドバーなどで重宝しそう。 ...
  • Description: 省スペースで多くのコンテンツを見ることが出来るコンパクトニュースビューアを実装出来るプラグインです。css3を利用しているのでデモと同じように実装す ...
  • Description: 動的にタブを生成するプラグインです。タブはページ推移無しでコンテンツを切り替えることが可能です。クロスブラウザ対応ですが、IE6だけ多少cssハ ...
  • Description: コンテンツスライダーにバリデーション付きのコンタクトフォームを埋め込んだもの。不備があるとチェックが付きます。順番も追えるのでユーザーとしても縦 ...
  • Description: 軽量なソースで全画面を使用するナビゲーションを実装します。クロスブラウザ且つ、画像を使った視差効果も出せる。プレゼンやスライドにも良さそうですね。 ...
  • Description: クールなエフェクトのフライアウトメニューです。css3も併用しています。要jquery.easingです。 Sample: demo ...
  • Description: かっこいいエフェクトでメニューを呼び出すプラグイン。ゲームみたいですね・・・クロスブラウザでは動作しませんが、なかなか印象的な見せ方ではないかなと思 ...