티스토리 뷰

Javascript/연습, 실습

카드 뒤집기

SBDB_뉴유 2022. 4. 14. 16:47
* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}
ul {
    list-style: none;
}
img {
    width: 100%;
    vertical-align: top;
}
body {
    background: #c9ad97;
}
.wrap__card {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100vh;
}
.card__inner {
    width: 700px;
    height: 700px;
    background-color: #fff;
    border-radius: 20px;
    padding: 30px;
}
.cards {
    display: flex;
    flex-wrap: wrap;
    justify-content: space-around;
    align-content: space-around;
    width: 100%;
    height: 100%;
}
.cards li {
    width: calc(100% / 4 - 20px);
    height: calc(100% / 4 - 20px);
    perspective: 1000px;
    transform-style: preserve-3d;
    position: relative;
}
.cards li .view {
    position: absolute;
    padding: 15%;
    transition: transform 0.6s linear;
    backface-visibility: hidden;
    border-radius: 10px;
    width: 100%;
    height: 100%;
    user-select: none;
    pointer-events: none;
}
.cards li .view.front {
    padding: 10%;
    background: #f1758c;
    transform:  rotateY(0deg);
}
.cards li.flip .view.front {
    transform:  rotateY(180deg);
}
.cards li .view.back {
    background: #c9ad97;
    transform:  rotateY(-180deg);
}
.cards li.flip .view.back {
    transform:  rotateY(0deg);
}
.cards li.shake {
    animation: shake 0.35s ease-in-out;
}
@keyframes shake {
    0%   {transform: translateX(0);}
    20%  {transform: translateX(-13px);}
    40%  {transform: translateX(13px);}
    80%  {transform: translateX(8px);}
    60%  {transform: translateX(-8px);}
    100% {transform: translateX(0);}
}
// 01. HTML/CSS 디자인 구성
// 02. 클릭한 카드 뒤집기
// 03. 클릭한 카드 뒤집기 확인하기(첫번째, 두번째)
// 04. 클릭한 카드의 두개의 이미지 가져오기
// 05. 두개의 이미지 비교하기
// 06. 틀린 이미지 애니메이션 효과 주기
// 07. 빨리 클릭하면 버그 발생 처리하기

const cards = document.querySelectorAll(".cards li");

let cardOne, cardTwo;
let disableDeck = false;

function flipCard(e){
    let clickedCard = e.target;

    if(clickedCard !== cardOne && !disableDeck){
        clickedCard.classList.add("flip");

        if(!cardOne){
            return cardOne = clickedCard;
        }
        cardTwo = clickedCard;
        disableDeck = true; 

        let cardOneIng = cardOne.querySelector(".back img").src;
        let cardTwoIng = cardTwo.querySelector(".back img").src;

        matchCards(cardOneIng, cardTwoIng);
    }
}

function matchCards(img1, img2){
    if(img1 == img2){
        cardOne.classList.removeEventListener("click", flipCard);
        cardTwo.classList.removeEventListener("click", flipCard);
        cardOne = cardTwo = "";
        disableDeck = false;
    } else {
        setTimeout(() => {
            cardOne.classList.add("shake");
            cardTwo.classList.add("shake");
        }, 400)
        setTimeout(() => {
            cardOne.classList.remove("shake", "flip");
            cardTwo.classList.remove("shake", "flip");
            cardOne = cardTwo = "";
            disableDeck = false;
        }, 1200)
    }
}

cards.forEach(card => {
    card.addEventListener("click", flipCard);
})

'Javascript > 연습, 실습' 카테고리의 다른 글

타자 연습  (0) 2022.04.14
뮤직 플레이  (0) 2022.04.14
js로 css 제어하기  (0) 2022.02.11
puzzle 만들기  (0) 2022.01.29
댓글
© 2018 webstoryboy