質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

Q&A

1回答

4591閲覧

FlickrAPI を使って猫と犬の画像をそれぞれ4枚ずつ表示したい。 javascript html Web API

Rsusu

総合スコア0

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

API

APIはApplication Programming Interfaceの略です。APIはプログラムにリクエストされるサービスがどのように動作するかを、デベロッパーが定めたものです。

0グッド

0クリップ

投稿2021/04/05 15:59

前提・実現したいこと

下記記載のHTMLのGalleryの部分はHTML上で表示されるようになっています。ここを、HTMLで表示するのではなく、Flickr APIから猫の画像4枚と、犬の画像4枚をギャラリー上に表示できるようにしたいです。
ひとまず、猫4枚だけを表示できるようにしようとして、できていないところです。
現状、うまく、APIから引っ張って表示できていないので、どこをどう直したら、良いのか教えていただけると幸いです。

前提条件としては、下記の仕様を実現するために、
index.htmlの、 <!-- ギャラリー -->の箇所を編集し、
下記記載のjavascriptのソースコードに修正して、実現する。

仕様
犬の画像と猫の画像を4枚ずつ連続で表示しましょう(犬と猫のどちらを先に表示するかまでは問いません)。
flickr.photos.search のパラメータに、以下の2つを含めてください。
license: '4', // Creative Commons Attributionのみ
extras: 'owner_name,license', // 追加で取得する情報 を含めてください。
BootstrapのTooltip機能でライセンス表記を行ってください。
Flickrから取得した画像をクリックしたときの挙動として、ライトボックス(Magnific Popup)を使うのではなく、Flickr画像元ページをブラウザの新規タブで開くようにしてください

発生している問題・エラーメッセージ

// $divを#mainに追加する
$div.appendTo('gallery'); ここをgalleryとしましたが、間違ってますかね?

該当のソースコード

Javascript,HTML

