サムネイルをクリックすると、モダールウィンドウでYouTube動画を表示

  • WebDesign
  • サムネイルをクリックすると、モダールウィンドウでYouTube動画を表示する方法を紹介します。

    サムネイルをクリックすると、モダールウィンドウ、YouTubeが表示されます。クローズボタン、背景をクリックするとモダールウィンドウが閉じます。

    サムネイルをクリックすると、モダールウィンドウ、YouTubeが表示

    クローズボタン、背景をクリックするとモダールウィンドウが閉じる

    コード

     <div id="column1">
    	<ul class="gallery">
    		<li class="modal-button"><img src="images/movie-thumb01.png" data-url="05NMZPHaU_o?si=ItFo_trls_FyY08C" alt""/></li>
    		<li class="modal-button"><img src="images/movie-thumb02.png" data-url="pZkD_bl9noY?si=bAhG48XTTYzDOF79" alt""/></li>
    		<li class="modal-button"><img src="images/movie-thumb03.png" data-url="3skpp5_QowM?si=7rx_UbrToJJH_YJY" alt""/></li>
    	</ul>
    </div>
    #column1 {
        display: grid;
    	align-content: center;
    	align-items: center;
    	height: 100vh;
    	width: 100vw;
    	background-repeat: no-repeat;
    	background-position: 70% center;
    	background-size: cover;
    	position: relative;
    	overflow: hidden;
    	background: #555;
    }
    .textcontent{
    	opacity: 0;
    	text-transform: uppercase;
    }
    .gallery{
    	display: flex;
    	margin: auto;	
    }
    .gallery li{
    	width: 20vw;
    	height: 20vw;
    	max-width: 200px;
    	max-height: 200px;
    	overflow: hidden;
    	list-style: none;
    }
    .gallery li img{
    	width: 100%;
    	height: 100%;
    	object-fit: cover;
    }
    .yt-modal {
    	width: 100%;
    	height: 100%;
    	position: absolute;
    	top: 0;
    	left: 0;
    	background-color: rgba(0, 0, 0, 0.2);
    	display: flex;
    	justify-content: center;
    	align-items: center;
    	z-index: 20;
    }
    .yt-inner {
    	top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        -webkit-transform: translate(-50%, -50%);
        -ms-transform: translate(-50%, -50%);
    	min-width: 350px;
    	position: fixed;
    	border-radius: 5px;
    	text-align: center;
    	max-width: 1000px;
    	height: auto;
    	display: flex;
    	justify-content: center;
    	align-items: center;
    	flex-direction: column;
    	z-index: 30;
    	width: 100%;
    	aspect-ratio: 16 / 9;
    	background: #000
    }
    .yt-inner iframe {
      width: 100%;
      height: 100%;
    }
    .yt-modal .yt-inner img{
    	width: 100%;
    	height: auto;
    }
    .yt-closemodal{
    	width: 50px;
    	height: 50px;
    	position: fixed;
    	top: 0;
    	right: 0;
    	z-index: 200;
    	cursor: pointer;
    }
    .yt-closemodal::after, .yt-closemodal::before{
    	content: '';
    	width: 30px;
    	height:1px;
    	top: 50%;
    	left: 50%;
    	background: #fff;
    	position: absolute;
    }
    .yt-closemodal::after{
    	transform: translate(-50%,-50%) rotate(45deg);
    }
    .yt-closemodal::before{
    	transform: translate(-50%,-50%) rotate(-45deg);
    }
    const ytModalButton = document.querySelectorAll('.modal-button');
    
    ytModalButton.forEach((image)=>{
    	image.addEventListener('click', (event) => {
    	const ytModalElement = document.createElement('div');
    	const youTubeUrl = event.target.dataset.url;
    	//modalクラスを付与する
    	ytModalElement.classList.add('yt-modal');
    	//モダールウィンドウの内部要素を生成する
    	const ytInnerElement = document.createElement('div');
    	ytInnerElement.classList.add('yt-inner');
    	ytInnerElement.innerHTML = `
    		<iframe width="" height="" src="https://www.youtube.com/embed/${youTubeUrl}
    " title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
    	`;
    	//クローズボタンを生成する
    	const ytCloseElement = document.createElement('div');
    	ytCloseElement.classList.add('yt-closemodal');  
    	//body要素にモダールウィンドウを配置する
    	document.body.appendChild(ytModalElement);
    	document.body.appendChild(ytInnerElement);
    	document.body.appendChild(ytCloseElement);
    	//オープンモダールアニメーション
    	const openModalKeyframes = {
    		opacity: [0, 1]
    	};
    	const openModalOptions = {
    		duration: 400,
    		easing: 'ease',
    		fill: 'forwards'
    	};
    	ytModalElement.animate(
    		openModalKeyframes, openModalOptions
    	);
    	ytInnerElement.animate(
    		openModalKeyframes, openModalOptions
    	);
    	ytCloseElement.animate(
    		openModalKeyframes, openModalOptions
    	);
    	//クローズモダールアニメーション
    	const closeModalKeyframes = {
    		opacity: [1, 0]
    	};
    	const closeModalOptions = {
    		duration: 400,
    		easing: 'ease',
    		fill: 'forwards'
    	};
    	function closeModalElement (){
    		ytModalElement.animate(
    			closeModalKeyframes, closeModalOptions
    		);
    		ytInnerElement.animate(
    			closeModalKeyframes, closeModalOptions
    		);
    		ytCloseElement.animate(
    			closeModalKeyframes, closeModalOptions
    		);
    		ytCloseElement.animate(
    			{
    				transform: ['translate(-50%,-50%) rotate(45deg)','translate(-50%,-50%) rotate(0deg)']
    			},
    			{
    				duration: 400,
    				pseudoElement: "::after",
    				easing: 'ease',
    			}
    		);
    		ytCloseElement.animate(
    			{
    				transform: ['translate(-50%,-50%) rotate(-45deg)','translate(-50%,-50%) rotate(-90deg)']
    			},
    			{
    				duration: 400,
    				pseudoElement: "::before",
    				easing: 'ease',
    			}
    		);
    		setTimeout( ()=> {
    			ytCloseModalWindow(ytModalElement);
    			ytCloseModalWindow(ytInnerElement);
    			ytCloseModalWindow(ytCloseElement);
    		}, 400)
    	}
    	//内部要素をクリックしたらモダールウィンドウを削除する処理
    	ytModalElement.addEventListener('click', () => {
    		closeModalElement ();
    	});
    	//内部要素をクリックしたらモダールウィンドウを削除する処理
    	ytCloseElement.addEventListener('click', () => {
    		closeModalElement ();
    	});	  
      });
    });
    
    function ytCloseModalWindow(ytModalElement) {
    	document.body.removeChild(ytModalElement)
    }