Formulaire à plusieurs étapes avec HTML, CSS, et JavaScript

cover
Oct 28, 2019 7 min Follow me on Twitter

Subscribe to receive the free weekly article

Cet article a été mis à jour le 2020-11-02

Un formulaire pas à pas ou à plusieurs étapes est une fonctionnalité pratique à avoir quand il s'agit de traiter de longs formulaires. Il améliore votre expérience utilisateur avec un formulaire plus convivial. Dans ce didacticiel, nous allons créer un formulaire pas à pas en utilisant HTML, CSS, et JavaScript.

Commençons!

Balisage

Comme vous pouvez le voir, le fichier HTML est relativement simple.

<main>
  <div class="stepper">
    <div class="step--1 step-active">Step 1</div>
    <div class="step--2">Step 2</div>
    <div class="step--3">Step 3</div>
    <div class="step--4">Finish</div>
  </div>
  <form class="form form-active">
    <div class="form--header-container">
      <h1 class="form--header-title">
        Personal Info
      </h1>

      <p class="form--header-text">
        Tell us more about you.
      </p>
    </div>
    <input type="text" placeholder="Name" />
    <input type="text" placeholder="Email" />
    <input type="text" placeholder="Password" />
    <button class="form__btn" id="btn-1">Next</button>
  </form>
  <form class="form">
    <div class="form--header-container">
      <h1 class="form--header-title">
        Company Info
      </h1>

      <p class="form--header-text">
        Tell us more about your company.
      </p>
    </div>

    <input type="text" placeholder="Company Name" />
    <input type="text" placeholder="Job title" />
    <input type="text" placeholder="Location" />
    <button class="form__btn" id="btn-2-prev">Previous</button>
    <button class="form__btn" id="btn-2-next">Next</button>
  </form>
  <form class="form">
    <div class="form--header-container">
      <h1 class="form--header-title">
        Social account
      </h1>

      <p class="form--header-text">
        Tell us more about your social account.
      </p>
    </div>
    <input type="text" placeholder="Linkedin" />
    <input type="text" placeholder="Twitter" />
    <input type="text" placeholder="Github" />
    <button class="form__btn" id="btn-3">Submit</button>
  </form>
  <div class="form--message"></div>
</main>

Outre la balise main, nous définissons également undiv contenant l'élément stepper. Ensuite, nous utilisons trois formulaires avec différents boutons id qui feront plus tard l'effet stepper à l'aide de JavaScript.

Avec cela en place, nous pouvons maintenant styliser le projet avec CSS.

Stylisation

Ici, nous commençons par quelques réinitialisations, puis nous définissons les propriétés font-family et background-color pour la balise body.

@import url("https://fonts.googleapis.com/css?family=Nunito&display=swap");
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}
body {
  background: #f5f6f7;
  font-family: "Nunito", sans-serif;
}

main {
  height: 100vh;
  width: 100%;
  display: flex;
  justify-content: center;
  align-items: center;
  flex-direction: column;
  position: relative;
}

Ensuite, nous utilisons la valeur flex sur la balise main pour centrer l'élément par rapport à la balise body.

.stepper {
  width: 20rem;
  display: flex;
  justify-content: center;
  align-items: center;
  position: absolute;
  top: 5%;
}

.step--1,
.step--2,
.step--3,
.step--4 {
  width: 5rem;
  padding: 0.5rem 0;
  background: #fff;
  color: #666;
  text-align: center;
}
.step--1,
.step--2,
.step--3 {
  border-right: 1px solid #666;
}

Pour les éléments Stepper, nous nous appuyons sur CSS flexbox pour les aligner horizontalement, puis nous utilisons leurs noms de classe pour ajouter le style.