1ソースコード 2/* global $ MobileDetect */ 3 4// モバイルブラウザかどうか判定 5const isMobile = !!new MobileDetect(window.navigator.userAgent).mobile(); 6 7/** 8 * ---------------------- 9 * 指定された名前のタブを表示 10 * ---------------------- 11 */ 12const showTab = (tabName) => { 13 // すでに表示されている場合は何もせずに終了 14 if ($(`#${tabName}`).is(':visible')) { 15 return; 16 } 17 18 const tabsContainer = $(`a[href='#${tabName}']`).closest('.tabs'); 19 // .tabs__menu liのうちtabNameに該当するものにだけactiveクラスを付ける 20 tabsContainer.find('.tabs__menu li').removeClass('active'); 21 tabsContainer 22 .find(`.tabs__menu a[href='#${tabName}']`) 23 .parent('li') 24 .addClass('active'); 25 26 // .tabs__contentの直下の要素をすべて非表示 27 tabsContainer.find('.tabs__content > *').css({ display: 'none' }); 28 // #<tabName>と.tabs__content .<tabName>を表示 29 tabsContainer 30 .find(`#${tabName}, .tabs__content .${tabName}`) 31 .css({ 32 display: 'block', 33 opacity: 0.7, 34 }) 35 .animate( 36 { 37 opacity: 1, 38 }, 39 400, 40 ); 41}; 42 43/** 44 * ------------- 45 * パララックス関連 46 * ------------- 47 */ 48 49// 背景画像のスクロール速度。数字が小さいほど速い。 50const parallaxXSpeed = 12; 51const parallaxYSpeed = 3; 52const parallaxXSpeedSmall = 5; 53const parallaxYSpeedSmall = 1; 54 55// パララックスを適用する関数 56const showParallax = () => { 57 const scrollTop = $(window).scrollTop(); 58 59 // 背景画像の位置をスクロールに合わせて変える 60 const offsetX = Math.round(scrollTop / parallaxXSpeed); 61 const offsetY = Math.round(scrollTop / parallaxYSpeed); 62 const offsetXSmall = Math.round(scrollTop / parallaxXSpeedSmall); 63 const offsetYSmall = Math.round(scrollTop / parallaxYSpeedSmall); 64 65 $('.puppies').css({ 66 'background-position': 67 // 一番上 68 `${-offsetX}px ${-offsetY}px, ${ 69 // 上から2番目 70 offsetXSmall 71 }px ${-offsetYSmall}px, ` 72 // 一番下 73 + '0% 0%', 74 }); 75 76 $('.kittens').css({ 77 'background-position': 78 // 一番上 79 `${offsetX}px ${-offsetY}px, ${ 80 // 上から2番目 81 -offsetXSmall 82 }px ${-offsetYSmall}px, ` 83 // 一番下 84 + '0% 0%', 85 }); 86}; 87 88// パララックスを初期化する関数 89const initParallax = () => { 90 $(window).off('scroll', showParallax); 91 92 if (!isMobile) { 93 // モバイルブラウザでなければパララックスを適用 94 showParallax(); 95 96 // スクロールのたびにshowParallax関数を呼ぶ 97 $(window).on('scroll', showParallax); 98 } 99}; 100 101/** 102 * ------------------ 103 * イベントハンドラの登録 104 * ------------------ 105 */ 106 107/** 108 * animatedクラスを持つ要素が画面内に入ったら 109 * Animate.cssのfadeInUpエフェクトを適用 110 */ 111$('.animated').waypoint({ 112 handler(direction) { 113 if (direction === 'down') { 114 $(this.element).addClass('fadeInUp'); 115 this.destroy(); 116 } 117 }, 118 /** 119 * 要素の上端が画面のどの位置に来たときにhandlerメソッドを呼び出すか指定 120 * 0%なら画面の一番上、100%なら画面の一番下に来たときに呼び出される 121 */ 122 offset: '100%', 123}); 124 125$(window).on('resize', () => { 126 // ウインドウがリサイズされるとここが実行される 127 initParallax(); 128}); 129 130// タブがクリックされたらコンテンツを表示 131$('.tabs__menu a').on('click', (e) => { 132 const tabName = $(e.currentTarget).attr('href'); 133 134 // hrefにページ遷移しない 135 e.preventDefault(); 136 137 if (tabName[0] === '#') { 138 // hrefの先頭の#を除いたものをshowTab()関数に渡す 139 showTab(tabName.substring(1)); 140 } 141}); 142 143/** 144 * ナビゲーションバーのリンクをクリックしたら、 145 * スムーズにスクロールしながら対象位置に移動 146 */ 147$('.nav-link').on('click', (e) => { 148 const destination = $(e.target).attr('href'); 149 150 // 本来のクリックイベントは処理しない 151 e.preventDefault(); 152 153 $('html, body').animate( 154 { 155 scrollTop: $(destination).offset().top, 156 }, 157 1000, 158 ); 159 160 // ハンバーガーメニューが開いている場合は閉じる 161 $('.navbar-toggler:visible').trigger('click'); 162}); 163 164// d-inline-blockクラスの付いた要素にMagnific Popupを適用 165$('.d-inline-block').magnificPopup({ 166 type: 'image', 167 gallery: { enabled: true }, 168 169 /** 170 * ポップアップに適用されるクラス。 171 * ここではフェードイン・アウト用のmfp-fadeクラスを適用。 172 */ 173 mainClass: 'mfp-fade', 174 175 // ポップアップが非表示になるまでの待ち時間 176 removalDelay: 300, 177}); 178 179/** 180 * --------------------------------------- 181 * ページの読み込みが完了したタイミングで行うDOM操作 182 * --------------------------------------- 183 */ 184 185// モバイルブラウザでは静止画を表示し、それ以外では動画を表示 186if (isMobile) { 187 $('.top__bg').css({ 188 'background-image': 'url(video/top-video-still.jpg)', 189 }); 190} else { 191 $('.top__video').css({ display: 'block' }); 192} 193 194// 初期状態として1番目のタブを表示 195showTab('puppies-1'); 196showTab('kittens-1'); 197 198// パララックスを初期化する 199initParallax(); 200 201 202 203 204//lesson7の3.3の流れは踏襲する。htmlなどの修正=例題では、mainだが、ここをimg?にする 205 206//ねこを表示するバージョン 207 208// Flickr API key 209const apiKey = '8c2eb4547c983e5549b882999b602b8'; 210 211// Flickr画像データのURLを返す 212const getFlickrImageURL = (photo, size) => { 213 let url = `https://farm${photo.farm}.staticflickr.com/${photo.server}/${photo.id}_${ 214 photo.secret 215 }`; 216 if (size) { 217 // サイズ指定ありの場合 218 url += `_${size}`; 219 } 220 url += '.jpg'; 221 return url; 222}; 223 224// Flickr画像の元ページのURLを返す 225const getFlickrPageURL = photo => `https://www.flickr.com/photos/${photo.owner}/${photo.id}`; 226 227// Flickr画像のaltテキストを返す 228const getFlickrText = (photo) => { 229 let text = `"${photo.title}" by ${photo.ownername}`; 230 if (photo.license === '4') { 231 // Creative Commons Attribution(CC BY)ライセンス 232 text += ' / CC BY'; 233 } 234 return text; 235}; 236 237// リクエストパラメータを作る 238const parameters = $.param({ 239 method: 'flickr.photos.search', 240 api_key: apiKey, 241 text: 'cat', // 検索テキスト 242 sort: 'interestingness-desc', // 興味深さ順 243 per_page: 4, // 取得件数 244 license: '4', // Creative Commons Attributionのみ 245 extras: 'owner_name,license', // 追加で取得する情報 246 format: 'json', // レスポンスをJSON形式に 247 nojsoncallback: 1, // レスポンスの先頭に関数呼び出しを含めない 248}); 249const url = `https://api.flickr.com/services/rest/?${parameters}`; 250console.log(url); 251 252// 猫の画像を検索して表示 253$.getJSON(url, (data) => { 254 console.log(data); 255 256 // データが取得できなかった場合 257 if (data.stat !== 'ok') { 258 console.error('データの取得に失敗しました。'); 259 return; 260 } 261 262 // 空の<div>を作る 263 const $div = $('<div>'); 264 265 // ヒット件数 266 $div.append(`<div>${data.photos.total} photos in total</div>`); 267 268 for (let i = 0; i < data.photos.photo.length; i++) { 269 const photo = data.photos.photo[i]; 270 const photoText = getFlickrText(photo); 271 272 // $divに <a href="..." ...><img src="..." ...></a> を追加する 273 $div.append( 274 $('<a>', { 275 href: getFlickrPageURL(photo), 276 class: 'd-inline-block', 277 target: '_blank', // リンクを新規タブで開く 278 'rel': "noopener noreferrer", 279 'data-toggle': 'tooltip', 280 'data-placement': 'bottom', 281 title: photoText, 282 }).append( 283 $('<img>', { 284 src: getFlickrImageURL(photo, 'q'), 285 width: 150, 286 height: 150, 287 alt: photoText, 288 }), 289 ), 290 ); 291 } 292 // $divを#mainに追加する 293 $div.appendTo('gallery'); 294 295 // BootstrapのTooltipを適用 296 $('[data-toggle="tooltip"]').tooltip(); 297}); 298 299 300HTML 301 <!-- ギャラリー --> 302 <section id="gallery" class="gallery"> 303 <div class="gallery__phrase animated">ギャラリー</div> 304 <h2 class="gallery__title animated">Gallery</h2> 305 <div class="image-gallery animated"> 306 <!--<div class="image-gallery__item">--> 307 <!-- <a class="d-inline-block" href="img/kitten1.jpg">--> 308 <!-- <img class="img-fluid" src="img/gallery-thumbnail/kitten1.jpg" width="150" height="150" alt="アメリカンショートヘア">--> 309 <!-- </a>--> 310 <!--</div>--> 311 <!--<div class="image-gallery__item">--> 312 <!-- <a class="d-inline-block" href="img/kitten2.jpg">--> 313 <!-- <img class="img-fluid" src="img/gallery-thumbnail/kitten2.jpg" width="150" height="150" alt="スコティッシュフォールド">--> 314 <!-- </a>--> 315 <!--</div>--> 316 <!--<div class="image-gallery__item">--> 317 <!-- <a class="d-inline-block" href="img/kitten3.jpg">--> 318 <!-- <img class="img-fluid" src="img/gallery-thumbnail/kitten3.jpg" width="150" height="150" alt="ベンガル">--> 319 <!-- </a>--> 320 <!--</div>--> 321 <!--<div class="image-gallery__item">--> 322 <!-- <a class="d-inline-block" href="img/kitten4.jpg">--> 323 <!-- <img class="img-fluid" src="img/gallery-thumbnail/kitten4.jpg" width="150" height="150" alt="ロシアンブルー">--> 324 <!-- </a>--> 325 <!--</div>--> 326 <!--<div class="image-gallery__item">--> 327 <!-- <a class="d-inline-block" href="img/puppy1.jpg">--> 328 <!-- <img class="img-fluid" src="img/gallery-thumbnail/puppy1.jpg" width="150" height="150" alt="シェパード">--> 329 <!-- </a>--> 330 <!--</div>--> 331 <!--<div class="image-gallery__item">--> 332 <!-- <a class="d-inline-block" href="img/puppy2.jpg">--> 333 <!-- <img class="img-fluid" src="img/gallery-thumbnail/puppy2.jpg" width="150" height="150" alt="レトリバー">--> 334 <!-- </a>--> 335 <!--</div>--> 336 <!--<div class="image-gallery__item">--> 337 <!-- <a class="d-inline-block" href="img/puppy3.jpg">--> 338 <!-- <img class="img-fluid" src="img/gallery-thumbnail/puppy3.jpg" width="150" height="150" alt="プードル">--> 339 <!-- </a>--> 340 <!--</div>--> 341 <!--<div class="image-gallery__item">--> 342 <!-- <a class="d-inline-block" href="img/puppy4.jpg">--> 343 <!-- <img class="img-fluid" src="img/gallery-thumbnail/puppy4.jpg" width="150" height="150" alt="ポメラニアン">--> 344 <!-- </a>--> 345 <!--</div>--> 346 </div> 347 <!--/.image-gallery --> 348 </section> 349 <!--/.gallery -->

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

gallaryってなんでしょうか?プロパティででしょうか?

idかクラスなら#gallary.gallaryにしないといけないはずですが

投稿2021/04/06 06:37

FKM

総合スコア3647

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問