良く訓練されたスライダー
JavaScript で作った UI 部品の話になると、
とか良く聞きますね。
UI の話だったら、jQuery よりも、YUI や Ext.js のがスゲ〜とか思うんですけどね。
せっかく UI 組むんだったら、ネットブック上の IE6 でもサクサク動かしたいよね
私も UI 部品をいくつか実装してみました。
- スライダー横 http://pigs.sourceforge.jp/blog/20091013/0.7/test/uu.ui.slider.htm
- スライダー縦 http://pigs.sourceforge.jp/blog/20091013/0.7/test/uu.ui.slider_y.htm
- ホイールやカーソルキーで移動も
- ソース(メインは 200step ぐらい) http://code.google.com/p/uupaa-js-spinoff/source/browse/trunk/0.7/uu.ui.slider.js?r=344
- ホイールやカーソルキーで移動も
- DragDrop http://pigs.sourceforge.jp/blog/20091013/0.7/test/uu.ev.drag.htm
- IE で画面外にドラッグしても引っかからない
- IE6 で SELECT BOX を突き抜けないように対策済み(SHIM)
- z-index の管理機能付き
- ソータブルなリスト http://pigs.sourceforge.jp/blog/20091013/0.7/test/uu.ev.sortable.htm
- 作りかけ
- IE でドラッグ開始時にマージンが相殺されるバグあり(解決方法が謎)
スライダーのデモでは、マスタースライダーで後続のスライダーを連動して動かせるようしています。これはメッセージの同期 + ブロードキャスト で実現しています。
こんな感じです。
function boot(uu) { uu.exp(); slider = []; // スライダーのインスタンス管理用の配列 // デモだから気張らずに グローバル変数 } function createSlider() { slider = query.ui('slider'); // オレオレ CSS セレクタで Slider Widget のインスタンスを収集 if (!slider.length) { // マスタースライダーを作成し、インスタンスを保存 // 動きがあったら onMasterSliderMove をコールバック slider.push(ui("slider", id("place1"), { move: onMasterSliderMove })); } else { // 後続のスライダーを作成し、インスタンスを保存 slider.push(ui("slider")); } } function onMasterSliderMove(val) { // マスタースライダー以外の全スライダーに、val を適用 msg.send(slider.slice(1), "setvalue", val); // 同期 + ブロードキャスト }
いまどきの激速なブラウザではなく、IE6 などのレガシーなブラウザで試してみると、違いが良くわかると思います。
# IE6 は Safari4 や Google Chrome4 に比べて 100倍以上遅いのです(ざっくり)。
# 自作した UI 部品は ASPIRE ONE 上の IE6 でサクサク動くように組んであります。
今日紹介した UI 部品は DOM + CSS で作ってます。画像を使わず HTML5::Canvas で実装したバージョンものちほど。