質問編集履歴

2

該当コードを追加しました。

2020/02/13 20:42

投稿

shunsuke5468
shunsuke5468

スコア15

test CHANGED
File without changes
test CHANGED
@@ -38,13 +38,475 @@
38
38
 
39
39
 
40
40
 
41
+ ```
42
+
43
+ /* global $ MobileDetect */
44
+
45
+
46
+
47
+ // モバイルブラウザかどうか判定
48
+
49
+ const isMobile = !!new MobileDetect(window.navigator.userAgent).mobile();
50
+
51
+
52
+
53
+ /**
54
+
55
+ * ----------------------
56
+
57
+ * 指定された名前のタブを表示
58
+
59
+ * ----------------------
60
+
61
+ */
62
+
63
+ const showTab = (tabName) => {
64
+
65
+ // すでに表示されている場合は何もせずに終了
66
+
67
+ if ($(`#${tabName}`).is(':visible')) {
68
+
69
+ return;
70
+
71
+ }
72
+
73
+
74
+
75
+ const tabsContainer = $(`a[href='#${tabName}']`).closest('.tabs');
76
+
77
+ // .tabs__menu liのうちtabNameに該当するものにだけactiveクラスを付ける
78
+
79
+ tabsContainer.find('.tabs__menu li').removeClass('active');
80
+
81
+ tabsContainer
82
+
83
+ .find(`.tabs__menu a[href='#${tabName}']`)
84
+
85
+ .parent('li')
86
+
87
+ .addClass('active');
88
+
89
+
90
+
91
+ // .tabs__contentの直下の要素をすべて非表示
92
+
93
+ tabsContainer.find('.tabs__content > *').css({ display: 'none' });
94
+
95
+ // #<tabName>と.tabs__content .<tabName>を表示
96
+
97
+ tabsContainer
98
+
99
+ .find(`#${tabName}, .tabs__content .${tabName}`)
100
+
101
+ .css({
102
+
103
+ display: 'block',
104
+
105
+ opacity: 0.7,
106
+
107
+ })
108
+
109
+ .animate(
110
+
111
+ {
112
+
113
+ opacity: 1,
114
+
115
+ },
116
+
117
+ 400,
118
+
119
+ );
120
+
121
+ };
122
+
123
+
124
+
125
+ /**
126
+
127
+ * -------------
128
+
129
+ * パララックス関連
130
+
131
+ * -------------
132
+
133
+ */
134
+
135
+
136
+
137
+ // 背景画像のスクロール速度。数字が小さいほど速い。
138
+
139
+ const parallaxXSpeed = 12;
140
+
141
+ const parallaxYSpeed = 3;
142
+
143
+ const parallaxXSpeedSmall = 5;
144
+
145
+ const parallaxYSpeedSmall = 1;
146
+
147
+
148
+
149
+ // パララックスを適用する関数
150
+
151
+ const showParallax = () => {
152
+
153
+ const scrollTop = $(window).scrollTop();
154
+
155
+
156
+
157
+ // 背景画像の位置をスクロールに合わせて変える
158
+
159
+ const offsetX = Math.round(scrollTop / parallaxXSpeed);
160
+
161
+ const offsetY = Math.round(scrollTop / parallaxYSpeed);
162
+
163
+ const offsetXSmall = Math.round(scrollTop / parallaxXSpeedSmall);
164
+
165
+ const offsetYSmall = Math.round(scrollTop / parallaxYSpeedSmall);
166
+
167
+
168
+
169
+ $('.puppies').css({
170
+
171
+ 'background-position':
172
+
173
+ // 一番上
174
+
175
+ `${-offsetX}px ${-offsetY}px, ${
176
+
177
+ // 上から2番目
178
+
179
+ offsetXSmall
180
+
181
+ }px ${-offsetYSmall}px, `
182
+
183
+ // 一番下
184
+
185
+ + '0% 0%',
186
+
187
+ });
188
+
189
+
190
+
191
+ $('.kittens').css({
192
+
193
+ 'background-position':
194
+
195
+ // 一番上
196
+
197
+ `${offsetX}px ${-offsetY}px, ${
198
+
199
+ // 上から2番目
200
+
201
+ -offsetXSmall
202
+
203
+ }px ${-offsetYSmall}px, `
204
+
205
+ // 一番下
206
+
207
+ + '0% 0%',
208
+
209
+ });
210
+
211
+ };
212
+
213
+
214
+
215
+ // パララックスを初期化する関数
216
+
217
+ const initParallax = () => {
218
+
219
+ $(window).off('scroll', showParallax);
220
+
221
+
222
+
223
+ if (!isMobile) {
224
+
225
+ // モバイルブラウザでなければパララックスを適用
226
+
227
+ showParallax();
228
+
229
+
230
+
231
+ // スクロールのたびにshowParallax関数を呼ぶ
232
+
233
+ $(window).on('scroll', showParallax);
234
+
235
+ }
236
+
237
+ };
238
+
239
+
240
+
241
+ /**
242
+
243
+ * ------------------
244
+
245
+ * イベントハンドラの登録
246
+
247
+ * ------------------
248
+
249
+ */
250
+
251
+
252
+
253
+ /**
254
+
255
+ * animatedクラスを持つ要素が画面内に入ったら
256
+
257
+ * Animate.cssのfadeInUpエフェクトを適用
258
+
259
+ */
260
+
261
+ $('.animated').waypoint({
262
+
263
+ handler(direction) {
264
+
265
+ if (direction === 'down') {
266
+
267
+ $(this.element).addClass('fadeInUp');
268
+
269
+ this.destroy();
270
+
271
+ }
272
+
273
+ },
274
+
275
+ /**
276
+
277
+ * 要素の上端が画面のどの位置に来たときにhandlerメソッドを呼び出すか指定
278
+
279
+ * 0%なら画面の一番上、100%なら画面の一番下に来たときに呼び出される
280
+
281
+ */
282
+
283
+ offset: '100%',
284
+
285
+ });
286
+
287
+
288
+
289
+ $(window).on('resize', () => {
290
+
291
+ // ウインドウがリサイズされるとここが実行される
292
+
293
+ initParallax();
294
+
295
+ });
296
+
297
+
298
+
299
+ // タブがクリックされたらコンテンツを表示
300
+
301
+ $('.tabs__menu a').on('click', (e) => {
302
+
303
+ const tabName = $(e.currentTarget).attr('href');
304
+
305
+
306
+
307
+ // hrefにページ遷移しない
308
+
309
+ e.preventDefault();
310
+
311
+
312
+
313
+ if (tabName[0] === '#') {
314
+
315
+ // hrefの先頭の#を除いたものをshowTab()関数に渡す
316
+
317
+ showTab(tabName.substring(1));
318
+
319
+ }
320
+
321
+ });
322
+
323
+
324
+
325
+ /**
326
+
327
+ * ナビゲーションバーのリンクをクリックしたら、
328
+
329
+ * スムーズにスクロールしながら対象位置に移動
330
+
331
+ */
332
+
333
+ $('.nav-link').on('click', (e) => {
334
+
335
+ const destination = $(e.target).attr('href');
336
+
337
+
338
+
339
+ // 本来のクリックイベントは処理しない
340
+
341
+ e.preventDefault();
342
+
343
+
344
+
345
+ $('html, body').animate(
346
+
347
+ {
348
+
349
+ scrollTop: $(destination).offset().top,
350
+
351
+ },
352
+
353
+ 1000,
354
+
355
+ );
356
+
357
+
358
+
359
+ // ハンバーガーメニューが開いている場合は閉じる
360
+
361
+ $('.navbar-toggler:visible').trigger('click');
362
+
363
+ });
364
+
365
+
366
+
367
+ // d-inline-blockクラスの付いた要素にMagnific Popupを適用
368
+
369
+ $('.d-inline-block').magnificPopup({
370
+
371
+ type: 'image',
372
+
373
+ gallery: { enabled: true },
374
+
375
+
376
+
377
+ /**
378
+
379
+ * ポップアップに適用されるクラス。
380
+
381
+ * ここではフェードイン・アウト用のmfp-fadeクラスを適用。
382
+
383
+ */
384
+
385
+ mainClass: 'mfp-fade',
386
+
387
+
388
+
389
+ // ポップアップが非表示になるまでの待ち時間
390
+
391
+ removalDelay: 300,
392
+
393
+ });
394
+
395
+
396
+
397
+ /**
398
+
399
+ * ---------------------------------------
400
+
401
+ * ページの読み込みが完了したタイミングで行うDOM操作
402
+
403
+ * ---------------------------------------
404
+
405
+ */
406
+
407
+
408
+
409
+ // モバイルブラウザでは静止画を表示し、それ以外では動画を表示
410
+
411
+ if (isMobile) {
412
+
413
+ $('.top__bg').css({
414
+
415
+ 'background-image': 'url(video/top-video-still.jpg)',
416
+
417
+ });
418
+
419
+ } else {
420
+
421
+ $('.top__video').css({ display: 'block' });
422
+
423
+ }
424
+
425
+
426
+
427
+ // 初期状態として1番目のタブを表示
428
+
429
+ showTab('puppies-1');
430
+
431
+ showTab('kittens-1');
432
+
433
+
434
+
435
+ // パララックスを初期化する
436
+
437
+ initParallax();
438
+
439
+
440
+
441
+ // Flickr API key
442
+
443
+ const apiKey = 'd446ddf0ddc4bf37749d948fccc4baed';
444
+
445
+
446
+
447
+ // Flickr画像データのURLを返す
448
+
449
+ const getFlickrImageURL = (photo, size) => {
450
+
451
+ let url = `https://farm${photo.farm}.staticflickr.com/${photo.server}/${photo.id}_${
452
+
453
+ photo.secret
454
+
455
+ }`;
456
+
457
+ if (size) {
458
+
459
+ // サイズ指定ありの場合
460
+
461
+ url += `_${size}`;
462
+
463
+ }
464
+
465
+ url += '.jpg';
466
+
467
+ return url;
468
+
469
+ };
470
+
471
+
472
+
473
+ // Flickr画像の元ページのURLを返す
474
+
475
+ const getFlickrPageURL = photo => `https://www.flickr.com/photos/${photo.owner}/${photo.id}`;
476
+
477
+
478
+
479
+ // Flickr画像のaltテキストを返す
480
+
481
+ const getFlickrText = (photo) => {
482
+
483
+ let text = `"${photo.title}" by ${photo.ownername}`;
484
+
485
+ if (photo.license === '4') {
486
+
487
+ // Creative Commons Attribution(CC BY)ライセンス
488
+
489
+ text += ' / CC BY';
490
+
491
+ }
492
+
493
+ return text;
494
+
495
+ };
496
+
497
+
498
+
499
+ // リクエストパラメータを作る
500
+
41
- ```const parameters = $.param({
501
+ const parameters = $.param({
42
502
 
43
503
  method: 'flickr.photos.search',
44
504
 
45
505
  api_key: apiKey,
46
506
 
47
- text:'cat,dog',// 検索テキスト
507
+ tags:'cat',// 検索テキスト
508
+
509
+ tag_mode:'',
48
510
 
49
511
  sort: 'interestingness-desc', // 興味深さ順
50
512
 
@@ -64,6 +526,98 @@
64
526
 
65
527
  console.log(url);
66
528
 
529
+
530
+
531
+ // 猫の画像を検索して表示
532
+
533
+ $.getJSON(url, (data) => {
534
+
535
+ console.log(data);
536
+
537
+
538
+
539
+ // データが取得できなかった場合
540
+
541
+ if (data.stat !== 'ok') {
542
+
543
+ console.error('データの取得に失敗しました。');
544
+
545
+ return;
546
+
547
+ }
548
+
549
+
550
+
551
+ // 空の<div>を作る
552
+
553
+ const $div = $('<div>');
554
+
555
+
556
+
557
+ // ヒット件数
558
+
559
+ $div.append(`<div>${data.photos.total} photos in total</div>`);
560
+
561
+
562
+
563
+ for (let i = 0; i < data.photos.photo.length; i++) {
564
+
565
+ const photo = data.photos.photo[i];
566
+
567
+ const photoText = getFlickrText(photo);
568
+
569
+
570
+
571
+ // $divに <a href="..." ...><img src="..." ...></a> を追加する
572
+
573
+ $div.append(
574
+
575
+ $('<a>', {
576
+
577
+ href: getFlickrPageURL(photo),
578
+
579
+ class: 'd-inline-block',
580
+
581
+ target: '_blank', // リンクを新規タブで開く
582
+
583
+ 'data-toggle': 'tooltip',
584
+
585
+ 'data-placement': 'bottom',
586
+
587
+ title: photoText,
588
+
589
+ }).append(
590
+
591
+ $('<img>', {
592
+
593
+ src: getFlickrImageURL(photo, 'q'),
594
+
595
+ width: 150,
596
+
597
+ height: 150,
598
+
599
+ alt: photoText,
600
+
601
+ }),
602
+
603
+ ),
604
+
605
+ );
606
+
607
+ }
608
+
609
+ // $divを#mainに追加する
610
+
611
+ $div.appendTo('#main');
612
+
613
+
614
+
615
+ // BootstrapのTooltipを適用
616
+
617
+ $('[data-toggle="tooltip"]').tooltip();
618
+
619
+ });
620
+
67
621
  ```
68
622
 
69
623
 

1

2020/02/13 20:41

投稿

shunsuke5468
shunsuke5468

スコア15

test CHANGED
File without changes
test CHANGED
@@ -38,7 +38,7 @@
38
38
 
39
39
 
40
40
 
41
- const parameters = $.param({
41
+ ```const parameters = $.param({
42
42
 
43
43
  method: 'flickr.photos.search',
44
44
 
@@ -64,6 +64,8 @@
64
64
 
65
65
  console.log(url);
66
66
 
67
+ ```
68
+
67
69
 
68
70
 
69
71
  ### 試したこと