HTML, CSS 및 Vanilla Javascript를 사용한 반응형 이미지 라이트박스 디자인

안녕 친구, 오늘 이 블로그에서는 HTML, CSS 및 Vanilla Javascript를 사용하여 반응형 이미지 라이트박스 디자인을 만드는 방법을 배웁니다. 이전 블로그에서 how to create a password strength checker using HTML, CSS, and Javascript을 보았습니다. 이제 이미지 라이트박스를 만들 차례입니다. 관심이 있으시면 이 블로그를 읽은 후 제 다른 자바스크립트 프로젝트를 확인하실 수 있습니다. My javascript blogs .

많은 웹사이트에서 이미지 라이트박스를 본 적이 있을 것입니다. 라이트박스는 웹사이트 화면의 80%를 가리고 페이지의 나머지 부분을 어둡게 하여 이미지와 동영상을 보여줍니다. 라이트박스에는 슬라이드 컨트롤이 있어 한 이미지에서 다른 이미지로 쉽게 전환할 수 있습니다. 라이트박스용 자바스크립트 라이브러리가 많이 있지만 이 블로그에서는 자바스크립트나 jquery 라이브러리를 사용하지 않고 라이트박스를 만드는 방법을 보여드리겠습니다.

당신은 다음을 좋아할 수 있습니다 :-


  • Cookie Consent Box Design
  • Responsive Accordion Design
  • Animated Product Preview Card Design
  • Custom Context or Right Click Menu Design

  • 이 프로젝트 [반응형 이미지 라이트박스]에는 웹 페이지에 6개의 이미지가 있습니다. 이미지 위로 마우스를 가져가면 크기가 커지며 축소 효과를 의미하고 특정 이미지 라이트박스를 클릭하면 부드러운 전환과 함께 나타납니다. 라이트박스에는 위의 이미지에서 볼 수 있듯이 왼쪽 상단 모서리에 전체 이미지 번호와 현재 이미지 번호가 있고 오른쪽 상단 모서리에 십자가 아이콘이 있는 닫기 버튼이 있습니다. 이미지를 변경하는 프레셔스 버튼과 다음 버튼도 있습니다. 닫기 버튼을 클릭하면 라이트박스가 사라집니다.

    이 이미지 갤러리와 라이트박스는 모든 장치에서 완전히 반응합니다. PC에서는 한 줄에 3개의 이미지가 있지만 모바일 장치에서는 한 줄에 하나의 이미지만 있습니다. 내 말을 이해하기 어렵다면 소스 코드를 확인하고 미리보기도 할 수 있습니다.

    미리보기를 사용할 수 있습니다here.

    HTML 코드




     <!-- --------------------- Created By InCoder --------------------- -->
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
        <meta charset="UTF-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title></title>
        <link rel="stylesheet" href="main.css">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.1.1/css/all.min.css">
    </head>
    
    <body>
        <div class="container">
            <div class="gallery">
                <div class="image">
                    <img src="https://drive.google.com/uc?id=1W_YHw1ky5GScu_oFR3Fa2xsA77Mi037B&export=view" alt="watch">
                </div>
                <div class="image">
                    <img src="https://drive.google.com/uc?id=1EkzGCReXAqdi0dcat2WWdioU0MM09STD&export=view" alt="laptop">
                </div>
                <div class="image">
                    <img src="https://drive.google.com/uc?id=1hTezbGNnjK54_jprSLrbNxF6gQIHFqqc&export=view" alt="laptop">
                </div>
                <div class="image">
                    <img src="https://drive.google.com/uc?id=1mSCh-fkpC31MTIyu63ylxZJ-12Wib2e5&export=view" alt="laptop">
                </div>
                <div class="image">
                    <img src="https://drive.google.com/uc?id=12Fs0GeOk0x8yr38Nepackc4dju3fKuLa&export=view" alt="laptop">
                </div>
                <div class="image">
                    <img src="https://drive.google.com/uc?id=1sBpjjw_FjIPu0uwAX0IEI9RHUxF3NPsf&export=view" alt="laptop">
            </div>
        </div>
        </div>
    
        <div class="lightBoxContainer">
            <div class="wrapper">
                <div class="header">
                    <div class="count">
                        <p><span class="current"></span>&nbsp;<span class="total"></span></p>
                    </div>
                    <button class="closeBtn">
                        <i class="fa-solid fa-xmark"></i>
                    </button>
                </div>
                <div class="body">
                    <i class="fa-solid fa-angle-left pre"></i>
                    <img src="">
                    <i class="fa-solid fa-angle-right next"></i>
                </div>
            </div>
        </div>
    
        <script src="script.js"></script>
    </body>
    
    </html>
    


    CSS 코드




    /* --------------------- Created By InCoder --------------------- */
    
    @import url('https://fonts.googleapis.com/css2?family=Poppins:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap');
    
    *{
        margin: 0;
        padding: 0;
        box-sizing: border-box;
    }
    
    body{
        height: 100vh;
        background-color: #ff5757;
        font-family: 'Poppins', sans-serif;
    }
    
    .container{
        height: 100%;
        display: flex;
        align-items: center;
        justify-content: center;
    }
    
    .gallery{
        display: flex;
        flex-wrap: wrap;
        max-height: 100%;
        margin-top: 2rem;
        align-items: center;
        justify-content: center;
    }
    
    .image {
        margin: 1rem;
        cursor: pointer;
        max-width: 18rem;
        overflow: hidden;
        max-height: 11rem;
        border-radius: .5rem;
    }
    
    .image img{
        max-width: 18rem;
        transition: transform .3s ease-in-out;
    }
    
    .image:hover img{
        transform: scale(1.1);
    }
    
    .lightBoxContainer{
        top: 0;
        left: 0;
        opacity: 0;
        width: 100%;
        height: 100%;
        display: flex;
        position: fixed;
        align-items: center;
        pointer-events: none;
        justify-content: center;
        backdrop-filter: blur(2px);
        background: rgb(0 0 0 / 60%);
        transition: opacity 0.3s ease-in-out;
    }
    
    .lightBoxContainer.show{
        opacity: 1;
        pointer-events: auto;
    }
    
    .lightBoxContainer .wrapper{
        display: flex;
        max-width: 40rem;
        align-items: center;
        flex-direction: column;
        justify-content: center;
    }
    
    .lightBoxContainer .body{
        display: flex;
        margin-bottom: 1rem;
        align-items: center;
        flex-direction: column;
        justify-content: center;
    }
    
    .lightBoxContainer .header{
        width: 100%;
        display: flex;
        padding: 0 2rem;
        margin-top: 1rem;
        align-items: center;
        margin-bottom: 1rem;
        justify-content: space-between;
    }
    
    .lightBoxContainer .header .count{
        color: #fff;
    }
    
    .lightBoxContainer .header .closeBtn{
        border: 0;
        color: #fff;
        width: 2.6rem;
        height: 2.6rem;
        cursor: pointer;
        font-size: 1.5rem;
        border-radius: 50%;
        background: transparent;
        transition: background .3s ease-in-out;
    }
    
    .lightBoxContainer .header .closeBtn:hover{
        background: rgb(255 255 255 / 20%);
    }
    
    .lightBoxContainer .body img{
        max-width: 80%;
        margin: 0 1rem;
    }
    
    .lightBoxContainer .body{
        display: flex;
        flex-direction: row;
    }
    
    .lightBoxContainer .body :is(.fa-angle-left, .fa-angle-right){
        border: 0;
        color: #fff;
        width: 2.6rem;
        display: grid;
        height: 2.6rem;
        cursor: pointer;
        font-size: 1.8rem;
        border-radius: 50%;
        place-items: center;
        background: transparent;
        transition: background .3s ease-in-out;
    }
    
    .lightBoxContainer .body :is(.fa-angle-left, .fa-angle-right):hover{
        background: rgb(255 255 255 / 20%);
    }
    


    자바스크립트 코드




    // --------------------- Created By InCoder ---------------------
    
    let images = document.querySelectorAll('.image')
    lightBoxContainer = document.querySelector('.lightBoxContainer')
    containerBody = document.querySelector('.lightBoxContainer .body')
    nextBtn = document.querySelector('.next')
    preBtn = document.querySelector('.pre')
    image = containerBody.querySelector('img')
    wrapper = document.querySelector('.wrapper')
    closeBtn = document.querySelector('.closeBtn')
    totalImg = document.querySelector('.total')
    currentImg = document.querySelector('.current')
    
    for (let i = 0; i < images.length; i++) {
        let newindex = i
        images[i].addEventListener('click', () => {
            function openPreview() {
                let imageURL = images[newindex].querySelector('img').src
                image.src = imageURL
                currentImg.innerText = `Image ${newindex + 1} of ${images.length}`
                if(newindex == 0){
                    preBtn.style.display = 'none';
                }else{
                    preBtn.style.display = 'grid';
                }
                if(newindex >= images.length - 1){
                    nextBtn.style.display = 'none';
                }else{
                    nextBtn.style.display = 'grid';
                }
                lightBoxContainer.classList.add('show')
            }
            preBtn.addEventListener('click', () => {
                newindex--
                if(newindex == 0){
                    openPreview()
                    preBtn.style.display = 'none';
                }else{
                    openPreview()
                }
            })
            nextBtn.addEventListener('click', () => {
                newindex++
                if(newindex >= images.length - 1){
                    openPreview()
                    nextBtn.style.display = 'none';
                }else{
                    openPreview()
                }
            })
            openPreview()
            closeBtn.addEventListener('click', () => {
                preBtn.style.display = 'grid';
                nextBtn.style.display = 'grid';
                lightBoxContainer.classList.remove('show')
            })
    
            lightBoxContainer.addEventListener('click', (e) => {
                if(e.target !== e.currentTarget) return
                preBtn.style.display = 'grid';
                nextBtn.style.display = 'grid';
                lightBoxContainer.classList.remove('show')
            })
        })
    }
    

    좋은 웹페이지 즐겨찾기