.form {
  background: #fff;
  text-align: center;
  position: absolute;
  width: 25rem;
  box-shadow: 0.2rem 0.2rem 0.5rem rgba(51, 51, 51, 0.2);
  display: none;
  border-radius: 1rem;
  overflow: hidden;
}
.form--header-container {
  background: linear-gradient(to right, rgb(51, 51, 51), #919191);
  color: #fff;
  height: 6rem;
  padding: 1rem 0;
  margin-bottom: 2rem;
}

.form--header-title {
  font-size: 1.4rem;
}

.form--header-text {
  padding: 0.5rem 0;
}

input[type="text"] {
  padding: 0.8rem;
  margin: auto;
  margin-top: 0.5rem;
  width: 20rem;
  display: block;
  border-radius: 0.5rem;
  outline: none;
  border: 1px solid #bdbdbb;
}

.form__btn {
  background: #333;
  color: #fff;
  outline: none;
  border: none;
  padding: 0.5rem 0.7rem;
  width: 7rem;
  margin: 1rem auto;
  border-radius: 0.9rem;
  text-transform: uppercase;
  font-weight: 700;
  cursor: pointer;
}
.form--message-text {
  width: 25rem;
  background: #fff;
  color: #444;
  padding: 2rem 1rem;
  text-align: center;
  font-size: 1.4rem;
  box-shadow: 0.2rem 0.2rem 0.5rem rgba(51, 51, 51, 0.2);
  animation: fadeIn 0.8s;
  border-radius: 1rem;
}

Au début, nous cachons les trois formulaires. Seul le formulaire contenant la classe active class sera affiché.

Dans la classe form-header-container, nous utilisons linear-gradient pour styliser l'en-tête du formulaire.

Ensuite, dans la classe form-message-text, nous ajoutons la propriété animation pour avoir un effet de fondu lorsque le formulaire est soumis avec succès.

.form-active {
  z-index: 1000;
  display: block;
}
.form-active-animate {
  animation: moveRight 1s;
}
.form-inactive {
  display: block;
  animation: moveLeft 1s;
}

.step-active {
  background: #666;
  color: #fff;
  border: 1px solid #666;
}

Nous utilisons la classe form-active pour afficher le formulaire actuel. Et aussi la propriété z-index pour placer le formulaire au-dessus d'autres éléments.

Ensuite, nous utilisons la classe form-active-animate pour créer une belle entrée d'animation de gauche à droite. Nous avons également le nom de classe form-inactive qui permet de masquer le formulaire précédent.

@keyframes moveRight {
  0% {
    transform: translateX(-27rem) scale(0.9);
    opacity: 0;
  }
  100% {
    transform: translateX(0rem) scale(1);
    opacity: 1;
  }
}

@keyframes moveLeft {
  0% {
    transform: translateX(0rem) scale(1);
    opacity: 1;
  }
  100% {
    transform: translateX(27rem) scale(0.9);
    opacity: 0;
  }
}

@keyframes fadeIn {
  0% {
    opacity: 0;
  }
  100% {
    opacity: 1;
  }
}

Comme vous pouvez le voir ici, nous nous appuyons sur les keyframes pour réaliser l'animation.

La première animation, moveRight, déplacera l'élément de gauche à droite en utilisant la propriété transform.

Pour la deuxième animation, c'est relativement le même processus, sauf que l'élément se déplacera davantage sur le côté droit.

La dernière animation, fadeIn, commencera l'effet de fondu d'entrée lorsque l'élément apparaît.

JavaScript

Comme vous pouvez le voir ici, nous écoutons l'événement click puis utilisons la fonction gotoNextForm pour le gérer.

const formBtn1 = document.querySelector("#btn-1")
const formBtnPrev2 = document.querySelector("#btn-2-prev")
const formBtnNext2 = document.querySelector("#btn-2-next")
const formBtn3 = document.querySelector("#btn-3")

Pour interagir avec le DOM, nous devons sélectionner tous les boutons du formulaire en utilisant la méthode querySelector.

// Button listener of form 1
formBtn1.addEventListener("click", function(e) {
  gotoNextForm(formBtn1, formBtnNext2, 1, 2)
  e.preventDefault()
})

// Next button listener of form 2
formBtnNext2.addEventListener("click", function(e) {
  gotoNextForm(formBtnNext2, formBtn3, 2, 3)
  e.preventDefault()
})

// Previous button listener of form 2
formBtnPrev2.addEventListener("click", function(e) {
  gotoNextForm(formBtnNext2, formBtn1, 2, 1)
  e.preventDefault()
})

// Button listener of form 3
formBtn3.addEventListener("click", function(e) {
  document.querySelector(`.step--3`).classList.remove("step-active")
  document.querySelector(`.step--4`).classList.add("step-active")
  formBtn3.parentElement.style.display = "none"
  document.querySelector(".form--message").innerHTML = `
   <h1 class="form--message-text">Your account is successfully created </h1>
   `
  e.preventDefault()
})

Ici, nous commençons par passer les identifiants de formulaire en tant que paramètres puis nous utilisons la méthode preventDefault() sur l'événement pour empêcher le rechargement de la page.

L'auditeur formBtn3 est un peu différent car nous devons montrer un message à l'utilisateur. C'est pourquoi nous utilisons innerHTML pour ajouter le contenu HTML.

const gotoNextForm = (prev, next, stepPrev, stepNext) => {
  // Get form through the button
  const prevForm = prev.parentElement
  const nextForm = next.parentElement
  const nextStep = document.querySelector(`.step--${stepNext}`)
  const prevStep = document.querySelector(`.step--${stepPrev}`)
  // Add active/inactive classes to both previous and next form
  nextForm.classList.add("form-active")
  nextForm.classList.add("form-active-animate")
  prevForm.classList.add("form-inactive")
  // Change the active step element
  prevStep.classList.remove("step-active")
  nextStep.classList.add("step-active")
  // Remove active/inactive classes to both previous an next form
  setTimeout(() => {
    prevForm.classList.remove("form-active")
    prevForm.classList.remove("form-inactive")
    nextForm.classList.remove("form-active-animate")
  }, 1000)
}

Ici, nous parcourons le DOM en utilisant la propriété parentElement sur les variables prevForm et nextForm pour sélectionner l'élément form.

Ensuite, nous utilisons les variables pour sélectionner les étapes du formulaire à partir de l'élément stepper.

Après cela, nous ajoutons les classes form-active et form-active-animate à l'élément de formulaire suivant pour avoir un bel effet d'animation.

Ensuite, nous supprimons les classes form-active, form-inactive et form-active-animate des formulaires après 1 seconde en utilisant la méthode setTimeout().

forme pas à pas

Génial! Nous avons terminé de construire un formulaire à plusieurs étapes avec HTML, CSS, et JavaScript.

Vous pouvez me suivre sur Twitter pour être averti lorsqu'un nouvel article sera publié.

Merci d'avoir lu!

#html#css#javascript

Support my work

Get articles in your inbox