diff --git a/src/cours/CIEL1/05-web-js/activite3-js-bases.md b/src/cours/CIEL1/05-web-js/activite3-js-bases.md index c32ea69..998be65 100644 --- a/src/cours/CIEL1/05-web-js/activite3-js-bases.md +++ b/src/cours/CIEL1/05-web-js/activite3-js-bases.md @@ -1,9 +1,30 @@ -# Web - Activité 3 - Carousel de photos en JavaScript +--- +puppeteer: + format: A4 + margin: + top: "0.5cm" + left: "0.5cm" + right: "0.5cm" + bottom: "0.5cm" +--- + +# Web - Activité 3 - Carrousel de photos en JavaScript ## Objectifs -- Développement d'un carousel de photos en JavaScript. -- Le carousel a pour but de faire défiler des photos de bâtiments pour le site de l'entreprise Numérobis afin de montrer aux visiteurs les projets sur lesquels ils ont pu travailler. +- Développement d'un carrousel de photos en JavaScript. +- Le carrousel a pour but de faire défiler des photos de bâtiments pour le site de l'entreprise Numérobis afin de montrer aux visiteurs les projets sur lesquels ils ont pu travailler. + +## Évaluation + +- C04: ANALYSER UN SYSTÈME INFORMATIQUE + - La structure de la solution technique est analysée avec un regard critique + - Le calme est conservé de façon constante dans des situations particulières, tout en persévérant dans la tâche jusqu’à l’atteinte du résultat sans se décourager +- C08: CODER + - Le code est versionné, commenté et le logiciel est documenté + - Les composants logiciels individuels sont développés conformément aux spécifications du cahier des charges, des bonnes pratiques et des différentes politiques de sécurité et de protection des données personnelles + - La solution (logicielle et matérielle) est intégrée et testée conformément aux spécifications du cahier des charges, des bonnes pratiques et des différentes politiques de sécurité et de protection des données personnelles + - La résolution d'un problème nouveau imprévu est réussie en utilisant ses propres moyens conformément aux règles de la fonction ## Validation ### Livrables @@ -17,21 +38,22 @@ Le tout dans un répertoire avec le nom suivant `YYYY-MM-DD_TPX_NOM1_Prenom1_NOM ### Résultats attendus -- [ ] Le carousel est intégré à la page d'accueil du site et fonctionnel. -- [ ] Le carousel permet de faire défiler 4 photos en boucle grâce à deux boutons -- [ ] Le carousel fait défiler automatiquement les photos toutes les 2 secondes +- [ ] Le carrousel est intégré à la page d'accueil du site et fonctionnel. +- [ ] Le carrousel permet de faire défiler 4 photos en boucle grâce à deux boutons +- [ ] Le carrousel fait défiler automatiquement les photos toutes les 2 secondes - [ ] Le résultat général (hors animation) ressemble à l'image ci-dessous (options incluses) -- [ ] (Optionnel) Le carousel permet d'afficher une photo au choix en cliquant sur un indicateur en bas de la photo -- [ ] (Optionnel) Le carousel affiche en haut à gauche le numéro de la photo, et en en dessous au centre son titre - [ ] (Optionnel) L'aspect visuel du site a été modernisé +- [ ] (Optionnel) Le carrousel affiche en haut à gauche le numéro de la photo, et en en dessous au centre son titre +- [ ] (Optionnel) Le carrousel permet d'afficher une photo au choix en cliquant sur un indicateur en bas de la photo +![final](images/final.png) ## Ressources fournies -- Documentations: - - HTML - - CSS - - JavaScript +- Documentations : + - [HTML](https://developer.mozilla.org/fr/docs/Web/HTML) + - [CSS](https://developer.mozilla.org/fr/docs/Web/CSS) + - [JavaScript](https://developer.mozilla.org/fr/docs/Web/JavaScript) - Cours de JavaScript - 4 images à intégrer dans le projet @@ -41,174 +63,263 @@ Le tout dans un répertoire avec le nom suivant `YYYY-MM-DD_TPX_NOM1_Prenom1_NOM **Objectif :** Préparer le projet -```admonish travail -- Repartir du résultat de l'activité précédente (ouvrir le répertoire dans VSCode) -- Vérifier que votre travail a été correctement commité et qu'il ne reste plus de fichiers modifiés mais non commités -- Créer un nouveau fichier de compte rendu vierge -- Lancer un serveur web de développement (`python -m http.server`) -- Ouvrir un navigateur (Firefox de préférence) et se rendre sur [cette page](https://localhost:8000) -``` +!!! example À faire + - Repartir du résultat de l'activité précédente (ouvrir le répertoire dans VSCode) + - Vérifier que votre travail a été correctement commité et qu'il ne reste plus de fichiers modifiés mais non commités + - Créer un nouveau fichier de compte rendu vierge + - Lancer un serveur web de développement (`python -m http.server`) + - Ouvrir un navigateur (Firefox de préférence) et se rendre sur [cette page](https://localhost:8000) + ### 1 - Découverte du JS **Objectif :** Découvrir le JavaScript et afficher du texte dans la console -```admonish travail -- Dans votre navigateur, ouvrir la console JS (F12 en général, ou voir cours) -- Démarrer le mode "multiligne" (firefox uniquement), qui permet d'écrire plusieurs lignes de code et les exécuter - ![multiligne0](./image.png) +!!! example À faire + - Dans votre navigateur, ouvrir la console JS (F12 en général, ou voir cours) + - Démarrer le mode "multiligne" (firefox uniquement), qui permet d'écrire plusieurs lignes de code et les exécuter + ![multiligne0](./image.png) - ![multiligne1](./image-1.png) -- Écrire dans la console le code suivant, puis l'exécuter : - ~~~js - console.log("Hello, World!"); - ~~~ -- Vérfier que le texte `Hello, World!` s'affiche. -- Écrire dans votre console le code suivant puis l'exécuter : - ~~~js - function carré(number){ - return number * number; - } - - console.log(carré(5)); - ~~~ -- Écrire le code suivant puis analyser la portée des variables et retirer les lignes `console.log` nécessaires pour faire fonctionner le programme - ~~~js - var maVariable = "Hello"; - function maFonction(){ - console.log("Dans la fonction"); - if (true){ - var autreVariable = "World"; - let variableInterne = "Bonjour"; - console.log(`Dans le if : autreVariable = ${autreVariable}`); - console.log(`Dans le if : variableInterne = ${variableInterne}`); + ![multiligne1](./image-1.png) + - Écrire dans la console le code suivant, puis l'exécuter : + ```js + console.log("Hello, World!"); + ``` + - Vérfier que le texte `Hello, World!` s'affiche. + - Écrire dans votre console le code suivant puis l'exécuter : + ```js + function carré(number){ + return number * number; } + + console.log(carré(5)); + ``` + - Écrire le code suivant puis analyser la portée des variables et retirer les lignes `console.log` nécessaires pour faire fonctionner le programme + ```js + var maVariable = "Hello"; + function maFonction(){ + console.log("Dans la fonction"); + if (true){ + var autreVariable = "World"; + let variableInterne = "Bonjour"; + console.log(`Dans le if : autreVariable = ${autreVariable}`); + console.log(`Dans le if : variableInterne = ${variableInterne}`); + } + console.log(`maVariable = ${maVariable}`); + console.log(`Hors du if : autreVariable = ${autreVariable}`); + console.log(`Hors du if : variableInterne = ${variableInterne}`); + } + + maFonction(); + console.log("Hors de la fonction"); console.log(`maVariable = ${maVariable}`); - console.log(`Hors du if : autreVariable = ${autreVariable}`); - console.log(`Hors du if : variableInterne = ${variableInterne}`); - } + console.log(`autreVariable = ${autreVariable}`); + console.log(`variableInterne = ${variableInterne}`); + ``` - maFonction(); - console.log("Hors de la fonction"); - console.log(`maVariable = ${maVariable}`); - console.log(`autreVariable = ${autreVariable}`); - console.log(`variableInterne = ${variableInterne}`); - ~~~ -``` -```admonish note title="Dans le compte rendu" -- Quel est le rôle du javascript dans le navigateur ? -- Que fait la fonction `console.log` ? -- Qu'est-ce que `carré` dans le code que vous avez écrit ? -- Comment déclarer et appeler une fonction en JavaScript ? -- Comment déclarer une variable en JavaScript ? -- Quelle est la différence entre var et let ? -``` +!!! note Dans le compte rendu + - Quel est le rôle du javascript dans le navigateur ? + - Que fait la fonction `console.log` ? + - Qu'est-ce que `carré` dans le code que vous avez écrit ? + - Comment déclarer et appeler une fonction en JavaScript ? + - Comment déclarer une variable en JavaScript ? + - Quelle est la différence entre var et let ? + ### 2 - Choisir quelle image afficher **Objectif :** Écrire une fonction en Javascript pour choisir l'image à afficher -```admonish travail -- Récupérer les 4 images fournies dans un répertoire image dans votre projet -- Supprimer l'image `home.png` (elle est remplacée par `building_1.png`) -- Dans le fichier `index.html`, remplacer la balise image qui affcihait `home.png` par le code suivant : - ~~~html -
-
- Projet démo 1 +!!! example À faire + - Récupérer les 4 images fournies dans un répertoire image dans votre projet + - Supprimer l'image `home.png` (elle est remplacée par `building_1.png`) + - Dans le fichier `index.html`, remplacer la balise image qui affichait `home.png` par le code suivant : + ```html +
+
+ Projet démo 1 +
-
- ~~~ -- Vérifier que tout s'affiche correctement (comme avant). Corriger le CSS si nécessaire. -- Rajouter les trois autres images dans la div `slideshow`, encapsulées chacune dans une balise `div` de classe `slide`. Vous devriez avoir les 4 images à la suite. -- Modifier le CSS pour que les éléments de classe `slide` [ne soient plus affichés](https://developer.mozilla.org/fr/docs/Web/CSS/Reference/Properties/display) -- Créer le fichier `slideshow.js` à la racine de votre projet -- Ajouter la balise suivante, entre les sections `head` et `body` de votre `index.html` : - ~~~html - - ~~~ -- Écrire une fonction `showSlide` qui prend un paramètre `index` représentant le numéro (de 0 à 3 ) de la photo à afficher. - - Récupérer les 4 conteneurs de classe `slide` dans une variable locale `slides`. [Fonction à utiliser.](https://developer.mozilla.org/fr/docs/Web/API/Document/getElementsByClassName) - - Grâce au code suivant, modifier la propriété de style `display` de l'image d'indice `index` : - ~~~js - slides[index].style.display = "block"; - ~~~ -- Modifier votre script `slideshow.js` pour appeler votre nouvelle fonction et affciher l'image d'indice 0 -- Compléter votre compte rendu, puis faire un commit. -``` + ``` + - Vérifier que tout s'affiche correctement (comme avant). Corriger le CSS si nécessaire. + - Rajouter les trois autres images dans la div `slideshow`, encapsulées chacune dans une balise `div` de classe `slide`. Vous devriez avoir les 4 images à la suite. + - Modifier le CSS pour que les éléments de classe `slide` [ne soient plus affichés](https://developer.mozilla.org/fr/docs/Web/CSS/Reference/Properties/display) + - Créer le fichier `slideshow.js` à la racine de votre projet + - Ajouter la balise suivante, entre les sections `head` et `body` de votre `index.html` : + ```html + + ``` + - Écrire une fonction `showSlide` qui prend un paramètre `index` représentant le numéro (de 0 à 3 ) de la photo à afficher. + - Récupérer les 4 conteneurs de classe `slide` dans une variable locale `slides`. [Fonction à utiliser.](https://developer.mozilla.org/fr/docs/Web/API/Document/getElementsByClassName) + - Grâce au code suivant, modifier la propriété de style `display` de l'image d'indice `index` : + ```js + slides[index].style.display = "block"; + ``` + - Modifier votre script `slideshow.js` pour appeler votre nouvelle fonction et affciher l'image d'indice 0 + - Compléter votre compte rendu, puis faire un commit. + + +!!! note Dans le compte rendu + - A quoi servent les div de classe `slideshow` et `slide` ? + - Pourquoi cache-t-on les images ? + - Que fait la ligne `` ? + - Que fait la fonction `document.getElementByClassName` ? + - Que fait la ligne suivante : `slides[index].style.display = "block";` ? Aidez-vous du debugger CSS de votre navigateur + - Expliquez dans les grandes lignes ce que vous avez fait à cette étape. Quelle sera, selon vous, la suite des opérations ? -```admonish note title="Dans le compte rendu" -- A quoi servent les div de classe `slideshow` et `slide` ? -- Pourquoi cache-t-on les images ? -- Que fait la ligne `` ? -- Que fait la fonction `document.getElementByClassName` ? -- Que fait la ligne suivante : `slides[index].style.display = "block";` ? Aidez-vous du debugger CSS de votre navigateur -- Expliquez dans les grandes lignes ce que vous avez fait à cette étape. Quelle sera, selon vous, la suite des opérations ? -``` ### 3 - Afficher une seule image à la fois **Objectif :** Réussir à n'afficher qu'une image -```admonish travail -- Modifier votre script pour effectuer des appels successifs à `showSlide` avec différentes images. Que constatez-vous ? -- Il va donc falloir cacher les autres images pour n'afficher que celle qui nous intéresse (celle passée en paramètre). - Pour cela, nous allons utiliser une boucle qui va remettre la propriété `display` de chaque `slide` à `none`. Modifiez - votre code pour faire ça. -- Vérifiez que cela fonctionne en faisant plusieurs appels successifs à `showSlide` (dans le même script). Seule la dernière image doit être visible. -- Complétez le compte rendu et faites un nouveau commit. -``` +!!! example À faire + - Modifier votre script pour effectuer des appels successifs à `showSlide` avec différentes images. Que constatez-vous ? + - Il va donc falloir cacher les autres images pour n'afficher que celle qui nous intéresse (celle passée en paramètre). + Pour cela, nous allons utiliser une boucle qui va remettre la propriété `display` de chaque `slide` à `none`. Modifiez + votre code pour faire ça. + - Vérifiez que cela fonctionne en faisant plusieurs appels successifs à `showSlide` (dans le même script). Seule la dernière image doit être visible. + - Complétez le compte rendu et faites un nouveau commit. + + +!!! note Dans le compte rendu + Expliquez ce que vous avez fait à cette étape. -```admonish note title="Dans le compte rendu" -Expliquez ce que vous avez fait à cette étape. -``` ### 4 - Changer d'image dynamiquement **Objectif :** Ajouter des boutons pour passer à l'image suivante dynamiquement -```admonish travail -- Dans votre `index.html`, dans la `div` `slideshow` ajouter deux éléments `button`: - - Le texte sera `❮` qui représente ❮, et l'id `prevSlide` - - Le texte sera `❯` qui représente ❯, et l'id `nextSlide` -- Ajoutez dans votre script la fonction : `showSlideRelative(relativeIndex)`. - Elle fera appel à `showSlide`. Son paramètre `relativeIndex` indiquera de combien de slides il faudra faire tourner le carousel. - Par exemple, si on passe 1 il faudra prendre l'image avec l'index suivant. Si on passe -1 il faudra prendre l'image précédente. -- Dans votre `index.html` il va falloir dire à vos deux boutons (`prevSlide` et `nextSlide`) d'appeler la fonction que vous venez de créer lorsqu'on clique dessus. Ajoutez l'attribut `onclick` avec un appel à `showSlideRelative` (en passant 1 pour suivant et -1 pour précédent). -- Vérifiez que votre code fonctionne. -- (À ajouter dans le compte rendu :) Si vous cliquez sur suivant alors que vous êtes sur l'image 4, que se passe-t-il ? Idem avec précédent à l'image 1 ? Pourquoi ? -- Corrigez votre algorithme. -- Mettez à jour le compte rendu et faites un nouveau commit. -``` +!!! example À faire + - Dans votre `index.html`, dans la `div` `slideshow` ajouter deux éléments `button`: + - Le texte sera `❮` qui représente ❮, et l'id `prevSlide` + - Le texte sera `❯` qui représente ❯, et l'id `nextSlide` + - Ajoutez dans votre script la fonction : `showSlideRelative(relativeIndex)`. + - Elle fera appel à `showSlide`. + - Son paramètre `relativeIndex` indiquera de combien de slides il faudra faire tourner le carrousel. + - Par exemple, si on passe 1 il faudra prendre l'image avec l'index suivant. Si on passe -1 il faudra prendre l'image précédente. + - Dans votre `index.html` il va falloir dire à vos deux boutons (`prevSlide` et `nextSlide`) d'appeler la fonction que vous venez de créer lorsqu'on clique dessus. Ajoutez l'attribut `onclick` avec un appel à `showSlideRelative` (en passant 1 pour suivant et -1 pour précédent). + - Vérifiez que votre code fonctionne. + - (À ajouter dans le compte rendu :) Si vous cliquez sur suivant alors que vous êtes sur l'image 4, que se passe-t-il ? Idem avec précédent à l'image 1 ? Pourquoi ? + - Corrigez votre algorithme. + - Mettez à jour le compte rendu et faites un nouveau commit. -```admonish help title="Aide" -- Votre nouvelle fonction doit calculer le nouvel indice et le passer à `showSlide`. -- Vous aurez besoin d'une variable globale `slideIndex` pour retenir la slide affichée. Vous pourrez ensuite ajouter `relativeIndex` à `slideIndex` -- N'oubliez pas de mettre à jour l'index global en mémoire dans `showSlide` -``` -```admonish note title="Dans le compte rendu" -- Que sont `❮` et `❯` ? -- Expliquez ce que vous avez fait à cette étape. N'oubliez pas d'expliquer comment vous avez résolu le problème de rotation des indices. -``` +!!! question Aide + - Vous aurez besoin de garder en mémoire la slide affichée pour savoir quelle est la slide suivante/précédente. + - Vous aurez donc besoin d'une variable globale `slideIndex` pour retenir la slide affichée. Vous pourrez ensuite ajouter `relativeIndex` à `slideIndex`. + - Votre nouvelle fonction doit calculer le nouvel indice et le passer à `showSlide`. + - N'oubliez pas de mettre à jour l'index global en mémoire dans `showSlide` + + +!!! note Dans le compte rendu + - Que sont `❮` et `❯` ? + - Expliquez ce que vous avez fait à cette étape. N'oubliez pas d'expliquer comment vous avez résolu le problème de rotation des indices. + ### 5 - Améliorer la lisibilité des boutons de rotation **Objectif :** Modifier le CSS des boutons pour les afficher sur l'image et aider l'utilisateurice à comprendre qu'ils sont cliquables -```admonish travail -- Dans le CSS, ajouter un sélecteur sur les deux boutons (via leurs ids) puis : - - Modifier la [propriété `position`](https://developer.mozilla.org/fr/docs/Web/CSS/Reference/Properties/position) à la valeur `absolute` (attention à ce que vous deux boutons soient bien inclus dans la div `slideshow`) - - Modifier la proriété `position` de `slideshow` à `relative` - - Modifier les propriétés [`top`](https://developer.mozilla.org/fr/docs/Web/CSS/Reference/Properties/top) et [`right`](https://developer.mozilla.org/fr/docs/Web/CSS/Reference/Properties/right) des boutons de façon à ce qu'ils soient bien de chaque côté de l'image et centrés verticalement. - - Modifier la propriété `cursor` pour changer le curseur de façon à comprendre qu'on a un objet cliquable -- Compléter le copmpte-rendu et faire un nouveau commit -``` +!!! example À faire + - Dans le CSS, ajouter un sélecteur sur les deux boutons (via leurs ids) puis : + - Modifier la [propriété `position`](https://developer.mozilla.org/fr/docs/Web/CSS/Reference/Properties/position) à la valeur `absolute` (attention à ce que vous deux boutons soient bien inclus dans la div `slideshow`) + - Modifier la proriété `position` de `slideshow` à `relative` + - Modifier les propriétés [`top`](https://developer.mozilla.org/fr/docs/Web/CSS/Reference/Properties/top) et [`right`](https://developer.mozilla.org/fr/docs/Web/CSS/Reference/Properties/right) des boutons de façon à ce qu'ils soient bien de chaque côté de l'image et centrés verticalement. + - Modifier la propriété `cursor` pour changer le curseur de façon à comprendre qu'on a un objet cliquable + - Compléter le copmpte-rendu et faire un nouveau commit + + +!!! note Dans le compte rendu + - Que fait la propriété CSS `position` ? + - Pourquoi avons-nous changé cette propriété dans `slideshow` et les boutons ? + - Que font `top`, `right` et `left` ? Dans quel cas peut-on les utiliser ? + - Expliquer ce que vous avez fait à cette étape + + +### 6 - Effectuer une rotation automatique des images + +**Objectif :** Changer l'image affichée toutes les deux secondes automatiquement + +!!! example À faire + - Lire la documentation de la fonction [`setInterval`](https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval) et celle de [`setTimeout`](https://developer.mozilla.org/fr/docs/Web/API/Window/setTimeout). Choisir celle qui vous paraît la plus adaptée. Justifier dans le compte rendu. + - Quelle fonction (déjà écrite par vos soins) allez-vous appeler à intervalles réguliers pour faire tourner votre carrousel ? Écrivez le code correspondant. Utilisez l'aide ci-dessous. + - Validez que votre code fonctionne. + - Mettez à jour votre compte rendu et faites un commit. + + +!!! question Aide + - Nous devons passer une **fonction** en paramètre à `setInterval` (ou `setTimeout`). Il s'agit bien d'une fonction, et non pas d'un appel à la fonction (qui ne donnerait qu'un seul résultat) ! C'est `setInterval` qui se chargera d'appeler votre fonction à intervalles réguliers. + - Mais pourtant, nous avons besoin de passer des paramètres à cette fonction. Il faut donc une solution pour les passer également. + - Deux possibilités pour ça : + - `setInterval` propose de prendre des arguments supplémentaires, qui seront passés à la fonction (voir doc) + - on utilise une fonction anonyme qui ne prend pas de paramètre avec la syntaxe suivante : + ```js + () => mafonction(param1, param2, ...) + ``` + + +!!! note Dans le compte rendu + - Justifier le choix entre `setInterval` et `setTimeout` et expliquer l'algorithme que vous avez choisi pour changer d'image toutes les deux secondes. + - `setInterval` et `setTimeout` permettent de passer une fonction ou un bout de code sous forme de chaîne de caractères comme paramètre. Qu'allez vous préférer et pourquoi ? Pensez à vérifier d'éventuelles problématiques de sécurité. + + +### 7 - Segmenter le JavaScript et le HTML + +**Objectif :** Lier les actions des boutons directement depuis le CSS pour une meilleure maintenabilité du code + +!!! example À faire + Les boutons `prevSlide` et `nextSlide` ont un attribut `onclick` dans lequel vous avez ajouté du code JavaScript (`onclick=showSlideRelative(1)` par exemple). + C'est une pratique à éviter, car elle complique la maintenance du code, et rompt la séparation des responsabilités. Le HTML ne devrait contenir que des informations de contenu. + + Nous allons donc y remédier. + - Retirez les attributs `onclick` de vos deux boutons `prevSlide` et `nextSlide`. + - Ajoutez une fonction d'initialisation dans votre code JS qui ne prend aucun argument. Vous pouvez l'appeler `initcarrousel` par exemple. + - Dans cette fonction déplacez l'appel à `showSlide(slideIndex)` que vous utilisiez pour initialiser le carrousel. Gardez en revanche la variable globale à l'extérieur. + - Il va maintenant falloir dire aux deux boutons d'écouter les évènements de clic et de les gérer avec la méthode `showSlideRelative` : + - Récupérez les références aux boutons par id grâce à [`document.getElementById`](https://developer.mozilla.org/fr/docs/Web/API/Document/getElementById) + - Utilisez la méthode [`addEventListener`](https://developer.mozilla.org/fr/docs/Web/API/EventTarget/addEventListener) pour ajouter le gestionnaire d'évènements sur un clic + - Le type sera `"click"` + - Le listener sera une [fonction anonyme](https://developer.mozilla.org/fr/docs/Glossary/Function#diff%C3%A9rents_types_de_fonctions) qui appellera `showSlideRelative(1)` ou `showSlideRelative(-1)` selon le bouton (voir aide ci-dessous). + - Validez que votre code fonctionne toujours comme avant. + - Complétez le compte-rendu et faites un nouveau commit. + + +!!! question Aide + Pour ajouter un gestionnaire d'évènements il faut passer un fonction **sans paramètre** à `addEventListener`. Or notre fonction `showSlideRelative` prend un paramètre (1 ou -1). + Il faut donc trouver une solution pour passer le paramètre directement lors de la création du gestionnaire d'évènements. + + Pour cela on peut créer une nouvelle fonction à usage unique, qui ne prendra aucun paramètre et appellera directement `showSlideRelative(1)` ou `showSlideRelative(-1)` selon le bouton. + + Ce type de fonctions à usage unique est très courant en JavaScript. C'est pour cela qu'il y a une syntaxe permettant de créer des fonctions anonymes (sans nom) qu'on peut utiliser dans ce cas. + + Deux syntaxes équivalentes sont possibles : + - La syntaxe classique d'une déclaration de fonction, sans nom : `(function () { /* mon code ici */ });` + - La syntaxe fléchée, plus courte : `() => { /* Mon code ici */ };` + + +!!! note Dans le compte rendu + - Expliquez ce que vous avez changé dans cette partie, et pourquoi. + + +## Pour aller plus loin + +### Bonus - Améliorer le style du carrousel pour qu'il ressemble à celui de l'image du résultat attendu + +**Objectif :** Compléter le HTML et le CSS pour avoir des boutons et un compteur d'images dans le style de l'image du résultat attendu du sujet. + + +### Bonus - Sélectionner l'image à afficher avec un clic + +**Objectif :** Ajouter des boutons pour sélectionner une image précise sans cliquer plusieurs fois sur les boutons de rotation + +!!! example À faire + Sur l'image résultat attendu, vous avez pu voir en bas de l'image, au centre des points gris et un blanc. + + Dans cette partie, vous allez réutiliser toutes les notions vues au cours de l'activité pour dessiner cette zone et rendre les points cliquables. + - HTML : il faudra ajouter un `div` de classe `dots` contenant des `span` de classe `dot` à la fin de la div `slideshow`. Le ● est le caractère unicode `●` + - CSS : il faut mettre la position de `dots` en relative et jouer avec `top` et `right` pour bien positionner la boîte. Améliorez le style pour un aspect visuel ressemblant à celui de l'image. + - CSS : prévoyez une classe `active` pour le point correspondant à l'image en cours. Cela changera juste la couleur du bouton en blanc. On ajoutera cette classe au bon élément via le JS. + - JS : Modifiez `slideShow` pour ajouter la classe `active` au point d'indice `index` (et la retirer des autres). Vous utiliserez la [propriété `className`](https://developer.mozilla.org/fr/docs/Web/API/Element/className) + - JS : Modifiez votre initialisation pour ajouter des gestionnaires d'évènements aux points (utilisez une boucle). Il faudra appeler `showSlide(i)` dans le gestionnaire, avec i l'indice du point (correspondant à l'indice de l'image) -```admonish note title="Dans le compte rendu" -- Que fait la propriété CSS `position` ? -- Pourquoi avons-nous changé cette propriété dans `slideshow` et les boutons ? -- Que font `top`, `right` et `left` ? Dans quel cas peut-on les utiliser ? -- Expliquer ce que vous avez fait à cette étape -``` diff --git a/src/cours/CIEL1/05-web-js/activite4.md b/src/cours/CIEL1/05-web-js/activite4.md deleted file mode 100644 index 484119c..0000000 --- a/src/cours/CIEL1/05-web-js/activite4.md +++ /dev/null @@ -1,66 +0,0 @@ - -### 6 - Effectuer une rotation automatique - -**Objectif :** Changer l'image affichée toutes les deux secondes automatiquement - -```admonish travail -- Lire la documentation de la fonction [`setInterval`](https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval) et celle de [`setTimeout`](https://developer.mozilla.org/fr/docs/Web/API/Window/setTimeout). Choisir celle qui vous paraît la plus adaptée. Justifier dans le compte rendu. -- Quelle fonction (déjà écrite par vos soins) allez-vous appeler à intervalles réguliers pour faire tourner votre carousel ? Ecrivez le code correspondant. Utilisez l'aide ci-dessous. -- Validez que votre code fonctionne. -- Mettez à jour votre compte rendu et faites un commit. -``` - -```admonish help title="Aide" -- Nous devons passer une **fonction** en paramètre à `setInterval` (ou `setTimeout`). Il s'agit bien d'une fonction, et non pas d'un appel à la fonction (qui ne donnerait qu'un seul résultat) ! C'est `setInterval` qui se chargera d'appeler votre fonction à intervalles réguliers. -- Mais pourtant, nous avons besoin de passer des paramètres à cette fonction. Il faut donc une solution pour les passer également. -- Deux possibilités pour ça : - - `setInterval` propose de prendre des arguments supplémentaires, qui seront passés à la fonction (voir doc) - - on utilise une fonction anonyme qui ne prend pas de paramètre avec la syntaxe suivante : - ~~~js - () => mafonction(param1, param2, ...) - ~~~ -``` - -```admonish note title="Dans le compte rendu" -- Justifier le choix entre `setInterval` et `setTimeout` et expliquer l'algorithme que vous avez choisi pour changer d'image toutes les deux secondes. -- `setInterval` et `setTimeout` permettent de passer une fonction ou un bout de code sous forme de chaîne de caractères comme paramètre. Qu'allez vous préférer et pourquoi ? Pensez à vérifier d'éventuelles problématiques de sécurité. -``` - -### 7 - Segmenter le JavaScript et le HTML - -**Objectif :** Lier les actions des boutons directement depuis le CSS pour une meilleure maintenabilité du code - -```admonish travail - -``` - -```admonish help title="Aide" -``` - -```admonish warning title="Attention" -``` - -```admonish note title="Dans le compte rendu" -``` - -## Pour aller plus loin - -### Bonus - Sélectionner l'image à afficher avec un clic - -**Objectif :** Ajouter des boutons pour sélectionner une image précise sans cliquer plusieurs fois sur les boutons de rotation - -```admonish travail -- -``` - -```admonish help title="Aide" -``` - -```admonish warning title="Attention" -``` - -```admonish note title="Dans le compte rendu" -``` - - -### Ressources diff --git a/src/cours/CIEL1/05-web-js/images/final.png b/src/cours/CIEL1/05-web-js/images/final.png new file mode 100644 index 0000000..c8fa7d7 Binary files /dev/null and b/src/cours/CIEL1/05-web-js/images/final.png differ