投稿日:2022年1月28日

先日、下記のような相談がありました。
 
YouTube動画を表示しておき、文字をクリックすると指定した時間領域を再生するようにしたい。
 
検証してみました。
先にお見せします。
それぞれの文字をクリックすると指定した時間領域を再生します。

WordCamp Japan 2021 のYouTubeをお借りしました。
 

YouTube API のサイトを参考にしました。
共有からiframeタグをコピーして埋め込む方法ではなく、準備してあるタグにJavaScriptでiframeタグを生成し、そこに埋め込む方法になっています。
ソースコードです。

 HTML

<!-- ▼▼▼ 包含する親要素を作成 -->
  <div id="YTWrap">
    <!-- ▼▼▼ ここにJavaScriptでiframeを埋め込む -->
    <div id="YTContent"></div>
  </div>

  <div id="linkWrap">
    <p id="YT01"><strong><span class="YTLink">DAY 7 オープニングセッション 0:00 / 4:38:12</span> <i class="fab fa-youtube"></i></strong>
    </p>
    <br>
    <p id="YT02"><strong><span class="YTLink">サイト制作者として生き抜くために「簡単にxxxできる」ツール・サービス等をうまく使おう 15:00 / 4:38:12</span> <i class="fab fa-youtube"></i></strong>
    </p>
    <br>
    <p id="YT03"><strong><span class="YTLink">SaaSでオンラインビジネスを加速しよう 1:15:30 / 4:38:12</span> <i class="fab fa-youtube"></i></strong>
    </p>
    <br>
    <p id="YT04"><strong><span class="YTLink">非エンジニアが30〜50万の小規模案件を1人で効率的にマネジメントして納品するためのティップス集 2:15:10 / 4:38:12</span> <i class="fab fa-youtube"></i></strong>
    </p>
    <br>
    <p id="YT05"><strong><span class="YTLink">LT大会 3:15:00 / 4:38:12</span> <i class="fab fa-youtube"></i></strong>
    </p>
    <br>
    <p id="YT06"><strong><span class="YTLink">閉会式 4:17:10 / 4:38:12</span> <i class="fab fa-youtube"></i></strong>
    </p>
  </div>

▲下記JavaScriptで、id値YTContentにYouTubeのiframeを挿入します。

 JavaScript

const tag = document.createElement('script');
tag.src = "https://www.youtube.com/player_api";
const firstScriptTag = document.getElementsByTagName('script')[0];
firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);

let player;

function onYouTubePlayerAPIReady() {
  player = new YT.Player('YTContent', {
    width: 800, //横幅
    height: 450, //縦幅
    videoId: 'SF7kA0VM9Fc', //動画のID。URLの"?v="以降の記述
    playerVars: {
      autoplay: 1, //自動再生
      controls: 1, //コントローラー
      rel: 0, //再生した動画と同チャンネルから関連動画が選択。
      playsinline: 1 // iOS上のHTML5 プレーヤーでインライン再生
    }
  });
}

// ▼▼▼ 文字クリックで動画再生の関数
const TYClick = (target, startSec, endSec) => {
  $(target).click(function () {
    player.loadVideoById({
      'videoId': 'SF7kA0VM9Fc', //YouTubeのvideo ID
      'startSeconds': startSec, //開始時間。秒で記述
      'endSeconds': endSec //終了時間。秒で記述
    });
  });
}

// ▼▼▼ 関数実行
TYClick('#YT01', 0, 900) //時間は秒で記述する。900秒は15分
TYClick('#YT02', 900, 4530);
TYClick('#YT03', 4530, 8110);
TYClick('#YT04', 8110, 11700);
TYClick('#YT05', 11700, 15430);
TYClick('#YT06', 15430, 16691);

YouTube Iframe Player APIl を参考にしました。
10、11行目で縦横幅の指定をしてますが、今回はレスポンシブでアクティブに変更するような仕様にしています。
コメントにも書きましたが、13行目、playerVarsのパラメーター、autoplay: 1 で自動再生。
controls: 1 でコントローラーを表示。
rel: 0 は、以前(2018年9月25日以前)、0で非表示にできたそうですが、現在は再生した動画と同チャンネルから関連動画が選択されるそうです。
その他はこちらを参考 にしてください。

 CSS

/* ▼▼▼ YouTubeをレスポンシブ対応 */
#YTWrap {
  position: relative;
  width: 100%;
  padding-top: 56.25%; /* アスペクト比16:9のとき横幅100%に対して縦は56.25%になる */
}

#YTWrap iframe {
  position: absolute;
  top: 0;
  right: 0;
  width: 100%;
  height: 100%;
}
/* ▲▲▲ YouTubeをレスポンシブ対応 */

.fa-youtube {
  color: red;
}

#linkWrap p {
  margin: .25em;
  cursor: pointer;
  display: inline-block;
}

.YTLink {
  color: blue;
  border-bottom: 1px solid blue;
}

▲YouTubeのレスポンシブ対応が要になってきます。
 

まとめ

始めは、通常通りYouTubeの共有からiframeをコピーして検証してました。
URLのパラメーターに?start=10&end=100などの追記や、autoplay=1 など、JavaScriptのイベントで操作すればできると思ってました。
だが、しかし、APIを使用しないとできないという、少々面倒くさい一面もありましたが、出来上がってみると手応えを感じました。
 
他にも色々と出来そうなので、もう少しYouTube APIを検証してみたいと思います。
最後まで読んでくださりありがとうございました。
 

関連記事


 

Pocket