前提・実現したいこと
iframe APIをレスポンシブで実装する。
その際iframe要素が画面内に入ったら自動再生し、それ以外の時はpauseする実装をしたい。
発生している問題・エラーメッセージ
iframeをレスポンシブで実装するために.embedというclassをつけたdiv要素をposition:absoluteしているのですが、 恐らくその影響でoffsetTopで取得したiframe要素の値が0になってしまっています。 そのため、iframe要素が画面内にあるかどうかの判定ができず、常に画面外にあるという判定をされている状況だと思います。
該当のソースコード
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Docment</title> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <style> body { margin: 800px 0; } ul { padding: 0; margin: 0 auto; width: 640px; list-style: none; } li+li { margin-top: 500px; } .container { position: relative; width: 100%; height: 0; padding-top: 56.25%; } .embed { position: absolute; top: 0; left: 0; width: 100%; height: 100%; } </style> </head> <body> <ul> <li> <div class="container"> <div class="embed" id="player01"></div> </div> </li> <li> <div class="container"> <div class="embed" id="player02"></div> </div> </li> <li> <div class="container"> <div class="embed" id="player03"></div> </div> </li> </ul> <script> var tag = document.createElement("script"); tag.src = "https://www.youtube.com/iframe_api"; var firstScriptTag = document.getElementsByTagName("script")[0]; firstScriptTag.parentNode.insertBefore(tag, firstScriptTag); var iframePlayerLists = []; var iframeDataLists = [{ id: "BAEn_W_98Xo", area: "player01" }, { id: "BAEn_W_98Xo", area: "player02" }, { id: "BAEn_W_98Xo", area: "player03" }]; function onYouTubeIframeAPIReady() { for (var i = 0; i < iframeDataLists.length; i++) { iframePlayerLists[i] = new YT.Player(iframeDataLists[i]["area"], { width: 640, height: 390, videoId: iframeDataLists[i]["id"], events: { "onReady": function (event) { event.target.mute() } } }); } }; window.addEventListener("scroll", function () { for (var i = 0; i < iframeDataLists.length; i++) { var iframePlayer = iframePlayerLists[i]; //.embedで宣言したposotion:absoluteの影響でiframe要素のy軸の値が0になっている?? console.log(iframePlayer.getIframe().offsetTop); if (window.pageYOffset < iframePlayer.getIframe().offsetTop && window.pageYOffset + window.screen.height > iframePlayer.getIframe().offsetTop + iframePlayer.getIframe().offsetHeight) { iframePlayer.playVideo(); } else { iframePlayer.pauseVideo(); } } }); </script> </body> </html>
試したこと
getBoundingClientRect()でiframe要素の座標を取得したりしましたが自動再生の関数は動きませんでした。
他にもdisplay:gridでiframe要素をレスポンシブで実装する方法も試し、目的の動作を実現できはしましたがie非対応のため諦めました。。
補足情報(FW/ツールのバージョンなど)
.containerと.embedに当たっているcssをコメントアウトすれば自動再生自体はできますが、
レスポンシブに対応しようとしている段階で詰まっている状況です。
参考サイト
https://coliss.com/articles/build-websites/operation/css/experiments-in-fixed-aspect-ratios.html
あなたの回答
tips
プレビュー