画像を Retina Display に対応する

CMSで表示させる画像には拡大画像の large- というファイルがあります。もともとは拡大表示用に利用している画像ですが、これをメイン画像として利用する事ができるようにする JavaScript を用意してみました。

大きな画像を利用する事になるので、サイトが重くなりますので、Cookie を利用して希望する人だけがキレイな画像のファイル名にJavaScriptで置き換えます。全ての画像を対象とするわけではなく、class="retinaImage" のついた画像のみを対象とします。


残念ながら2つを見比べてみても分からないですね。以下をご覧になってみて下さい。

retinaImage.js

$(function(){
    if ( $.cookie('js-switch_retina[0]') == 'on' ) {
            _.each($('.retinaImage'), function(v){
                var imageUrl = v.src;
                var fileName = imageUrl.match(".+/(.+?)([\?#;].*)?$")[1];
                var largeUrl = imageUrl.replace(fileName, 'large-'+fileName);

                var img = new Image();
                img.src = largeUrl;
                img.onload = function() {
                    v.src = largeUrl;
                }
            });

            $('#retinaConfigOn').hide();
        } else {
            $('#retinaConfigOff').hide();
        }
});

切り替え用のフォーム

<form action="" method="post" class="acms-form" id="retinaConfigOn">
	<input type="hidden" name="js-switch_retina" value="on" />
	<input type="hidden" name="cookie[]" value="js-switch_retina" />
	<input type="submit" name="ACMS_POST_Cookie" value="(現在 通常画像モード)高解像度の画像を使用する" class="acms-btn acms-btn-admin-primary"/>
</form>

<form action="" method="post" class="acms-form" id="retinaConfigOff">
	<input type="hidden" name="js-switch_retina" value="off" />
	<input type="hidden" name="cookie[]" value="js-switch_retina" />
	<input type="submit" name="ACMS_POST_Cookie" value="(現在 Retinaモード)高解像度の画像を使用しない" class="acms-btn acms-btn-admin-danger"/>
</form>

/themes/system/include/unit.html

unit#image ブロックの img タグに class="retinaImage" を追加します。

<!-- BEGIN unit#image -->
<!-- 画像 -->
<div class="column-image-{align}"{display_size}[raw]><!-- BEGIN link#front -->
	<a href="{url}"{viewer}[raw]><!-- END link#front -->
		<img class="columnImage retinaImage" src="%{ROOT_DIR}{path}" alt="{alt}" width="{x}" height="{y}" /><!-- BEGIN link#rear -->
	</a><!-- END link#rear --><!-- BEGIN caption:veil -->
	<p class="caption">{caption}</p><!-- END caption:veil -->
</div><!-- END unit#image -->