サンプル
「Flickr:Setの写真を表示する」をMasonryに対応するように変更した。
場合によっては、「Flickr:Setの写真を表示する」に記載した方法が良い場合もある。
参考:jQueryで可変グリッド・Masonryプラグイン
(なぜか、http://www.geocities.jp/winchester_cathedral_nostalgy/tips/FlickrPhotoSet_tile/index.html では、window.resizeが機能しない。
http://cgi.geocities.jp/winchester_cathedral_nostalgy/tips/FlickrPhotoSet_tile/index.html を使用。)
場合によっては、「Flickr:Setの写真を表示する」に記載した方法が良い場合もある。
参考:jQueryで可変グリッド・Masonryプラグイン
(なぜか、http://www.geocities.jp/winchester_cathedral_nostalgy/tips/FlickrPhotoSet_tile/index.html では、window.resizeが機能しない。
http://cgi.geocities.jp/winchester_cathedral_nostalgy/tips/FlickrPhotoSet_tile/index.html を使用。)
◆ html
コードは下記のとおり。以下のjavascriptファイルを使用する。
jquery.js - ここからダウンロード
masonry.pkgd.min.js - ここからダウンロード
<!DOCTYPE html> <html lang="ja"> <head> <meta charset=UTF-8"> <title>FlckrPhotoSet</title> <link rel="stylesheet" href="Flickr_photoset.css"> <script src="jquery.js"></script> <script src="masonry.pkgd.min.js"></script> <script src="Flickr_photoset.js"></script> <script> var photoset_id = '72157635974998255' var consumerKey = 'f4bc240df0b0418fb80e3719ec173dc0'; </script> </head> <body> <div id="header">Loading...</div> <div id="contents">Loading...</div> </body> </html>
Masonryを使用するため、8行目を追加した。
◆ javascript(Flickr_photoset.js)
var list; var photoset_owner; window.onresize = function(){ // #contentsの高さを全体の高さからtopの高さと20pxとを引いた高さにする var document_height = $(document).height(); var header_height = $(header).height(); document.getElementById('contents').style.height = (document_height - header_height-20) + "px"; } window.onload = function () { ShowPhotos(); }
6~9行目:
リサイズにはMasonryが対応してくれるので処理は不要。
#contentsの高さをウインドウに合わせて定義している。
こうしないと、#headerを固定して#contents部分だけをスクロールすることができない。
ShowPhotos()
htmlで定義した(photoset_id)photosetの情報を取得する。
function ShowPhotos () { // Header // callback関数の生成 window[ 'jsonHeader'] = function(obj){ var description_ = obj.photoset.description._content.replace(/\n/g,"<br/>"); var $title = $("<div>").html(obj.photoset.title._content).addClass("header_title"); // タイトルのタグを作成 var $caption = $("<p>").html(description_).addClass("header_caption"); // キャプションのタグを作成 var $div = $("<div>").append($title).append($caption); // div要素にタイトルのタグとキャプションのタグを追加 $("#header").html($div); // 上記で作成したタグでid="header"の要素のタグを置き換え }; // リクエスト var arguments = { api_key: api_key, photoset_id: photoset_id, format: "json", jsoncallback: "jsonHeader", method: "flickr.photosets.getInfo" }; flickrRest(arguments); // Photos // callback関数の生成 window[ 'jsonPhotos'] = function(data){ list = data.photoset.photo; photoset_owner = data.photoset.owner; Album(); }; // リクエスト var arguments = { api_key: api_key, photoset_id: photoset_id, format: "json", jsoncallback: "jsonPhotos", method: "flickr.photosets.getPhotos", extras: "geo,date_taken,owner_name,description,o_dims" }; flickrRest(arguments); }
ここは変更なし。
Album()
photosetの写真、タイトル(title)、descriptionを表示する。
function Album () { // #contentsの高さを全体の高さからtopの高さと20pxとを引いた高さにする var document_height = $(document).height(); var header_height = $(header).height(); document.getElementById('contents').style.height = (document_height - header_height-20) + "px"; var $box = []; var $contents = $('#contents').html(""); for( var i=0; i<list.length; i++ ) { var photo = list[i]; var src = 'http://www.flickr.com/photos/' + photoset_owner + '/' + photo.id + '/in/set-' + photoset_id; var $ahref = $('<a>', { href: src, target: '_blank' }); var src = 'http://static.flickr.com/' + photo.server + '/' + photo.id+ '_' + photo.secret + '.jpg'; var $img = $('<img>', { 'src': src }); var $div = $('<div class="box">').append($ahref).append($img); if ( photo.title != "") { var $photoTitle = $('<div >', { class: "photo_title", text: photo.title }); $div.append($photoTitle); } if ( photo.description._content != "" ){ var caption = photo.description._content.replace(/\n/g,"<br/>") var $photoCaption = $('<div>', { class: "photo_caption", text: caption }); $div.append($photoCaption); } $contents.append($div); $box[i] = $div; } $('#contents img').bind('load',function(){ masonryBox ($contents,$box); }); }
8,9行目を変更。
30,31行目を変更。
34~36行目を変更。
19行目:画像を読み込み中にfloatで表示させるため、classをしています。
尚、4~6行目では、#contentsの高さをウインドウに合わせて定義している。
こうしないと、#headerを固定して#contents部分だけをスクロールすることができない。
masonryBox()
masonryを用いて表示する。
function masonryBox ($container,$box) { var $div = $('<div id="masonry_list">'); for( var i=0; i<$box.length; i++ ) { var $tmp = $('<div>', { class: "item", style: "margin:5px;" }).append($box[i]); $div.append($tmp); } $container.html("") .append($div); $('#masonry_list').masonry({ isAnimated: true, duration: 400, itemSelector: '.item', isFitWidth: true }); }
6行目:"margin:5px;"にしないと、写真の間に間隔がなく、くっついて表示されてしまう。
flickrRest()
FlickrにArgumentsを送付する関数
function flickrRest (arguments) { // APIリクエストURLの生成 var url = 'https://www.flickr.com/services/rest/?'+ obj2query(arguments); // script 要素の発行 var script = document.createElement( 'script' ); script.type = 'text/javascript'; script.src = url; document.body.appendChild( script ); } // オブジェクトからクエリー文字列を生成する関数 function obj2query ( obj ) { var list = []; for( var key in obj ) { var k = encodeURIComponent(key); var v = encodeURIComponent(obj[key]); list[list.length] = k+'='+v; } var query = list.join( '&' ); return query; }
ここは変更なし。
◆ css
* { margin: 0px; padding: 0px; } html, body { height: 100%; margin: 0px; padding: 0px; overflow: hidden; } #header { background-color: white; } #contents { overflow: scroll; background-color: #EFE; } .box { float: left; margin: 5px; } .header_title { text-align: left; margin: 0px; font: bold 32px arial,sans-serif; color: limegreen; } .header_caption { text-align: left; margin: 10px; font: 14px arial,sans-serif; color: black; } img { border: none; } .photo_title { text-align: left; margin: 0px; font: bold 16px arial,sans-serif; text-decoration: none; color: black; } .photo_caption { text-align: left; margin: 0px; font: 16px arial,sans-serif; color: black; }
22~25行目:画像を読み込み中にfloatで表示させています。
以上