2013-09-16

Flickr:Setの写真を表示する

サンプル

(なぜか、http://www.geocities.jp/winchester_cathedral_nostalgy/tips/FlickrPhotoSet/index.html では、window.resizeが機能しない。
http://cgi.geocities.jp/winchester_cathedral_nostalgy/tips/FlickrPhotoSet/index.html を使用。)

タイリングで配置したい場合はこちらを参考に。

◆ html

コードは下記のとおり。

以下のjavascriptファイルを使用する。
    jquery.js - ここからダウンロード
  1. <!DOCTYPE html>
  2. <html lang="ja">
  3. <head>
  4. <meta charset=UTF-8">
  5. <title>FlckrPhotoSet</title>
  6. <link rel="stylesheet" href="Flickr_photoset.css">
  7. <script src="jquery.js"></script>
  8. <script src="Flickr_photoset.js"></script>
  9.  
  10. <script>
  11. var photoset_id = '72157635974998255'
  12. var consumerKey = 'f4bc240df0b0418fb80e3719ec173dc0';
  13. </script>
  14.  
  15. </head>
  16.  
  17. <body>
  18. <div id="header">Loading...</div>
  19. <div id="contents">Loading...</div>
  20. </body>
  21.  
  22. </html>


◆ javascript(Flickr_photoset.js)


4-6行目:
windowがリサイズされたとき、PhotoList()を実行して、1行当たりの写真の数をwindowサイズに合わせて表示する〔リンク〕
  1. var list;
  2. var photoset_owner;
  3.  
  4. window.onresize = function(){
  5. Album();
  6. }
  7.  
  8. window.onload = function () {
  9. ShowPhotos();
  10. }


ShowPhotos()
htmlで定義した(photoset_id)photosetの情報を取得する。
  1. function ShowPhotos () {
  2.  
  3. // Header
  4. // callback関数の生成
  5. window[ 'jsonHeader'] = function(obj){
  6.  
  7. var description_ = obj.photoset.description._content.replace(/\n/g,"<br/>");
  8. var $title = $("<div>").html(obj.photoset.title._content).addClass("header_title"); // タイトルのタグを作成
  9. var $caption = $("<p>").html(description_).addClass("header_caption"); // キャプションのタグを作成
  10. var $div = $("<div>").append($title).append($caption); // div要素にタイトルのタグとキャプションのタグを追加
  11. $("#header").html($div); // 上記で作成したタグでid="header"の要素のタグを置き換え
  12.  
  13. };
  14.  
  15. // リクエスト
  16. var arguments = {
  17. api_key: api_key,
  18. photoset_id: photoset_id,
  19. format: "json",
  20. jsoncallback: "jsonHeader",
  21. method: "flickr.photosets.getInfo"
  22. };
  23. flickrRest(arguments);
  24.  
  25. // Photos
  26. // callback関数の生成
  27. window[ 'jsonPhotos'] = function(data){
  28. list = data.photoset.photo;
  29. photoset_owner = data.photoset.owner;
  30. Album();
  31.  
  32. };
  33.  
  34. // リクエスト
  35. var arguments = {
  36. api_key: api_key,
  37. photoset_id: photoset_id,
  38. format: "json",
  39. jsoncallback: "jsonPhotos",
  40. method: "flickr.photosets.getPhotos",
  41. extras: "geo,date_taken,owner_name,description,o_dims"
  42. };
  43. flickrRest(arguments);
  44.  
  45. }


Album()
photosetの写真、タイトル(title)、descriptionを表示する。
  1. function Album () {
  2.  
  3. // #contentsの高さを全体の高さからtopの高さと20pxとを引いた高さにする
  4. var document_height = $(document).height();
  5. var header_height = $(header).height();
  6. document.getElementById('contents').style.height = (document_height - header_height-20) + "px";
  7.  
  8. var $box = [];
  9. var $contents = $('#contents').html("");
  10. for( var i=0; i<list.length; i++ ) {
  11.  
  12. var photo = list[i];
  13.  
  14. var src = 'http://www.flickr.com/photos/' + photoset_owner + '/' + photo.id + '/in/set-' + photoset_id;
  15. var $ahref = $('<a>', { href: src, target: '_blank' });
  16. var src = 'http://static.flickr.com/' + photo.server + '/' + photo.id+ '_' + photo.secret + '.jpg';
  17. var $img = $('<img>', { 'src': src });
  18. var $div = $('<div style="float: left; margin: 5px;">').append($ahref).append($img);
  19. if ( photo.title != "") {
  20. var $photoTitle = $('<div>', { class: "photo_title", text: photo.title });
  21. $div.append($photoTitle);
  22. }
  23. if ( photo.description._content != "" ){
  24. var caption = photo.description._content.replace(/\n/g,"<br/>")
  25. var $photoCaption = $('<div>', { class: "photo_caption", text: caption });
  26. $div.append($photoCaption);
  27. }
  28. $contents.append($div);
  29. $box[i] = $div;
  30. }
  31.  
  32. var $img = $('#contents img');
  33.  
  34. var imgIndex = 0;
  35. $img.bind('load',function(){
  36.  
  37. imgIndex++;
  38.  
  39. if ( imgIndex >= $img.length ) {
  40. photoTable ($contents,$box);
  41. }
  42.  
  43.  
  44. });
  45. }
  46.  


photoTable()
写真とタイトル、キャプションをウィンドーの幅に合わせて表示する。
  1. function photoTable ($container,$box) {
  2.  
  3. var border = 0;
  4. var cellpadding = 5;
  5. var windowMargin = 10;
  6.  
  7. var $html = $('<div>');
  8. var td_num = 0;
  9. var colPix = 0;
  10. for( var i=0; i<$box.length; i++ ) {
  11.  
  12. var imgWidth = $box[i].width();
  13. //var imgWidth = $('#contents img').eq(i).width();
  14.  
  15. if ( colPix+imgWidth+2*cellpadding > $(document).width() - 2*windowMargin ) {
  16. td_num = 0;
  17. colPix = 0;
  18. $table.append($tr);
  19. $html.append($table);
  20. }
  21.  
  22. if (td_num == 0) {
  23. var $table = $('<table>', { border: border});
  24. var $tr = $('<tr>');
  25. }
  26.  
  27. var $td = $('<td>').css("padding", String(cellpadding) + "px").append($box[i].html());
  28. colPix += imgWidth+2*cellpadding;
  29.  
  30. $tr.append($td);
  31. if (i == $box.length-1) {
  32. $table.append($tr);
  33. $html.append($table);
  34. }
  35.  
  36. td_num++;
  37.  
  38. }
  39.  
  40. $container.html($html);
  41.  
  42. }


画像の隙間をtableのcellpaddingで設定した場合、 cssで、* { margin: 0; padding: 0 } を定義しているとcellpaddingが効かない。
td のpadding で設定すればうまくいく。

尚、引数$boxが以下の通りだと12行目のwidth()の取得がうまくいかない。
  1. var $contents = $('#contents').html("");
  2.  
  3.  
  4. $box[i] = $(html_tmp);
  5. $contents.append($(html_tmp));
  6.  
  7.  
  8. photoTable ($contents,$box);

以下の通りとしなければならない。
  1. $box[i] = $(html_tmp);
  2. $contents.append($box[i]);
  3.  
  4. photoTable ($contents,$box);

$box[i]をhtmlに実装しておかなくては、width()は取れないので、当たり前ではあるが...



flickrRest()
FlickrにArgumentsを送付する関数
  1. function flickrRest (arguments) {
  2.  
  3. // APIリクエストURLの生成
  4. var url = 'https://www.flickr.com/services/rest/?'+
  5. obj2query(arguments);
  6.  
  7. //  script 要素の発行
  8. var script = document.createElement( 'script' );
  9. script.type = 'text/javascript';
  10. script.src = url;
  11. document.body.appendChild( script );
  12.  
  13. }
  14.  
  15. // オブジェクトからクエリー文字列を生成する関数
  16. function obj2query ( obj ) {
  17. var list = [];
  18. for( var key in obj ) {
  19. var k = encodeURIComponent(key);
  20. var v = encodeURIComponent(obj[key]);
  21. list[list.length] = k+'='+v;
  22. }
  23. var query = list.join( '&' );
  24. return query;
  25.  
  26. }

2013-11-09改定

2013-11-17改定

2014-12-31改定 
flickrRest()を変更($.ajaxを使わないようにした)

2015-01-04改定 
photoTable()を引数で引き継ぐように変更(名前も変更した)
photoTable()で、画像の隙間の設定をtdのpaddingで行うようにした。


以上