jQueryで数字並べを作ってみた
勉強がてら空いてる時間になんとなく作ってみました。
jQueryのバージョンは1.5.2
最初"position"で配置、入れ替えなど判定するように組んだのですがやっぱりやめて、アプローチをかえ要素自体の並び順で判定するようにしました。
ブロックが動くときのアニメーションだけ仕方なく"position"にて動かしています。
HTML
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>数字並べ</title> <meta name="keywords" content=""> <meta name="description" content=""> <script type="text/javascript" src="./jquery.js"></script> <script type="text/javascript" src="./default.js"></script> <style type="text/css"> body,ul,li { margin:0; padding:0; text-align:center; font-family:serif; } ul { position:relative; margin:200px auto 50px auto; width:200px; height:200px; border:1px solid #666666; } ul li { position:relative; float:left; width:48px; height:48px; list-style:none; border:1px solid #999999; font-size:260%; text-align:center; line-height:1; background-color:#ffffff; z-index:1; } ul li#No16 { z-index:-1; border:none; padding:1px; text-indent:-9999px; } </style> </head> <body> <ul> <li id="No1">1</li> <li id="No2">2</li> <li id="No3">3</li> <li id="No4">4</li> <li id="No5">5</li> <li id="No6">6</li> <li id="No7">7</li> <li id="No8">8</li> <li id="No9">9</li> <li id="No10">10</li> <li id="No11">11</li> <li id="No12">12</li> <li id="No13">13</li> <li id="No14">14</li> <li id="No15">15</li> <li id="No16">16</li> </ul> </body> </html>
$(function(){ $.fn.extend ({ shuffle: function() { //The number is shuffled. $.shuffle = function(arr) { for(var j, x, i = arr.length; i; j = parseInt(Math.random() * i), x = arr[--i], arr[i] = arr[j], arr[j] = x); return arr; } return this.each(function(){ var items = $(this).children().clone(true); return (items.length) ? $(this).html($.shuffle(items)) : this; }); }, click_target: function() { //The number that can be clicked is specified. var click_box = [($('#No16').index() - 4),($('#No16').index() + 1),($('#No16').index() + 4),($('#No16').index() - 1)]; this.each(function(){ var click_block = $(this).index(); if( (click_block == click_box[0]) || ((click_block == click_box[1]) && (click_block !== 4) && (click_block !== 8) && (click_block !== 12)) || (click_block == click_box[2]) || ((click_block == click_box[3]) && (click_block !== 3) && (click_block !== 7) && (click_block !== 11)) ){ $(this).css({'background-color':'#eeeeee','cursor':'pointer'}).hover( function(){$(this).css('background-color','#ffccff');}, function(){$(this).css('background-color','#eeeeee');} ); $(this).addClass('selected'); } }); }, move: function() { //The number is moved. $(this).addClass('click_btn'); $('ul li').removeClass('selected').each(function(){ var li_position = $(this).position(); $(this).css({'top':li_position.top + 'px','left':li_position.left + 'px'}); }); $('ul li').css('position','absolute'); var move_number_id = this.attr('id'); var move_number_html = this.html(); this.animate({'left':$('#No16').css('left'),'top':$('#No16').css('top')},50); $('#No16').animate({'left':this.css('left'),'top':this.css('top')},{ complete: function(){ $('ul li').css({'position':'relative','top':'0px','left':'0px'}); $('#No16').after('<li id="' + move_number_id + '">' + move_number_html + '</li>').remove(); $('.click_btn').after('<li id="No16">16</li>').remove(); $('ul li').judgment(); } },50); $(this).addClass('click_btn'); }, judgment: function(){ //It judges whether to become complete. this.addClass('position_out'); this.each(function(){ var id_check = $(this).attr('id').replace('No',''); if((id_check-1) == $(this).index()) $(this).removeClass('position_out'); }); if($('.position_out').length == 0) { alert('Congratulations!'); $('ul li').css('background-color','#ffffff'); $('ul').shuffle(); $('ul li').click_target(); } else { $('ul li').unbind().css({'background-color':'#ffffff','cursor':'default'}).click_target(); } } }); $(document).ready(function(){ $('ul').shuffle(); $('ul li').click_target(); $('.selected').live('click',function(){ $(this).move(); }); }); });
思ったより苦労せず動きました。><