2013年3月4日、ブログは以下のURLに移行しました。最新の記事はこちらで公開しています。
新しいブログでは、コメントやリンクが一部切れていたり、一部機能が調整中です。
新しいブログへ

Mootools 1.4へのアップグレード Lightbox編

投稿日:2012.04.09 / カテゴリ:JavaScript / 投稿者:Tom Goodsun

Lightbox系はSqueezeBoxSlimboxを使っていたのですが、1.4系に最適化されたものないかと検索した結果「mootools 1.4 lightbox」でいいのが見つかりました。って一発でした。

ということでCeraBoxというものを使います。
Lightboxとしての機能もそうですが、YouTubeやSWF、IFRAME、それにAndroidやiOSなどのスマートフォンにも対応しているので、すんげぇいい感じです。
ですが、ちょっと問題が。使い方が違うのでそのままでは使えない。
Slimboxでは以下のようにrel属性を設定するようにしていました。

<a href="large-image.png" rel="lightbox[]" target="_blank" title="Image title"><img alt="Image title" height="150" src="small-image.png" width="200" /></a>

ここでブランケット([])の中に文字列を入れることでグループ化することができます。
過去の記事を書き換えるのは面倒臭いので、このルールを変更することなくCeraBoxに移行するための対応をすることにします。

ということで、JavaScriptをガリガリっと。

var LightboxManager = {
    /**
     * Create Lightbox
     * Using CeraBox on Mootools
     *
     * @param attrName string Name of attribute
     * @param groupName string Name of group, and attribute value must be 'groupName[]'
     * @param options object Options for CeraBox
     */
    createLightbox: function(attrName, groupName, options) {
        options = options || {};
        var elements = $$('a[' + attrName + ']');
        var targetElements = [];
        var regexp = new RegExp('^' + groupName, 'i');
        for (var i = 0, len = elements.length; i < len; i++) {
            var relValue = elements[i].getAttribute(attrName);
            if (relValue.match(regexp)) {
                if (!targetElements[relValue]) {
                    targetElements[relValue] = 0;
                }
                targetElements[relValue]++;
            }
        }
        for (var i in targetElements) {
            var createOptions = options;
            if (i.match(/\[.*\]/)) {
                createOptions.group = targetElements[i] > 1;
            } else {
                createOptions.group = false;
            }
            $$('a[' + attrName + '="' + i + '"]').cerabox(createOptions);
        }
    }
}

window.addEvent('load', function(e) {
    LightboxManager.createLightbox('rel', 'lightbox', {
        animation: 'ease',
        loaderAtItem: true,
        titleFormat: 'Image {number} / {total} - {title}',
        fixedPosition: true
    });
});

これで大体同じ動きをしよるはずです。

コメント

まだコメントはありません。
このアイテムは閲覧専用です。コメントの投稿、投票はできません。