もう2~3年前のことになるのですが、iGoogleのようなDraggableなUIを実装して欲しいと言われたことがありました。
当時からjQuery・Prototype.jsなどはありましたし、ライブラリを使用して同様のUIを実装しているところも見かけましたので、それほど難しいことではないと思い受注したのですが、その後「ライブラリの使用はポリシー違反」という事実が発覚し、「ライブラリ無しでDraggableを実装」となってしまったのです。
右も左も分からない中、四苦八苦し、ライブラリを使用せず、何とか実用に耐えるものを仕上げることができましたが、今より未熟だった当時を考えると、奇跡だったんじゃないかとwなんとかなるものですねぇ…
案件が終わった後も、活用できるように改良を重ね、iSoopleというiGoogleの劣化パクりサイトを作成しました。
自分のために作ったサイトでしたが、お使いの方もいらっしゃるようで、大変有り難いことです。
さて。前置きが長くなりましたが、本記事ではこのJavaScriptを公開いたします。
jQueryなどのライブラリを企業が率先して採用している昨今、必要になる機会は無いかもしれませんが、折角ブログ作ったし、ということで。
ソース
HTML
<div id="dragWrap">
<ul class="col">
<li class="blank"> </li>
<li class="itemBox">ボックス1</li>
<li class="itemBox">ボックス2</li>
<li class="itemBox">ボックス3</li>
</ul>
<ul class="col">
<li class="blank"> </li>
<li class="itemBox">ボックス4</li>
<li class="itemBox">ボックス5</li>
<li class="itemBox">ボックス6</li>
</ul>
<ul class="col">
<li class="blank"> </li>
<li class="itemBox">ボックス7</li>
<li class="itemBox">ボックス8</li>
<li class="itemBox">ボックス9</li>
</ul>
</div>
CSS
#dragWrap { overflow: auto; }
#dragWrap .col {
float: left;
margin: 0 0 0 10px;
padding: 0;
}
#dragWrap li {
list-style-type: none;
display: block;
margin: 10px 0 0 0;
padding: 0;
width: 100px;
height: 50px;
}
#dragWrap .itemBox {
background: #F0F0F0;
cursor: move;
}
#dragWrap .reserver {
background: #CCCCCC;
}
#dragWrap .blank {
height: 1px;
overflow: hidden;
background: none;
}
Javascript
<script type="text/javascript" src="/file/demo/draggable.js"></script>
<script type="text/javascript">
new draggable({
parent: 'dragWrap', //ドラッグ要素を内包する親要素のID
item: { tag: 'li', css: 'itemBox' }, //ドラッグ要素のタグ名とクラス名
handle: { tag: 'li', css: 'itemBox' }, //ドラッグできる要素のタグ名とクラス名
except: { tag: 'li', css: 'blank' }, //ドラッグ除外要素のタグ名とクラス名
reserve: 'reserver', //ドロップ箇所に表示される要素のクラス名
dropped: function(){ return false; } //ドロップ完了時に実行
});
</script>
※bodyの閉じタグ前に挿入してください。
ライセンスはよく分からないので、とりあえずMITにしておきした。
お気づきの点があればどんどんツッコんでください。
よろしくお願いします。