Quiz App Using JavaScript, HTML, and CSS

Creating a quiz application can be an exciting project for anyone looking to hone their web development skills. This simple yet interactive quiz app will guide you through utilizing HTML for structuring, CSS for styling, and JavaScript for adding functionality. Let's dive into how you can create a quiz app that queries users with multiple-choice questions and calculates their scores.

Project Overview

The quiz app features a series of questions with four multiple-choice answers. Users can select an answer for each question and submit their choices. At the end of the quiz, the app displays the user's score and offers an option to retake the quiz.

Implementation

Project Setup

Workspace Preparation: Create a folder named quiz-app. This dedicated workspace keeps your project files organized.

Create Project Files: Within your project folder, create three files:
  • index.html: Defines the structure and content of your web application.
  • style.css: Styles the application to improve user experience.
  • script.js: Contains the logic for quiz application and handles user interactions.

1. index.html - HTML Structure

The HTML document sets up the quiz container and the form where questions will be displayed. Each question is followed by four options as radio inputs, allowing the user to select only one answer per question. The submit button captures the user's selection and progresses the quiz.

Let's open the index.html file and add the following HTML code to it:
<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="style.css" />
    <title>Quiz App</title>
  </head>
  <body>
    <div class="quiz-container" id="quiz">
      <div class="quiz-header">
        <h2 id="question">Question text</h2>
        <ul>
          <li>
            <input type="radio" name="answer" id="a" class="answer">
            <label for="a" id="a_text">Question</label>
          </li>

          <li>
            <input type="radio" name="answer" id="b" class="answer">
            <label for="b" id="b_text">Question</label>
          </li>

          <li>
            <input type="radio" name="answer" id="c" class="answer">
            <label for="c" id="c_text">Question</label>
          </li>

          <li>
            <input type="radio" name="answer" id="d" class="answer">
            <label for="d" id="d_text">Question</label>
          </li>
        </ul>
      </div>
      <button id="submit">Submit</button>
    </div>
    <script src="script.js"></script>
  </body>
</html>

2. style.css - CSS Styling 

The CSS file imports the Poppins font from Google Fonts to enhance the app's typography. A linear gradient background adds a pleasant aesthetic to the app, while the quiz container is styled to be visually appealing and user-friendly. Styles for the quiz header, question text, options list, and the submit button ensure a cohesive look and feel.

Let's open the style.css file and add the following content to it:   
@import url('https://fonts.googleapis.com/css2?family=Poppins:wght@200;400&display=swap');

* {
  box-sizing: border-box;
}

body {
  background-color: #b8c6db;
  background-image: linear-gradient(315deg, #b8c6db 0%, #f5f7fa 100%);
  font-family: 'Poppins', sans-serif;
  display: flex;
  align-items: center;
  justify-content: center;
  height: 100vh;
  overflow: hidden;
  margin: 0;
}

.quiz-container {
  background-color: #fff;
  border-radius: 10px;
  box-shadow: 0 0 10px 2px rgba(100, 100, 100, 0.1);
  width: 600px;
  overflow: hidden;
}

.quiz-header {
  padding: 4rem;
}

h2 {
  padding: 1rem;
  text-align: center;
  margin: 0;
}

ul {
  list-style-type: none;
  padding: 0;
}

ul li {
  font-size: 1.2rem;
  margin: 1rem 0;
}

ul li label {
  cursor: pointer;
}

button {
  background-color: #8e44ad;
  color: #fff;
  border: none;
  display: block;
  width: 100%;
  cursor: pointer;
  font-size: 1.1rem;
  font-family: inherit;
  padding: 1.3rem;
}

button:hover {
  background-color: #732d91;
}

button:focus {
  outline: none;
  background-color: #5e3370;
}

3. script.js - JavaScript Logic 

The JavaScript code begins by defining a quizData array containing objects for each question. Each object holds the question text, multiple-choice answers, and the correct answer identifier. The script dynamically loads each question into the HTML structure, displaying the question and its options.

Let's open the script.js file and add the following content to it:
const quizData = [
    {
        question: "Which language runs in a web browser?",
        a: "Java",
        b: "C",
        c: "Python",
        d: "JavaScript",
        correct: "d",
    },
    {
        question: "What does CSS stand for?",
        a: "Central Style Sheets",
        b: "Cascading Style Sheets",
        c: "Cascading Simple Sheets",
        d: "Cars SUVs Sailboats",
        correct: "b",
    },
    {
        question: "What does HTML stand for?",
        a: "Hypertext Markup Language",
        b: "Hypertext Markdown Language",
        c: "Hyperloop Machine Language",
        d: "Helicopters Terminals Motorboats Lamborginis",
        correct: "a",
    },
    {
        question: "What year was JavaScript launched?",
        a: "1996",
        b: "1995",
        c: "1994",
        d: "none of the above",
        correct: "b",
    },
];

const quiz = document.getElementById('quiz')
const answerEls = document.querySelectorAll('.answer')
const questionEl = document.getElementById('question')
const a_text = document.getElementById('a_text')
const b_text = document.getElementById('b_text')
const c_text = document.getElementById('c_text')
const d_text = document.getElementById('d_text')
const submitBtn = document.getElementById('submit')

let currentQuiz = 0
let score = 0

loadQuiz()

function loadQuiz() {
    deselectAnswers()

    const currentQuizData = quizData[currentQuiz]

    questionEl.innerText = currentQuizData.question
    a_text.innerText = currentQuizData.a
    b_text.innerText = currentQuizData.b
    c_text.innerText = currentQuizData.c
    d_text.innerText = currentQuizData.d
}

function deselectAnswers() {
    answerEls.forEach(answerEl => answerEl.checked = false)
}

function getSelected() {
    let answer

    answerEls.forEach(answerEl => {
        if(answerEl.checked) {
            answer = answerEl.id
        }
    })

    return answer
}

submitBtn.addEventListener('click', () => {
    const answer = getSelected()

    if(answer) {
        if(answer === quizData[currentQuiz].correct) {
            score++
        }

        currentQuiz++

        if(currentQuiz < quizData.length) {
            loadQuiz()
        } else {
            quiz.innerHTML = `
                <h2>You answered ${score}/${quizData.length} questions correctly</h2>

                <button onclick="location.reload()">Reload</button>
            `
        }
    }
})
The functionality to load questions and determine the selected answer is implemented. The script keeps track of the current question index and the user's score. Upon submitting an answer, it checks if the selected answer is correct, increments the score if so, and loads the next question. Once all questions are answered, it displays the user's score and offers to reload the quiz.

Open index.html in Browser

Let's open the index.html file in the browser, and you will be able to see the following screen:
Quiz App Using JavaScript, HTML, and CSS

Conclusion

Building a quiz app is a fantastic project for beginners and seasoned developers. It involves a mix of HTML, CSS, and JavaScript skills, offering a comprehensive practice ground for web development fundamentals. By following the steps outlined above, you can create an interactive quiz app that is not only functional but also visually appealing. Whether for educational purposes, fun trivia, or as a challenge, your quiz app can engage users and provide immediate feedback on their knowledge in any subject area you choose.

Comments