Last active
July 30, 2019 11:13
-
-
Save sxidsvit/b2b94b027bba37316cb15650ed73ce7f to your computer and use it in GitHub Desktop.
Простой квиз, созданный на ES6
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// ------------------- JS ------------------------- | |
(function() { | |
const myQuestions = [ | |
{ | |
question: "Who is the strongest?", | |
answers: { | |
a: "Superman", | |
b: "The Terminator", | |
c: "Waluigi, obviously" | |
}, | |
correctAnswer: "c" | |
}, | |
{ | |
question: "What is the best site ever created?", | |
answers: { | |
a: "SitePoint", | |
b: "Simple Steps Code", | |
c: "Trick question; they're both the best" | |
}, | |
correctAnswer: "c" | |
}, | |
{ | |
question: "Where is Waldo really?", | |
answers: { | |
a: "Antarctica", | |
b: "Exploring the Pacific Ocean", | |
c: "Sitting in a tree", | |
d: "Minding his own business, so stop asking" | |
}, | |
correctAnswer: "d" | |
} | |
]; | |
function buildQuiz() { | |
// we'll need a place to store the HTML output | |
const output = []; | |
// for each question... | |
myQuestions.forEach((currentQuestion, questionNumber) => { | |
// we'll want to store the list of answer choices | |
const answers = []; | |
// and for each available answer... | |
for (letter in currentQuestion.answers) { | |
// ...add an HTML radio button | |
answers.push( | |
`<label> | |
<input type="radio" name="question${questionNumber}" value="${letter}"> | |
${letter} : | |
${currentQuestion.answers[letter]} | |
</label>` | |
); | |
} | |
// add this question and its answers to the output | |
output.push( | |
`<div class="slide"> | |
<div class="question"> ${currentQuestion.question} </div> | |
<div class="answers"> ${answers.join("")} </div> | |
</div>` | |
); | |
}); | |
// finally combine our output list into one string of HTML and put it on the page | |
quizContainer.innerHTML = output.join(""); | |
} | |
function showResults() { | |
// gather answer containers from our quiz | |
const answerContainers = quizContainer.querySelectorAll(".answers"); | |
// keep track of user's answers | |
let numCorrect = 0; | |
// for each question... | |
myQuestions.forEach((currentQuestion, questionNumber) => { | |
// find selected answer | |
const answerContainer = answerContainers[questionNumber]; | |
const selector = `input[name=question${questionNumber}]:checked`; | |
const userAnswer = (answerContainer.querySelector(selector) || {}).value; | |
// if answer is correct | |
if (userAnswer === currentQuestion.correctAnswer) { | |
// add to the number of correct answers | |
numCorrect++; | |
// color the answers green | |
answerContainers[questionNumber].style.color = "lightgreen"; | |
} else { | |
// if answer is wrong or blank | |
// color the answers red | |
answerContainers[questionNumber].style.color = "red"; | |
} | |
}); | |
// show number of correct answers out of total | |
resultsContainer.innerHTML = `${numCorrect} out of ${myQuestions.length}`; | |
} | |
function showSlide(n) { | |
slides[currentSlide].classList.remove("active-slide"); | |
slides[n].classList.add("active-slide"); | |
currentSlide = n; | |
if (currentSlide === 0) { | |
previousButton.style.display = "none"; | |
} else { | |
previousButton.style.display = "inline-block"; | |
} | |
if (currentSlide === slides.length - 1) { | |
nextButton.style.display = "none"; | |
submitButton.style.display = "inline-block"; | |
} else { | |
nextButton.style.display = "inline-block"; | |
submitButton.style.display = "none"; | |
} | |
} | |
function showNextSlide() { | |
showSlide(currentSlide + 1); | |
} | |
function showPreviousSlide() { | |
showSlide(currentSlide - 1); | |
} | |
const quizContainer = document.getElementById("quiz"); | |
const resultsContainer = document.getElementById("results"); | |
const submitButton = document.getElementById("submit"); | |
// display quiz right away | |
buildQuiz(); | |
const previousButton = document.getElementById("previous"); | |
const nextButton = document.getElementById("next"); | |
const slides = document.querySelectorAll(".slide"); | |
let currentSlide = 0; | |
showSlide(0); | |
// on submit, show results | |
submitButton.addEventListener("click", showResults); | |
previousButton.addEventListener("click", showPreviousSlide); | |
nextButton.addEventListener("click", showNextSlide); | |
})(); | |
// ----------------------------- HTML --------------------- | |
<h1>Quiz on Important Facts</h1> | |
<div class="quiz-container"> | |
<div id="quiz"></div> | |
</div> | |
<button id="previous">Previous Question</button> | |
<button id="next">Next Question</button> | |
<button id="submit">Submit Quiz</button> | |
<div id="results"></div> | |
// ------------------------ CSS ------------------------------- | |
@import url(https://fonts.googleapis.com/css?family=Work+Sans:300,600); | |
body{ | |
font-size: 20px; | |
font-family: 'Work Sans', sans-serif; | |
color: #333; | |
font-weight: 300; | |
text-align: center; | |
background-color: #f8f6f0; | |
} | |
h1{ | |
font-weight: 300; | |
margin: 0px; | |
padding: 10px; | |
font-size: 20px; | |
background-color: #444; | |
color: #fff; | |
} | |
.question{ | |
font-size: 30px; | |
margin-bottom: 10px; | |
} | |
.answers { | |
margin-bottom: 20px; | |
text-align: left; | |
display: inline-block; | |
} | |
.answers label{ | |
display: block; | |
margin-bottom: 10px; | |
} | |
button{ | |
font-family: 'Work Sans', sans-serif; | |
font-size: 22px; | |
background-color: #279; | |
color: #fff; | |
border: 0px; | |
border-radius: 3px; | |
padding: 20px; | |
cursor: pointer; | |
margin-bottom: 20px; | |
} | |
button:hover{ | |
background-color: #38a; | |
} | |
.slide{ | |
position: absolute; | |
left: 0px; | |
top: 0px; | |
width: 100%; | |
z-index: 1; | |
opacity: 0; | |
transition: opacity 0.5s; | |
} | |
.active-slide{ | |
opacity: 1; | |
z-index: 2; | |
} | |
.quiz-container{ | |
position: relative; | |
height: 200px; | |
margin-top: 40px; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment