Dans ce didacticiel, nous expliquerons la création d'un formulaire premium et interactif en plusieurs étapes avec des animations fluides et une validation côté client à l'aide de HTML, CSS et JavaScript. Ce formulaire offre une expérience utilisateur améliorée et ressemble à quelque chose tout droit sorti de 2025 !
Démo en direct : https://codepen.io/HanGPIIIErr/pen/ZYzbrqW
Table des matières
1.Introduction
Les formulaires en plusieurs étapes sont un excellent moyen d'améliorer l'expérience utilisateur en décomposant les formulaires longs en sections gérables. Dans ce didacticiel, nous allons créer un formulaire en cinq étapes qui comprend :
Nous ajouterons des animations fluides entre les étapes et validerons les entrées de l'utilisateur pour garantir l'intégrité des données.
Prérequis
Compréhension de base du HTML, CSS et JavaScript
Familiarité avec les éléments de formulaire et la gestion des événements en JavaScript
Structure du projet
Nous aurons trois fichiers principaux :
index.html — La structure HTML
style.css — Le style de notre formulaire
script.js — Le JavaScript pour gérer les interactions avec les formulaires
Commençons par configurer notre fichier HTML.
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Premium Multi-Step Form</title> <link href="https://fonts.googleapis.com/css?family=Poppins:300,400,600&display=swap" rel="stylesheet"> <link rel="stylesheet" href="style.css"> </head> <body> <form> <p>Explanation</p> <ul> <li>Form Steps: Each step is wrapped in a div with the class form-step.</li> <li>Active Class: The first step has the class active to display it initially.</li> <li>Navigation Buttons: Each step (except the first and last) has "Previous" and "Next" buttons.</li> <li>Summary Section: The last step displays a summary of the entered information.</li> </ul> <p>Styling with CSS</p> <p>Now, let's style our form to give it that premium feel.<br> </p> <pre class="brush:php;toolbar:false">/* style.css */ body { font-family: 'Poppins', sans-serif; background: linear-gradient(135deg, #1abc9c, #16a085); display: flex; justify-content: center; align-items: center; height: 100vh; overflow: hidden; } form { width: 90%; max-width: 600px; background: rgba(255, 255, 255, 0.95); padding: 3em; border-radius: 20px; box-shadow: 0 15px 25px rgba(0, 0, 0, 0.2); backdrop-filter: blur(10px); position: relative; overflow: hidden; } .form-step { position: absolute; width: 100%; opacity: 0; transform: scale(0.8) translateY(50px); transition: all 0.5s ease; } .form-step.active { opacity: 1; transform: scale(1) translateY(0); position: relative; } .step-header { position: absolute; top: -30px; right: 30px; background: #16a085; color: #fff; padding: 0.5em 1em; border-radius: 30px; font-weight: 600; animation: slideIn 0.5s forwards; } h2 { margin-bottom: 1em; color: #333; font-weight: 600; text-align: center; animation: fadeInDown 0.5s ease-in-out; } label { display: block; margin-top: 1em; color: #555; font-weight: 500; animation: fadeInUp 0.5s ease-in-out; } input[type="text"], input[type="email"], input[type="file"], textarea { width: 100%; padding: 0.75em 1em; margin-top: 0.5em; border: 2px solid #ddd; border-radius: 10px; font-size: 1em; outline: none; transition: border-color 0.3s; animation: fadeInUp 0.5s ease-in-out; } input:focus, textarea:focus { border-color: #1abc9c; } input[type="checkbox"] { margin-right: 0.5em; } .buttons { display: flex; justify-content: space-between; margin-top: 2em; animation: fadeInUp 0.5s ease-in-out; } button { padding: 0.75em 2em; border: none; border-radius: 30px; cursor: pointer; font-size: 1em; font-weight: 600; transition: background 0.3s, transform 0.3s, box-shadow 0.3s; } .next-step, .prev-step { background: #1abc9c; color: #fff; } .next-step:hover, .prev-step:hover { background: #16a085; transform: translateY(-3px); box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1); } button[type="submit"] { background: #e74c3c; color: #fff; margin-left: auto; } button[type="submit"]:hover { background: #c0392b; transform: translateY(-3px); box-shadow: 0 8px 15px rgba(0, 0, 0, 0.1); } #summary p { margin: 1em 0; color: #333; font-weight: 500; animation: fadeInUp 0.5s ease-in-out; } /* Animations */ @keyframes fadeInUp { from { opacity: 0; transform: translateY(30px); } to { opacity: 1; transform: translateY(0); } } @keyframes fadeInDown { from { opacity: 0; transform: translateY(-30px); } to { opacity: 1; transform: translateY(0); } } @keyframes slideIn { from { opacity: 0; transform: translateX(30px); } to { opacity: 1; transform: translateX(0); } }
Explication
Rendons notre formulaire fonctionnel.
document.addEventListener('DOMContentLoaded', function() { const form = document.getElementById('multi-step-form'); const steps = document.querySelectorAll('.form-step'); const nextBtns = document.querySelectorAll('.next-step'); const prevBtns = document.querySelectorAll('.prev-step'); const summary = document.getElementById('summary'); let currentStep = 0; nextBtns.forEach(btn => { btn.addEventListener('click', () => { if (validateStep()) { steps[currentStep].classList.remove('active'); currentStep++; if (currentStep < steps.length) { steps[currentStep].classList.add('active'); } if (currentStep === steps.length - 1) { displaySummary(); } } }); }); prevBtns.forEach(btn => { btn.addEventListener('click', () => { steps[currentStep].classList.remove('active'); currentStep--; steps[currentStep].classList.add('active'); }); }); form.addEventListener('submit', (e) => { e.preventDefault(); alert('Form successfully submitted!'); form.reset(); steps[currentStep].classList.remove('active'); currentStep = 0; steps[currentStep].classList.add('active'); }); function validateStep() { let stepIsValid = true; const currentInputs = steps[currentStep].querySelectorAll('input, textarea'); currentInputs.forEach(input => { if (!input.checkValidity()) { input.reportValidity(); stepIsValid = false; } }); return stepIsValid; } function displaySummary() { const name = document.getElementById('name').value || 'N/A'; const email = document.getElementById('email').value || 'N/A'; const prefs = Array.from(document.querySelectorAll('input[name="pref"]:checked')).map(el => el.value).join(', ') || 'None'; const comments = document.getElementById('comments').value || 'None'; summary.innerHTML = ` <p><strong>Name:</strong> ${name}</p> <p><strong>Email:</strong> ${email}</p> <p><strong>Preferences:</strong> ${prefs}</p> <p><strong>Comments:</strong> ${comments}</p> `; } // Initialize steps steps.forEach((step, index) => { if (index !== currentStep) { step.classList.remove('active'); } else { step.classList.add('active'); } }); });
Explication
? Conclusion : Forger l'avenir de la bataille des gladiateurs
Les dernières améliorations apportées à Gladiators Battle marquent un pas significatif vers une expérience fluide et captivante pour tous les joueurs. Avec un système de tutoriel enrichi, des composants modulaires, un écosystème de guilde florissant et des mini-jeux optimisés, le jeu évolue vers le RPG de gladiateur ultime.
Que vous soyez un nouveau venu explorant l'arène pour la première fois ou un guerrier chevronné dominant le champ de bataille, ces mises à jour permettent à chacun de se forger son propre héritage épique.
? Rejoignez le voyage !
Nous recherchons activement les commentaires des joueurs et des développeurs. Plongez dans Gladiators Battle et partagez vos réflexions avec nous.
? Site Web : https://gladiatorsbattle.com
?️ Soutenez-nous sur Kickstarter : https://www.kickstarter.com/projects/gladiatorsbattle/gladiators-battle-forge-your-legend-in-the-ultimate-arena
? Suivez-nous sur X (anciennement Twitter) : https://x.com/GladiatorsBT
? Connectez-vous sur LinkedIn : https://www.linkedin.com/in/pierre-romain-lopez
? Rejoignez la communauté sur Discord : https://discord.gg/YBNF7KjGwx
Merci pour votre soutien indéfectible alors que nous continuons à développer Gladiators Battle. Vos commentaires, vos idées et votre enthousiasme sont les moteurs de nos progrès.
Que l'aventure continue – Ave, Gladiateurs ! ?✨
Si vous avez des questions ou des suggestions, veuillez laisser un commentaire ci-dessous !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!