WordPress に javascript で動作する「スライダー」 を付けるメモの続きです。
bxslider がかなり使えるなーという事で、ちょっとカスタマイズしてみる事にしました。
関連記事
bxslider で画像を「スライダー」の対象にするには、最初に HTML が出力されている必要があるのですが、対象とする画像を「動的」に指定できないかと思い少し試してみました。
PHP で img 要素を動的に吐き出せば一番簡単ですが、HTML を動的に生成するのが難しい場合にも対応できるように jsonp を使ってやってみました。
スポンサーリンク
bxslider のスライド画像を jsonp から読み込む
まず、サーバ部分ですが Perl で json を吐き出す処理をこんな感じに書いてみます。テストなので画像を直接指定しちゃってますけど、ここで表示させる画像を動的に生成させます。
#!/usr/bin/perl
use strict;
use warnings;
use CGI;
use JSON;
my $q = CGI->new;
my $callback = $q->param('callback') || exit);
my $hash = {};
my @img = (
'http://example.jp/bxslider-01.jpg',
'http://example.jp/bxslider-02.jpg',
'http://example.jp/bxslider-03.jpg',
'http://example.jp/bxslider-04.jpg',
'http://example.jp/bxslider-05.jpg',
'http://example.jp/bxslider-06.jpg'
);
foreach (@img) { push(@{$hash->{img}}, $_); }
my $json = to_json( $hash, {utf8 => 1} );
print $q->header(-type => 'text/x-json', -charset=>'utf-8'),"$callback($json)";
exit;
jQuery 側はこんな感じに。
(function ($) {
$(function(){
$.ajax({
url : "http://example.jp/image.cgi?",
dataType : "jsonp",
async : "true"
}).done(function(mycb){
for (var i = 0; i < mycb.img.length; i++) {
$(".bxslider").append('<div><img src="' + mycb.img[i] + '" /></div>');
}
// 成功した場合は bxslider を呼び出す
loadSlider();
}).fail(function(myerr){
//debug
//console.log(myerr);
});
});
function loadSlider() {
$(".bxslider").bxSlider({
mode: 'horizontal',
speed: 1500,
pause: 3000,
autoControls: true,
auto: true,
infiniteLoop: true,
controls: false,
slideWidth: 150,
minSlides: 2,
maxSlides: 4,
moveSlides: 1,
slideMargin: 5
});
return;
};
})(jQuery);
最後は WordPress でこの javascript を読み込んで、表示させたい場所に以下の HTML タグを書きます。
<div class="bxslider"></div>
完成後はこんな感じになります。
bxslider Demo
中々いい感じにできました。
bxslider で外部から読み込みんだ画像を使う方法は以上になります。