Quiz - Question pour une calculatrice
Par
, en novembre 2020Ce projet a été réalisé par des élèves en spécialité NSI du Lycée Louis Pasteur. Ils sont également les auteurs de ce compte rendu. Pour en savoir plus : Les projets en spécialité NSI
Ne trouvez-vous pas qu’internet et plus précisément les entreprises qui y travaillent, veulent faire des profits par la publicité ou par la récolte de vos donnée personnelle par la création de compte, l’utilisation de site et par des questionnaires en lignes qui ont pour seul but de revendre vos informations.
Et bien, on vous propose de répondre à un questionnaire sans publicité ni récolte des données personnelle mais en plus on vous propose un questionnaire avec pour seul but de vous divertir.
I - Le questionnaire
Le questionnaire est un intègrement JavaScript.
Au lancement du script, la première fonction buildQuiz(){} permet, comme l’indique son nom, la création du quiz en 3 étapes :
Tout d’abord, ces 3 étapes sont rentrées dans un fonction myQuestions.forEach(), elle débute par la création d’une liste vide pour stocker la liste des réponses possibles const answers = [].
Suite à cela et pour toutes les réponses possible, elle crée un bouton permettant la validation de la réponse souhaiter.
Et pour finir, elle affiche la question, les réponses et les boutons permettant de passer à la questions suivante ou précédente et si c’est la dernière question, elle affiche un bouton supplémentaire permettant de faire vérifier ses réponses.
- function buildQuiz(){
- const output = [];
- myQuestions.forEach(
- (currentQuestion, questionNumber) => {
- answers
- // stockage des différentes réponses
- const answers = [];
- for(letter in currentQuestion.answers){
- answers.push(
- `<label>
- <input type="radio" name="question${questionNumber}" value="${letter}">
- ${letter} :
- ${currentQuestion.answers[letter]}
- </label>`
- );
- }
- output.push(
- `<div class="slide">
- <div class="question"> ${currentQuestion.question} </div>
- <div class="answers"> ${answers.join("")} </div>
- </div>`
- );
- }
- );
- quizContainer.innerHTML = output.join('');
- }
Il s’en suit de la deuxième fonction function showResults(){} .
Cette fonction permet de trouver la réponse sélectionnée par l’utilisateur puis elle garde une trace des réponses qui seront utiliser pour savoir si celle-ci sont correcte ou fausse et ça permettra de retourner un résultat sous forme de fraction (combien sont juste sur le nombre total de question) et sous forme visuelle par la couleur rouge si la réponse est fausse ou verte pour l’inverse.
- function showResults(){
- const answerContainers = quizContainer.querySelectorAll('.answers');
- let numCorrect = 0;
- myQuestions.forEach( (currentQuestion, questionNumber) => {
- const answerContainer = answerContainers[questionNumber];
- const selector = `input[name=question${questionNumber}]:checked`;
- const userAnswer = (answerContainer.querySelector(selector) || {}).value;
- // si la réponse est juste
- if(userAnswer === currentQuestion.correctAnswer){
- // incrémente le nombre de réponse juste
- numCorrect++;
- // met la bonne réponse en vert
- answerContainers[questionNumber].style.color = 'lightgreen';
- }
- // si la réponse est fausse ou vide cela met la réponse en rouge
- else{
- // color the answers red
- answerContainers[questionNumber].style.color = 'red';
- }
- });
- // afficher le nombre de réponses correctes sur le total des questions
- resultsContainer.innerHTML = `${numCorrect} out of ${myQuestions.length}`;
- }
Pour finir il reste 3 fonctions :
La fonction showSlide(n) {} que nous avons beaucoup de mal à comprendre.
- 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';
- }
- }
Et deux fonctions permettant de passer d’une question à l’autre, showNextSlide() {} , et de pouvoir retourner en arrière, showPreviousSlide() {} .
- function showNextSlide() {
- showSlide(currentSlide + 1);
- }
- function showPreviousSlide() {
- showSlide(currentSlide - 1);
- }
Il reste encore les variables permettant de contenir les différentes partie de l’ensemble d’une questions c’est-à-dire la question, les réponses et la bonne question :
- // Variables
- const quizContainer = document.getElementById('quiz');
- const resultsContainer = document.getElementById('results');
- const submitButton = document.getElementById('submit');
Il ne reste donc plus qu’à ajouter les questions :
- const myQuestions = [
- {
- question: "Que signifie WWW?",
- answers: {
- a: "World Wide Web ",
- b: "World Withdraw War",
- c: "We Will Wock you "
- },
- correctAnswer: "a"
- }
Si vous voulais en ajouter d’autre, il suffit de mettre une virgule après la dernière accolade et copier/coller le modèle (l.2 à l.10), et bien sûr en le modifiant
PS : la dernière question ne doit pas ce finir avec la virgule précédemment ajouter.
Ce qui nous rend ceci :
II - Le CSS
Vous voici dans la partie visuelle du site où nous avons utilisé un code css à la porter de toutes les personnes se débrouillant un peu avec le css. Nous avons choisit de mettre des couleurs sobres qui ont la particularité de ne pas agresser vos yeux (même si ils restent éblouis par la beauté du site ^^).
Voici pour les deux premières pages :
- h1{
- margin-top: 30px;
- }
- body{
- font-size: 20px;
- font-family: serif;
- color: #333;
- font-weight: 300;
- text-align: center;
- background-color: #f8f6f0;
- }
- ul {
- list-style-type: none;
- margin: 0;
- padding: 0;
- overflow: hidden;
- background-color: #111;
- position: fixed;
- top: 0;
- width: 100%;
- }
- li {
- float: left;
- display: inline;
- }
- li a {
- display: block;
- color: white;
- text-align: center;
- padding: 14px 16px;
- text-decoration: none;
- }
- .active {
- background-color: #279;
- color: #279;
- }
- li a:hover {
- background-color: #279;
- }
- html, body, #container {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
- background-color: #f8f6f0;
- }
- h1{
- font-weight: 300;
- padding-bottom: 2px;
- padding-top: 25px;
- 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;
- }
- body {
- font-family: 'Open Sans', sans-serif;
- font-weight: 300;
- text-align: center;
- color: #7f7e7e;
- background-color: #ececec;
- margin: 0;
- padding: 0;
- }
- h2 {
- margin: 35px;
- font-weight: 300;
- }
- a{
- text-decoration: none;
- color: #a8a8a8;
- }
- footer {
- display: flex;
- position: bottom;
- left: 0;
- bottom: 0;
- width: 100%;
- text-align: center;
- justify-content: center;
- padding: 5px;
- background-color: #111;
- color: #ffffff;
- }
Et pour la dernière page avec des légères modifications :
- body{
- font-size: 20px;
- font-family: serif;
- color: #333;
- font-weight: 300;
- text-align: center;
- background-color: #f8f6f0;
- }
- footer {
- display: flex;
- left: 0;
- bottom: 0;
- width: 100%;
- text-align: center;
- justify-content: center;
- padding: 5px;
- background-color: #111;
- color: #ffffff;
- }
- ul {
- list-style-type: none;
- margin: 0;
- padding: 0;
- overflow: hidden;
- background-color: #111;
- position: fixed;
- top: 0;
- width: 100%;
- }
- h1{
- padding-bottom: 2px;
- padding-top: 25px;
- color: black;
- background-color: white;
- margin-block-end: none;
- }
- a{
- text-decoration: none;
- color: #a8a8a8;
- }
- li {
- float: left;
- display: inline;
- }
- li a {
- display: block;
- color: white;
- text-align: center;
- padding: 14px 16px;
- text-decoration: none;
- }
- .active {
- background-color: #279;
- color: #279;
- }
- li a:hover {
- background-color: #279;
- }
- html, body, #container {
- width: 100%;
- height: 100%;
- margin: 0;
- padding: 0;
- background-color: #f8f6f0;
- }
- body {
- font-family: 'Open Sans', sans-serif;
- font-weight: 300;
- text-align: center;
- color: #7f7e7e;
- background-color: #ececec;
- margin: 0;
- padding: 0;
- }
- p{
- padding-top: 50px;
- margin-left: 10%;
- margin-right: 10%;
- color: black;
- }
Cela donne ceci :
III - HTML
Notre site se compose de trois pages html : une page d’acceuil, un page où se trouve le questionnaire et une dernière avec un graphique.
Pour cela, nous avons mis en place des liens qui redirige votre demande sur la page souhaiter avec des balises < a > qui permettent de rentrer un lien html et nous les avons mis dans une liste ordonnée (< li >) qui est elle même dans une liste non ordonnée (< ul >). Nous avons volontairement mis une liste ordonnée dans une liste non ordonnée pour pouvoir grâce au css donner de l’esthétisme au site.
Voici l’ensemble des codes :