スマホでも素早く読み込みが可能な動画ライブラリーを開発

ファーストヴューでYouTube動画のサムネイル画像を読み込む

画像クリックで該当する動画が表示される

HTMLで組んだ画像ギャラリーをjQueryでクリックされた画像のみを動画に置き換えて再生する。

今回はWordPressの固定ページを新規に作成し、直接以下のHTMLを入力して

画像ギャラリー

を作成する。

繰り返しになるが、表向きは(ファーストヴュー)は画像ギャラリーを表示するだけとなる。そのため、一切動画の読み込みは発生しない。よって、多数の動画をファーストビューで表示する動画ギャラリーとは異なり、

素早くページを読み込むことが可能

となる。

作成方法

ギャラリー見本

sample-gallery

完成形は上の画像のとおりであるが、あくまでもファーストビュー用のダミー画像を表示しているにすぎず、youtube動画のiframeが埋め込まれているわけではない

ダミー画像は、自作して以下のHTMLで参照しているパスに配置した。

HTML

13個の画像(動画)をギャラリーとして表示するHTMLになる。下のHTMLでは、冒頭の2つの枠に実際の画像を設定したソースコードになる。それ以外の枠は、緑色のサンプル画像で穴埋めしてある。

<div class="gallery gallery-columns-3">
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img class="recommend" src="/wp-content/themes/twentythirteen-kid/images/music/dream-theater.png" alt="Dream Theater" />
    </div>
    <h3 class="figcaption"><figcaption class='wp-caption-text gallery-caption'>Dream Theater</figcaption></h3>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon landscape'>
      <img class="recommend" src="/wp-content/themes/twentythirteen-kid/images/music/period-chemistry.png" alt="Period" width="148" height="123" />
    </div>
    <h3 class="figcaption"><figcaption class='wp-caption-text gallery-caption'>Period</figcaption></h3>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img class="recommend" src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
  <figure class="gallery-item">
    <div class='gallery-icon portrait'>
      <img src="/wp-content/themes/twentythirteen-kid/images/148x123.png" alt="" />
    </div>
    <div>
      <figcaption class='wp-caption-text gallery-caption'></figcaption>
    </div>
  </figure>
</div>

SEO

googlebotなどのWebクローラは、上の純粋なHTMLを読み込むので、緑色の穴埋め画像には、altタグとfigcaptionを空に設定することにした。それ以外の実際の画像には、動画のタイトルや補足情報をaltタグ等に設定することで、どのような動画なのかWebクローラに伝えることが出来る。

jQuery

動画ギャラリーに載せる動画のiframeコードを配列として手動で定義しておく。

// youtubeの純粋なiframeタグを設定する配列
var data = new Array(
  {
    iframe: '<iframe class="recommend" width="300" height="250" src="//www.youtube.com/embed/UhEzjq1pRsk?feature=player_detailpage" frameborder="0" allowfullscreen></iframe>'
  },
  {
    iframe: '<iframe class="recommend" width="148" height="123" src="//www.youtube.com/embed/HoUV6Pi6gN0?feature=player_detailpage" frameborder="0" allowfullscreen></iframe>'
  }
);

// iframeタグから属性を抽出する配列を宣言しておく
var video = [];

次にimgタグにクリックイベントをセットして、youtube動画が設定されている枠がクリックされた場合には、画像を動画に置き換える。

// HTMLのrecommend classが設定されたimgを走査
$('.recommend').each(function(index) {
  // iframeが設定されている場合
  if( data[index] )
  {
    // iframeから属性を抽出
    video[index] = {
      src: $(data[index].iframe).attr('src'),
      width: $(data[index].iframe).attr('width'),
      height: $(data[index].iframe).attr('height')
    };

    // ダミー画像のクリックイベント
    $(this).click(function (){
      // ダミー画像をyoutube動画に置き換える
      $(this).after('<iframe width="'+video[index].width+'" height="'+video[index].height+'" src="'+video[index].src+'?feature=player_detailpage&controls=0&modestbranding=1&showinfo=0&autoplay=1&rel=0" frameborder="0" allowfullscreen></iframe>').remove();
    });
  }
});

緑色のサンプル画像に対しては、フロント側でキャプションを追加する。純粋なHTMLにキャプションを付けず、フロント側でjQueryを使ってappendする理由は、Webクローラにより正確にページの情報を伝えるための配慮といった感じ。

$('.gallery-caption').each(function(index) {
  if( !data[index] )
  {
    $(this).append('Awesome Song');
  }
});

まとめ

純粋なHTMLには動画を一切表示させないことで、スマホでもページを素早く読み込むことが出来る。youtube動画はクリックイベントで個別に読み込むようにする。

動画を複数、あるいは一つでも読み込む場合は、おぼえておきたいノウハウ。

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

スマホでも素早く読み込みが可能な動画ライブラリーを開発の記事にコメントを投稿

開発