퀴즈

퀴즈 이펙트 4번 객관식 확인하기

ture403 2023. 3. 18. 11:32

- Frederick Philips Brooks
Mythical Man-Month 저자
728x90
반응형

완성된 사진입니다.

HTML 코드 입니다.

<!DOCTYPE html>
<html lang="ko">
<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>퀴즈 이펙트04</title>
<link rel="stylesheet" href="css/reset.css">
<link rel="stylesheet" href="css/quiz.css">
</head>
<body>
    <header id="header">
        <h1><a href="../javascript14.html">Quiz</a><em>객관식 확인하기</em></h1>
        <ul>
            <li><a href="quizEffect01.html">1</a></li>
            <li><a href="quizEffect02.html">2</a></li>
            <li><a href="quizEffect03.html">3</a></li>
            <li class="active"><a href="quizEffect04.html">4</a></li>
            <li><a href="quizEffect05.html">5</a></li>
        </ul>
    </header>
    <!-- //header -->

    <main id="main">
        <div class="quiz_wrap">

            <div class="quiz">
                <div class="quiz_header">
                    <h2 class="quiz_title"></h2>
                </div>
                <div class="quiz_main">
                    <div class="quiz_quection">
                    </div>
                    <div class="quiz_view">
                        <div class='dog_wrap'>
                            <div class="ture">정답입니다.</div>
                            <div class="false">틀렸습니다!</div>
                            <div class='card-container'>
                                <div class="dog">
                                    <div class="head">
                                        <div class="ears"></div>
                                        <div class="face"></div>
                                        <div class="eyes">
                                            <div class="teardrop"></div>
                                        </div>
                                        <div class="nose"></div>
                                        <div class="mouth">
                                            <div class="tongue"></div>
                                        </div>
                                        <div class="chin"></div>
                                    </div>
                                    <div class="body">
                                        <div class="tail"></div>
                                        <div class="legs"></div>
                                    </div>
                                </div>
                            </div>
                        </div>
                    </div>
                    <div class="quiz_choice">
                        <label for="choice1">
                            <input type="radio" id="choice1" value="1" name="choice">
                            <span></span>
                        </label>
                        <label for="choice2">
                            <input type="radio" id="choice2" value="2" name="choice">
                            <span></span>
                        </label>
                        <label for="choice3">
                            <input type="radio" id="choice3" value="3" name="choice">
                            <span></span>
                        </label>
                        <label for="choice4">
                            <input type="radio" id="choice4" value="4" name="choice">
                            <span></span>
                        </label>

                    </div>
                    <div class="quiz_answer">
                        <button class="confirm">정답 확인 하기</button>
                    </div>
                </div>
                <div class="quiz_desc"></div>
            </div>
        </div>
</main>
<!-- //main -->

<footer id="footer">
    <a href="mailto:ture403@gmail.com">ture403@gmail.com</a>
</footer>
<!-- //footer -->
</body>
  • div박스를 만들어서  quiz_choice 클래스를 만들어서 거기안에 4개의 inupt박스를 만들었습니다.
  • input type을 라디오로 하고 그안에 이름을 choice로 설정 하고 각각 value값을 넣어주었습니다.
  • 정답확인하기 버튼을 button태그를 써서 만들었습니다.
  • quiz_desc 를 만들어서 해설을 넣었습니다.

CSS코드 입니다. 강아지는 전에 있는 코드를 봐주세요

/* header */
#header {
    position: fixed;
    left: 0;
    top: 0;
    background-color: #262626;
    color: #fff;
    padding: 10px;
    margin-bottom: 100px;
    width: 100%;
    z-index: 1000;
    display: flex;
    justify-content: space-between;
}
#header::before {
    content: "";
    border: 4px ridge #a3a3a3;
    position: absolute;
    left: 5px;
    top: 5px;
    width: calc(100% - 10px);
    height: calc(100% - 10px);
}
#header h1 {
    font-size: 28px;
    padding: 5px 5px 5px 10px;
    font-family: 'DungGeunMo';
    position: relative;
    z-index: 10;
}
#header h1 a {
    color: #fff;
}
#header h1 em {
    font-size: 0.5em;
}
#header ul {
    padding: 5px;
}
#header li {
    display: inline;
    z-index: 10;
    position: relative;
}
#header li a {
    color: #fff;
    font-family: 'DungGeunMo';
    border: 1px dashed #fff;
    display: inline-block;
    padding: 5px;
}
#header li.active a,
#header li a:hover {
    background-color: #fff;
    color: #000;
}


