JavaScriptでモダールウィンドウを作成

  • WebDesign
  • 今回はJavaScriptでモダールウィンドウを作成する方法を紹介します。

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

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

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

    コード

    <div id="modal-column1">
    	<ul class="jazz-gallery">
     		<li class="modal-button"><img src="images/jazz002.jpg" alt""/></li>
     		<li class="modal-button"><img src="images/jazz003.jpg" alt""/></li>
     		<li class="modal-button"><img src="images/jazz004.jpg" alt""/></li>
    	</ul>
    </div>
    #modal-column1 {
        display: grid;
    	align-content: center;
    	align-items: center;
    	height: 100vh;
    	width: 100vw;
    	background-image: url("../images/jazz001.jpg");
    	background-repeat: no-repeat;
    	background-position: center;
    	background-size: cover;
    	position: relative;
    	overflow: hidden;
    }
    .jazz-gallery{
    	display: flex;
    	margin: auto;
    }
    .jazz-gallery li{
    	width: 20vw;
    	height: 20vw;
    	max-width: 200px;
    	max-height: 200px;
    	overflow: hidden;
    	cursor: pointer;
    }
    .jazz-gallery li img{
    	width: 100%;
    	height: 100%;
    	object-fit: cover;
    }
    .modal {
    	width: 100vw;
    	height: 100vh;
    	position: fixed;
    	top: 0;
    	left: 0;
    	background-color: rgba(0, 0, 0, 0.5);
    	display: flex;
    	justify-content: center;
    	align-items: center;
    	z-index: 20;
    	cursor: pointer;
    }
    .inner {
    	top: 50%;
        left: 50%;
        transform: translate(-50%, -50%);
        -webkit-transform: translate(-50%, -50%);
        -ms-transform: translate(-50%, -50%);
    	min-width: 350px;
    	position: fixed;
    	text-align: center;
    	max-width: 1200px;
    	height: auto;
    	display: flex;
    	justify-content: center;
    	align-items: center;
    	flex-direction: column;
    	animation: fadeInAnimation 800ms ease-out;
    	z-index: 30;
    	aspect-ratio: 4 / 3;
    	overflow: hidden;
    }
    .inner img {
        width: 100%;
       	height: 100%;
        object-fit: cover;
    }
    .closemodal{
    	width: 50px;
    	height: 50px;
    	/*background: #000;*/
    	position: fixed;
    	top: 0;
    	right: 0;
    	z-index: 200;
    	cursor: pointer;
    }
    .closemodal::after, .closemodal::before{
    	content: '';
    	width: 30px;
    	height:1px;
    	top: 50%;
    	left: 50%;
    	background: #fff;
    	position: absolute;
    }
    .closemodal::after{
    	transform: translate(-50%,-50%) rotate(45deg);
    }
    .closemodal::before{
    	transform: translate(-50%,-50%) rotate(-45deg);
    }
    @keyframes fadeInAnimation {
      from {
        opacity: 0;
      }
      to {
        opacity: 1;
      }
    }
    const modalButton = document.querySelectorAll('.modal-button');
    
    modalButton.forEach((image)=>{
      image.addEventListener('click', (event) => {
    	 const moalImageSrc =  event.target.src;
    	 const modalElement = document.createElement('div');
    	//modalクラスを付与する
    	modalElement.classList.add('modal');
    	
    	//モダールウィンドウの内部要素を生成する
    	const innerElement = document.createElement('div');
    	innerElement.classList.add('inner');
    	innerElement.innerHTML = `
    		<img src="${moalImageSrc}" alt""/>
    	`;
    	  
    	 //クローズボタンを生成する
    	const closeElement = document.createElement('div');
    	closeElement.classList.add('closemodal');
    	  
    	//body要素にモダールウィンドウを配置する
    	document.body.appendChild(modalElement);
    	document.body.appendChild(innerElement);
    	document.body.appendChild(closeElement);
    	//内部要素をクリックしたらモダールウィンドウを削除する処理
    	modalElement.addEventListener('click', () => {
    		
    		modalElement.animate(
    			{
    				opacity: [1, 0]
    			},
    			{
    				duration: 400,
    				easing: 'ease',
    				fill: 'forwards'
    			}
    		);
    		innerElement.animate(
    			{
    				opacity: [1, 0]
    			},
    			{
    				duration: 400,
    				easing: 'ease',
    				fill: 'forwards'
    			}
    		);
    		closeElement.animate(
    			{
    				opacity: [1, 0]
    			},
    			{
    				duration: 400,
    				easing: 'ease',
    				fill: 'forwards'
    			}
    		);
    		closeElement.animate(
    			{
    				transform: ['translate(-50%,-50%) rotate(45deg)','translate(-50%,-50%) rotate(0deg)']
    			},
    			{
    				duration: 400,
    				pseudoElement: "::after",
    				easing: 'ease',
    			}
    		);
    		closeElement.animate(
    			{
    				transform: ['translate(-50%,-50%) rotate(-45deg)','translate(-50%,-50%) rotate(-90deg)']
    			},
    			{
    				duration: 400,
    				pseudoElement: "::before",
    				easing: 'ease',
    			}
    		);
    		setTimeout( ()=> {
    			closeModalWindow(modalElement);
    			closeModalWindow(innerElement);
    			closeModalWindow(closeElement);
    		}, 400)
    	});
    	//内部要素をクリックしたらモダールウィンドウを削除する処理
    	closeElement.addEventListener('click', () => {
    		
    		modalElement.animate(
    			{
    				opacity: [1, 0]
    			},
    			{
    				duration: 400,
    				easing: 'ease',
    				fill: 'forwards'
    			}
    		);
    		innerElement.animate(
    			{
    				opacity: [1, 0]
    			},
    			{
    				duration: 400,
    				easing: 'ease',
    				fill: 'forwards'
    			}
    		);
    		closeElement.animate(
    			{
    				opacity: [1, 0]
    			},
    			{
    				duration: 400,
    				easing: 'ease',
    				fill: 'forwards'
    			}
    		);
    		closeElement.animate(
    			{
    				transform: ['translate(-50%,-50%) rotate(45deg)','translate(-50%,-50%) rotate(0deg)']
    			},
    			{
    				duration: 400,
    				pseudoElement: "::after",
    				easing: 'ease',
    			}
    		);
    		closeElement.animate(
    			{
    				transform: ['translate(-50%,-50%) rotate(-45deg)','translate(-50%,-50%) rotate(-90deg)']
    			},
    			{
    				duration: 400,
    				pseudoElement: "::before",
    				easing: 'ease',
    			}
    		);
    		setTimeout( ()=> {
    			closeModalWindow(modalElement);
    			closeModalWindow(innerElement);
    			closeModalWindow(closeElement);
    		}, 400)
    	});
    	  
      });
    });
    function displayModalWindow() {
    	//モダールウィンドウを生成する
    }
    
    function closeModalWindow(modalElement) {
    	document.body.removeChild(modalElement)
    }