기초부터 시작하는 코딩/Javascript

Javascript를 이용한 사이트 만들기! - 퀴즈 효과 사이트 만들기02

kebab00 2023. 3. 9. 19:00

728x90

- 자 오늘은 어제 만든 강아지가 정답을 맞추면 웃고 정답을 틀리면 우는 것을 만들어 보겠습니다.

 

- 일단 완성본입니다!!

- 이제 코드를 뜯어보도록하죠

    <script>
    // 선택자
        const quizWrap = document.querySelector(".quiz__wrap")
        const quizTitle = quizWrap.querySelector(".quiz__title span");
        const quizTime = quizWrap.querySelector(".quiz__title em");
        const quizQuestionNum = quizWrap.querySelector(".qiuz__question em");
        const quizQuestion = quizWrap.querySelector(".qiuz__question span");
        const quizDesc = quizWrap.querySelector(".quiz__desc")
        const quizAnswerConfirm = quizWrap.querySelector(".quiz__answer .confirm");
        const quizAnswerResult = quizWrap.querySelector(".quiz__answer .result");
        const quizAnswerInput = quizWrap.querySelector(".quiz__answer .input");
        const dogWrap = quizWrap.querySelector(".dog__wrap")
        const quizFooter = quizWrap.querySelector(".quiz__footer")

    // 문제 정보
        const infoType = "정보처리 기능사 : ";
        const infoTime = "2011년 5회";
        const infoNumber = "2";
        const infoQuestion = "프레젠테이션에서 화면 전체를 전환하는 단위를 의미하는것은?";
        const infoAnswer = "슬라이드";
        const infoDesc = "슬라이드는 프리젠테이션의 화면 전체를 말하며, 개체는 화면을 구성하는 개개의 요소를 말한다."
  
  // 문제 출력
        quizTitle.textContent = infoType;
        quizTime.textContent = infoTime;
        quizQuestionNum.textContent = infoNumber;
        quizQuestion.textContent = infoQuestion;
        quizDesc.textContent = infoDesc;
        quizAnswerResult.textContent = infoAnswer;
    
    // 정답 & 해설 숨기기
        quizAnswerResult.style.display = "none";
        quizFooter.style.display = "none";

    // 사용자 정답
    quizAnswerConfirm.addEventListener("click", function(){
        // 정답 버튼 제거
        quizAnswerInput.style.display = "none"; // 인풋 박스 숨김
        quizAnswerConfirm.style.display = "none"; // 정답 확인 버튼 숨김
        quizAnswerResult.style.display = "block"; // 정답 나타내기
        quizFooter.style.display = "block"; // 해설 보이기
        const userAnswer = quizAnswerInput.value.trim();
        if(infoAnswer == userAnswer){
            dogWrap.classList.add("like");
        } else {
            dogWrap.classList.add("dislike");
        }
    });
    </script>

- 사실 html과 CSS는 크게 달라진 점이 없기 때문에 오늘도 자바스크립트에 집중하도록 하겠습니다.

- 설명부분과 우측상단에 문제번호가 추가된 것 말고는 내용 상에는 변한게 없습니다.

- 일단 기본적인 부분은(번호를 넣거나 문제를 넣는 내용적인 부분들) 어제 것과 같기 때문에 설명을 생략하겠습니다.

- 이게 사소해 보이지만 중요한 것인데 html를 짤 때 규격에(?) 맞춰서 짠다면 코드의 재활용이 가능하다는 점입니다.

- 덕분에 저희는 달라지는 요소들만 바꾸면 된다는 것이죠!!

- 출력과 숨기기는 어제 했으니 오늘은 사용자의 정답을 받아와서 정답을 클릭해줬을 때 그것이 정답이 맞는지 확인해주는 것을 만들어 보겠습니다.

<input class="input" type="text" placeholder="정답을 적어주세요!"></input>

- 아 참!! 그전에 사용자가 적는 답을 입력받아야 되는 부분인데 그냥 div로 만들면 입력받을 수 없음으로 용도에 맞는 input 태그로 정답을 적을 칸들 만들어 주어야합니다!! 이거 빼고는 진짜 특이사항 없습니당 히히..

- 자 우선 const quizAnswerInput = quizWrap.querySelector(".quiz__answer .input"); 이라는 선택자를 만들어 주어 사용자가 입력한 정답을 quizAnswerInput이라는 변수로 저장을 해주었습니다.

- 그 후 quizAnswerConfirm.addEventListener("click", function(){}; 을통해 정답을 클릭했을 때 함수가 실행하도록 해주었습니다.

- 클릭했을 때 정답확인버튼과 입력한 정답 값이 사라지고 정답이 나오며 해설이 보이게 해주는 것 까지는 어제 한 것에서 내용만 바꾸어주면 됩니다.

- 이제 메인!! 클릭했을 때 정답이 맞는지 틀린지 판단하고 결과에 따라 강아지의 상태를 바꾸어 주는 것입니다.

- 정답이 맞는지 틀린지 확인한다? 이거 먼가 익숙하지 않나요?? 맞습니다!! 바로 if 문을 사용하는 것이죠!!

const userAnswer = quizAnswerInput.value.trim();
if(infoAnswer == userAnswer){
    dogWrap.classList.add("like");
} else {
    dogWrap.classList.add("dislike");
}

- 일단 변수를 선언해 줍니다. userAnswer가 사용자가입력한 값이 되도록 하는 것이죠.

- 어라 근데 .value()?? .trim()?? 처음보는 것들의 정체가 무엇인지 궁금하시죠? 안궁금해도어쩔수가없.....

- 자 그럴줄 알고 제가 알아왔습니다!!

- .value()란 메소드에 일종으로 사용하면 해당 요소의 현재 값을 가져올 있습니다. 값은 사용자가 요소에 입력한 값이 있습니다.

- .trim() 이란 문자열 뒷쪽에 있는 공백이 있어도 같다고 인식하게 해줍니다. 이것이 없다면 "슬라이드"와 "슬라이드 "를 다르다고 인식하지만 이것이 있다면 같은 답으로 인식해줍니다.

- 자 이제 if문을 통해 사용자가 입력한 정답과  제가 입력해 놓은 정답이 같을 때와 다를 때 어떻게 할 지 알려주면 됩니다.

- classList는 속성중에 하나로  속성을 사용하여 클래스를 추가, 제거 토글할 있습니다.

- 한마디로 요소.classList.add("추가할 클래스 명")를 해주면 해당요소에 원하는 클래스를 추가해 줍니다!!

- 이것을 통해 정답을 맞췄을 땐 "like"라는 클라스를 추가해주고 틀렸을 땐 "dislike"라는 클라스를 추가해 주면!!!! 

- 사용자의 정답에 따라 울고 웃는 강아지가 완성됩니다!!

- 끝!!!!!