/* footer */
#footer {
    position: fixed;
    left: 0;
    bottom: 0;
    background-color: #262626;
    width: 100%;
    text-align: center;
}
#footer a {
    color: #fff;
    padding: 20px;
    display: block;
    font-family: 'DungGeunMo';
    position: relative;
    z-index: 10;
}
#footer::before {
    content: "";
    border: 4px ridge #a3a3a3;
    position: absolute;
    left: 5px;
    top: 5px;
    width: calc(100% - 10px);
    height: calc(100% - 10px);
    
}

#main {
    padding: 100px 0;
}

/* quiz_wrap */
.quiz_wrap {
    display: flex;
    justify-content: center;
    flex-wrap: wrap;
    align-items: flex-start;
}
.quiz_wrap .quiz {
    width: 500px;
    background-color: #fff;
    border: 8px ridge #ecb2b2;
    margin: 10px;
}
.quiz_title {
    background-color: #ecb2b2;
    border: 3px ridge #ecb2b2;
    border-bottom-width: 6px;
    padding: 5px;
    font-family: 'DungGeunMo';
    font-size: 16px;
    color: #3b3b3b;
    text-align: center;
}
.quiz_quection {
    padding: 20px;
    font-size: 24px;
    font-family: 'arial';
    line-height: 1.4;
    font-weight: bold;
    border-bottom: 6px ridge #ecb2b2;
}
.quiz_quection em {
    color: hotpink;
}
.quiz_answer {
    padding: 20px;
    font-size: 24px;
    font-family: 'arial';
    text-align: center;
    /* border-bottom: 6px ridge #cacaca; */
}
.quiz_answer .confirm {
    background-color: #ecb2b2;
    border: 6px ridge #ecb2b2;
    width: 100%;
    font-family: 'arial';
    padding: 10px 20px;
    font-size: 22px;
    font-weight: bold;
    cursor: pointer;
    transition: all 0.3s;
    text-shadow: 2px 2px 0px rgba(212, 153, 153, 0.7);
}
.quiz_answer .confirm:hover{
    background-color: #c77676;
}
.quiz_answer .result {
    background-color: #fff;
    border: 6px ridge #ecb2b2;
    width: 100%;
    font-family: 'arial';
    padding: 10px 20px;
    font-size: 22px;
    /* display: none; */
}
.quiz_answer .input{
    background-color: #fff;
    border: 6px groove #ecb2b2;
    width: 100%;
    font-family: 'arial';
    padding: 10px 20px;
    font-size: 22px;
    text-align: center;
    margin-bottom: 10px;
}
.quiz_view {
    border-bottom: 6px ridge #ecb2b2;
    overflow: hidden;
}
.quiz_desc {
    border-top: 6px ridge #ecb2b2;
    padding: 20px;
    font-family: "arial";
    background-color: #f5f5f5;
}
.quiz_desc::before {
    content: "👍Tip ";
    color: hotpink;
    font-weight: bold;
}
.quiz_choice{
    border-bottom: 6px ridge #ecb2b2;
    padding: 20px;
}
.quiz_choice label {
    display: flex;
}
.quiz_choice label input {
    position: absolute;
    clip:rect(0 0 0 0);
    width: 1px;
    height: 1px;
    margin: 1px;
    overflow: hidden;
}
.quiz_choice label span {
    font-size: 20px;
    line-height: 1.3;
    padding: 6px;
    display: flex;
    cursor: pointer;
    margin: 2px 0;
}
.quiz_choice label span::before{
    content: "";
    width: 26px;
    height: 26px;
    border-radius: 50%;
    margin-right: 15px;
    background: #fff;
    box-shadow: inset 0 0 0 4px #3b3b3b;
    transition: all 0.2s;
    flex-shrink: 0; /* 기본 크기 유지 */
}
.quiz_choice label input:checked + span{
    background-color: #e27ed5;
}
.quiz_choice label input:checked + span::before{
    box-shadow: inset 0 0 0 8px #3b3b3b;
}
.quiz_check {
    position: fixed;
    right: 20px;
    bottom: 20px;
    width: 130px;
    height: 130px;
    line-height: 130px;
    border-radius: 50%;
    z-index: 1000;
    background-color: #444;
    color: #fff;
    text-align: center;
    font-family: "arial";
    cursor: pointer;
}
.quiz_info {
    position: fixed;
    right: 20px;
    bottom: 170px;
    background-color: #ff3c3c;
    text-align: center;
    width: 120px;
    height: 50px;
    line-height: 50px;
    border-radius: 10px;
    font-family: "arial";
    color: #fff;
}
.quiz_info::after {
    content: "";
    position: absolute;
    left: 50%;
    margin-left: -10px;
    bottom: -10px;
    border-top: 10px solid #39ee7e;
    border-left: 10px solid transparent;
    border-right: 10px solid transparent;

}

