Cours de Développement Web: HTML, CSS, JS
Cours de Développement Web: HTML, CSS, JS
A. Paquot, M. Codutti
crédit image
Introduction Contrat pédagogique
Apprendre à développer
des applications web
Parcours
WEBG2 Coté client (pas de serveur)
HTML, CSS, JavaScript, jQuery, Bootstrap
Cette année
Rythme
Bimestre 3 Bimestre 4
Cours 4h -
Labo 2h 4h
Ressources
Slides et liens utiles sur poÉSI
Évaluation
Pas d’examen
Évaluation continue aux labos
(avec des questions théoriques)
Charge de travail
5 ECTS =⇒ 125 heures de travail
Présentiel = 60h
Travail personnel = 65h
crédit image
Introduction Le navigateur WEB
Que signifie le 80 ?
Le serveur répond
Trying 176.31.161.61...
Connected to www.esi−bru.be.
Escape character is ’^]’.
Voici la réponse
<!DOCTYPE html>
<html>
...
</html>
Déchiffrer la presse
« C’est à la mi-2017
que le navigateur Firefox devrait changer
de moteur, abandonnant Gecko pour adopter
définitivement le moteur de rendu Quantum
qui promet des performances accrues. »
https://www.generation-nt.com/firefox-changement-moteur-2017-actualite-1937843.html
crédit image
Introduction Le serveur web
Ne pas confondre
VS
crédit image
Introduction Anatomie d’une page WEB
crédit image
Introduction Compétences à atteindre
Exemples
1 Un calculateur d’obésité
2 Un jeu de mémoire
3 Une liste de tâches
4 Un QCM
5 ...
crédit image
HTML Hello World !
HTML ?
HyperText Markup Language
Langage de description d’un document
Mélangeant textes, images. . .
Destiné à être affiché sur un écran
Offrant des hyperliens
crédit image
HTML Historique du WEB
Naissance du web
1991 - Web
Protocole HTTP + langage HTML
Inventé au CERN par Tim Berners-Lee
Toute première page WEB :
https://www.w3.org/History/19921103-hypertext/hypertext/WWW/TheProject.html
crédit image
crédit image
HTML Les bases de la syntaxe
Un langage à balises
HTML est un langage à balises (markup)
<balise> . . . </balise>
Exemple
sample/html/head.html
1 <head>
2 <title>Site de MCD</title>
3 <meta charset="UTF−8">
4 <meta name="description" content="Page d’accueil de mon site">
5 <meta name="keywords" content="ESI, MCD">
6 <meta name="author" content="MCD">
7 <link rel="stylesheet" href="monstyle.css">
8 </head>
Les attributs
Un attribut configure une balise
Syntaxe :
nom="valeur" ou nom=’valeur’
nom (quelques rares attributs sans valeur)
5 deux<br>lignes.
crédit image
HTML Les liens
Le lien internet
Que serait l’hypertexte sans lien ?
<a href="adresse cible">texte à afficher</a>
Exemple : <a href="http://www.he2b.be/">HE2B</a>
Le lien est
absolu (ex : href="http://www.he2b.be/")
crédit image
HTML Les images
crédit image
HTML Les listes
Listes imbriquées
sample/html/ul-ol.html
1 Technologies
2 à apprendre
3 <ol>
4 <li>HTML</li>
5 <li>CSS
6 <ul>
7 <li>avec Bootstrap</li>
8 </ul>
9 </li>
10 <li>Javascript
11 <ul>
12 <li>avec jQuery</li>
13 </ul>
14 </li>
15 </ol>
Listes descriptives
sample/html/dl.html
1 Technologies WEB
2 <dl>
3 <dt>HTML</dt>
4 <dd>Permet de définir le contenu</dd>
5 <dt>CSS</dt>
6 <dd>Permet de définir la mise en page</dd>
7 <dt>Javascript</dt>
8 <dd>Pour la dynamique</dd>
9 </dl>
crédit image
HTML Les tableaux
Cases d’entête
td = case de donnée, th = case d’entête
sample/html/table2.html
1 <table border="1">
2 <tr><th>WEBG2</th><th>Bim3</th><th>Bim4</th></tr>
3 <tr><th>Cours</th><td>4h</td><td>−</td></tr>
4 <tr><th>Labo</th><td>2h</td><td>4h</td></tr>
5 </table>
Extension de case
Une entrée peut s’étendre sur plusieurs colonnes
(colspan) ou plusieurs lignes (rowspan)
sample/html/table3.html
1 <table border="1">
2 <tr><th>WEBG2</th><th>Bim3</th><th>Bim4</th></tr>
3 <tr><th>Cours</th><td>4h</td><td>−</td></tr>
4 <tr><th>Labo</th><td colspan="2">3h</td></tr>
5 </table>
crédit image
HTML Les formulaires
Introduction
Un formulaire simple
sample/html/form.html
1 <form>
2 login: <input type="text"><br>
3 password: <input type="password"><br>
4 âge: <input type="number"><br>
5 <button>Inscription</button>
6 </form>
La balise <input>
Le label
Sans effet visuel
Associé à une saisie
Sélectionne la saisie si cliqué
Utilisé par les lecteurs d’écran
Important pour les cases à cocher
sample/html/label.html
1 <form>
2 <label for="nom">Nom:</label>
3 <input id="nom">
4 </form>
La zone de texte
Pour permettre d’entrer un code plus long
sample/html/textarea.html
1 <form>
2 <label for="comment">Commentaire:</label><br>
3 <textarea id="comment"></textarea>
4 </form>
Un texte indicatif
Alternative aux labels (input et textarea)
sample/html/placeholder.html
1 <input type="mail" placeholder="Votre email...">
2 <br>
3 <textarea placeholder="Votre commentaire..."></textarea>
Attributs
checked
Indique le choix par défaut
name
Sera utilisé lors de l’envoi du formulaire au serveur
Ici, en plus, indique que les boutons sont liés
sample/html/qcm.html
1 <form>
2 <p>Quel langage connaissez−vous ?</p>
3 <input type="checkbox" name="answer" value="Java">
4 <label for="ans1">Java</label><br>
5 <input type="checkbox" name="answer" value="C++">
6 <label for="ans2">C++</label><br>
7 <input type="checkbox" name="answer" value="JavaScript">
8 <label for="ans3">JavaScript</label><br>
9 <button type="button">Valider</button>
10 </form>
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 64 / 423
HTML Les formulaires
Les listes
Les choix simples et multiples
peuvent être présentés sous
forme d’une liste
sample/html/list.html
1 <form>
2 <p>Quelle est la marque de votre téléphone ?</p>
3 <select> <!−− <select multiple> si plusieurs réponses −−>
4 <option value="apple">Apple</option>
5 <option value="samsung">Samsung</option>
6 <option value="huawei">Huawei</option>
7 <option value="other">Autre</option>
8 </select>
9 <button>Valider</button>
10 </form>
Validation
On peut indiquer des contraintes sur les champs des
formulaires
required : la donnée est requise
crédit image
HTML Les balises sémantiques
Sémantique vs style
Historiquement, HTML propose des balises
sémantiques
<h1> : indique un titre de niveau 1
<a> : indique un lien
de style
<b> : pour mettre en gras
<em> : pour mettre en italique
Sémantique vs style
C’est pareil au niveau des attributs
href : apporte une sémantique
Balises structurantes
HTML 5 introduit des balises sémantiques de structure
Balises structurantes
Certaines sont faciles à comprendre
header entête commun à chaque page
footer pied de page commun à chaque page
nav menu principal de navigation
main partie principale différente des autres pages
(exclut donc les 3 parties ci-dessus)
Exemple
sample/html/struct1.html
1 <!DOCTYPE html>
2 <html>
3 <head><title>Page de MCD</title></head>
4 <body>
5 <header>
6 <h1>Page personnelle de MCD</h1>
7 </header>
8 <nav>
9 <ul>
10 <li>Accueil</li>
11 <li>Mon CV</li>
12 <li>Mes cours</li>
13 <li>Mes hobbys</li>
14 </ul>
15 </nav>
16 <main>
17 Contenu ici !
18 </main>
19 <footer>
20 <p>Dernière mise à jour, juin 2018</p>
21 </footer>
22 </body>
23 </html>
Balises structurantes
Un menu de navigation se définit ainsi
sample/css/menu.html
1 <nav>
2 <ul>
3 <li><a href="#home">Home</a></li>
4 <li><a href="#news">News</a></li>
5 <li><a href="#contact">Contact</a></li>
6 <li><a href="#about">About</a></li>
7 </ul>
8 </nav>
Balises structurantes
D’autres balises sont plus sujettes à discussion
article Contenu qui peut se comprendre sans le
reste : un article wikipedia, un commentaire. . .
section Regroupe des éléments liés
Contient typiquement un entête
Un article peut contenir des sections. . .
et inversement
aside Contenu annexe
Exemple
sample/html/struct2.html
1 <main>
2 <section>
3 <header><h1>Mes cours</h1></header>
4 <article>
5 <h1>WEBG2</h1>
6 <h2>Contenu</h2>
7 blabla
8 <h2>Évaluation</h2>
9 blabla
10 </article>
11 <article>
12 <h1>WEBG4</h1>
13 blabla
14 blabla
15 </article>
16 </section>
17 </main>
Balises structurantes
Dans vos recherches, vous trouverez souvent du
code comme celui-ci
<div id="header">
Et encore d’autres
mark : pour du texte surligné
pre : pour garder la mise en forme du texte
...
sample/html/spaces2.html
1 En <mark>Java</mark>,
2 le "Hello, world !" est :
3 <pre>
4 public class Test {
5 public static void main(String[] args) {
6 System.out.println("Hello, world !");
7 }
8 }
9 </pre>
crédit image
HTML Emboîtement et placement
Emboîtement
Certaines balises peuvent se trouver dans une autre :
<head>...<title>...</title>...</head>
<p>...<a>...</a>...</p>
D’autres pas :
<body>...<title>...</title>...</body> : NON
<h1>...<p>...</p>...</h1> : NON
Comment le savoir ?
https://www.w3.org/TR/2014/REC-html5-20141028/semantics.html
Placement du contenu
2 catégories d’éléments :
bloc
Ex : h1, p. . .
Occupe toute la largeur de la page
Saut de page avant et après
en ligne
Ex : a, img. . .
Occupe juste la largeur nécessaire
Se place à droite de l’élément précédent (si en ligne)
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 84 / 423
HTML Emboîtement et placement
Placement du contenu
crédit image
Cf. https://www.w3schools.com/html/html_entities.asp
Explorer
Il existe beaucoup plus de balises.
À vous d’explorer la richesse d’HTML
www.w3schools.com/html/
https://developer.mozilla.org/fr/docs/Web/HTML/Reference
www.pierre-giraud.com/html-css-apprendre-coder-cours/
crédit image
CSS Introduction
CSS vs HTML
HTML permet de définir le contenu
CSS permet de gérer le style : police, taille,
couleurs, mise en page. . .
HTML possède aussi des balises/attributs de mise
en page
Ex : <b>, <center>, border="1"
Non recommandé
Exemple de base
Pour indiquer que les titres de niveau 1 sont en brun
sample/css/hello.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <style>h1 {color: maroon}</style>
5 </head>
6 <body>
7 <h1>Hello, world !</h1>
8 </body>
9 </html>
Histoire de CSS
CSS = Cascading Style Sheets
Créé en 1994 par Håkon Wium Lie et Bert Bos
En est à la version 3
crédit image
CSS Syntaxe
Syntaxe de CSS
Propriétés de CSS
Que peut-on définir ?
La police, la taille, les couleurs (texte et fond)
Les bordures et les marges
Mise en page des liens, des listes, des tables. . .
Positionnement des éléments dans la page
Adaptation à la taille de la page
...
Où placer le CSS ?
Plusieurs possibilités
1 Dans le fichier HTML entre les balises <style>
sample/css/style.html
1 <head>
2 <style>
3 p{
4 color: red
5 }
6 </style>
7 </head>
8 <body>
9 <p>Bonjour</p>
10 </body>
Où placer le CSS ?
2 Dans un fichier à part (recommandé)
D’extension .css
Sans les balises <style>
sample/css/mystyle.css
1 p{
2 color: red;
3 }
Où placer le CSS ?
3 Directement dans la balise
Sans la partie sélecteur
OK pour de petites modifications / un test
<h1 style="color: maroon; margin−left:30px;">
crédit image
CSS Le texte
La police
sample/css/basic-texte.html
1 p{
2 font−family: cursive;
3 font−size: 4em;
4 font−weight: bold;
5 font−style: italic;
6 font−variant: small−caps;
7 }
crédit image
CSS Les tailles (I)
crédit image
CSS La couleur
La couleur
sample/css/color.html
1 p{
2 background−color: steelblue;
3 color: aliceblue;
4 }
Via un nom
Via le système RGB
Via le système HSL
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 106 / 423
CSS La couleur
La couleur
Via un nom
Il en existe 140 : black, chocolate, navy
(cf. https://www.w3schools.com/colors/colors_names.asp)
Le système RGB
Quantité de rouge (R), vert (G) et bleu (B)
Chaque valeur de 0 à 255
En hexadécimal : #808000 (un jaune)
En décimal : rgb(128, 128, 0) (idem)
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 107 / 423
CSS La couleur
La couleur (suite)
Le système HSL
Teinte (hue) de 0 à 360
Saturation de 0% (gris) à 100% (coloré)
Luminosité de 0% (noir) à 100% (blanc)
hsl(0, 100%, 80%) (rouge intense et clair)
hsl(80, 50%, 30%) (gris-vert foncé)
Pour s’exercer :
https://www.w3schools.com/colors/colors_hsl.asp
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 108 / 423
CSS La couleur
Association de couleurs
Pour choisir des couleurs qui vont bien ensemble :
https://www.w3schools.com/colors/colors_schemes.asp
crédit image
CSS Les liens
crédit image
CSS Les boites
Une boite
Chaque balise html occupe une boite dans la page
Une boite
Bien différencier :
margin (marge)
espace entre la bordure et les autres éléments
padding (remplissage)
espace entre le contenu et la bordure
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 119 / 423
CSS Les boites
La taille
On peut définir la taille d’une boite
sample/css/box-size.html
1 <p style="border: solid; width: 200px;">
2 Hello, World !
3 </p>
4 <p style="border: solid; width: 20%; height: 10em">
5 Hello, World !
6 </p>
La taille de quoi ?
Dépend de la valeur de box-sizing
content-box : du contenu uniquement (défaut)
border-box : contenu + padding + bordure
sample/css/box-size2.html
1 <p style="border: solid; width: 200px;">
2 Hello, World !
3 </p>
4 <p style="border: solid; width: 200px; box−sizing: border−box;">
5 Hello, World !
6 </p>
Marge automatique
Une valeur possible pour margin : auto
Valeur calculée par le navigateur
Prend tout l’espace disponible, équitablement
sample/css/margin-auto.html
1 <p style="border: solid; width: 50%; margin: auto">
2 Cadre centré.
3 </p>
4 <p style="border: solid; width: 50%; margin−left: auto">
5 Cadré aligné à droite.
6 </p>
crédit image
CSS Les tailles (II)
em ou rem ?
sample/css/emvsrem.html
1 <h1 style="font−size: 2em; border: solid; padding−top: 1em">
2 Padding 1em
3 </h1>
4 <h1 style="font−size: 2em; border: solid; padding−top: 1rem">
5 Padding 1rem
6 </h1>
vw ou % ?
sample/css/vwvspourcent.html
1 <body style="width: 50%">
2 <h1 style="width: 50%; background−color: gray">Titre en 50%</h1>
3 <h1 style="width: 50; background−color: gray">Titre en 50vw</h1>
crédit image
CSS Identifier les éléments
Identifiant
Que faire si on veut appliquer un style à un élément en
particulier ?
Donner
un identifiant à un élément
<p id="conclusion">Bonjour</p>
Lier
le style à cet identifiant
#conclusion {border: solid}
Classe
Si on veut appliquer un style à plusieurs éléments ?
Attribuer
une classe aux éléments
<p class="important">Bonjour</p>
Lier
le style à la classe
.important {color: red}
Exemple
Le CSS
sample/css/idclass.html
1 .deleted {text−decoration: line−through}
2 #second {background−color: black; color:white}
3 p {color: darkolivegreen}
Le HTML
sample/css/idclass.html
1 <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
2 <p id="second">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
3 <p class="deleted">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
4 <p>Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
5 <p class="deleted">Lorem ipsum dolor sit amet, consectetur adipiscing elit.</p>
Le Cascading de CSS
Si plusieurs règles peuvent s’appliquer :
Elle se superposent
Priorité en cas de conflit : #id > .class > balise
Priorité identique : la dernière gagne
Plus complexe :
https://openweb.eu.org/articles/cascade_css
div et span
Et si on doit appliquer un style à une partie sans balise ?
1 span
Balise neutre (pas de sens particulier)
Entoure un bout de texte
sample/css/span.html
1 .stabilo {background−color: yellow;}
2 <p>Le <span class="stabilo">CSS</span> c’est super !</p>
div et span
2 div : balise neutre, destinée à entourer des blocs
sample/css/div.html
1 <p>Phrase 1</p>
2 <div style="border: solid thick green">
3 <p>Phrase 2</p>
4 <p>Phrase 3</p>
5 </div>
6 <p>Phrase 4</p>
crédit image
CSS Disposition des boites
Expérience 1
sample/css/box-exp1.html
1 <p style="border: solid; width: 40%;">
2 Hello, World !
3 </p>
4 <p style="border: solid; width: 40%;">
5 Hello, World !
6 </p>
Expérience 2
sample/css/box-exp2.html
1 <p style="border: solid">
2 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
3 Donec at leo mattis, scelerisque mauris
4 <span style="background−color: yellow; margin: 1em">
5 condimentum , tincidunt ante.
6 </span>
7 Duis lorem libero, tristique vitae urna eu, lobortis luctus diam.
8 Pellentesque lacinia quam.
9 </p>
Rappel HTML
Les éléments HTML appartiennent à une catégorie
block : h1, p et. . . div
Se place en dessous de l’élément
précédent
Passage à la ligne après
inline : a, texte et. . . span
Se place à droite du précédent
(si pas bloc)
Passage à la ligne possible
Et les boites peuvent s’emboiter. . .
Disposition - Exemple
sample/css/flux.html
1 <div style="border: solid red; margin:5px">
2 <span style="border: solid green; margin:5px">texte 1</span>
3 <div style="border: solid yellow; margin:5px">
4 <span style="border: solid green; margin:5px">texte 2</span>
5 <span style="border: solid green; margin:5px">texte 3</span>
6 </div>
7 </div>
8 <div style="border: solid grey; margin:5px">
Disposition - display
1 display : block
Défaut pour de nombreuses balises : p, div. . .
Passage à la ligne avant et après (placement vertical)
On peut définir sa largeur (100% par défaut)
On peut définir sa hauteur
(juste ce qui est nécessaire par défaut)
Disposition - display
2 display : inline
Défaut pour de quelques balises : a, span. . .
Également pour chaque mot d’un texte
Se place à droite si possible (placement horizontal)
Un espace entre chaque élément
On ne peut pas définir sa largeur (juste ce qu’il faut)
On ne peut pas définir sa hauteur (juste ce qu’il faut)
On ne peut pas définir de marge haute/basse
Le padding haut/bas déborde sur le reste
Disposition - display
3 display : inline-block
Se place comme inline
On peut définir les tailles comme block
Alignement vertical définit par vertical-align
4 Et encore d’autres. . .
Disposition - Exemple
sample/css/inline.html
1 <style>
2 p{
3 width: 40%;
4 height: 4em;
5 border: solid;
6 display: block; /∗ inline, inline−block∗/
7 }
8 </style>
9 <p>
10 Lorem ipsum dolor sit amet, consectetur adipiscing elit.
11 </p>
12 <p>
13 Duis lorem libero, tristique vitae urna eu, lobortis luctus diam.
14 </p>
Disposition - Exemple
block inline
inline-block
crédit image
CSS Les listes
Exemples
list−style−type: upper−alpha
list−style−image: url(’icon.png’)
Application - un menu
Essayons de mettre en forme un menu.
1 La partie HTML est souvent présentée comme un
liste de liens
sample/css/menu.html
1 <nav>
2 <ul>
3 <li><a href="#home">Home</a></li>
4 <li><a href="#news">News</a></li>
5 <li><a href="#contact">Contact</a></li>
6 <li><a href="#about">About</a></li>
7 </ul>
8 </nav>
Application - un menu
2 Voici une mise en page possible
sample/css/menu-simple.html
1 ul {
2 list−style−type: none;
3 width: 80px;
4 }
5 a{
6 text−decoration: none;
7 display: block;
8 background−color: aliceblue;
9 color: black;
10 border: solid aliceblue;
11 padding−left: .5em;
12 }
13 a:hover {
14 border: solid steelblue;
15 }
16 a:active {
17 background−color: steelblue;
18 color: white;
19 }
Application - un menu
3 On obtient
crédit image
CSS Positionnement
La position
L’attribut position modifie la position d’un élément
Ne pas confondre
display 6= position
La position
2 relative : décalage par rapport au flux normal
sample/css/relative.html
1 Hello,
2 <span style="position: relative; bottom: 10px">W</span>orld !
sample/css/relative2.html
1 <p>Bien malin celui qui
2 <span style="position: relative; right: 6em">parvient à me</span>
3 lire</p>
La position
3 fixed : un endroit précis de l’écran
sample/css/fixed.html
1 <h1>Titre 1</h1>
2 <h1>Titre 2</h1>
3 <h1>Titre 3</h1>
4 <h1>Titre 4</h1>
5 <p style="position:fixed; top:0px; right:0px">Hello</p>
La position
4 absolute : un endroit précis de la page
sample/css/absolute.html
1 <h1>Hello</h1>
2 <p style="position:absolute; top:0px; right:0px">world !</p>
La position
4 absolute : cas particulier
Si dans une boite avec une position non static
Se place par rapport à cette boite
sample/css/absolute2.html
1 <h1>Mon jeu</h1>
2 <div style="border:solid; width:400px; height:100px; position:relative">
3 <span style="position:absolute; top:0px; right:0px">Score 00000</span>
4 </div>
La position
5 sticky : place de la colle à un endroit
Commence dans le flow normal
Reste collé lorsqu’il atteint l’endroit indiqué
Tant que le parent est visible
sample/css/sticky.html
1 <h1>L’entête du site</h1>
2 <nav style="background−color: lightblue; position: sticky; top: 0px">
3 Le menu doit toujours être visible
4 </nav>
crédit image
CSS Sélecteurs complexes
On sait sélectionner
Un type de balise (p)
Une classe (.classe), un id (#id)
On peut les combiner
h1,h2 : s’applique à <h1> et <h2>
table p : s’applique aux <p> dans un table
p.info : s’applique aux <p> ayant la classe info
Plus d’infos
https://www.xul.fr/css/selecteur.php
Exercices
Que va désigner : div.menu a ?
Quelle différence entre div.menu et div .menu ?
Comment désigner le premier élément d’une liste ?
Un petit jeu ? http://flukeout.github.io/
crédit image
CSS Structure d’une page et grille
La partie HTML
Voici une page générale
sample/css/page.html
1 <body>
2 <header>
3 L’entête
4 </header>
5 <nav>
6 Le menu
7 </nav>
8 <main>
9 Le contenu de la page
10 qui est à priori plus grand que la partie menu
11 </main>
12 <footer>
13 Le pied de page
14 </footer>
15 </body>
Ce qu’on veut
Essayons d’obtenir cette mise en page
On a
un entête
un pied de page
un menu à gauche
le contenu de la page
CSS 3 introduit un standard : les grilles (grid)
Grid
Ajout d’une nouvelle valeur pour display : grid
Grande souplesse pour désigner
Les différentes parties de la grille
Leur taille
Leur position
Grid - La solution
Voici une solution possible avec les grilles
sample/css/grid.html
1 body {
2 display: grid;
3 grid-template-columns: auto 1fr;
4 grid-template-rows: auto 1fr auto;
5 grid-template-areas: "header header"
6 "menu main"
7 "footer footer";
8 grid-gap: 4px;
9 }
10 header {grid-area: header;}
11 nav {grid-area: menu; align-self: start}
12 main {grid-area: main;}
13 footer {grid-area: footer;}
Grid - Exercice
Comment modifier la solution précédente pour obtenir
ceci ?
crédit image
CSS Menu et boîte flexible
Ce qu’on veut
La plupart des pages présentent un menu
Comment l’obtenir ?
La partie HTML
La partie HTML est souvent présentée comme un
liste de liens
sample/css/menu.html
1 <nav>
2 <ul>
3 <li><a href="#home">Home</a></li>
4 <li><a href="#news">News</a></li>
5 <li><a href="#contact">Contact</a></li>
6 <li><a href="#about">About</a></li>
7 </ul>
8 </nav>
sample/css/center.html
1 <div style="display: flex;
2 justify-content: center;">
3 <h1 style="border: thick solid steelblue;
4 border-radius: 1em;
5 background-color: rgba(173, 216, 230, .3);
6 color: steelblue;
7 padding: .25em 1em">
8 Titre centré avec cadre ajusté
9 </h1>
10 </div>
Le code HTML
sample/jquery/feux0.html
1 <div class="feux">
2 <div class="feu rouge"></div>
3 <div class="feu orange"></div>
4 <div class="feu vert"></div>
5 </div>
crédit image
CSS Image et animation
Arrière plan
Une image peut servir d’arrière plan
sample/css/background.html
1 <style>
2 #scene {
3 border: solid;
4 width: 250px; height: 100px;
5 position: relative;
6 background−image: url("ciel−nocturne.png");
7 background−size: cover;
8 }
9 </style>
10 <div id="scene"></div>
Transition
On peut appliquer une transition entre 2 valeurs d’une
propriété
sample/css/transition.html
1 <style>
2 #cube {
3 width: 100px;
4 height: 100px;
5 background−color:red;
6 transition: width 1s, height 1s;
7 }
8 #cube:hover {
9 width: 200px;
10 height: 200px;
11 }
12 </style>
13 <div id="cube"></div>
Animation
On peut aussi définir des animations plus complexes
sample/css/animation.html
1 <style>
2 #cube {
3 width: 100px; height: 100px;
4 background−color:red;
5 animation−name: rainbow;
6 animation−duration: 2s;
7 animation−iteration−count: infinite;
8 animation−direction: alternate−reverse;
9 animation−timing−function: linear;
10 }
11
12 @keyframes rainbow {
13 from {
14 width: 200px; height: 100px;
15 }
16 to {
17 width: 100px; height: 200px;
18 }
19 }
20 </style>
21 <div id="cube"></div>
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 181 / 423
CSS Image et animation
Transparence
On peut vouloir jouer avec la transparence
De 0 (transparent) à 1 (opaque)
opacity : opacité de tout l’élément
Couleur (texte ou fond) avec transparence
rgba(128, 128, 0, 0.2) (rouge presque transparent)
La transparence
Exemple
Éléments flottants
float et clear ont été pensés pour permettre à du texte
d’entourer d’autres éléments (ex : une image)
sample/css/float.html
1 <img src="http://he2b.be/images/HE2B−Logo−DEF−300.jpg"
2 style="float:left; height:50px">
3 <img src="http://he2b.be/images/campus_ESI.gif" style="float:left; height:50px">
4 <img src="http://www.heb.be/esi/images/poesi.png" style="float:right; height:50px">
5 <p>
6 Ce texte va entourer toutes les images pour autant qu’il soit assez long.
7 Comme dans cet exemple si l’écran est réduit au minimum.
8 Bon, il faut quand même qu’il soit assez assez assez assez assez assez long.
9 </p>
10 <p style="clear:both">Mais pas celui−ci</p>
Icônes
sample/css/icon.html
1 <head>
2 <link href="https://fonts.googleapis.com/icon?family=Material+Icons"
,→ rel="stylesheet">
3 </head>
4 <body>
5 <i class="material−icons">done</i>
6 <i class="material−icons">person</i>
7 <i class="material−icons">eco</i>
8 <i class="material−icons">star</i>
9 <i class="material−icons">star</i>
10 <i class="material−icons">star_half</i>
11 <i class="material−icons">info</i>
12 </body>
Liste : https://material.io/resources/icons/
crédit image
CSS Fonction, variable et calcul
Variable
On peut définir une variable et la réutiliser
Don’t Reapeat Y ourself
sample/css/variable.html
1 :root {
2 −−main−color: steelblue;
3 −−main−light−color: aliceblue;
4 }
5 header {
6 background−color: var(−−main−color);
7 color: var(−−main−light−color)
8 }
9 nav {
10 background−color: var(−−main−light−color);
11 color: var(−−main−color);
12 }
Calcul
La fonction calc() permet de faire des calculs
Ex : Reprenons le vaisseau
Sa taille est de 39px
Comment faire pour qu’il aille exactement de haut
en bas ?
@keyframes shipYoyo {
from {top: 0%;}
to {top: calc(100% − 39px);}
}
Explorer
crédit image
JavaScript Motivation
Que manque-t’il ?
Il faut introduire du code (en JavaScript)
Qui implémente l’algorithme suivant :
1 Prendre le contenu du premier champ de saisie
2 Prendre le contenu du second champ de saisie
3 Les additionner
4 Mettre le résultat à la place de « ? »
sample/js/add2.html
1 <form>
2 <input id="nb1" type="number"> +
3 <input id="nb2" type="number">
4 <button type="button">=</button>
5 <output id="sum" >?</output>
6 </form>
crédit image
JavaScript Ce que c’est et d’où ça vient
Historique
1995 - Naissance
Créé par Brendan Eich (Netscape)
Scripts tournant dans un client web
JavaScript 6= Java !
Au départ, beaucoup utilisé comme « gadget »
crédit image
Historique
1996 - 2014 : Évolution confuse
Chaque navigateur a sa variante
Parfois même un nom différent
(JScript de MicroSoft)
=⇒ problèmes de compatibilité
Apparition de concurrents : Flash
Historique
2015 à nos jours : L’âge d’or
Standardisation par ECMA (ECMAScript)
2015 : ECMAScript 6 est une avancée majeure
Son utilisation explose
Présent même sur le serveur : NodeJS
crédit image
JavaScript Hello World !
Fichier externe
Bonne pratique : code dans un fichier à part
D’extension .js
Sans les balises <script>
Appelé
dans le HTML via la variante
<script src="myScript.js"></script>
Dans le head pour les déclarations de fonctions
En fin de body pour l’exécution du code
Fichier externe
sample/js/hello3.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 </head>
5 <body>
6 <script src="hello.js"></script>
7 </body>
8 </html>
sample/js/hello.js
1 console.log("Hello, world !");
Fichier externe
Le fichier externe est préféré dans un développement réel
Plus lisible
Plus maintenable
Plus facile de collaborer
Plus facile de réutiliser
Plus rapide (système de cache)
crédit image
JavaScript Variables, types et calculs
Les variables
Déclarer une variable : let nb = 42;
Pas de type déclaré
Peut changer de type (typage dynamique)
let nb = 42;
nb = "hello";
Vous verrez aussi souvent : var nb = 42;
Sens légèrement différent
let est plus proche de ce qu’on trouve en Java
Demander la valeur
La valeur peut-être demandée à l’utilisateur
Utile surtout pour les tests
sample/js/helloyou.html
1 <!DOCTYPE html>
2 <html>
3 <head></head>
4 <body>
5 <script>
6 let name = prompt("Quel est votre nom ?");
7 console.log("Hello, " + name);
8 </script>
9 </body>
10 </html>
Les nombres
Numeric
Comprend les entiers et les flottants
Opérateurs : +, −, ∗, /, ∗∗, ++, −−
Objet
Math
x = Math.trunc(13/2);
x = Math.sin(Math.PI);
max = Math.max(a,b,c);
console.log(Math.random());
Les chaînes
String
Peut s’écrire "Hello" ou ’Hello’
Backquotes pour inclure des expressions :
‘1+1=${1+1}‘ donne "1+1=2"
Conversions
De
nombreuses conversions automatiques
"a" + 1; // "a1"
1 + "a"; // "1a"
Attention
!
"3" ∗ "4"; // 12
"3" + "4"; // "34"
Conversions
explicites possibles
Number("3") + Number("4"); // 7
let nb = 42;
nb.toString() + nb; // "4242"
Les booléens
Boolean
Est considéré comme faux : false, 0, "". . .
Est
considéré comme vrai : true et tout le reste
Boolean(42); // vrai
if(42) {console.log("hello");} // affiche le message
a=41; if(a=42) {console.log("hello");} // aussi (piège !)
Opérateurs de comparaison : <, >, <=, >=
Opérateurs booléens : !, &&, ||
Opérateurs d’égalité : == (!=) VS === (!==)
5=="5" // vrai : même valeur
5==="5" // faux : même valeur mais pas même type
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 219 / 423
4.5 – Les structures de contrôle
crédit image
JavaScript Les structures de contrôle
Les alternatives
Vous ne vous sentirez pas dépaysé !
sample/js/switch.html
1
2 switch (new Date().getDay()) {
3 case 4:
4 case 5:
sample/js/if.html
1 5 text = "Le weekend arrive...";
2 let time = new Date().getHours(); 6 break;
3 if (time < 10) { 7 case 0:
4 greeting = "Good morning"; 8 case 6:
5 } else if (time < 20) { 9 text = "Weekend !";
6 greeting = "Good day"; 10 break;
7 } else { 11 default:
8 greeting = "Good evening"; 12 text = "Weekend fini :(";
9 } 13 }
Les boucles
Idem pour les boucles !
sample/js/for.html
1
2 for (let i = 0; i < 5; i++) {
3 console.log(i);
4 }
sample/js/while.html sample/js/dowhile.html
1 let i=0; 1 let i=0;
2 while (i < 10) { 2 do {
3 console.log(i); 3 console.log(i);
4 i++; 4 i++;
5 } 5 } while (i < 10);
Principe
Proche d’une liste Java dans le fonctionnement
Emprunts aux tableaux Java pour la syntaxe
Création
En donnant les valeurs : tab = [1, 42, −3];
Ou en le créant vide : tab = [];
Jamais en donnant la taille
Accès et taille
idem Java
sample/js/tablength.html
1 let tab = [1, 42, −3];
2 console.log("Tableau: "+tab); // "Tableau: 1, 42, −3"
3 for(let i=0; i<tab.length; i++) {
4 console.log(tab[i]);
5 }
Mémoire
Un tableau est une référence
sample/js/tabref.html
1 let tab1 = [1,2,3];
2 let tab2 = tab1;
3 tab2[1]=9;
4 console.log("Tableau:"+tab1); // "Tableau: 1, 9, 3"
Le faire grandir
En assignant une valeur à l’élément « suivant »
sample/js/tabadd.html
1 let tab = [];
2 for(let i=0; i<10; i++) {
3 tab[i] = i;
4 }
Ajout
Ajout à la fin : tab.push(52);
Ajout au début : tab.unshift(52);
sample/js/tabpush.html
1 let tab1 = [];
2 let tab2 = [];
3 for(let i=0; i<5; i++) {
4 tab1.push(i);
5 tab2.unshift(i);
6 }
7 // tab1 == [0,1,2,3,4];
8 // tab2 == [4,3,2,1,0];
Suppression
Suppression du dernier élément : last = tab.pop();
Suppression du 1er élément : first = tab.shift();
sample/js/tabpop.html
1 let tab = [1, 42, −3];
2 while(tab.length>0) {
3 console.log(tab.pop());
4 }
5 console.log("tab:"+tab);
Modifier
splice
permet d’ajouter, enlever, remplacer au milieu
tab.splice(où, combien à enlever, éléments à ajouter...);
Enlever les éléments 3 et 4 : tab.splice(3,2);
Insérer en position 3 : tab.splice(3,0,10,11,12);
Remplacer en pos 3 et 4 : tab.splice(3,2,14,15);
sample/js/tabsplice.html
1 let tab = [1, 42, −3, 11, −15, −16, 17];
2 let i = tab.length−1;
3 while(i>=0) {
4 if(tab[i]<0) {
5 tab.splice(i,1);
6 }
7 i−−;
8 }
9 console.log("tab:"+tab);
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 229 / 423
JavaScript Les tableaux
Plusieurs dimensions
Pas de règle spéciale pour un tableau 2D
C’est un tableau de tableaux
sample/js/pascal.html
1 let pascal = [[1],[1,1],[1,2,1],[1,3,3,1]];
2
3 for(let i=0; i<pascal.length; i++) {
4 for(let j=0; j<pascal[i].length; j++) {
5 console.log(pascal[i][j]);
6 }
7 }
8
9 for(let ligne of pascal) {
10 for(let val of ligne) {
11 console.log(val);
12 }
13 }
Les fonctions
Aussi appelée : routine, méthode. . . dans d’autres
contextes
sample/js/fct.html
1 function add (nb1, nb2) {
2 return nb1+nb2;
3 }
4
5 console.log( add(12,30) );
Réflexion :
Que va retourner une méthode multiplierPar2(nb) si on
l’appelle ainsi : multiplierPar2("21") ?
Pas de main
Pas de main
Et ceci ?
sample/js/main2.html
1 <!DOCTYPE html>
2 <html>
3 <head></head>
4 <body>
5 <script>
6 function main() {
7 console.log("Hello, world !");
8 }
9 main();
10 </script>
11 </body>
12 </html>
Pas de main
Et enfin ceci ?
sample/js/main2b.html
1 <!DOCTYPE html>
2 <html>
3 <head></head>
4 <body>
5 <script>
6 function main() {
7 console.log("Hello, world !");
8 }
9 main;
10 </script>
11 </body>
12 </html>
sample/js/main.js
1 function main() {
2 console.log("Hello, world !");
3 }
8 try{
9 console.log(sqrt(−2));
10 } catch(e) {
11 console.log(e.message);
12 }
crédit image
JavaScript L’orienté objet
crédit image
JavaScript Librairies
Les libraires
JavaScript offre des classes comme on peut en
retrouver en Java pour les besoins les plus
courants
Math : constantes et fonctions mathématiques
...
Consultez la documentation pour les détails. . .
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 251 / 423
4.10 – Étude de cas
crédit image
JavaScript Étude de cas
crédit image
jQuery Introduction
jQuery
Bibliothèque JavaScript
Facilite la manipulation des pages
Gère la compatibilité entre navigateurs
De loin la plus utilisée de nos jours
Créée en 2006 par John Resig
Utilisation
Il suffit d’ajouter ceci à la page
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
Syntaxe
jQuery introduit une seule fonction : $
Sélecteur
Désigne ce sur quoi on agit (notation CSS)
$("h1") tous les titres de niveau 1
$("#menu") l’élément d’id menu
$(".menu") tous les éléments de classe menu
$("p.note") tous les paragraphes de classe note
$("[type=password]") tous les éléments qui ont un
attribut type valant password
$(document) tout le document
$(this) l’élément en cours
...
Premier exemple
Cliquer sur le bouton cache tous les paragraphes
sample/jquery/ex1.html
1 <script src=
2 "https://ajax.googleapis.com/ajax/libs/jquery/3.2.1/jquery.min.js">
3 </script>
4 <p>Paragraphe 1</p>
5 <p>Paragraphe 2</p>
6 <p>Paragraphe 3</p>
7 <button>Cliquer</button>
8 <script>
9 $("button").click(
10 function(){
11 $("p").hide();
12 }
13 );
14 </script>
Une précaution
Souvent, on rencontrera plutôt ce code
sample/jquery/ex2.html
1 $(document).ready(
2 function(){
3 $("button").click(
4 function(){
5 $("p").hide();
6 }
7 );
8 }
9 );
Une précaution
Avec un peu d’habitude, vous utiliserez la mise en page
condensée
sample/jquery/ex3.html
1 $(document).ready( function(){
2 $("button").click( function(){
3 $("p").hide();
4 });
5 });
Actions possibles
crédit image
jQuery Événementiel
Définition
Programmation événementielle
Un bout de code est associé à un événement ;
Il est exécuté quand l’événement survient
Action de l’utilisateur
Temps écoulé
Opération terminée
...
vs programmation séquentielle
Différent de la programmation séquentielle
Beaucoup utilisé pour les interfaces graphiques
L’utilisateur contrôle ce qui est fait et quand
En pratique : mélange des 2 sortes de
programmation
Quand a-t-on déjà vu du code événementiel ?
Les événements
load La page est chargée
click L’utilisateur clique sur un bouton
mouseover L’utilisateur passe sur un élément
avec la souris
keydown L’utilisateur appuie sur une touche
du clavier
...
Associer du code
Via les attributs onXXX
sample/js/event.html
1 <body onload="console.log(’load’)"
2 onkeydown="console.log(’key’)">
3 <p onclick="console.log(’click’)">
4 Cliquez
5 </p>
6 <p onmouseover="console.log(’mouseover’)">
7 Passez
8 </p>
9 </body>
En pratique
On appelle une fonction (handler) qui fait le boulot
sample/js/event2.html
1 <button onclick="go()">GO</button>
2 <script>
3 function go() {
4 console.log("C’est parti !");
5 }
6 </script>
En JavaScript pur
L’association événement-code peut se faire en
JavaScript pur
sample/js/event3.html
1 <button id="goButton">GO</button>
2 <script>
3 function go() {
4 console.log("C’est parti !");
5 }
6 document.getElementById("goButton").onclick = go;
7 </script>
Ou avec jQuery
sample/js/event4.html
1 $("#goButton").click(go);
Revoyez ce code
sample/jquery/ex3.html
1 $(document).ready( function(){
2 $("button").click( function(){
3 $("p").hide();
4 });
5 });
Réagir au clavier
Comment savoir quelle touche a été appuyée ?
Chaque handler peut recevoir un objet en paramètre
Généralement appelé : event
Décrit l’événement
Pour le clavier : event.key donne la touche
function brol(event) {
console.log("touche pressée : " + event.key);
}
$(document).keydown( brol );
Exemple - Vaisseau
Reprenons l’exemple du vaisseau spatial
Exemple - Vaisseau
Rappel du css (sans l’animation du vaisseau)
sample/css/vaisseau-jq.css
1 #scene {
2 border: solid; width: 640px; height: 200px;
3 position: relative;
4 background−image: url("ciel−nocturne.png");
5 background−size: cover;
6 }
7 #vaisseau {
8 position: absolute;
9 left: 5%; top: 90px;
10 }
11 #scene {
12 background−repeat: repeat−x;
13 animation: starsSlide 5s linear infinite;
14 }
15 @keyframes starsSlide {
16 from {background−position: 640px 0px;}
17 to {background−position: 0px 0px;}
18 }
Exemple - Vaisseau
Le javascript peut s’écrire
sample/css/vaisseau-jq.js
1 let posShip = 90;
2
3 function moveShip(event) {
4 switch (event.key) {
5 case "ArrowUp":
6 posShip−=4;
7 break;
8 case "ArrowDown":
9 posShip+=4;
10 break;
11 }
12 $("#vaisseau").css("top",posShip); // Va modifier le css !
13 }
14
15 $(document).ready( function() {
16 $(document).keydown(moveShip);
17 });
crédit image
DOM Introduction
Le DOM
Le DOM (Document Object Model)
Permet la manipulation d’une page HTML
Il offre
1 Une vue objet de chaque élément de la page
2 Une vue de la page sous forme d’un arbre d’objets
Identifier un élément
Exemples
Javascript pur :
document.getElementById("goButton")
jQuery : $("#goButton")
Sélecteur
Rappel des sélecteurs
$("h1") tous les titres de niveau 1
$("#menu") l’élément d’id menu
$(".menu") tous les éléments de classe menu
$("p.note") tous les paragraphes de classe note
$("[type=password]") tous les éléments qui ont un
attribut type valant password
$(document) tout le document
$(this) l’élément en cours
...
crédit image
DOM Modifier les éléments
Questionner
.text() : donne son contenu (sans les balises)
Modifier
.text("val") : modifie le contenu (sans balise)
sample/dom/attribut.html
1 <body>
2 <img id="logo" src="../html/esi.png" height="100">
3 <button onclick="size(400)">Grand</button>
4 <button onclick="size(100)">Petit</button>
5 </body>
sample/dom/style.html
1 <body>
2 <p id="para">Un texte</p>
3 <button onclick="color(’red’)">Rouge</button>
4 <button onclick="color(’green’)">Vert</button>
5 </body>
Exemple 4 - this
$(this) représente l’élément associé à l’événement
sample/dom/this.html
1 <script>
2 function strike(item) {
3 item.css("textDecoration","line−through");
4 }
5 </script>
sample/dom/this.html
1 <body>
2 <ul>
3 <li onclick="strike($(this))">Acheter du lait</li>
4 <li onclick="strike($(this))">Apprendre jQuery</li>
5 </ul>
6 </body>
Modifier
Les fonctions de modification retournent l’objet modifié
On peut donc les chainer
Exemple :
$("p.important")
.text("effacé")
.removeClass("important")
.css("background−color", "lightblue");
crédit image
DOM Supprimer
Supprimer un élément
element.remove() enlève l’élément de la page
sample/dom/remove.html
1 <script>
2 function remove(item) {
3 item.remove();
4 }
5 </script>
sample/dom/remove.html
1 <body>
2 <ul>
3 <li onclick="remove($(this))">Acheter du lait</li>
4 <li onclick="remove($(this))">Apprendre jQuery</li>
5 </ul>
6 </body>
Apparition / Disparition
L’élement est toujours présent dans le DOM
.hide/show/toggle() : cache/affiche/bascule l’élément
.fadeIn/fadeOut/slideDown/slideUp() :
apparition/disparition avec effets
.animate(...) : déplacement/agrandissement/. . .
Bonne pratique
Les visuels complexes sont de plus en plus faits avec
CSS3.
crédit image
DOM Parcourir
Parcourir un résultat
Si un résultat est composé de plusieurs éléments,
Ce n’est pas un tableau (pas de for of)
Méthodes spécifiques pour parcourir
elts.first() le premier
elts.last() le dernier
elts.eq(i) le ie (à partir de 0)
elts.length le nombre d’éléments
elts.each(i,fct) exécute la fonction sur chaque élément
Exemples
Parcours classique
sample/dom/parcours1.html
1 let para = $("p");
2 // Parcours avec un for
3 for(let i=0; i<para.length; i++) {
4 console.log("> " + para.eq(i).text());
5 }
Exemples
Se déplacer
elt.parent() le parent direct
elt.children() les enfants
elt.next() le suivant
elt.siblings() tous les frères
elt.find("CSS") cherche un fils correspondant au critère
elt.index() position d’un élément parmi ses frères
Exemple - todo
Supposons une page comme celle-ci
sample/jquery/todo.html
1 <ul>
2 <li>Acheter du lait <button>Fait !</button></li>
3 <li>Apprendre jQuery <button>Fait !</button></li>
4 </ul>
crédit image
DOM Ajouter
Ajouter
Pour créer un nouvel élément
${"<tag>"} crée un élément de tag donné
(. . .)
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 315 / 423
DOM Ajouter
crédit image
Formulaires Envoi du formulaire
Schéma général
La balise form
sample/form/form.html
1 <form action="/monserveur/action.php">
2 First name: <input type="text" name="fname"><br>
3 Last name: <input type="text" name="lname"><br>
4 <button>Submit</button>
5 </form>
form
La balise form
method=
get : envoyé dans l’URL (défaut)
(/monserveur/action.php?fname=xxx&lname=yyy)
post : envoyé dans le corps du message HTTP
sample/form/form1post.html
1 <form action="/monserveur/action.php"
2 method="post">
3 First name: <input type="text" name="fname"><br>
4 Last name: <input type="text" name="lname"><br>
5 <button>Submit</button>
6 </form>
Les boutons
3 types de boutons : <button type="...">
submit : soumet le formulaire (défaut)
button : action définie par JavaScript
reset : réinitialise les champs
Autre version : <input type="..." value="...">
Option 3 : Exemple
1 La première page présente un formulaire
sample/form/form1.html
1 <form action="form2.html">
2 Votre nom: <input type="text" name="nom">
3 <button>Envoyer</button>
4 </form>
crédit image
Formulaires Récupération des données
Sur un serveur
Données sont envoyées au serveur
Dans l’URL (GET)
Ex. : .../action.php?fname=John&lname=Doe
Lors du dialogue HTTP (POST)
Toujours une chaine
Comment les traiter dépend du langage utilisé sur le
serveur
En local
En local, on peut associer du code au bouton de
soumission
sample/form/form-suscribe.html
1 <button type="button" onclick="traiter()">
2 S’inscrire
3 </button>
Les listes
Posons à nouveau une question
avec une seule réponse mais en
présentant les propositions
sous forme d’une liste
1 Le code html5 peut ressembler à ceci
sample/form/list.html
1 <form>
2 <p>Quelle est la marque de votre téléphone ?</p>
3 <select id="brand" multiple>
4 <option value="apple">Apple</option>
5 <option value="samsung">Samsung</option>
6 <option value="huawei">Huawei</option>
7 <option value="other">Autre</option>
8 </select>
9 <button id="validate" type="button">Valider</button>
10 </form>
Validation de formulaire
sample/form/valid.html
1 <form>
2 <fieldset>
3 <legend>Enregistrement</legend>
4 <input type="text" name="login" required
5 pattern="[a−zA−Z0−9]+"
6 title="Ne contient que des lettres et des chiffres"
7 placeholder="login..."><br>
8 <input type="text" name="password" required
9 pattern=".{8,}"
10 title="Doit comporter 8 caractères minimum"
11 placeholder="mot de passe..."><br>
12 <button type="submit">Envoyer</button>
13 </fieldset>
14 </form>
crédit image
JavaScript avancé L’orienté objet
Définition de la classe
sample/js2/rect1.html
1 class Rectangle {
2 }
3
Occupation mémoire
C’est une référence : rect1!=rect2 et rect1==rect3
Présence d’un garbage collector
Pour libérer l’objet : rect2=null
(mais rect1=null ne suffit pas !)
Définition du constructeur
sample/js2/rect2.html
1 class Rectangle {
2 constructor(longueur, largeur) {
3 // Il manque l’assignation des attributs
4 }
5 }
6 let rect1 = new Rectangle(5,2);
Définition d’attributs
sample/js2/rect3.html
1 class Rectangle {
2 constructor(longueur, largeur) {
3 this._longueur = longueur;
4 this._largeur = largeur;
5 }
6 }
7 let rect1 = new Rectangle(5,2);
Ajout de méthodes
sample/js2/rect4.html
1 class Rectangle {
2 constructor(longueur, largeur) {
3 this._longueur = longueur;
4 this._largeur = largeur;
5 }
6 surface() {
7 return this._longueur ∗ this._largeur;
8 }
9 }
10 let rect1 = new Rectangle(5,2);
11 let surf = rect1.surface();
Méthodes statiques
sample/js2/util.html
1 class Util {
2 static hasard(min, max) {
3 let range = max−min+1;
4 return Math.trunc( Math.random()∗range ) + min;
5 }
6 }
7 console.log( Util.hasard(1,6) );
Attributs statiques
Ajout récent
sample/js2/rect8.html
1 class Rectangle {
2 static NB_COTES = 4;
3 }
4 console.log(Rectangle.NB_COTES); // 4
Exemple récapitulatif
sample/js2/Rectangle.js
1 class Rectangle {
2
3 // Constructeurs
4 constructor(longueur, largeur) {
5 this.longueur = longueur; // Appel au setteur
6 this.largeur = largeur;
7 }
8
9 static createCarre(cote) {
10 return new this(cote,cote);
11 }
12
13 // Accesseurs / mutateurs
14 get largeur() {
15 return this._largeur;
16 }
17
18 set largeur(value) {
19 if (value < 0) {
20 throw new Error("Largeur négative: " + value);
21 }
22 this._largeur = value;
23 }
sample/js2/Rectangle.js
1 get longueur() {
2 return this._longueur;
3 }
4
5 set longueur(value) {
6 if (value < 0) {
7 throw new Error("Longueur négative: " + value);
8 }
9 this._longueur = value;
10 }
11
12 // Méthodes
13
14 surface() {
15 return this.longueur ∗ this.largeur;
16 }
17
18 }
sample/js2/Rectangle-test.html
1 let rect1 = new Rectangle(3,2);
2 let rect2 = Rectangle.createCarre(4);
3 console.log(rect1.surface());
4 console.log(rect2.surface());
5 console.log(rect1.longueur);
6 console.log(rect2.largeur);
7 rect1.longueur=10;
8 console.log(rect1.surface());
Héritage
Reprenons l’exemple du cours de Java
1 La classe Point
sample/js2/Point.js
1 class Point {
2
3 constructor(x,y) {
4 this._x = x;
5 this._y = y;
6 }
7
8 get x() { return this._x; }
9 get y() { return this._y; }
10
11 toString() {
12 return "(" + this.x + "," + this.y + ")";
13 }
14 }
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 361 / 423
JavaScript avancé L’orienté objet
Héritage
2 La classe PointColore hérite de Point
sample/js2/PointColore.js
1 class PointColore extends Point {
2
3 constructor(x,y,color) {
4 super(x,y);
5 this._color = color;
6 }
7
8 get color() { return this._color; }
9
10 toString() {
11 return super.toString() + ":" + this.color;
12 }
13 }
Héritage
3 Utilisation
sample/js2/PointColore-test.html
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <script src="Point.js"></script>
5 <script src="PointColore.js"></script>
6 </head>
7 <body>
8 <script>
9 let pc = new PointColore(3,2,"rouge");
10 console.log(pc.toString());
11 </script>
12 </body>
13 </html>
crédit image
JavaScript avancé L’orienté objet old-school
Historique
Le mot-clé class a été introduit en ES6
Avant, autre syntaxe fort différente
On la rencontre encore souvent
À utiliser avec parcimonie
Importance d’en connaitre les bases
Ensemble de propriétés
Une propriété associe une clé (nom, identifiant) et
une valeur
Manipulable classiquement : rect1.largeur
Ressemblance avec une structure
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 366 / 423
JavaScript avancé L’orienté objet old-school
Et
même en supprimer !
delete rect1.nom;
On
peut même utiliser la notation des tableaux
console.log( rect1["largeur"]); // Remarquez les ""
Et
utiliser une expression !
let key = "longueur";
rect1[key] = 10;
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 367 / 423
JavaScript avancé L’orienté objet old-school
Examiner un objet
On
peut tester si une propriété existe
if("couleur" in rect1) {...}
Ou
les ajouter par la suite
rect1.périmètre = function() {
return 2∗(this.largeur+this.longueur);
}
Création en série
Pour simplifier la création de plusieurs objets similaires :
On
peut passer par une fonction
function newRectangle(longueur, largeur) {
return {
longueur: longueur,
largeur: largeur,
surface() {return largeur∗longueur;}
}
}
crédit image
JavaScript avancé Timer
Timer
JavaScript fournit des méthodes pour gérer des délais
setTimeout(fct,delay) :
exécute une fonction après un certain délai
setInterval(fct,delta) :
exécute une fonction à intervalle régulier
Les feux
Revenons à nos feux
sample/jquery/feux.html
1 <div class="feux">
2 <div class="feu rouge"></div>
3 <div class="feu orange eteint"></div>
4 <div class="feu vert eteint"></div>
5 </div>
sample/jquery/feux.html
1 .rouge {background−color: red;}
2 .orange {background−color: orange;}
3 .vert {background−color: green;}
4 .eteint {background−color: gray;}
Ajoutons de l’automatisme
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 374 / 423
JavaScript avancé Timer
Les feux
Version 2 - Automatique à intervalle régulier
sample/jquery/feux2.html
1 let crtFeu = 2;
2
3 function next() {
4 $(".feu").eq(crtFeu).addClass("eteint");
5 crtFeu−−;
6 if (crtFeu < 0) {
7 crtFeu = 2;
8 }
9 $(".feu").eq(crtFeu).removeClass("eteint");
10 }
11
12 $(document).ready(function() {
13 setInterval(next,1000);
14 })
Les feux
Version 3 - Temps différent pour chaque couleur
sample/jquery/feux4.html
1 let feu; // Le feu courant : "vert", "orange" ou "rouge"
2
3 function updateUI() {
4 $(".feu").addClass("eteint");
5 $(‘.${feu}‘).removeClass("eteint");
6 }
7
8 function green() {feu="vert"; updateUI(); setTimeout(orange, 3000)}
9 function orange() {feu="orange"; updateUI(); setTimeout(red, 500)}
10 function red() {feu="rouge"; updateUI(); setTimeout(green, 2000)}
11
12 $(document).ready(function() {
13 green();
14 })
crédit image
JavaScript avancé Stockage local
Présentation
Introduit en HTML5
Manipulé via JavaScript
Local :
à la machine
à l’utilisateur
au navigateur
au profil
Fonctionnement
Les données sont stockées sous la forme
clé = valeur
La clé est une chaîne
La valeur aussi
Pour lire une valeur :
localStorage.getItem("key");
JSON
JSON = JavaScript Object Notation
Représentation de valeurs d’objets (tableau inclus)
sous forme textuelle
De plus en plus utilisé pour échanger de
l’information entre applications
Aussi pour persister de l’information pas trop
complexe
Syntaxe semblable à la syntaxe JavaScript
JSON - Exemple
sample/js2/example.json
1 {
2 "firstName": "John",
3 "lastName": "Smith",
4 "age": 25,
5 "address":
6 {
7 "streetAddress": "21 2nd Street",
8 "city": "New York",
9 "state": "NY",
10 "postalCode": "10021"
11 },
12 "phoneNumber":
13 [
14 {
15 "type": "home",
16 "number": "212 555−1234"
17 },
18 {
19 "type": "fax",
20 "number": "646 555−4567"
21 }
22 ]
23 }
JSON - Conversions
Pour convertir une chaine JSON en objet :
monObjet = JSON.parse(chaineJSON)
sample/js2/todo.js
1 let todos; // Array des todos
2
3 // Charge les todos à partir du storage
4 function loadTodos() {
5 let json = localStorage.getItem("todos");
6 if (json) {
7 todos = JSON.parse(json);
8 } else {
9 todos = [];
10 }
11 }
12
13 // Sauve les todos dans le storage
14 function saveTodos() {
15 localStorage.setItem("todos", JSON.stringify(todos))
16 }
17
18 // Ajoute une todo et sauve
19 function addTodo(todoMsg) {
20 todos.push(todoMsg);
21 saveTodos();
22 }
sample/js2/todo.js
1 // Enleve la tâche numéro i et sauve
2 function removeTodo(i) {
3 todos.splice(i,1);
4 saveTodos();
5 }
6
7 // Initialise les données
8 function init() {
9 loadTodos();
10 }
sample/js2/todoUI.js
1 // Initialise l’UI avec les todos de départ
2 function initUI() {
3 $("#todolist").empty();
4 for(let todo of todos) {
5 addTodoUI(todo);
6 }
7 }
8
9 // Ajoute une todo
10 function addTodoUI(todoMsg) {
11 $("#newTodo").val("");
12 $("#todolist").append(
13 $("<li>")
14 .text(todoMsg + " ")
15 .append(
16 $("<button>")
17 .text("Fait !")
18 .addClass("doneTodo")
19 .click(doneClick)
20 )
21 );
22 }
23
24 // Enlève une todo
25 function removeTodoUI(i) {
26 $(‘#todolist li‘).eq(i).remove();
27 }
sample/js2/todoCtrl.js
1 // On clique sur le bouton d’ajout
2 function addClick() {
3 let todoMsg=$("#newTodo").val();
4 $("#newTodo").val("")
5 addTodo(todoMsg);
6 addTodoUI(todoMsg);
7 }
8
9 // On clique sur un bouton pour enlever une tâche
10 function doneClick() {
11 let li = $(this).parent(); // Le <li> associé au bouton
12 let index = li.index(); // Sa position dans ul
13 removeTodo(index);
14 removeTodoUI(index);
15 }
16
17 function initCtrl() {
18 init();
19 initUI();
20 }
Concepts avancés
Il reste beaucoup d’éléments du langage que nous
n’avons pas abordés
Plus compliqués
Moins souvent rencontrés
Ancienne syntaxe
Utilisation non recommandées
Manque de temps
crédit image
Bootstrap Introduction
Ce que c’est
Essentiellement une feuille de style CSS
Éléments de page plus jolis
tableau, formulaires, menus, images. . .
Mobile First
Pensé pour les téléphones
Responsive Design
Mise en page s’adapte à la taille de l’écran
Démo : le site de l’école
Contexte
Créé en 2011
Par Mark Otto et Jacob Thornton de Twitter
Open source
Bootstrap 3 largement utilisé
Bootstrap 4 sorti en janvier 2018
https://getbootstrap.com/
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 397 / 423
Bootstrap Introduction
Utilisation
Inclure un lien vers le CDN
<link rel="stylesheet" href=
,→ "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
Inclure le JavaScript (facultatif)
<script src="https://code.jquery.com/jquery−3.2.1.slim.min.js"</script>
<script
,→ src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js"
</script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js"
</script>
Hello, World !
sample/bootstrap/hello.html
1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="utf−8">
5 <meta name="viewport"
6 content="width=device−width, initial−scale=1, shrink−to−fit=no">
7 <link rel="stylesheet" href =
,→ "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
8 <title>Hello, world!</title>
9 </head>
10 <body>
11 <h1>Hello, world!</h1>
12 <script src="https://code.jquery.com/jquery−3.2.1.slim.min.js"></script>
13 <script src =
,→ "https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js">
14 </script>
15 <script src = "https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js">
16 </script>
17 </body>
18 </html>
crédit image
Bootstrap Des éléments plus jolis
Typographie
Améliore le look de certaines balises de base
<mark> : fond jaune
<abbr> : souligné en pointillé
<code> : rouge sur fond gris
<kbd> : blanc sur fond noir
...
sample/bootstrap/typo.html
1 Appuyez sur <kbd>F5</kbd> pour <mark>exécuter</mark> le code
2 <abbr title="Langage de programmation du Web">Javascript</abbr>
3 suivant : <code>alert(’Hello, world !’);</code>
Couleurs sémantiques
Introduit des couleurs sémantiques via des classes
Pour le texte
.text−sucess : pour indiquer une réussite
.text−primary : pour mettre en évidence
Couleurs sémantiques
Introduit des couleurs sémantiques via des classes
Et la couleur de fond
.bg−warning : moins fort que danger
...
sample/bootstrap/color.html
1 <p class="bg−danger text−white">
2 Cette suppression sera définitive !
3 </p>
Les tableaux
sample/bootstrap/table.html
1 <table class="table table−striped table−hover">
2 <thead class="thead−dark">
3 <tr>
4 <th>Sigle</th> <th>Intitulé</th>
5 </tr>
6 </thead>
7 <tbody>
8 <tr>
9 <td>INT1</td> <td>Cours d’introduction</td>
10 </tr>
11 <tr>
12 <td>DEV1</td> <td>Développement I</td>
13 </tr>
14 <tr>
15 <td>MAT1</td> <td>Mathématiques</td>
16 </tr>
17 </tbody>
18 </table>
Les images
sample/bootstrap/img.html
1 <img src="otto.jpg" class="rounded−circle" alt="Mark
,→ Otto">
Les formulaires
sample/bootstrap/form.html
1 <form action="#">
2 <div class="form−group">
3 <label for="name">Nom</label>
4 <input type="text" class="form−control" id="name">
5 </div>
6 <div class="form−group">
7 <label for="sel1">Section</label>
8 <select class="form−control" id="section">
9 <option>Gestion</option>
10 <option>Industrielle</option>
11 <option>Réseau</option>
12 </select>
13 </div>
14 <div class="form−group">
15 <label class="radio−inline"><input type="radio" name="genre">Homme</label>
16 <label class="radio−inline"><input type="radio" name="genre">Femme</label>
17 </div>
18 <div class="form−group">
19 <label for="comment">Remarque</label>
20 <textarea class="form−control" rows="5" id="comment"></textarea>
21 </div>
22 <button type="submit" class="btn btn−primary">Envoyer</button>
23 </form>
Les boutons
sample/bootstrap/buttons.html
1 <button type="button" class="btn btn−success">Success</button>
2 <button type="button" class="btn btn−outline−info">Info</button>
3 <button type="button" class="btn btn−primary
,→ btn−lg">Large</button>
Les badges
sample/bootstrap/buttons.html
1 <h1>
2 Bootstrap 4
3 <span class="badge badge−pill
,→ badge−info">Nouveau</span>
4 </h1>
5 <button type="button" class="btn btn−primary">
6 Messages <span class="badge badge−light">4</span>
7 </button>
Les menus
sample/bootstrap/navbar.html
1 <nav class="navbar navbar−expand−lg navbar−dark bg−secondary"
2 style="margin:24px 0;">
3
4 <a class="navbar−brand" href="#">WEBG2</a>
5 <button class="navbar−toggler navbar−toggler−right"
6 type="button" data−toggle="collapse" data−target="#navb">
7 <span class="navbar−toggler−icon"></span>
8 </button>
9
10 <div class="collapse navbar−collapse" id="navb">
11 <ul class="navbar−nav mr−auto">
12 <li class="nav−item">
13 <a class="nav−link" href="#">HTML</a>
14 </li>
15 <li class="nav−item">
16 <a class="nav−link" href="#">CSS</a>
17 </li>
18 </ul>
19 <form class="form−inline">
20 <input class="form−control" type="text" placeholder="Search">
21 <button class="btn btn−success" type="button">Search</button>
22 </form>
23 </div>
24 </nav>
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 409 / 423
Bootstrap Des éléments plus jolis
Les cartes
sample/bootstrap/card.html
1 <div class="card" style="width:400px">
2 <img class="card−img−top" style="width:100%" alt="Kili"
3 src="http://www.esprit−daventure.com/DATA/VOYAGE/59_med.jpg">
4 <div class="card−body">
5 <h4 class="card−title">Le Kilimanjaro</h4>
6 <p class="card−text">
7 Le Kilimanjaro est une montagne
8 située dans le Nord−Est de la Tanzanie
9 et culminant à 5 895 mètres.</p>
10 <a href="https://fr.wikipedia.org/wiki/Kilimandjaro" class="btn btn−primary">
11 En savoir plus...
12 </a>
13 </div>
14 </div>
Un slideshow
sample/bootstrap/caroussel.html
1 <div id="demo" class="carousel slide" data−ride="carousel">
2
3 <!−− The slideshow −−>
4 <div class="carousel−inner">
5 <div class="carousel−item active">
6 <img src="http://esi−bru.be/images/code−1076536_1280.jpg">
7 </div>
8 <div class="carousel−item ">
9 <img src="http://esi−bru.be/images/processor_cpu_heat_sink.jpg">
10 </div>
11 <div class="carousel−item">
12 <img src="http://esi−bru.be/images/rj45−1139366_1280.jpg">
13 </div>
14 </div>
15
16 <!−− Left and right controls −−>
17 <a class="carousel−control−prev" href="#demo" data−slide="prev">
18 <span class="carousel−control−prev−icon"></span>
19 </a>
20 <a class="carousel−control−next" href="#demo" data−slide="next">
21 <span class="carousel−control−next−icon"></span>
22 </a>
23
24 </div>
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 411 / 423
Bootstrap Des éléments plus jolis
Des onglets
sample/bootstrap/tab.html
1 <!−− Nav tabs −−>
2 <ul class="nav nav−tabs">
3 <li class="nav−item">
4 <a class="nav−link active" data−toggle="tab" href="#home">WEBG2</a>
5 </li>
6 <li class="nav−item">
7 <a class="nav−link" data−toggle="tab" href="#part1">HTML</a>
8 </li>
9 <li class="nav−item">
10 <a class="nav−link" data−toggle="tab" href="#part2">CSS</a>
11 </li>
12 </ul>
13 <!−− Tab panes −−>
14 <div class="tab−content">
15 <div class="tab−pane active container" id="home">
16 Bienvenue dans le cours de Développement WEB I
17 </div>
18 <div class="tab−pane container" id="part1">
19 HTML c’est...
20 </div>
21 <div class="tab−pane container" id="part2">
22 Java c’est...
23 </div>
24 </div>
MCD (HE2B - ÉSI) WEBG2 - WEB I 2018 - 2019 412 / 423
9.3 – Responsive Design
crédit image
Bootstrap Responsive Design
Principe de base
La présentation doit s’adapter
à la taille de l’écran
La division en colonnes
Une page Bootstrap est divisée en 12 colonnes
sample/bootstrap/grid.html
1 <div class="row">
2 <div class="col−1">col−1</div>
3 <div class="col−2">col−2</div>
4 <div class="col−4">col−4</div>
5 <div class="col−5">col−5</div>
6 </div>
7 <div class="row">
8 <div class="col−3">col−3</div>
9 <div class="col">col</div>
10 <div class="col−3">col−3</div>
11 </div>
Exemple
Comprenez-vous ce qui va se passer ?
sample/bootstrap/grid-md.html
1 <div class="row">
2 <div class="col−md−1">col−1</div>
3 <div class="col−md−2">col−2</div>
4 <div class="col−md−4">col−4</div>
5 <div class="col−md−5">col−5</div>
6 </div>
7 <div class="row">
8 <div class="col−lg−3">col−3</div>
9 <div class="col−lg">col</div>
10 <div class="col−lg−3">col−3</div>
11 </div>
La magie expliquée
Bootstrap se base sur les @media de CSS
sample/bootstrap/media.html
1 body {background−color: white;}
2 @media (min−width: 800px) {
3 body {background−color: gray;}
4 }
La magie expliquée
Bootstrap se base sur les @media de CSS
sample/bootstrap/media.html
1 body {background−color: white;}
2 @media (min−width: 800px) {
3 body {background−color: gray;}
4 }
crédit image
crédit image