Practice for jquery plugin.

プラグイン作成の練習。
スクロールと同時にランダムに動くプラグインを作成しました。
基本ソースは以下。

■HTML

<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>Parallax Test</title>
<meta name="keywords" content="">
<meta name="description" content="">
<link rel="stylesheet" href="css/style.css" media="all">
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script src="js/jquery.randomScroll.js"></script>
<script>
$(function() {
     $("#parallax").shparallax({
          scrollValueDiv : "#scrollValue"
     });
});
</script>
</head>
<body>
<h1>Just scroll it.</h1>
<p class="indicator">スクロール値 | <span id="scrollValue">0</span></p>
<ul id="parallax">
     <li id="item1"></li>
     <li id="item2"></li>
     <li id="item3"></li>
     <li id="item4"></li>
     <li id="item5"></li>
</ul>
</body>
</html>

■CSS

body {
     height: 3300px;
}
h1 {
     font-size: 100%;
}
.indicator {
     margin: 0;
     position: fixed;
     right: 10px;
     top: 10px;
}

li {
     display: block;
     height: 60px;
     position: fixed;
     top: 40px;
     width: 60px;
}
#item1 {
     background: #000;
     left: 20px;
}
#item2 {
     background: #333;
     left: 100px;
}
#item3 {
     background: #ff358B;
     left: 180px;
}
#item4 {
     background: #01b0f0;
     left: 260px;
}
#item5 {
     background: #aeee00;
     left: 340px;
}

■JS
jquery plugin を作る際の基本ルール。
まず、ファイル名は「jquery.puluginName.js」というように。
そして先頭に ; を付けるのだが、これは先に読むファイルが;で閉じられて無かった場合のバグを防ぐ為に。
なので基本書式は、

;(function($) {
     // code..
})(jQuery);

となる。

そして、セレクタは勿論thisとなるが、オプションを指定したい場合、プラグイン呼び出し時に、

$(function() {
     $("body").myplugin({
          someoption: "optionValue"
     });
});

の様に記述すると、プラグインの中で

var option = option.someoption;

といった具合に使う事ができる。

;(function($) {
     $.fn.shparallax = function(options) {

          var targetUl = $(this);

          var lis = targetUl.find("li");
          var leftValues = {};
         
          var top = $(lis[0]).offset().top; // initial y value
          for(var i=0; i<lis.length; i++){
               leftValues[i] = $(lis[i]).offset().left; // each x value
          }

          $(window).scroll(function(){
               var value = $(this).scrollTop(); // scroll amount
               $(options.scrollValueDiv).text(value);

               // add top and amount depends on scroll amount.
               for(var i=0; i<lis.length; i++){
                    var topamt = value / 4 * Math.sin( Math.random() * 100 / 180 * Math.PI);
                    var leftamt =  value / 4 * Math.cos(Math.random() * 100 / 180 * Math.PI);

                    $(lis[i]).css({'top': top + topamt, 'left' : leftValues[i] + leftamt});
               }              

          });
     }
})(jQuery);

今回は練習の為にランダムにしたが、
topamt やleftamtの値をランダムにせず、それぞれ指定してやればパララックスぽい動きも可能だと思うよ。