자바스크립트 코드 입니다.

//선언자
const quizWrap = document.querySelector(".quiz_wrap");
const quizTitle = quizWrap.querySelector(".quiz_title");
const quizQuection = quizWrap.querySelector(".quiz_quection");
const quizChoice = quizWrap.querySelectorAll(".quiz_choice span");
const quizSelect = quizWrap.querySelectorAll(".quiz_choice input");
const quizDesc = quizWrap.querySelector(".quiz_desc");
const quizAnswer = quizWrap.querySelector(".quiz_answer");
const quizConfirm = quizWrap.querySelector(".quiz_answer .confirm");
const dogWrap = quizWrap.querySelector(".dog_wrap");

//문제정보
const quizInfo = [
    {
        infoType : "웹디자인 기능사",
        infoTime : "2016년도 4회",
        infoNumber : "1",
        infoQuection : "다음 중 디자인의 기본 요소들로 옳은 것은?",
        infoChoice : ["선, 색체 ,공간, 수량","점, 선, 면, 질감","시간, 수량, 구조, 공간","면, 구조, 공간, 수량"],
        infoAnswer :"2",
        infoDesc : "디자인의 기본 요소에는 점, 선, 면, 질감이 있습니다.[점선면]"
    }
];

//문제 출력
function updateQuiz(){
    quizTitle.innerHTML = quizInfo[0].infoType +" "+ quizInfo[0].infoTime;
    quizQuection.innerHTML = "<em>" + quizInfo[0].infoNumber + "</em>." + " " + quizInfo[0].infoQuection;
    quizDesc.textContent = quizInfo[0].infoDesc;

    for(let i=0; i<4; i++){
        quizChoice[i].innerHTML = quizInfo[0].infoChoice[i];
    }

    //해설 숨기기
    quizDesc.style.display ="none";
};

//정답확인
function answerQuiz(){
    // 사용자가 선택한 input(checked)박스 == 문제 정답 (quizInfo[0].infoAnswer)

    for(let i=0; i<quizChoice.length; i++){
        if(quizSelect[i].checked == true){ //사용자가 보기를 체크한 상태
            if(quizSelect[i].value == quizInfo[0].infoAnswer){
                //정답
                // alert("정답");
                dogWrap.classList.add("like");
            } else {
                //오답
                // alert("오답");
                dogWrap.classList.add("dislike");
            }
        }
    }
    //해설 보이기
    quizDesc.style.display ="block";

    //정답 버튼 숨기기
    quizAnswer.style.display = "none";
}

//정답 클릭
quizConfirm.addEventListener("click", answerQuiz);

updateQuiz();
  • 함수 answerQuiz 에서 사용자가 선택한 것을 찾아내서 정답인지 오답인지 확인하는 쿼리입니다.
  • 그리고 addEventListener를 써서 클릭을 했을떄 answerQuiz 를 실행하게 했습니다.
  • updateQuiz함수는 선언자로 클래스를 불러오고 그안에 quizInfo안에 있는 값을 넣어 주었습니다.\
속성 속성 설명
checked 선택된 checkbox 또는 radio 타입의 INPUT 버튼이나 선택된 option 태그를 선택하는 선택자
clip 속성은 요소의 보여지는 영역을 지정하는데 사용됩니다. clip 속성은 흔히 position 속성과 함께 사용되어 흥미로운 시각적 효과를 만들기 위해 사용됩니다.
flex-shrink flex item이 flex container 내에서 줄어들 수 있는 정도를 지정합니다.