Peach's CODE peach

공부한 내용을 정리중입니다. 틀린 내용이 있을 수 있습니다 : )

코딩하는 딱복

[Javascript] translate를 이용한 row scroll 본문

Frontend 🎨/Javascript

[Javascript] translate를 이용한 row scroll

yundi 2024. 2. 27. 15:09

🔍️ 구현해야 할 부분

저번이랑 같은 rowscroll이라 구현하기 쉬울 것 같다고 생각했는데....! 이번엔 스크롤로는 구현을 할 수 없어서 translation을 사용해 보았다.

 

1️⃣ 초기화면

🖼️ HTML

        <div class="cont3-wrap">
            <div class="brand1">
                <div class="brand-wrap3">
                    <img src="./img/이미지1.png" class="brand-img1">
                    <img src="./img/이미지2.png" class="brand-img2">
                    <img src="./img/이미지5.png" class="brand-img5">
                </div>
                <div class="plus-wrap3">
                    <img src="./img/더하기.svg" class="plus-img3">
                    <img src="img/더하기_호버.svg" class="plus-hover3">
                    <img src="img/빼기.svg" class="minus-img3">
                    <img src="img/빼기_호버.svg" class="minus-hover3">
                </div>
                <div class="comment-wrap3">
                    <div class="red-arrow">
                        <img src="img/화살표(red).svg" class="r-arrow">
                    </div>
                    <span class="brand-title">당신의 착한 쉼표,</span><span class="bold">데일리라이크</span>
                    <p class="brand-con">
                        직접 갈아 만든 드립 커피 한 잔, 달콤한 레몬 쿠키 한 조각,
                        손으로 한 땀 한 땀 만들어 낸 티 코스터, 당신의 착한 쉼표.
                        dailylike. Dailylike는 "로맨틱한 휴식." 이라는 컨셉을 토대로,  
                        여성을 타겟으로 자신의 주변과 일상들을 소중히 여기고
                        가꿀 줄 아는 여성들을 위한 작은 공간을 만들어 갈 예정입니다.
                    </p>
                </div>
            </div>
        </div>

🎨 CSS

#content3 {
    position: relative;
    width: 100%;
    left: 0;
    display: flex;
    flex-direction: column;
    align-items: center;
    background-color: #fff;
    padding: 140px 0;
}

.cont3-wrap {
    height: 544px;
    display: flex;
    align-items: center;
    width: 1060px;
    justify-content: space-around;
    z-index: 2;
    margin-bottom: 50px;
    position: relative;
    margin: 0 auto;
    padding-bottom: 50px;
}
 
.brand1 {
    display: flex;
    width: 1040px;
    justify-content: space-between;
    align-items: center;
}
 
img.brand-img1 {
    position: relative;
    z-index: 10;
}

img.brand-img5 {
    position: absolute;
    top: 0;
    left: 0;
    transform: rotate(-10deg);
    transition: transform 0.3s ease;
}

img.brand-img2 {
    position: absolute;
    top: 0;
    left: 0;
    transform: rotate(10deg);
    transition: transform 0.3s ease;
}

 

2️⃣ hover 화면

🎨 CSS

달라진게 없어 보이지만 각도가 다른 것을 알 수 있다 ㅎㅎ..

.cont3-wrap:hover .brand-img5{
    transform: rotate(-15deg);
}

.cont3-wrap:hover .brand-img2{
    transform: rotate(15deg);
}

 

3️⃣ toggle 화면

📃 Javascript

부드럽게 닫히고 열리는 느낌을 주기 위해서 트랜지션을 주었다.

    //인기 브랜드
    function toggleBrand(brandDetail, plusBtn, plusImg, minusImg, brandWrap, showBrand, scrollBrand) {
        if (!brandDetail) {
            plusBtn.css({"left": "258px", "transition": "left 0.3s ease"});
            plusImg.css({"opacity": "0"});
            minusImg.css({"opacity": "1"});
            brandWrap.css({
                "opacity": "0",
                "visibility": "hidden",
                "transition": "opacity 0.3s ease, visibility 0.3s ease"
            });
            showBrand.css({
                "opacity": "1",
                "visibility": "visible",
                "transition": "opacity 0.3s ease, visibility 0.3s ease"
            });
            scrollBrand.css({
                "transform": "translateX(0)"
            });

            brandDetail = true;
        } else {
            plusBtn.css({"left": "", "transform":"","transition": "left 0.3s ease"});
            plusImg.css({"opacity": ""});
            minusImg.css({"opacity": ""});
            brandWrap.css({
                "opacity": "",
                "visibility": "",
            });
            showBrand.css({
                "opacity": "",
                "visibility": "",
            });
            brandDetail = false;
        }
        return brandDetail;
    }

 

4️⃣ scroll 구현

📃 Javascript

    function isToggle(brandIndex) {
        var brandDetail = false;
        var plusBtn = $(`.plus-wrap${brandIndex}`);
        var plusImg = $(`.plus-img${brandIndex}, .plus-hover${brandIndex}`);
        var minusImg = $(`.minus-img${brandIndex}`);
        var brandWrap = $(`.brand-wrap${brandIndex}, .comment-wrap${brandIndex}`);
        var showBrand = $(`.show-brand${brandIndex}`);
        var scrollBrand = $(`.scroll-brand${brandIndex}`);
   
        plusBtn.on("click", function() {
            brandDetail = toggleBrand(brandDetail, plusBtn, plusImg, minusImg, brandWrap, showBrand, scrollBrand);
        });
   
        var sliders = document.querySelector(`.scroll-brand${brandIndex}`);
        var plusWrap = document.querySelector(`.plus-wrap${brandIndex}`);
        setupSlider(sliders, plusWrap);
    }
   
    isToggle(1);
    isToggle(2);
    isToggle(3);
   
    var maxTranslation = 1120;
   
    function setupSlider(sliders, plusWrap) {
        let isDown = false;
        let startXs;
        let scrollLefts;
   
        sliders.addEventListener('mousedown', (e) => {
            isDown = true;
            startXs = e.pageX - sliders.offsetLeft;
            const style = getComputedStyle(sliders);
            scrollLefts = parseInt(style.transform.split(',')[4]) || 0;
        });
   
        document.addEventListener('mouseup', () => {
            isDown = false;
        });
   
        document.addEventListener('mousemove', (e) => {
            if (!isDown) return;
            e.preventDefault();
            const x = e.pageX - startXs;
   
            const currentTranslation = scrollLefts + x;
   
            if (currentTranslation >= -maxTranslation && currentTranslation <= maxTranslation) {
                sliders.style.transform = `translateX(${currentTranslation}px)`;
                plusWrap.style.transform = `translateX(${currentTranslation}px)`;
            }
        });
    }

getComputedStyle() : 요소의 현재 스타일을 가져오는 메소드

parseInt(style.transform.split(',')[4]) : translateX의 값을 가져와 정수로 변환

 

 결과

 

'Frontend 🎨 > Javascript' 카테고리의 다른 글

[Node.js] Node.js 개념 및 설치  (0) 2024.06.05
[Javascript] overflow를 이용한 row scroll  (0) 2024.02.26