Projet final

Une to-do list complète

On assemble tout : HTML pour la structure, CSS pour l'apparence, JavaScript pour l'interactivité. 5 étapes, chacune vérifiée. Chaque étape repart de la solution de la précédente.

Voici ce que tu vas construire (essaie-la !) :

La structure HTML

Étape 1 — Le squelette

Dans la div.app, sous le titre, ajoute :

  • un formulaire id="form-tache" contenant un champ texte id="nouvelle-tache" (avec un placeholder) et un bouton « Ajouter » ;
  • une liste vide <ul id="liste"> ;
  • un paragraphe id="compteur" qui affiche 0 tâche restante.
IndiceSous le titre, il faut 3 éléments : un form, une ul et un p.
IndiceLe formulaire contient un <input> et un <button>. Vérifie l’orthographe des id : form-tache, nouvelle-tache, liste, compteur.
IndiceLe formulaire :
<form id="form-tache">
  <input id="nouvelle-tache" placeholder="Nouvelle tâche…">
  <button type="submit">Ajouter</button>
</form>

Le style CSS

Étape 2 — Une jolie carte

  • .app : fond blanc, max-width: 420px, centrée, avec padding et coins arrondis.
  • Le formulaire en flex avec un gap, le champ prend toute la place restante (flex: 1).
  • #liste sans puces (list-style: none) et les li en flex, contenu écarté aux deux bouts.
  • Pour plus tard : li.faite span barré (line-through) et gris.
IndicePour centrer la carte : max-width: 420px et margin: 20px auto sur .app.
IndiceFlexbox sur #form-tache (display: flex; gap: 8px;) et flex: 1 sur le champ.
IndiceLa liste :
#liste { list-style: none; padding: 0; }
#liste li { display: flex; justify-content: space-between; }
li.faite span { text-decoration: line-through; color: gray; }

L'interactivité en JavaScript

Pour les 3 dernières étapes, le HTML et le CSS sont prêts (onglets HTML et CSS). On se concentre sur le JS.

Étape 3 — Ajouter une tâche

  • À l'envoi du formulaire : empêche le rechargement.
  • Si le champ n'est pas vide (pense à .trim()), crée un li contenant un span avec le texte, et ajoute-le à #liste.
  • Vide le champ.
IndiceÉcoute submit sur form, et empêche le rechargement avec e.preventDefault().
Indiceinput.value.trim() retire les espaces au début et à la fin : si le résultat vaut "", arrête-toi avec return.
IndiceLa fonction ajouterTache :
function ajouterTache(texte) {
  const li = document.createElement("li");
  const span = document.createElement("span");
  span.textContent = texte;
  li.append(span);
  liste.append(li);
}

Étape 4 — Cocher et supprimer

  • Chaque tâche contient aussi un bouton ✕ de classe supprimer.
  • Un clic sur le span ajoute/retire la classe faite sur le li.
  • Un clic sur le bouton supprime le li.
IndiceDans ajouterTache, crée un troisième élément : document.createElement("button"), avec le texte ✕ et la classe supprimer.
IndiceUn écouteur click sur le span (→ li.classList.toggle("faite")), un autre sur le bouton (→ li.remove()).
IndiceN’oublie pas d’insérer le bouton dans la tâche : li.append(span, bouton);

Étape 5 — Le compteur

Écris une fonction majCompteur() qui compte les tâches non faites et affiche 1 tâche restante ou 3 tâches restantes (avec le pluriel !). Appelle-la après chaque ajout, cochage et suppression.

Indiceliste.querySelectorAll("li:not(.faite)").length compte les tâches qui ne sont pas faites.
IndicePour le pluriel : const s = n > 1 ? "s" : ""; puis `${n} tâche${s} restante${s}`.
IndiceAppelle majCompteur() à 3 endroits : à la fin de ajouterTache, et dans chacun des deux écouteurs de clic.

Bonus : sauvegarder les tâches

Recharge la page : tout disparaît ! Le navigateur offre un petit espace de stockage, localStorage, qui ne stocke que du texte. On convertit donc notre tableau avec JSON :

// Sauvegarder : tableau → texte
const taches = [...liste.querySelectorAll("li")].map(li => ({
  texte: li.querySelector("span").textContent,
  faite: li.classList.contains("faite"),
}));
localStorage.setItem("taches", JSON.stringify(taches));

// Charger au démarrage : texte → tableau
const sauvegarde = JSON.parse(localStorage.getItem("taches")) || [];
sauvegarde.forEach(t => ajouterTache(t.texte, t.faite));

Défi : appelle la sauvegarde dans majCompteur() (elle est déjà appelée à chaque changement !) et ajoute un paramètre faite à ajouterTache.

Et maintenant ?

Bravo, tu as les bases ! Pour continuer :

🛠️ Pratique

Recrée ce projet sur ton ordinateur dans trois fichiers : index.html, style.css, script.js (voir la leçon « Mon premier projet »).

💡 Idées de projets

Une calculatrice, un quiz, un jeu du « plus ou moins », une page portfolio responsive.

📚 Référence

MDN Web Docs : la documentation de référence, en français.

🚀 Publier

Mets ton site en ligne gratuitement avec GitHub Pages ou Netlify.

Tu es arrivé au bout du cours, bravo ! 🎉 Pour fêter ça, tu peux m'offrir un café ☕ : c'est le carburant officiel de ce cours… et la seule dépendance que je ne mettrai jamais à jour.

Ce que tu as mobilisé