Beruflich Dokumente
Kultur Dokumente
HTML5, CSS3
& jQuery
Table des matières
Introduction ......................................................................................................VII
Les sources de l’ouvrage .................................................................................................................VII
Site compagnon..................................................................................................................................VII
Rubriques spéciales de ce livre.................................................................................................... VIII
Joindre l’auteur ................................................................................................................................. VIII
1. Avant de commencer......................................................................................1
Mais, au fait, qu’est-ce qu’un site Web ? .........................................................................................1
Qu’apporte chaque langage ? .........................................................................................................2
Vocabulaire et conventions d’écriture............................................................................................ 3
Compatibilité HTML5/CSS3............................................................................................................... 4
Les outils de développement............................................................................................................6
Votre première page HTML avec Notepad++............................................................................... 7
Premier contact avec le langage CSS3 ........................................................................................ 12
Pourquoi préférer CSS à HTML pour la mise en forme ?......................................................... 15
Premier contact avec jQuery........................................................................................................... 16
HTML, CSS et jQuery : deux approches....................................................................................... 18
5. Images ..........................................................................................................75
Insérer une image dans une page.................................................................................................75
Une image en arrière-plan d’une page ........................................................................................76
Une image en arrière-plan d’un conteneur .................................................................................77
Utiliser une image comme lien hypermédia................................................................................78
Légender une image .........................................................................................................................78
Centrer une image dans un conteneur ........................................................................................79
Modifier les caractéristiques d’une image lorsqu’elle est survolée...................................... 81
Empiler des images .......................................................................................................................... 82
Préchargement d’images ................................................................................................................ 83
Images réactives................................................................................................................................ 84
Album photos ..................................................................................................................................... 85
Exercice 4 ............................................................................................................................................ 88
6. Ombrages et arrondis.................................................................................89
Ombrer des objets non textuels.................................................................................................... 89
Ombrer des objets textuels ............................................................................................................ 92
Arrondir les coins d’un élément de type block.......................................................................... 93
Exercice 5.............................................................................................................................................97
7. Menus ............................................................................................................99
Menu vertical flottant en HTML5................................................................................................... 99
Menu horizontal en HTML5 ...........................................................................................................100
Amélioration du menu avec quelques propriétés CSS ..........................................................102
Menu déroulant.................................................................................................................................103
Exercice 6............................................................................................................................................. 111
Index............................................................................................................... 257
Site compagnon
Cet ouvrage est accompagné d’un site Web sur lequel se trouvent tous les corrigés
des exercices en vidéo. Pour accéder à ces derniers, rendez-vous à l’adresse www.
moneformation.fr, inscrivez-vous pour activer votre compte et accéder aux corrigés des
exercices. Vous aurez besoin de consulter le présent ouvrage pour créer votre compte
et répondre à la question de sécurité. Chaque fois que vous voudrez réaliser un exercice
de l’ouvrage, vous pourrez vous référer à la page correspondante de l’exercice sur le
site Web.
Introduction VII
Rubriques spéciales de ce livre
Astuce
Elles fournissent des remarques
particulières ou des raccourcis
inhabituels du langage.
Info
Elles donnent des informations
complémentaires sur le sujet étudié,
sans être indispensables pour la tâche
en cours.
Attention
Elles attirent votre attention sur des
points particulièrement importants ou
qui demandent une relecture pour être
correctement assimilés.
Joindre l’auteur
Une question ? Une remarque ? Une suggestion ? N’hésitez pas à me joindre en vous
rendant sur le site www.mediaforma.com et en sélectionnant l’onglet Contact.
VIII Introduction
1
Avant de commencer
Cet ouvrage est consacré aux langages de programmation HTML5, CSS3 et jQuery.
Vous vous demandez certainement s’il est absolument nécessaire d’apprendre ces trois
langages, ou si vous pouvez vous limiter au HTML. Cette question est tout à fait licite, car
les pages Web sont écrites en HTML. Ce langage devrait donc suffire !
S’il est vrai que, contrairement au HTML, les langages CSS et jQuery ne sont pas
obligatoires, vous verrez qu’ils apportent un confort non négligeable et que, tout bien
considéré, ils sont quasiment incontournables pour quiconque désire créer un site Web
bien structuré, facilement maintenable et agréable à utiliser…
Attention
Je dis bien "site Web" et non "site Internet" ! Beaucoup de personnes considèrent
qu’Internet se limite au Web et parlent tout naturellement de sites Internet. Mais alors,
est-ce que l’échange de messages e-mail, les téléchargements FTP et les dialogues en
direct ne font pas partie d’Internet ? Bien sûr que si ! Comme vous lisez cet ouvrage, vous
allez acquérir une certaine expérience dans le développement de sites Web et, en tant
qu'"expert", il est important que vous utilisiez le bon vocabulaire.
Lorsqu’un site est constitué d’une seule page, il se contente d’afficher un nombre réduit
d’informations, ou il utilise une technique qui lui permet d’afficher plusieurs pages dans
une seule. Ceci est possible en mettant en place un système d’onglets qui contiennent
chacun une partie des informations à afficher.
Lorsqu’un site est constitué de plusieurs pages, ces dernières sont reliées entre elles par
des liens hypertexte ou hypermédia. Dans la Figure 1.1, par exemple, cet extrait de page
contient plusieurs liens hypertexte et hypermédia.
Figure 1.1
Cette figure
représente une
partie de la page
principale du site
www.microsoft.com.
Vous l’aurez compris, les liens hypertexte sont des éléments textuels sur lesquels on peut
cliquer pour accéder à d’autres pages. Quant aux liens hypermédia, ils sont également
cliquables, mais représentés par des éléments non textuels (des images en général).
La page principale d’un site est appelée "page d’accueil" ou "homepage". C’est elle qui
donne accès aux autres pages du site, en utilisant une structure arborescente dans
laquelle les pages de tous les niveaux peuvent faire référence aux pages des autres
niveaux.
Figure 1.2
La structure
arborescente
d’un site
composé de
six pages.
2 Chapitre 1
■■ Le jQuery est essentiellement utilisé pour apporter du mouvement et de l’interactivité
aux pages Web. Nous l’utiliserons pour animer des zones de l’écran et pour réagir aux
actions de l’utilisateur.
Comme vous commencez à le pressentir, ces trois langages forment un tout et la réalisation
de pages Web en omettant l’un d’entre eux n’est pas une bonne idée. Rassurez-vous,
votre apprentissage se fera de façon progressive, pratique et indolore. Très vite, vous
serez capable de créer des sites évolués et compatibles avec les standards actuels.
Info
jQuery n’est pas un langage, mais une bibliothèque, qui vient compléter et simplifier
l’utilisation du langage JavaScript.
Les balises sont généralement ouvertes et fermées. Le signe "/", précisé après le "<" de
début de balise, indique qu’il s’agit d’une balise fermante. Ainsi, par exemple, </html>
et </u> sont des balises fermantes, alors que <html> et <u> sont des balises ouvrantes.
Certaines balises peuvent être ouvrantes et fermantes. On dit alors qu’elles sont
"autofermantes". Dans ce cas, le signe "/" est placé à la fin de la balise, juste avant le ">".
Par exemple :
<br />
<hr />
<meta />
Lorsque les signes "<" et ">" sont omis, on parle non plus de balises mais d’éléments.
Nous utiliserons alternativement ces deux termes dans cet ouvrage.
Certaines balises comportent un ou plusieurs paramètres, nommés "attributs". Par
exemple, la balise <img> suivante utilise l’attribut src pour indiquer le chemin et le nom
de l’image à afficher :
<img src="images/banniere.jpg" />
D’une manière plus générale, toutes les balises HTML sont construites sur le même
modèle :
<élément attr1="val1" attr2="val2" attr3="val3" …>
Où élément est le nom d’un élément HTML (a, img, link ou body par exemple), les
attr sont des attributs HTML et les val sont les valeurs affectées à ces attributs. Les
Avant de commencer 3
couples attribut-valeur permettent de paramétrer l’élément auquel ils s’appliquent. Par
exemple, vous pouvez définir l’adresse de la page à atteindre dans un lien hypertexte
<a>, l’image à afficher dans une balise <img>, ou encore le nom d’un formulaire dans
une balise <form>.
La première balise d’un document HTML5 est appelée "DTD" (pour déclaration de type
de document). Elle indique au navigateur le type de langage utilisé. En HTML5, la DTD
est des plus simples :
<!DOCTYPE html>
Par convention, seule la balise DOCTYPE est écrite en majuscules dans un document
HTML5. Toutes les autres balises seront donc systématiquement écrites en caractères
minuscules.
Les instructions CSS sont généralement regroupées dans l’en-tête du document HTML
ou dans un fichier spécifique appelé "feuille de styles". Elles consistent en un ensemble
de couples "propriété: valeur;". Voici quelques instructions CSS :
background: yellow;
float: left;
height: 20px;
jQuery est essentiellement utilisé pour interagir avec le DOM (Document Object Model).
Cet acronyme fait référence à une structure de données qui représente un document
HTML comme une arborescence. Avec jQuery, vous pouvez interroger le DOM pour
connaître les caractéristiques des balises (attributs et valeurs HTML, mais aussi propriétés
et valeurs CSS) et les modifier.
La fonction jQuery(), souvent remplacée par son alias $() pour raccourcir l’écriture,
est le point d’entrée de la bibliothèque jQuery. Elle permet d’accéder à toutes les
méthodes de la bibliothèque. Lorsqu’une méthode jQuery est invoquée, elle retourne un
objet jQuery, qui consiste en zéro, un ou plusieurs éléments piochés dans le DOM. Voici
un exemple d’instruction jQuery :
$('#affiche').html('La condition est respectée');
Ici, le texte "La condition est respectée" est affecté à l’élément d’identifiant affiche du
DOM.
Compatibilité HTML5/CSS3
Alors que nous écrivons ces lignes, quelques nouveaux éléments propres au langage
HTML5 ne sont pas encore entièrement implémentés sur les navigateurs. Pour connaître le
taux de compatibilité de votre navigateur, rendez-vous sur la page http://html5test.com/.
Un compte rendu clair et succinct y sera présenté et une note lui sera attribuée. Comme le
montre la Figure 1.3, Google Chrome est aujourd’hui le navigateur le plus compatible avec
le standard HTML5.
4 Chapitre 1
Figure 1.3
Comparaison des
navigateurs Google
Chrome 30, Firefox 25
et Internet Explorer 11
sous Windows 8.1.
Les éléments inconnus du navigateur sont généralement ignorés. Mais il est possible
de leur affecter un style en utilisant une feuille de styles CSS. Notez cependant qu’un
traitement particulier doit être réservé à Internet Explorer 8 et inférieur. En effet, celui-ci
doit intégrer les éléments inconnus à son DOM via la méthode createElement. Sans
quoi, il ne sera pas en mesure de leur affecter un style. D’autre part, il est nécessaire
d’attribuer un rendu block à ces éléments en initialisant leur propriété CSS display.
Nous y reviendrons en détail par la suite.
Concernant le langage CSS, les principaux navigateurs utilisent un préfixe pour (pré)
implémenter les nouvelles propriétés CSS3 :
■■ -moz pour les navigateurs Mozilla (Firefox) ;
■■ -webkit pour les navigateurs Webkit (Safari, OmniWeb, Midori, etc.) ;
■■ -khtml pour les navigateurs Konqueror ;
■■ -o pour les navigateurs Opera ;
■■ -ms pour le navigateur Internet Explorer 9 et supérieur.
Tant que la spécification du langage n’a pas atteint au moins le statut de recommandation
candidate, vous devrez utiliser plusieurs préfixes dans les propriétés CSS3 pour assurer
la plus grande compatibilité possible. À terme, ces préfixes ne devraient plus avoir cours
et une seule instruction devrait être interprétée à l’identique dans tous les navigateurs.
Wait and see…
Si vous utilisez encore des fonctions CSS spécifiques d’Internet Explorer (DropShadow(),
filter() ou gradient(), par exemple), mieux vaut les inclure dans une feuille de styles
particulière, appelée dans un commentaire conditionnel, dans l’en-tête du document :
<head>
<!--[if IE]>
<link rel="stylesheet" href="style-pour-ie.css">
<![endif]-->
</head>
Avant de commencer 5
Si, par la suite, vous décidez de remplacer ces fonctions par du code CSS3, il vous suffira
de supprimer l’élément link correspondant.
Notepad++
Notepad++ est un éditeur de code multilangage à coloration syntaxique. Distribué sous
licence GPL, vous pouvez librement l’installer et l’utiliser sur votre ordinateur. Rendez-
vous sur la page http://notepad-plus-plus.org/fr/, cliquez sur Téléchargement dans la
partie gauche de la page, puis sur DOWNLOAD pour télécharger la dernière version en
date de Notepad++. Le fichier téléchargé est une archive auto-extractible. Il suffit donc de
double-cliquer dessus pour l’installer.
Figure 1.4
Téléchargement de Notepad++.
Firefox
Firefox est un excellent navigateur Web. Il doit faire partie de la panoplie du développeur
Web, afin de tester la compatibilité du code.
Pour télécharger Firefox, rendez-vous sur la page www.mozilla.org/fr/firefox/new/ et
cliquez sur le bouton Firefox, Téléchargement gratuit. Un fichier exécutable d’installation
sera alors téléchargé. Cliquez sur Exécuter pour procéder à l’installation de Firefox sur
votre ordinateur.
6 Chapitre 1
Google Chrome
Chrome est actuellement le navigateur le plus compatible avec les langages HTML5 et
CSS3. Vous vous devez donc de l’installer sur votre ordinateur, ne serait-ce que pour
avoir un avant-goût des possibilités offertes par les instructions les plus évoluées de
ces langages. Sans aucun doute possible, les autres navigateurs seront en mesure
d’interpréter ces instructions dans un avenir proche.
Pour télécharger Google Chrome, rendez-vous sur la page www.google.fr/intl/fr/
chrome/browser/ et cliquez sur Télécharger Google Chrome.
La bibliothèque jQuery
jQuery est une bibliothèque JavaScript. En d’autres termes, il s’agit d’un fichier d’extension
.js. Pour développer du code jQuery, il suffit de faire référence à la bibliothèque jQuery
avec une instruction du type suivant :
<script src="chemin">
</script>
Avant de commencer 7
Code minimal en HTML5
Voici le code minimal à utiliser pour une page HTML5 :
<!DOCTYPE html>
<html>
<head>
</head>
<body>
</body>
</html>
Figure 1.5
Le code est sauvegardé dans un
fichier HTML.
Dès que le fichier est sauvegardé, les instructions changent de couleur. En effet,
Notepad++ sait maintenant que les instructions sont écrites en HTML et il peut leur
appliquer une coloration syntaxique (voir Figure 1.6).
8 Chapitre 1
Figure 1.6
Les instructions sont colorées car
Notepad++ connaît le langage
utilisé.
Langue du document
La langue française utilise des caractères spécifiques tels que é, è, â, ç, etc. Pour que ces
derniers soient affichés correctement dans tous les navigateurs du monde, vous devez
utiliser un jeu de caractères (ou charset).
Les charsets ( jeux de caractères) sont associés à la notion de claviers nationaux. Pour
indiquer aux navigateurs dans quel jeu de caractères vous travaillez, vous pouvez insérer
une balise <meta charset=> dans l’en-tête de votre document.
Vous utiliserez le jeu de caractères :
■■ ISO-8859-1 pour accéder directement à la majorité des caractères des langues
occidentales (français, anglais, allemand, espagnol, etc.).
■■ UTF-8 pour afficher sur une même page des caractères issus de plusieurs langues
(français et japonais, par exemple). Consultez la page www.columbia.edu/kermit/
utf8.html pour vous rendre compte des immenses possibilités du jeu de caractères
UTF-8.
Dans cet ouvrage, nous utiliserons systématiquement le jeu de caractères UTF-8, bien
plus universel et… indépendant des frontières.
Pour utiliser le jeu de caractères UTF-8, il ne suffit pas d’insérer une balise <meta> dans
le code : vous devez également vous assurer que Notepad++ utilise ce type d’encodage.
Déroulez le menu Encodage et sélectionnez la commande Encoder en UTF-8 (sans BOM).
Info
L’encodage UTF-8 avec BOM (pour Byte Order Mark) ajoute une espace insécable de
largeur nulle en début de fichier. Étant donné que ce caractère n’a aucune utilité en
UTF-8, je vous conseille d’utiliser un encodage UTF-8 sans BOM. D’autant plus qu’un
encodage avec BOM peut provoquer une erreur de type "headers already sent by"
lorsque vous effectuez une redirection de page Web.
Une fois le jeu de caractères spécifié, vous devez également indiquer la langue utilisée
dans le document. Cette information est en effet primordiale pour le référencement
(moteurs de recherche) et l’accessibilité (lecteurs d’écran) de la page.
Avant de commencer 9
La langue d’un document HTML présente deux types d’informations :
■■ La langue "primaire", qui correspond au public visé. Elle peut être spécifiée :
– Dans le champ d’en-tête HTTP, au niveau du serveur. Par exemple, sur un serveur
APACHE, la ligne suivante peut être insérée dans le fichier .htaccess du dossier
concerné :
Content-Language :fr
■■ La langue "de traitement", qui correspond au contenu de la page. Elle doit être spécifiée
dans l’attribut lang. Si cet attribut est défini dans la balise <html>, toutes les autres
balises hériteront de cette langue :
<HTML lang="fr" />
Référencement
La balise <meta> peut également être utilisée comme aide au référencement d’une
page. Vous pouvez préciser :
■■ les mots-clés associés à la page ;
■■ la description de la page ;
■■ le nom de l’auteur de la page.
<meta name="keywords" content="mot-clé1, mot-clé2, mot-clé3, …" />)
<meta name="description" content="Description de la page en quelques phrases." />
<meta name= "author" content="Nom de l’auteur" />
Info
La balise <meta name="keywords"> ne fait plus partie de l’algorithme d’indexation de
Google. Autant dire qu’elle est devenue quasiment… obsolète !
Titre du document
Le titre du document est spécifié entre les balises <title> et </title>, dans l’en-tête
du document. Le texte entré entre ces deux balises est affiché dans la barre de titre du
navigateur. Il joue également un rôle très important dans le référencement de la page. Il
est donc important de choisir un titre approprié pour chaque page.
10 Chapitre 1
<meta name="description" content="Description de la page en quelques
➥phrases." />
<meta name="author" content="Nom de l’auteur" />
<title>Titre de la page</title>
</head>
<body>
</body>
</html>
Figure 1.7
Le code HTML5 est valide.
Avant de commencer 11
Info
Si vous préférez utiliser le validateur du W3C, tapez l’adresse suivante dans la barre
d’adresse de votre navigateur : http://validator.w3.org/.
12 Chapitre 1
Styles CSS dans les balises
Pour définir des propriétés CSS dans une balise, vous utiliserez l’attribut style :
<balise style="propriété1: valeur1; propriétéN: valeurN;">
où :
■■ balise est un nom de balise : <p> ou <h1>, par exemple.
■■ propriété1 à propriétéN sont des propriétés de style de la balise.
■■ valeur1 à valeurN sont les valeurs affectées aux propriétés.
À titre d’exemple, pour affecter la couleur jaune à l’arrière-plan d’un élément p, vous
utiliserez le code suivant :
<p style="background-color:yellow;">
Ce texte a un arrière-plan jaune
</p>
Pour utiliser la police Verdana corps 18 dans un titre h2, vous utiliserez le code suivant :
<h2 style="font-family:Verdana; font-size: 18px;">
Ce titre est en Verdana corps 18
</h2>
Attention
À moins que vous ne désiriez écraser les propriétés définies par défaut dans une feuille
de styles externe, cette technique n’est pas optimale, car elle est limitée au seul élément
qui l’utilise. Dans la mesure du possible, privilégiez l’utilisation d’une feuille de styles
externe (fichier d’extension .css) reliée au document à l’aide d’un élément link. Cette
même feuille de styles pourra être utilisée dans tous les documents apparentés pour
uniformiser leur apparence.
où :
■■ élément est un nom d’élément : p ou h1, par exemple.
■■ propriété1 correspond aux propriétés de style de l’élément.
■■ valeur1 correspond aux valeurs affectées aux propriétés.
Avant de commencer 13
À titre d’exemple, pour définir dans tout le document un arrière-plan jaune pour les
éléments p et pour utiliser la police Verdana corps 18 dans tous les titres h2, vous
utiliserez le code suivant :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Une feuille de styles interne</title>
<style>
p {background-color:yellow;}
h2 {font-family:Verdana; font-size: 18px;}
</style>
</head>
<body>
…
</body>
</html>
Attention
Cette technique n’est pas optimale, car elle est limitée au seul document qui l’utilise.
Dans la mesure du possible, privilégiez l’utilisation d’une feuille de styles externe (fichier
d’extension .css) reliée au document à l’aide d’un élément link. Elle pourra être utilisée
dans toutes les pages d’un même site pour uniformiser leur apparence.
Supposons que le fichier moncss.css contienne les deux éléments de style ci-après :
p {background-color:yellow;}
h2 {font-family:Verdana; font-size: 18px;>
14 Chapitre 1
<!-- Les instructions HTML5 peuvent utiliser les styles -->
<!-- définis dans la feuille de styles moncss.css -->
</body>
</html>
Avant de commencer 15
background: #FF4040;
margin: 14px 14px 14px 14px;
list-style: square;
}
Figure 1.8
Tous les éléments de la liste ont été affectés par la
feuille de styles externe.
Vous pourrez ensuite insérer des instructions jQuery dans le code HTML, entre les balises
<script> et </script> :
<script>
16 Chapitre 1
// Une ou plusieurs instructions jQuery
</script>
Comme nous l’avons dit précédemment, jQuery est utilisé pour interroger et pour
modifier le DOM, c’est-à-dire les éléments affichés dans une page Web. Imaginez que
vous commenciez à interroger/modifier des éléments qui ne sont pas encore affichés.
Cela produirait une belle pagaille, et peut-être même un "plantage" du navigateur. La
première précaution à prendre lorsque l’on écrit du code jQuery est donc de s’assurer de
la disponibilité du DOM. Voici comment cela s’écrit en jQuery :
jQuery(document).ready(function(){
// Ici, le DOM est entièrement disponible
});
Avant de commencer 17
<head>
<meta charset="UTF-8" />
<title>HTML et jQuery</title>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
Ce texte est affiché en HTML<br>
<span id="texte2"></span>
<script>
$(function(){
$('#texte2').html('... et celui-ci par jQuery.');
});
</script>
</body>
</html>
Pour l’instant, il n’est pas utile que vous compreniez le fonctionnement de ce programme.
Remarquez juste qu’un <span> d’identifiant texte2 est défini dans le corps du
document :
<span id="texte2"></span>
Tout ceci sera bien plus clair lorsque vous connaîtrez mieux jQuery. En attendant, exécutez
ce code dans votre navigateur et constatez que jQuery est bien en mesure d’afficher du
texte dans le <span> (voir Figure 1.9).
Figure 1.9
HTML et jQuery cohabitent parfaitement.
18 Chapitre 1
■■ Un pour le code HTML, limité au squelette standard et aux données qui doivent être
affichées dans la page.
■■ Un pour le code CSS (feuille de styles externe) contenant les règles de mise en forme
et de mise en page.
■■ Un ou plusieurs pour le code jQuery. Ces éléments sont alors appelés en utilisant
autant de balises <script> que nécessaire.
À titre d’exemple, nous allons étendre le code précédent pour y inclure quelques règles
CSS et le découper en plusieurs fichiers.
Avant de commencer 19
</body>
</html>
Autant que possible, vous privilégierez l’approche multifichier. En particulier si le site que
vous développez comporte de nombreuses pages. En réutilisant le code CSS et jQuery
dans chacune des pages qui le nécessitent, vous réduirez le temps de développement
et faciliterez la maintenance du site.
20 Chapitre 1
2
Premiers pas en
HTML, CSS et jQuery
Arrivé à ce point dans la lecture de l’ouvrage, vous êtes en mesure de créer un squelette
HTML5 standard, de définir des règles de mise en forme CSS (directement dans les
balises, dans une feuille de styles interne ou externe) et d’invoquer la bibliothèque jQuery.
Bien que nécessaires, ces connaissances ne sont pas encore suffisantes pour créer des
pages Web dignes de ce nom. Ce deuxième chapitre va enrichir votre connaissance
des trois langages et vous permettre de faire vos premiers pas en solo. Tournez vite les
pages.
D’après vous, comment sera affiché ce texte dans le navigateur ? Jetez un œil à la
Figure 2.1 pour constater à quel point votre navigateur peut manquer de discernement !
Figure 2.1
Les espaces
multiples et les
sauts de ligne sont
ignorés.
Pour indiquer au navigateur que vous voulez passer à la ligne, vous utiliserez la balise
<br> (pour break, ou saut de ligne). Si vous voulez que vos espaces multiples soient
également prises en considération, vous les remplacerez par autant d’entités
que nécessaire. Le code précédent est donc corrigé comme ceci :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Espaces et sauts multiples</title>
</head>
<body>
Ce texte est volontairement écrit sur<br>
<br>
<br>
plusieurs lignes et
➥ de multiples espaces<br>
sont insérées
➥entre les mots
</body>
</html>
Comme le montre la Figure 2.2, cette fois-ci, les espaces et les sauts de ligne sont bien
interprétés.
Figure 2.2
Le navigateur se
comporte bien…
lorsqu’on lui parle
correctement.
22 Chapitre 2
Pour terminer cette section, sachez que vous pouvez également utiliser la balise <p></
p> pour créer des paragraphes.
À titre d’exemple, si vous insérez ces trois lignes de code entre les balises <body> et
</body> d’un squelette standard, vous obtenez le résultat représenté à la Figure 2.3 :
<p>Ceci est un premier paragraphe.</p>
<p>Ceci est un deuxième paragraphe.</p>
<p>Et ceci est un troisième paragraphe.</p>
Figure 2.3
Contrairement aux sauts de ligne <br>, un espace supplémentaire est inséré entre chaque
paragraphe.
Info
En utilisant des règles CSS simples, il est possible de définir la taille des espaces affichés
avant et après un paragraphe.
Le texte inséré dans une balise de titre est important pour les personnes qui lisent la
page Web, mais également pour les moteurs de recherche qui référencent la page. Il est
donc important de choisir des titres en accord avec le contenu de chaque section.
Figure 2.5
Visuellement, aucune
différence entre b et
strong ni entre i et em.
24 Chapitre 2
Comme vous pouvez le voir, les balises <b> et <strong> produisent le même effet dans
le navigateur. Il en va de même pour les balises <i> et <em>. Dans ce cas, pourquoi
HTML5 propose-t-il plusieurs balises pour obtenir le même résultat ? Cette distinction
est importante pour la deuxième audience de vos pages. Entendez par là les robots qui
parcourent le Web à des fins d’indexation. Ces programmes n’ont que faire de l’aspect
visuel d’une page. Pour eux, ce qui importe, c’est le "poids" des mots utilisés. Ainsi, vous
utiliserez les balises <strong> et <em> si vous voulez mettre en avant un mot ou un bloc
de texte tout en modifiant son allure. En revanche, vous utiliserez les balises <b> et <i>
si vous ne voulez faire passer aucun message aux robots d’indexation.
Pour différencier un mot visuellement (et non sémantiquement), vous pouvez également :
■■ le souligner en l’entourant des balises <u> et </u> ;
■■ le surligner en l’entourant des balises <mark> et </mark> ;
■■ l’afficher en caractères de petite taille, en l’entourant des balises <small> et </
small>.
Tapez ce code entre les balises <body> et </body> et exécutez-le. Vous devriez obtenir
le résultat représenté Figure 2.6 :
<p><mark>Ce texte est marqué</mark></p>
<p><u>Ce texte est souligné</u></p>
<p><small>Ce texte est affiché en caractères de petite taille</small></p>
Figure 2.6
D’autres formes
de différenciation.
Une liste numérotée est délimitée par les balises <ol> et </ol> (ol est l’abréviation de
ordered list, soit en français "liste ordonnée"). Chaque élément de la liste est délimité par
les balises <li> et </li> (voir Figure 2.8) :
<ol>
<li>Premier</li>
<li>Deuxième</li>
<li>Troisième</li>
<li>Quatrième</li>
</ol>
Figure 2.8
Une liste numérotée.
Il est possible d’imbriquer plusieurs liste. Pour cela, il suffit d’insérer une balise <ul> ou
<ol> avant que la balise de la liste précédente (<ul> ou <ol>) n’ait été fermée. À titre
d’exemple, le code suivant imbrique une liste numérotée dans une liste à puces, elle-
même imbriquée dans une liste numérotée (voir Figure 2.9) :
<ol>
<li>Entrée principale 1</li>
<ul>
<li>Entrée secondaire 1</li>
<li>Entrée secondaire 2</li>
<ol>
<li>Première entrée de niveau 3</li>
<li>Deuxième entrée de niveau 3</li>
<li>Troisième entrée de niveau</li>
</ol>
<li>Entrée secondaire 3</li>
</ul>
<li>Entrée principale 2</li>
<li>Entrée principale 3</li>
</ol>
26 Chapitre 2
Figure 2.9
Trois listes imbriquées.
Liens hypertexte
La magie du Web tient en grande partie aux liens hypertexte : en définissant des liens sur
vos pages, il est possible de renvoyer l’utilisateur vers une page de votre site ou vers une
page hébergée à plusieurs milliers de kilomètres…
Les liens hypertexte sont définis avec la balise <a> :
<a href="adresse">texte</a>
Où adresse est l’adresse de la page à atteindre et texte est le texte sur lequel
l’utilisateur cliquera pour accéder à la page visée. Par exemple, l’instruction suivante
permet de créer un lien hypertexte qui donne accès au site Web de Microsoft France
(voir Figure 2.10) :
<a href="http://www.microsoft.com/fr-fr/default.aspx">Cliquez ici pour accéder au
➥ site de Microsoft</a>
Figure 2.10
Un clic suffit pour accéder
au site de Microsoft France.
Pour accéder à cet emplacement dans la page, vous devez définir un lien hypertexte qui
pointe vers l’identifiant, précédé d’un caractère "#".
Examinez ce code :
<h2 id="haut">Haut de la page</h2>
<a href="#bas">Accéder au bas de la page</a><br />
But I must explain to you how all this mistaken idea of denouncing pleasure and
➥praising pain was born and I will give you a complete account of the system,
➥and expound the actual teachings of the great explorer of the truth, the
➥master-builder of human happiness. No one rejects, dislikes, or avoids pleasure
➥itself, because it is pleasure, but because those who do not know how to pursue
➥pleasure rationally encounter consequences that are extremely painful.
<h2 id="bas">Bas de la page</h2>
<a href="#haut">Accéder au début de la page</a>
Au début du document, un lien hypertexte fait référence à l’ancre bas. Lorsque ce lien est
cliqué, la partie inférieure du document s’affiche dans le navigateur :
<a href="#bas">Accéder au bas de la page</a><br />
À la fin du document, un lien fait référence à l’ancre haut. Lorsque ce lien est cliqué, la
partie supérieure du document s’affiche dans le navigateur :
<a href="#haut">Accéder au début de la page</a>
Si vous voulez tester ce code, assurez-vous que tout le document ne puisse pas s’afficher
d’une seule traite dans le navigateur. Dans ce cas, les liens hypertexte sembleraient
n’avoir aucun effet (voir Figure 2.11).
Info
Un peu plus haut, vous avez appris à créer des liens hypertexte vers des pages Web.
En ajoutant des identifiants à certaines balises dans ces pages, vous pouvez créer des
liens qui pointent vers ces identifiants depuis une autre page Web. Ainsi, si l’identifiant
partie2 a été défini dans la page introduction.htm, vous pouvez définir le lien suivant
pour afficher la page introduction.htm et décaler l’affichage jusqu’à la balise d’id
partie2 :
<a href="introduction.htm#partie2">Cliquez ici pour afficher la partie 2 de
➥l’introduction</a>
28 Chapitre 2
Figure 2.11
Les deux liens sont bien fonctionnels,
à condition que la fenêtre soit de taille
réduite.
Vous pouvez également définir un lien vers une adresse e-mail. Ici, par exemple, le lien
ouvre une fenêtre de composition de message dans le client de messagerie par défaut de
l’utilisateur et insère l’adresse qui suit le mot-clé mailto: dans le champ A du message :
<a href="mailto:prenom.nom@domaine.com">Cliquez ici pour m’envoyer un message</a>
Si vous le souhaitez, il est possible d’aller plus loin avec ce type de lien, en définissant
le sujet du message (subject), les destinataires secondaires (cc) et/ou cachés (bcc) :
<a href="mailto:prenom1.nom1@domaine1.com?subject=Sujet%20du%20message&cc=
➥prenom2.nom2@domaine2.com&bcc=prenom3.nom3@domaine3.com">Cliquez ici</a>
Info
Les espaces et les apostrophes ne sont pas permises dans le sujet du mail. Si ces
caractères sont présents dans le sujet, vous les remplacerez par leur code ASCII : %20 et
%27 respectivement.
Ce mode d’écriture peut être généralisé à toutes les balises du langage HTML : si vous
voulez modifier les caractéristiques de toutes les occurrences d’une balise (<img>, <a>,
<p>, <table>, etc.) dans une page, indiquez le nom de l’élément concerné et définissez
autant de couples propriété-valeur que nécessaire.
Le sélecteur de classe est certainement celui qui est le plus utilisé. Pour le mettre en
œuvre, vous définirez l’attribut class dans les balises concernées. Par exemple, pour
afficher le texte de certaines balises <p> en bleu et celui de certaines autres en rouge,
vous définirez les classes bleu et rouge comme ceci :
<p class="bleu">Texte en bleu</p>
<p class="rouge">Texte en rouge</p>
30 Chapitre 2
Vous vous doutez que ce code ne suffit pas pour changer la couleur du texte : vous
devez également écrire quelques lignes de CSS :
<style type="text/css">
.bleu {color: blue;}
.rouge {color: red;}
</style>
Figure 2.12
Utilisation de classes CSS dans des paragraphes.
Le point décimal utilisé devant les mots bleu et rouge dans le code CSS indique qu’il
s’agit d’un sélecteur de classe et non d’un élément HTML. Les classes peuvent concerner
plusieurs balises, éventuellement de types différents. Par exemple, si vous affectez la
classe rouge à une balise <p> et à une balise <span>, le texte inséré dans ces deux
balises sera affiché en rouge si vous définissez la règle suivante :
.rouge {color: red;}
Si vous voulez limiter cette règle de style aux seules balises <span> de classe rouge,
vous utiliserez un autre sélecteur :
span.rouge {color: red;}
Enfin, si vous voulez appliquer cette règle de style aux balises <span> de classe rouge
et aux balises <p> de classe r, vous utiliserez le sélecteur suivant :
span.rouge, p.r {color: red;}
Pseudo-classes
Le sélecteur de pseudo-classe est représenté par le caractère deux-points (:).
Vous ferez appel aux pseudo-classes pour cibler des balises en fonction de caractéristiques
inaccessibles aux sélecteurs traditionnels : premier enfant ou focus, par exemple.
La pseudo-classe :first-child permet de cibler le premier enfant d’une balise. Par
exemple, pour mettre en gras la première balise <p> enfant de la balise <div>, vous
utiliserez le sélecteur suivant :
div p:first-child {font-weight: bold;}
La pseudo-classe :hover cible les balises dont le contenu est survolé. Cela permet, par
exemple, de changer la bordure d’une image lorsqu’elle est pointée par la souris :
img:hover {border-style: dotted;}
D’une façon traditionnelle, les CSS sont liés à un élément, en fonction de sa position
dans l’arbre du document. Cependant, il peut être utile de faire appel à un pseudo-
élément pour effectuer des mises en forme à partir d’informations absentes de l’arbre du
document. Par exemple, pour définir le style de la première ligne ou du premier caractère
d’une balise.
Le pseudo-élément :first-line cible la première ligne d’une balise. Ici, par exemple, la
première ligne de la balise <p> est affichée en rouge.
p:first-line {color:red;}
32 Chapitre 2
Sélecteurs hiérarchiques
Tous les objets du DOM font partie d’un arbre commun dont la racine est la balise <body>.
Le tableau suivant dresse la liste des sélecteurs hiérarchiques utilisables en CSS.
Syntaxe Signification
p > e Éléments e directement descendants d’éléments p
p + e Éléments e directement précédés d’un élément p
p ~ e Éléments e précédés d’un élément p
Syntaxe Signification
nom_élément[attr="valeur"] Tout élément nom_élément dont la valeur de
l’attribut attr est égale à la chaîne valeur
nom_élément[attr^="valeur"] Tout élément nom_élément dont la valeur de
l’attribut attr commence exactement par la
chaîne valeur
nom_élément[attr$="valeur"] Tout élément nom_élément dont la valeur de
l’attribut attr finit exactement par la chaîne
valeur
nom_élément[attr*="valeur"] Tout élément nom_élément dont la valeur de
l’attribut attr contient la sous-chaîne valeur
nom_élément[attr|="valeur"] Tout élément nom_élément dont la valeur de
l’attribut attr est une chaîne séparée par des
tirets et dont la première partie commence par
valeur
nom_élément:root Un élément nom_élément, racine du document
nom_élément:nth-child(n) Un élément nom_élément qui est le énième
enfant de son parent
nom_élément:nth-last-child(n) Un élément nom_élément qui est le énième
enfant de son parent en comptant depuis le
dernier enfant
nom_élément:nth-of-type(n) Un élément nom_élément qui est le énième
enfant de son parent et de ce type
nom_élément:nth-last-of-type(n) Un élément nom_élément qui est le énième
enfant de son parent et de ce type en comptant
depuis le dernier enfant
nom_élément:last-child Un élément nom_élément, dernier enfant de
son parent
nom_élément:first-of-type Un élément nom_élément, premier enfant de
son type
Info
Pour avoir un aperçu général des sélecteurs utilisables en CSS, reportez-vous à la page
dédiée du W3C :
www.w3.org/Style/css3-selectors-updates/WD-css3-selectors-20010126.fr.html.
Un exemple d’utilisation
Pour illustrer la mise en forme des balises en CSS, nous allons nous intéresser aux listes
(à puces et numérotées).
Les puces et les numéros utilisés dans une liste peuvent être personnalisés via la
propriété CSS list-style-type. Pour une liste à puces, cette propriété peut prendre
les valeurs suivantes :
■■ disc : puce ronde remplie.
■■ circle : puce ronde vide.
■■ square : carré rempli.
■■ none : aucun signe.
Pour une liste ordonnée décimale, la propriété list-style-type peut prendre les
valeurs suivantes :
■■ decimal : 1, 2, 3.
■■ decimal-leading-zero : 01, 02, 03.
■■ hebrew : numérotation hébraïque traditionnelle.
34 Chapitre 2
■■ armenian : numérotation arménienne traditionnelle.
■■ georgian : numérotation géorgienne traditionnelle.
■■ hiragana : a, i, u, e, o, ka, ki, ku.
■■ katakana : A, I, U, E, O, KA, KI, KU.
■■ hiragana-iroha : i, ro, ha, ni, ho, he.
■■ katakana-iroha : I, RO, HA, NI, HO, TE.
■■ none : aucune numérotation.
Enfin, pour une liste ordonnée alphabétique, la propriété list-style-type peut
prendre les valeurs suivantes :
■■ lower-roman : i, ii, iii, iv.
■■ upper-roman : I, II, III, IV.
■■ lower-greek : a, b, c, d, e.
■■ lower-alpha : a, aa, aaa.
■■ upper-alpha : A, AA, AAA.
■■ lower-latin : a, b, c.
■■ upper-latin : A, B, C.
■■ none : aucune numérotation.
Nous allons travailler sur une liste numérotée et sur une liste à puces :
<h2>Check-list voiture</h2>
<ol>
<li>Niveaux</li>
<li>Vidange</li>
<li>Courroie</li>
<li>Décrassage</li>
<li>Optiques</li>
<li>Echappement</li>
<li>Pneumatiques</li>
</ol>
<h2>Check-list avion</h2>
<ul>
<li>Passeport</li>
<li>Devise</li>
<li>Vaccination</li>
<li>Bagages</li>
</ul>
Sans aucune mise en forme, ces deux listes sont affichées comme à la Figure 2.13.
Supposons que vous vouliez modifier la mise en forme de ces deux listes pour arriver au
résultat représenté Figure 2.14.
Figure 2.14
Les deux listes ont été mises en forme
avec des instructions CSS.
Les éléments de la liste à puces, c’est-à-dire les enfants li de l’élément ul (ul li), sont
écrits avec la police Calibri de type x-large :
ul li {
font-family: Calibri;
font-size: x-large;
}
36 Chapitre 2
Enfin, les premier, troisième et septième enfants li de la liste ol sont affichés en
caractères rouges sur un fond jaune :
ol li:nth-child(1), ol li:nth-child(3), ol li:nth-child(7) {
color: red;
background-color: yellow;
}
Définissez ces règles dans l’en-tête de la page, entre les balises <style> et </style>,
et vous devriez obtenir le résultat recherché :
<head>
<style type="text/css">
// Les règles de style sont définies ici
</style>
</head>
Ou encore l’instruction suivante insère le texte "vide" dans tous les éléments de classe
data :
$('.data').html('vide');
Quelques exemples :
1. Pour surligner en jaune la deuxième balise <li> du document, vous utiliserez
l’instruction suivante :
$('li:eq(1)').css('background-color','yellow');
2. Pour surligner en jaune les balises <li> paires à partir de la deuxième, vous utiliserez
l’instruction suivante :
$('li:even:gt(1)').css('background-color','yellow');
3. Pour affecter une couleur d’arrière-plan rouge aux éléments pairs d’un tableau et une
couleur d’arrière-plan jaune aux éléments impairs de ce tableau, vous utiliserez les
deux instructions suivantes :
$('td:even').css('background-color','red');
$('td:odd').css('background-color','yellow');
Info
Pour avoir un aperçu global de tous les sélecteurs utilisables en jQuery, consultez la page
http://api.jquery.com/category/selectors/.
38 Chapitre 2
Figure 2.15
Toutes les
fonctions
jQuery sont
listées sur
cette page.
Supposons par exemple que vous vouliez modifier la couleur d’une balise <span>. Pour
cela, vous devez agir sur la propriété CSS color. Vous devez donc trouver la fonction
qui permet de modifier une propriété CSS. Cliquez sur la catégorie CSS, dans la partie
gauche de la page. Il ne vous reste plus qu’à trouver la fonction adéquate. Un rapide coup
d’œil à la partie droite de la page, et vous constatez que la fonction css() correspond
exactement à ce que vous recherchez (voir Figure 2.16).
Figure 2.16
La fonction
css() permet
de lire et de
modifier une
propriété CSS.
Cliquez sur le lien css() pour connaître le gabarit de la fonction et avoir des détails sur son
utilisation (voir Figure 2.17).
La fonction css() peut donc être utilisée en lecture (pour connaître la valeur d’une
propriété) ou en écriture (pour affecter une valeur à une propriété). Pour modifier la
couleur d’une balise <span>, vous utiliserez donc une instruction de ce type (ici, la balise
<span> a pour id premier) :
$('span#premier').css('color', 'red');
Figure 2.18
La fonction attr() permet
de lire et de modifier la
valeur d’un attribut.
40 Chapitre 2
À titre d’exemple, supposons que vous vouliez modifier l’attribut src de la balise <img>
suivante en utilisant jQuery :
<img id="image1" src="chat.jpg">
Chaînage jQuery
Les fonctions jQuery retournent un objet jQuery. Il est donc possible de chaîner différentes
fonctions pour effectuer plusieurs actions en une seule instruction. Par exemple, pour
modifier la couleur du texte et la couleur de l’arrière-plan d’une balise <span> d’id
#monTexte, vous pouvez utiliser les instructions suivantes :
$('#monTexte').css('color','red');
$('#monTexte').css('background','yellow');
Pour faire plus simple, vous pouvez également utiliser une seule instruction en chaînant
les deux fonctions css() :
$('#monTexte').css('color','red').css('background','yellow');
Cette technique fonctionne sur toutes les fonctions jQuery. Libre à vous de l’utiliser ou de
définir une seule action par instruction. Le résultat obtenu sera le même.
Figure 2.19
Le résultat final.
42 Chapitre 2
3
Éléments textuels
Les balises permettant d’afficher
du texte
Pour afficher du texte dans le navigateur, il suffit de le saisir entre les balises <body>
et </body>. Cependant, pour faciliter sa mise en forme à l’aide d’instructions CSS ou
jQuery, vous pouvez encapsuler le texte dans plusieurs balises : <p>, <span>, <div> et
<h1> à <h6>. Vous connaissez la plupart d’entre elles :
■■ <p></p> définit un paragraphe, c’est-à-dire un bloc de texte suivi d’un saut de ligne.
■■ <span></span> isole un bloc de texte afin de faciliter sa mise en forme.
■■ <div></div> isole un bloc pouvant contenir du texte, des images, des vidéos et
n’importe quel autre type de données.
■■ <h1> à <h6> définissent des titres de niveaux 1 à 6.
<p>, <div> et <h1> à <h6> sont des balises de type block. Comparables à des
paragraphes dans un traitement de texte, elles s’affichent les unes sous les autres. Quant
à <span>, il s’agit d’une balise de type inline. Son utilisation dans une balise <div>
ou <p> ne rompra pas le flot du texte qui continuera à s’afficher sur la même ligne, si les
dimensions de la fenêtre le permettent bien entendu.
Pour bien comprendre la différence entre les balises de type block et les balises de type
inline, observez le code ci-après et son résultat dans le navigateur, comme représenté
Figure 3.1 :
<h1>Un titre h1</h1>
<h2>suivi d’un titre h2</h2>
<p>Ce texte</p>
<p>montre les différences entre <span>les balises de type inline</span> et les
➥balises </p>
<div>de type block</div>
Figure 3.1
Les balises de type
block s’affichent les
unes sous les autres. Les
balises de type inline
s’affichent les unes à la
suite des autres.
Comme vous pouvez le voir, seule la balise <span> ne provoque aucune rupture dans
l’écriture du texte. Toutes les autres balises provoquent un passage à la ligne et un saut
de ligne.
Listes HTML
Dans le chapitre précédent, vous avez fait connaissance avec les listes à puces (<ul>)
et les listes numérotées (<ol>). Le langage HTML5 permet également de créer des
listes de descriptions. Les listes de descriptions étaient déjà présentes dans HTML 4.x.
Souvent boudées et utilisées de manière non sémantique, elles ont subi un lifting pour
être remises au goût du jour dans HTML5. La balise <dfn> est essentiellement utilisée
pour encapsuler les mots d’un glossaire, à l’intérieur de la balise <dt>. Notez qu’on
peut également définir plusieurs descriptions (<dd>) pour un seul nom (<dt>), ou encore
regrouper plusieurs noms pour une seule description.
Cet exemple vous aidera à mieux comprendre l’utilité des listes de descriptions (voir
Figure 3.2) :
<dl>
<dt><dfn>Bit</dfn></dt>
<dd>Information représentée par un symbole à deux valeurs généralement notées 0
➥et 1, associées aux deux états d’un dispositif.</dd>
<dt><dfn>Octet</dfn></dt>
<dd>Ensemble ordonné de huit éléments binaires traités comme un tout.</dd>
</dl>
Figure 3.2
Les mots du glossaire
et les descriptions sont
automatiquement mis en
forme grâce aux balises
<dfn>, <dt> et <dd>.
44 Chapitre 3
Personnaliser une liste
Dans les pages précédentes, vous avez vu qu’il était possible de personnaliser le type
des puces ou des numéros dans une liste, en utilisant la propriété CSS list-style-
type.
ol { list-style-type: lower-latin;}
ul { list-style-type: square;}
Ces propriétés sont également accessibles en jQuery, via la fonction css(). Voici les
instructions jQuery équivalentes :
$('ol').css('list-style-type','lower-latin');
$('ul').css('list-style-type','square');
Si vous vous sentez limité par les styles de puces accessibles par défaut en CSS3, sachez
que la propriété list-style-image permet d’utiliser n’importe quelle image comme
symbole de puce. Voici sa syntaxe :
list-style-image: url(adresse);
Éléments textuels 45
Figure 3.3
La liste à puces a désormais une tout
autre allure.
Info
Si l’image spécifiée dans la propriété list-style-image n’est pas trouvée, la puce par
défaut la remplacera. Si vous souhaitez une puce circle, square ou aucune puce, vous
devrez initialiser la propriété list-style-type en conséquence. Par exemple :
ul {
list-style-image: url(blueball.gif);
list-style-type: square;
}
Je ne sais pas si vous l’avez remarqué, mais les puces de la Figure 3.3 ne sont pas
alignées horizontalement avec le texte qui les suit. Ceci vient du fait que leur hauteur
est inférieure à celle du texte. Pour résoudre ce problème, vous utiliserez une image
d’arrière-plan à la place de la propriété list-style-image (voir Figure 3.4).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Liste à puces</title>
<style type="text/css">
ul {list-style-type: none;}
li {
background-image: url(blueball.gif);
background-repeat: no-repeat;
background-position: 0 1px;
padding-left: 25px;
line-height: 20px;
}
</style>
</head>
<body>
<ul>
<li>Premier</li>
<li>Deuxième</li>
<li>Troisième</li>
<li>Quatrième</li>
</ul>
46 Chapitre 3
</body>
</html>
Figure 3.4
Les puces sont maintenant bien
alignées.
Lorsque plusieurs polices sont spécifiées, la première police disponible sur l’ordinateur
où s’exécute le code est utilisée. Vous devez choisir en dernier lieu un nom de police
générique, qui existera forcément sur tous les ordinateurs : serif, sans-serif, cursive,
fantasy ou monospace.
Voici quelques types de polices correspondant à chacun des types génériques :
■■ serif : Times New Roman, Bodoni, Garamond, MS Georgia.
■■ sans-serif : MS Trebuchet, MS Arial, MS Verdana, Univers, Futura, Gill Sans,
Helvetica.
■■ cursive : Script, Segoe Script, Comic Sans MS, Viner Hand ITC, Vladimir Script.
■■ fantasy : Kino MT, Tektonpro, Critter, Studz.
■■ monospace : Courier, MS Courier New, Prestige.
Éléments textuels 47
La définition de la police peut se faire :
1. En CSS, dans une feuille de styles interne ou externe :
p {font-family: "Courier New", Courier, monospace;}
h1 {font-family: "Times New Roman", Garamond, serif;}
p {font-family: "Comic sans MS", Script, cursive;}
Attention
Les noms de polices contenant des espaces doivent être placés entre guillemets.
Il est fortement déconseillé de choisir une police fantasy pour afficher vos textes. En
effet, chaque système d’exploitation possède ses propres polices fantasy. L’affichage
est donc des plus aléatoires.
2. En jQuery :
$('p').css('font-family','"Courier New", Courier, monospace');
$('h1').css('font-family','"Times New Roman", Garamond, serif');
$('p').css('font-family','"Comic sans MS", Script, cursive');
48 Chapitre 3
Figure 3.5
Termes techniques relatifs à la
taille des polices.
Éléments textuels 49
■■ lowercase : tous les caractères en minuscules.
Voici un exemple d’utilisation :
■■ En HTML : <span id="trans1" style="text-transform:
uppercase;">texte</span>
■■ En CSS : span#trans1 {text-transform: uppercase;}
■■ En jQuery : $('span#trans1').css('text-transform', 'uppercase');
La propriété font-variant permet de mettre un texte en petites majuscules lorsque la
valeur small-caps lui est affectée :
■■ En HTML : <p id="sc">Un texte en small caps</p>
■■ En CSS : p#sc {font-variant: small-caps;}
■■ En jQuery : $('p#sc').css('font-variant', 'small-caps');
La propriété text-indent définit l’indentation de la première ligne d’un paragraphe.
La valeur de l’indentation peut être spécifiée en utilisant une unité de taille quelconque
(px, pt, mm, in, etc.) ou un pourcentage. Si la valeur est négative, le texte est décalé vers
la gauche. Dans ce cas, pensez à définir une marge à gauche : sinon, le début du texte
risque d’être masqué. Voici un exemple d’utilisation :
■■ En HTML : <p id="ti" style="text-indent: 30px;">Ce paragraphe est
indenté de 30 px sur la première ligne</p>
■■ En CSS : p#ti {text-indent: 30px;}
■■ En jQuery : $('p#ti').css('text-indent', '30px');
50 Chapitre 3
Où :
■■ nom-police est le nom de la police, tel qu’il sera utilisé dans la feuille de styles.
■■ style-police définit le style de la police : all, normal, italic ou oblique.
■■ petites-capitales indique la casse des caractères : normal ou small-caps.
■■ graisse-police indique la graisse de la police : all, normal, bold, 100, 200,
300, 400, 500, 600, 700, 800 ou 900.
■■ condensé-étendu définit l’état de compression/extension horizontale de la
police : all, normal, ultra-condensed, extra-condensed, condensed,
semi-condensed, semi-expanded, expanded, extra-expanded ou
ultra-expanded.
■■ taille-police définit les tailles possibles pour la police : all pour toutes les
polices proportionnelles, une ou deux tailles pour les polices bitmap ou devant être
rendues dans une taille ou une fourchette de tailles spécifiques.
■■ nom-local définit le nom local de la police, au cas où cette dernière serait installée
sur l’ordinateur.
■■ url-police définit l’adresse URL de la police accessible sur le serveur.
■■ format-police définit le format de la police : truedoc-pfr (TrueDoc™ Portable
Font Resource, .pfr), embedded-opentype (Embedded OpenType, .eot), type-
1 (PostScript™ Type 1, .pfb ou .pfa), truetype (TrueType, .ttf) ou opentype
(OpenType, .ttf).
À titre d’exemple, pour implémenter la police serveur Little Bird, disponible dans le
dossier Fonts, sous le nom LittleBird.ttf, vous définirez la propriété suivante :
@font-face
{
font-family: "Little Bird";
src: url("fonts/LittleBird.ttf");
}
Pour utiliser une police implémentée via @font-face, il suffit d’affecter la propriété
font-family définie dans @font-face à un élément ou une classe quelconque. Ici,
par exemple, nous affectons la police serveur Little Bird au titre h1 du document (voir
Figure 3.6) :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Police serveur</title>
<style type="text/css">
@font-face
{
font-family: "Little Bird";
src: url("LittleBird.ttf");
}
h1 {font-family: 'Little Bird';}
</style>
</head>
Éléments textuels 51
<body>
<h1>Un titre en Little Bird</h1>
</body>
</html>
Figure 3.6
Le titre h1 est affiché avec la
police Little Bird.
Vous vous demandez certainement comment obtenir les quatre variantes d’une police.
Rendez-vous sur le site Font Squirrel (www.fontsquirrel.com/fonts/) et basculez sur
l’onglet WEBFONT GENERATOR, dans la partie supérieure de la page. Sélectionnez
l’option OPTIMAL, cochez la case Yes, the fonts I’m uploading are legally eligible for Web
embedding et cliquez sur Add Fonts pour ajouter la police que vous voulez convertir (voir
Figure 3.7).
52 Chapitre 3
Figure 3.7
La police
LittleBird
Medium a été
uploadée.
Il ne vous reste plus qu’à cliquer sur DOWNLOAD YOUR KIT pour générer les autres
formats de polices. Quelques instants plus tard, Font Squirrel vous proposera de
télécharger une archive au format ZIP dans laquelle se trouvent les quatre versions de la
police (voir Figure 3.8).
Figure 3.8
Le kit contenant les quatre versions de la police a été généré.
Il ne vous reste plus qu’à dézipper l’archive pour accéder aux quatre versions des polices
(voir Figure 3.9).
Figure 3.9
Les quatre versions
des polices sont
accessibles dans
le kit.
Pour faciliter les choses, le fichier stylesheet.css contient le code CSS3 nécessaire à
l’implémentation de la police :
/* Generated by Font Squirrel (http://www.fontsquirrel.com) on November 18, 2013 */
Éléments textuels 53
@font-face {
font-family: 'littlebirdmedium';
src: url('littlebird-webfont.eot');
src: url('littlebird-webfont.eot?#iefix') format('embedded-opentype'),
url('littlebird-webfont.woff') format('woff'),
url('littlebird-webfont.ttf') format('truetype'),
url('littlebird-webfont.svg#littlebirdmedium') format('svg');
font-weight: normal;
font-style: normal;
Figure 3.10
Démonstration de l’utilisation
de la police. Ici, dans
Internet Explorer 11.
54 Chapitre 3
Le type de soulignement peut également être choisi avec la propriété CSS
text-decoration :
■■ a {text-decoration: valeur;} pour les liens non visités ;
■■ a:visited {text-decoration: valeur} pour les liens visités.
La propriété text-decoration peut prendre les valeurs suivantes :
■■ none : aucun soulignement.
■■ underline : soulignement par défaut, au-dessous du lien.
■■ overline : soulignement au-dessus du lien.
■■ overline underline : soulignement double, au-dessous et au-dessus du lien.
■■ line-through : barre transversale sur toute la longueur du lien.
Cet exemple utilise quatre classes pour illustrer les différentes couleurs et décorations
que peuvent revêtir les liens non visités et les liens visités.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Mise en forme des liens hypertexte</title>
<style>
a.type1 {color: red; text-decoration: none; }
a.type1:visited {color: blue; text-decoration: underline; }
a.type2 {color: blue; text-decoration: overline; }
a.type2:visited {color: red; text-decoration: none; }
a.type3 {color: red; text-decoration: overline underline; }
a.type3:visited {color: blue; text-decoration: overline; }
a.type4 {color: blue; text-decoration: line-through; }
a.type4:visited {color: red; text-decoration: underline; }
</style>
</head>
<body>
<a href="http://www.page1.fr" class="type1">Lien vers la page 1</a>
<a href="http://www.page2.fr" class="type2">Lien vers la page 2</a>
<a href="http://www.page3.fr" class="type3">Lien vers la page 3</a>
<a href="http://www.page4.fr" class="type4">Lien vers la page 4</a>
</body>
</html>
Les propriétés relatives au texte sont également utilisables dans un style relatif aux liens
hypertexte. Vous utiliserez en particulier les propriétés suivantes :
■■ font-family : police(s) à utiliser.
■■ font-size : taille des caractères.
■■ font-style : orientation des caractères (normal, italic ou oblique).
■■ font-weight : graisse de la police.
■■ font-variant : caractères par défaut (normal) ou petites majuscules (small-caps).
■■ text-transform : casse des caractères (none, capitalize, uppercase ou
lowercase).
Éléments textuels 55
■■ background-color : couleur d’arrière-plan du lien.
Enfin, notez qu’il est possible d’utiliser la pseudo-classe a:hover, associée à la propriété
color, pour changer la couleur des liens hypertexte lorsque le pointeur les survole. Ici,
par exemple, le lien est affiché en rouge lorsqu’il est pointé par la souris :
a:hover {color: red;}
Toutes les propriétés abordées dans cette section sont également accessibles en jQuery,
via la fonction css(). Par exemple, pour que les liens hypertexte soient affichés avec un
soulignement au-dessus du lien lorsqu’ils ont été visités, vous utiliserez le code suivant :
$('a:visited').css('text-decoration', 'overline');
56 Chapitre 3
Exercice 2
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
Définissez le code HTML et CSS nécessaire pour obtenir le résultat présenté à la
Figure 3.11. Sauvegardez le code HTML dans le fichier index.htm et le code css dans le
fichier site.css.
Figure 3.11
Le résultat à obtenir.
Éléments textuels 57
4
Couleur des éléments
Couleur du texte
La couleur du texte est définie par la propriété CSS color. Voici sa syntaxe :
color: couleur;
Où red, green et blue sont les composantes rouge, verte et bleue de la couleur. Ces
trois informations peuvent prendre 256 valeurs, codées entre 0 et 255.
Voici deux exemples d’utilisation en HTML :
<p style="color:rgb(255, 0, 0);">Ce texte est affiché en rouge</p>
<p style="background-color:rgb(255, 255, 0);">et celui-ci a un arrière-plan de
➥couleur jaune</p>
Bien entendu, cette fonction peut également être utilisée dans une règle CSS ou dans
une instruction jQuery. Voici comment pourrait être réécrit le code précédent en CSS et
en jQuery :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Fonction RGB()</title>
<script src=http://code.jquery.com/jquery.min.js></script>
<style style="text/css">
#css1 { color:rgb(255,0,0); }
#css2 { background-color:rgb(255,255,0); }
</style>
</head>
<body>
<p style="color:rgb(255,0,0);">Ce texte est affiché en rouge</p>
<p style="background-color:rgb(255,255,0);">et celui-ci a un arrière-plan de
➥couleur jaune</p>
<script>
60 Chapitre 4
$(function(){
$('#jq1').css('color', 'rgb(255, 0, 0)');
$('#jq2').css('background-color', 'rgb(255, 255, 0)');
});
</script>
</body>
</html>
Où :
■■ red, green et blue sont les composantes rouge, verte et bleue de la couleur. Ces
trois informations peuvent prendre 256 valeurs, codées entre 0 et 255.
■■ alpha est le degré d’opacité de la couleur. Cette information est un nombre décimal
codé entre 0 (transparent) et 1 (opaque).
La fonction RGBA() ne doit pas être confondue avec la propriété CSS opacity. La
première agit sur une propriété CSS et la seconde sur un élément HTML. L’exemple
suivant va clarifier les choses (voir Figure 4.1) :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Fonction RGB()</title>
<script src=http://code.jquery.com/jquery.min.js></script>
<style style="text/css">
div {
height: 200px;
width: 200px;
font-size: 40px;
color: red;
}
Figure 4.1
La fonction RGBA() et la propriété
opacity sont bien différentes.
Comme vous pouvez le voir, la fonction RGBA() n’affecte que la couleur d’arrière-plan
dans la balise d’identifiant #div2, alors que la propriété opacity affecte la couleur
d’arrière-plan et le texte dans la balise #div3.
Gradient linéaire
Il est bien souvent nécessaire de réaliser un dégradé dans l’arrière-plan d’un conteneur
HTML. Au moment où j’écris ces lignes, cette possibilité n’est pas implémentée de façon
standard sur les navigateurs. Pour définir un gradient linéaire, vous devrez utiliser des
préfixes destinés à chaque navigateur :
■■ -moz-linear-gradient pour les navigateurs Gecko (Mozilla Firefox) ;
■■ -webkit-gradient pour les navigateurs WebKit (Safari, Chrome) ;
■■ -ms-gradient pour les navigateurs Internet Explorer.
Voici la syntaxe détaillée de ces trois propriétés :
-moz-linear-gradient(p1, c1, c2) no-repeat;
Où :
■■ p1 représente les coordonnées du point de départ du gradient : sur le navigateur
Mozilla et Internet Explorer, p1 peut prendre une ou plusieurs des valeurs suivantes :
top, left, right et/ou down. Sur les navigateurs WebKit, p1 représente un
pourcentage horizontal et un pourcentage vertical.
62 Chapitre 4
■■ p2 représente les coordonnées du point d’arrivée du gradient sur les navigateurs
WebKit. Il est défini par un pourcentage horizontal et un pourcentage vertical de la
zone cible.
■■ c1 est la couleur de départ du gradient.
■■ c2 est la couleur de fin du gradient.
Gradient vertical
Par exemple, pour définir un gradient vertical de la couleur rouge à la couleur bleue, vous
utiliserez les déclarations de styles CSS3 suivantes :
background: -moz-linear-gradient(top, red, yellow);
background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(red), to(yellow));
background: -ms-linear-gradient(top, red, yellow);
Voici un exemple de code complet. Ici, le gradient vertical est affecté à une balise <div>
de 200 pixels sur 200 (voir Figure 4.2) :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Gradient linéaire</title>
<style style="text/css">
div {
height: 200px;
width: 200px;
background: -moz-linear-gradient(top, red, yellow);
background: -webkit-gradient(linear, 0% 0%, 0% 100%, from(red),
➥to(yellow));
background: -ms-linear-gradient(top, red, yellow);
}
</style>
</head>
<body>
<div></div>
</body>
</html>
Figure 4.2
Un gradient vertical compatible Internet Explorer,
Chrome et Firefox.
Voici un exemple de code. Comme dans l’exemple précédent, le gradient vertical est
affecté à une balise <div> de 200 pixels sur 200 (voir Figure 4.3) :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Gradient linéaire horizontal</title>
<style style="text/css">
div {
height: 200px;
width: 200px;
background: -moz-linear-gradient(left, red, yellow);
background: -webkit-gradient(linear, 0% 0%, 100% 0%, from(red),
➥to(yellow));
background: -ms-linear-gradient(left, red, yellow);
}
</style>
</head>
<body>
<div></div>
</body>
</html>
Figure 4.3
Un gradient horizontal compatible Internet
Explorer, Chrome et Firefox.
64 Chapitre 4
Gradient diagonal
Pour définir un gradient diagonal de la couleur rouge à la couleur jaune, il suffit de
changer les coordonnées du point de départ (Gecko, Internet Explorer) ou des points
de départ et d’arrivée (WebKit) :
background: -moz-linear-gradient(top left, red, yellow);
background: -webkit-gradient(linear, 0% 0%, 100% 100%, from(red), to(yellow));
background: -ms-linear-gradient(top left, red, yellow);
Figure 4.4
Un gradient diagonal du coin supérieur gauche
au coin inférieur droit.
Où :
■■ Les pi sont les coordonnées des différentes transitions de couleurs, exprimées en
pourcentages.
■■ Les ci sont les différentes couleurs du gradient.
Pour les navigateurs WebKit, vous utiliserez la syntaxe suivante :
-webkit-gradient(linear, p1, p2, from(c1), color-stop(v2, c2), color-stop(v3,
➥c3), …, to(cN));
Où :
■■ p1 et p2 sont les coordonnées des points de départ et d’arrivée du gradient, exprimées
en pourcentages.
Figure 4.5
Plusieurs transitions ont été
définies dans ce gradient
horizontal.
Pour créer vos gradients plus aisément, vous pouvez vous rendre sur la page
http://gradients.glrzad.com/, où quelques réglages élémentaires permettent d’obtenir
le code CSS3 correspondant (voir Figure 4.6).
66 Chapitre 4
Figure 4.6
Un générateur de gradients en ligne.
Gradient radial
Vous savez maintenant affecter un gradient linéaire à un conteneur quelconque. Cette
section va vous montrer comment créer des gradients radiaux, c’est-à-dire des dégradés
de couleurs qui rayonnent depuis leur origine en décrivant un cercle ou une ellipse. Les
propriétés à utiliser sont les suivantes :
■■ -webkit-gradient(radial, …) sur les navigateurs WebKit (Safari, Chrome) ;
■■ -moz-radial-gradient sur les navigateurs Gecko (Mozilla Firefox) ;
■■ -ms-radial-gradient sur les navigateurs Internet Explorer 10 et supérieur.
Où :
■■ p1 représente les coordonnées du point intérieur du gradient.
■■ r1 est le rayon intérieur du gradient.
■■ p2 représente les coordonnées du point extérieur du gradient.
■■ r2 est le rayon extérieur du gradient.
■■ c1 est la couleur intérieure du gradient.
■■ c2 est la couleur extérieure du gradient.
Pour les navigateurs Gecko et Internet Explorer 10 et supérieur :
background: -moz-radial-gradient(p1, forme taille, c1, c2);
Voici un exemple de code. Le gradient radial est affecté à une balise <div> de 200 pixels
sur 200 (voir Figure 4.7) :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Gradient radial</title>
<style style="text/css">
div {
height: 200px;
width: 200px;
background: -webkit-gradient(radial, 50% 0%, 20, 50% 100%, 40, from(red),
➥to(yellow));
background: -moz-radial-gradient(50% 50%, closest-side, red, yellow);
background: -ms-radial-gradient(50% 50%, circle closest-side, red,
➥yellow);
}
</style>
</head>
<body>
<div></div>
</body>
</html>
68 Chapitre 4
Figure 4.7
Un gradient radial du rouge au jaune.
Pour les navigateurs Gecko et Internet Explorer 10 et supérieur, il est nécessaire d’ajouter
deux pourcentages lors de la définition des couleurs. Ici, le rouge constitue le point de
départ du gradient (0 %) et le jaune s’arrête à 30 % de la taille maximale du gradient (30 %
de farthest-side) :
background: -moz-radial-gradient(50% 50%, circle farthest-side, red 0%, yellow
➥30%);
background: -ms-radial-gradient(50% 50%, circle farthest-side, red 0%, yellow
➥30%);
Figure 4.8
Le gradient n’occupe pas toute la surface du
conteneur.
Pour les navigateurs Gecko et Internet Explorer 10 et supérieur, la syntaxe est beaucoup
plus simple : il suffit de préciser les différentes couleurs comme paramètres de la propriété
-moz-radial-gradient et -ms-radial-gradient. Ici, le gradient va du rouge au
noir en passant par le jaune et le bleu :
background: -moz-radial-gradient(circle, red, yellow, blue, black);
background: -ms-radial-gradient(circle, red, yellow, blue, black);
70 Chapitre 4
<title>Gradient radial multiple </title>
<style style="text/css">
div {
height: 200px;
width: 200px;
background: -webkit-gradient(radial, 50% 50%, 0, 50% 50%, 150, from(red),
➥color-stop(.25,yellow), color-stop(.50, blue), to(blue));
background: -moz-radial-gradient(circle, red, yellow, blue, black);
background: -ms-radial-gradient(circle, red, yellow, blue, black);
}
</style>
</head>
<body>
<div></div>
</body>
</html>
Figure 4.9
Un gradient radial multiple.
Figure 4.10
Le résultat à atteindre.
Ici, le lien Vertical a été
cliqué.
Pour arriver à ce résultat, vous devez utiliser deux techniques qui n’ont pas encore été
décrites : l’alignement CSS float et l’exécution de code jQuery lorsqu’un élément HTML
est cliqué.
Dans la Figure 4.10, les mots Uni, Horizontal et Vertical sont alignés à gauche et le
copyright est aligné à droite. Pour arriver à ce résultat, vous encapsulerez le copyright
dans une balise <span> et vous initialiserez à right sa propriété CSS float.
Le code jQuery à mettre en œuvre pour réagir au clic sur un élément d’identifiant
#unElement est le suivant :
$('#unElement').click(function() {
72 Chapitre 4
// Une ou plusieurs instructions jQuery
});
Pour l’instant, contentez-vous d’utiliser ce code. Il vous sera expliqué en détail dans le
Chapitre 10.
Où nom est le chemin complet de l’image. Par exemple, img/monimage.gif pour une
image locale située dans le dossier enfant img, ou encore http://nom-site/nom-
dossier/nom-image.jpg pour l’image nom-image.jpg accessible dans le dossier
nom-dossier de la page http://nom-site.
Plusieurs autres attributs optionnels peuvent être utilisés. Ils sont résumés dans le tableau
suivant.
Si l’image est plus petite que la page, elle est répétée autant de fois que nécessaire
pour couvrir la totalité de la page. Ce comportement est souhaitable si l’image est une
trame de fond. En revanche, il est désastreux s’il s’agit d’une photo. Pour résoudre ce
problème, vous pouvez centrer l’image en interdisant son redimensionnement. Voici le
code à utiliser :
<html style="background: url(paysage.jpg) no-repeat center fixed;">
L’approche CSS va nous permettre d’aller plus loin en redimensionnant l’image de façon
qu’elle occupe la totalité de la fenêtre. Dans un premier temps, voici le code nécessaire
pour affecter une image d’arrière-plan à la page :
html {
background: url(paysage.jpg);
}
Si vous voulez que l’image soit centrée et qu’elle n’apparaisse qu’une seule fois, le code
CSS devient :
html {
background: url(paysage.jpg) no-repeat center fixed;
}
Enfin, si vous voulez que l’image soit automatiquement redimensionnée pour occuper la
totalité de la fenêtre, le code à utiliser est le suivant :
html {
background: url(paysage.jpg) no-repeat center fixed;
-webkit-background-size: cover;
-moz-background-size: cover;
-ms-background-size: cover;
background-size: cover;
}
76 Chapitre 5
Une image en arrière-plan
d’un conteneur
Vous pouvez insérer une image d’arrière-plan dans un conteneur quelconque (une balise
<div>, une cellule de tableau <td>, un paragraphe <p>, etc.). Pour cela, définissez une
classe qui initialise l’arrière-plan de l’élément avec la propriété background, puis faites
référence à cette classe dans les éléments concernés.
Dans le code suivant, la classe bgimage est successivement affectée aux balises <p>,
<td>, <div>, <span> et <a>. Le résultat est représenté à la Figure 5.1.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Une image en arrière-plan d’un conteneur</title>
<style type="text/css">
.bgimage { background: url(paysage.jpg); }
</style>
</head>
</body>
<p class="bgimage">Texte dans un paragraphe</p>
<table border>
<tr>
<td class="bgimage">Texte dans la première cellule</td>
<td>Texte dans la deuxième cellule</td>
</tr>
</table>
<br />
<div class="bgimage">Texte dans le div</div>
<br />
<span class="bgimage">Texte dans un span</span>
<br /><br />
<a href="http://www.bing.com" class="bgimage">Cliquez ici pour accéder au
➥moteur de recherche Bing</a>
</body>
</html>
Images 77
Figure 5.1
De nombreux éléments HTML
peuvent utiliser une image
d’arrière-plan.
Par défaut, un cadre entoure les images utilisées comme liens hypermédia. Pour
supprimer ce cadre, affectez la valeur 0 à l’attribut border de l’image :
<a href="une-page.htm"><img src="une-image.jpg" border="0"></a>
78 Chapitre 5
<figcaption>Un paysage hivernal.</figcaption>
</figure>
Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium
➥doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore
➥veritatis et quasi architecto beatae vitae dicta sunt explicabo.
</body>
</html>
Attention
La balise <figcaption> doit être définie comme premier ou dernier enfant de la balise
<figure>.
Figure 5.2
L’image et sa légende sont
automatiquement indentées par
rapport au texte avoisinant.
Images 79
Voici un exemple de code et son effet, représenté à la Figure 5.3.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Aligner une image dans un conteneur</title>
<style type="text/css">
#lediv {
background: #ACE8E0;
width: 500px;
height: 300px;
border: 1px solid black;
text-align: center;
display: table-cell;
vertical-align: middle;
}
</style>
</head>
<body>
<div id="lediv">
<img src="petitpaysage.jpg">
</div>
</body>
</html>
Figure 5.3
L’image est bien centrée
dans le conteneur <div>.
80 Chapitre 5
Modifier les caractéristiques d’une
image lorsqu’elle est survolée
Il est possible de modifier les caractéristiques d’une image (taille, contour, transparence,
etc.) lorsqu’elle est survolée par le pointeur de la souris. Pour cela, vous pouvez utiliser
une approche CSS ou jQuery.
En CSS, le pseudo-sélecteur img:hover permet de cibler l’image lorsqu’elle est survolée
par le pointeur. Il suffit alors de modifier une ou plusieurs propriétés pour obtenir l’effet
souhaité. Vous pouvez, par exemple, agir sur les propriétés suivantes :
■■ height et width : largeur et hauteur de l’image.
■■ opacity : opacité de l’image.
■■ top et left : position de l’image si elle est positionnée de façon absolue.
■■ border : bordure de l’image.
À titre d’exemple, voici comment modifier les dimensions d’une image lorsqu’elle est
survolée par le pointeur de la souris :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Agrandissement d’une image au survol</title>
<style type="text/css">
#paysage:hover { width: 500px; }
</style>
</head>
<body>
<img src="paysage.jpg" id="paysage" width="250">
</body>
</html>
L’approche jQuery est tout aussi simple. Voici un exemple de code dans lequel la position
de l’image est modifiée au survol de la souris :
<!DOCTYPE html>
<html>
<head>
<meta charset= "UTF-8" />
<title>Agrandissement d’une image au survol</title>
<script src=http://code.jquery.com/jquery.min.js></script>
<style type="text/css">
#paysage {
position: absolute;
top: 20px;
left: 120px;
}
</style>
</head>
<body>
Images 81
<img src="petitpaysage.jpg" id="paysage">
<script>
$(function(){
$('#paysage').mouseover(function(){
$('#paysage').css('top', '100px');
});
$('#paysage').mouseout(function(){
$('#paysage').css('top', '20px');
});
});
</script>
</body>
</html>
82 Chapitre 5
<body>
<img src="chien250.jpg" id="chien">
<img src="chat250.jpg" id="chat">
<img src="cheval250.jpg" id="cheval">
<img src="girafe250.jpg" id="girafe">
</body>
</html>
Figure 5.4
L’image pointée passe en avant-plan.
Préchargement d’images
Si vous utilisez la pseudo-classe :hover pour afficher une image, cette dernière sera
chargée au moment où le pointeur sera placé sur le lien. En fonction du poids de l’image
et de la nature de la connexion Internet, le délai nécessaire au chargement de l’image
peut s’avérer gênant. Pour résoudre ce problème, vous préchargerez l’image en forçant
à la valeur none sa propriété display.
<body>
...
<img src="monimage.jpg" style="display: none;" />
...
</body>
L’image est préchargée lors de l’ouverture de la page. Son affichage sera donc immédiat
à l’utilisation de la pseudo-classe :hover.
Images 83
Attention
La ou les images préchargées doivent être spécifiées aussi bas que possible dans le
code HTML. En effet, l’exécution du code HTML étant séquentielle, l’affichage de la page
sera retardé par les instructions de préchargement. Mieux vaut donc repousser ces
instructions vers la fin du listing.
Images réactives
Les images réactives comportent une ou plusieurs zones cliquables. Lorsque l’utilisateur
clique sur l’une d’entre elles, un traitement particulier est effectué ou une page Web
annexe est ouverte. Il est possible d’utiliser le langage CSS pour rendre une image
réactive. Il suffit pour cela de définir autant de balises <a> que de zones réactives et de
dimensionner ces balises en conséquence par l’intermédiaire d’un ou de plusieurs styles.
Dans cet exemple, nous allons définir trois zones réactives sur les trois couleurs du
drapeau français (voir Figure 5.5). Le découpage étant élémentaire, un seul style sera
nécessaire pour mettre en place les trois zones réactives.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Empilement d’images avec z-index</title>
<style type="text/css">
#imagemap {
background: url(drapeau_francais.jpg) top left no-repeat;
width:460px;
height: 302px;
}
.map {
float: left;
width: 149px;
height: 300px;
border: 1px dashed #aaa;
}
</style>
</head>
<body>
<div id="imagemap">
<a title="bleu" class="map"></a>
<a title="blanc" class="map"></a>
<a title="rouge" class="map"></a>
</div>
</body>
</html>
La partie HTML du code met en place un <div> d’identificateur imagemap. Cette balise
contient trois liens fictifs de classe map pour lesquels l’attribut title est renseigné. Ainsi,
84 Chapitre 5
une info-bulle contenant le texte de l’attribut title sera affichée lorsque le pointeur se
trouvera au-dessus de chacune des zones réactives.
La partie CSS du code contient deux styles.
■■ Le sélecteur d’identificateur #imagemap définit les caractéristiques du <div>
imagemap : arrière-plan (background) et dimensions (width et height).
■■ Le sélecteur de classe .map définit les caractéristiques des zones cliquables : affichage
flottant (float: left;), taille (width et height) et bordures (border).
Figure 5.5
La troisième
zone réactive
est pointée, ce
qui provoque
l’affichage de
l’attribut titre
de la balise <a>
correspondante.
Album photos
La réalisation d’un album photos HTML/CSS/jQuery est intéressante à plus d’un égard.
Elle repose sur les actions suivantes :
■■ préchargement des images de l’album ;
■■ affichage de la première image ;
■■ définition de liens hypertexte fictifs gérés en jQuery.
Cet album est composé de cinq photos de même taille. Ici, 600 × 374 pixels (voir
Figure 5.6). Voici le code :
<!DOCTYPE html>
<html>
<head>
<style type="text/css">
a { padding-right: 20px; }
</style>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
Images 85
<body>
Choisissez l’image à afficher :
<a id="i1" href=#>01</a>
<a id="i2" href=#>02</a>
<a id="i3" href=#>03</a>
<a id="i4" href=#>04</a>
<a id="i5" href=#>05</a>
<br /><br /><img id= "image" src="i1.jpg">
<!-- Préchargement des images de l’album -->
<img src="i2.jpg" style="display: none;" />
<img src="i3.jpg" style="display: none;" />
<img src="i4.jpg" style="display: none;" />
<img src="i5.jpg" style="display: none;" />
<script>
$(function(){
$('#i1').click(function(){
$('#image').attr('src','i1.jpg');
});
$('#i2').click(function(){
$('#image').attr('src','i2.jpg');
});
$('#i3').click(function(){
$('#image').attr('src','i3.jpg');
});
$('#i4').click(function(){
$('#image').attr('src','i4.jpg');
});
$('#i5').click(function(){
$('#image').attr('src','i5.jpg');
});
});
</script>
</body>
</html>
La partie HTML du code affiche le texte "Choisissez l’image à afficher" suivi des liens
permettant d’afficher les cinq images. Observez la syntaxe utilisée. Par exemple pour le
premier lien :
<a id="i1" href=#>01</a>
L’attribut href ne pointe vers aucune image. Ce qui laisse supposer que le traitement du
clic se fera en CSS ou en jQuery. Le code HTML se poursuit par l’affichage de la première
image et le préchargement des quatre autres.
Le code CSS est très simple. Il se limite à définir un padding à droite de 20 pixels sur tous
les liens hypertexte afin de les espacer :
a { padding-right: 20px; }
86 Chapitre 5
Figure 5.6
Un album photos
élémentaire en
HTML5/CSS3/jQuery.
Les dernières instructions sont écrites en jQuery. Elles permettent de réagir aux clics de
l’utilisateur sur les cinq liens hypertexte. Examinons le code relatif au clic sur le premier
lien :
$('#i1').click(function(){
$('#image').attr('src','i1.jpg');
});
Lorsque l’élément d’identifiant #i1 (c’est-à-dire le premier lien hypertexte) est cliqué,
l’élément d’identifiant #image (c’est-à-dire l’image affichée dans le document) voit son
attribut src initialisé à i1.jpg, ce qui provoque l’affichage de l’image i1.jpg.
Les quatre blocs d’instructions qui suivent sont tout à fait comparables, à ceci près qu’ils
capturent les clics sur les liens #i2 à #i5 et affichent les images i2.jpg à i5.jpg.
Images 87
Exercice 4
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
Vous allez enrichir le code HTML et CSS de l’exercice 3.
Rendez-vous sur le site www.backgroundcity.com, téléchargez une texture à votre
convenance et permettez à l’utilisateur de l’utiliser en arrière-plan de la page en ajoutant
le lien Texture dans le bas de page.
Insérez le logo HTML5/CSS3/jQuery et modifiez l’emplacement du titre pour obtenir le
résultat représenté à la Figure 5.7. Le logo flotte à gauche et est décalé de 25 pixels par
rapport au bord supérieur de son conteneur. Quant au titre, il flotte à droite et est décalé
de 100 pixels par rapport au bord supérieur de son conteneur.
Figure 5.7
L’en-tête a été modifié
et un lien Texture a été
ajouté dans le bas de
page.
88 Chapitre 5
6
Ombrages et arrondis
Le CSS3 apporte de nombreuses améliorations dans la mise en forme des éléments
HTML. En particulier en ce qui concerne l’ombrage et les coins arrondis. Ce chapitre va
vous montrer comment ombrer des éléments textuels et non textuels et comment ajouter
des ombres sur des éléments textuels et non textuels.
Où :
■■ offset-horiz est le décalage horizontal de l’ombrage en pixels.
■■ offset-vert est le décalage vertical de l’ombrage en pixels.
■■ rayon-ombrage est le rayon de l’ombrage en pixels.
■■ couleur est la couleur de l’ombrage.
Cette propriété présente deux avantages : elle est compatible avec la quasi-totalité des
navigateurs actuels (y compris Internet Explorer) et elle s’applique à tous les éléments
HTML5.
À titre d’exemple, dans le code suivant, nous appliquons la propriété box-shadow à une
balise <div>.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Ombrage CSS3</title>
<style>
.ombrageCSS3 {
width: 300px;
height: 300px;
background: yellow;
font-size: 400%;
box-shadow: 10px 10px 5px grey;
}
</style>
</head>
<body>
<div class="ombrageCSS3">
Texte à l’intérieur de la balise <div>
</div>
</body>
</html>
Les instructions CSS définissent les dimensions, la couleur d’arrière-plan, la taille des
caractères et les propriétés de l’ombrage. La Figure 6.1 présente le résultat de ce code
dans Internet Explorer 11.
Figure 6.1
L’ombrage a une
épaisseur de 10 pixels et
un rayon de 5 pixels.
Pour que l’ombrage soit plus diffus, il suffit d’augmenter son rayon. La Figure 6.2
représente la même page, mais, ici, le rayon a été fixé à 25 pixels dans la propriété
box-shadow :
box-shadow: 10px 10px 25px grey;
Figure 6.2
Ombrage CSS3 diffus
d’une balise <div>.
90 Chapitre 6
En inversant le signe des deux premiers paramètres de la propriété box-shadow, on
peut changer la position de la bordure. Par exemple, avec la déclaration de style suivante,
la bordure apparaît comme à la Figure 6.3 :
box-shadow: -10px -10px 25px grey;
Figure 6.3
La position de l’ombrage
a été inversée.
La propriété box-shadow peut également être appliquée à une image. Il suffit pour cela
de définir la classe ombreimage et de l’affecter à la balise <img> (voir Figure 6.4).
.ombreimage { box-shadow: 10px 10px 25px grey; }
<img class="ombreimage" src="paysage.jpg" width="400px" />
Figure 6.4
L’ombrage est
appliqué à
une image.
Ombrages et arrondis 91
Ombrer des objets textuels
L’ombrage CSS3 d’éléments textuels se fait via la propriété text-shadow :
text-shadow: offset-horiz offset-vert épaisseur couleur;
Où :
■■ offset-horiz est le décalage horizontal de l’ombrage en pixels.
■■ offset-vert est le décalage vertical de l’ombrage en pixels.
■■ épaisseur est l’épaisseur de l’ombrage en pixels.
■■ couleur est la couleur de l’ombrage.
Voici un exemple d’utilisation de cette propriété. Le résultat de ce code est représenté à
la Figure 6.5.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Ombrage de texte en CSS3</title>
<style>
.otexte {
font-family: magneto;
font-size: 60px;
text-shadow: 4px 4px 4px grey;
}
</style>
</head>
<body>
<p class="otexte">Ce texte est ombré</p>
</body>
</html>
Figure 6.5
Ombrage de
texte CSS3.
92 Chapitre 6
Arrondir les coins d’un élément
de type block
Pour définir des arrondis sur un élément de type block, vous utiliserez la propriété
CSS3 border-radius. Avec certains navigateurs, il n’est pas nécessaire d’utiliser des
préfixes :
border-radius: r1 r2 r3 r4;
Figure 6.6
Un arrondi uniforme de 20 pixels.
Comme vous pouvez le voir à la Figure 6.6, l’arrondi s’étend sur toute la largeur de
la page, car la balise <div> n’a pas été dimensionnée. Il est possible de limiter ses
Ombrages et arrondis 93
dimensions avec les propriétés width et height. D’autre part, le texte à l’intérieur de
la balise <div> est un peu trop collé sur le bord gauche. Pour résoudre ce problème,
il suffit de définir un padding. Pour finaliser la mise en forme, vous pouvez également
modifier l’alignement du texte avec la propriété text-align et colorer l’arrière-plan
avec la propriété background. Voici le code CSS3 remanié. Son résultat est représenté
à la Figure 6.7 :
.arrondi {
border-radius: 15px;
border: 1px solid black;
padding: 10px;
width: 250px;
height: 200px;
background:#ADCF4F;
text-align: center;
}
Figure 6.7
Un arrondi CSS3 amélioré.
L’arrière-plan peut également être une image, répétée si nécessaire pour couvrir toute
la surface de l’élément. Ici, par exemple, nous avons pris l’image fond.gif et nous l’avons
répétée pour couvrir toute la surface de la balise <div>. La taille des caractères a
également été modifiée, ainsi que la hauteur de la balise <div> et l’épaisseur de la
bordure. Le résultat de ce nouveau code CSS est représenté à la Figure 6.8.
.arrondi
{
border-radius: 15px;
border: 5px solid black;
padding: 10px;
width: 250px;
height: 300px;
font-size: 60px;
background: url("fond.gif") repeat;
text-align: center;
}
94 Chapitre 6
Figure 6.8
Un arrondi avec image d’arrière-
plan.
Dans ce dernier exemple, nous appliquons des arrondis différents sur un élément div
pour lui donner une forme un peu plus évoluée (voir Figure 6.9).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Une boîte à coins arrondis en CSS3</title>
<style>
.arrondi {
border-radius: 50px 50px 200px 50px;
border: 1px solid black;
width: 350px;
height: 150px;
padding-top: 50px;
padding-left: 20px;
}
</style>
</head>
<body>
<div class="arrondi">
Boîte à bords arrondis en CSS3
</body>
</html>
Ombrages et arrondis 95
Figure 6.9
Les coins n’ont pas tous le même
rayon.
96 Chapitre 6
Exercice 5
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
Vous allez enrichir le code CSS de l’exercice 4. La Figure 6.10 illustre le résultat à obtenir.
Ont été ajoutés :
■■ Sur les éléments #entete, #corps et #basdepage : une ombre grise décalée de
5 pixels à droite et vers le bas, et de rayon 5 pixels.
■■ Sur les éléments #entete, #corps et #basdepage : un arrondi uniforme de rayon
15 pixels.
■■ Sur l’élément #titre : une ombre grise décalée de 4 pixels à droite et vers le bas, et
de rayon 4 pixels.
Figure 6.10
La page a une tout
autre allure avec
les arrondis et les
ombres.
Ombrages et arrondis 97
7
Menus
Pour accéder aux différentes pages qui composent un site Web, le plus simple consiste
à utiliser un menu. Ce chapitre va vous montrer comment créer un menu vertical flottant,
un menu horizontal, et comment réagir aux actions de l’utilisateur dans le menu via du
code CSS et jQuery.
Figure 7.1
Un menu vertical
élémentaire composé de
cinq liens hypertexte.
100 Chapitre 7
#horizontal { list-style: none; }
#horizontal li {
display: inline-block;
padding-left: 2em;
}
#corps { text-align: justify; }
</style>
</head>
<body>
<ul id="horizontal">
<li><a href="page1.htm">Page 1</a></li>
<li><a href="page2.htm">Page 2</a></li>
<li><a href="page3.htm">Page 3</a></li>
<li><a href="page4.htm">Page 4</a></li>
<li><a href= "page5.htm">Page 5</a></li>
</ul>
<p id="corps">Iam summus Pater architectus Deus hanc quam videmus mundanam
➥domum, divinitatis templum augustissimum, archanae legibus sapientiae
➥fabrefecerat. Supercaelestem regionem mentibus decorarat; aethereos globos
➥aeternis animis vegetarat; excrementarias ac feculentas inferioris mundi partes
➥omnigena animalium turba complerat. Sed, opere consummato, desiderabat artifex
➥esse aliquem qui tanti operis rationem perpenderet, pulchritudinem amaret,
➥magnitudinem admiraretur. Idcirco iam rebus omnibus (ut Moses5 Timaeusque6
➥testantur) absolutis, de producendo homine postremo cogitavit. Verum necerat
➥in archetypis unde novam sobolem effingeret, nec in thesauris quod novo filio
➥hereditarium largiretur, nec insubselliis totius orbis, ubi universi
➥contemplator iste sederet.</p>
</body>
</html>
Le code CSS se poursuit par la définition des caractéristiques des éléments de la liste.
Le simple fait d’initialiser la propriété display à inline-block provoque l’affichage
horizontal des éléments de la liste <ul>. L’espacement entre les entrées du menu est
fixé avec la propriété padding-left.
display: inline-block;
padding-left: 2em;
Enfin, le texte contenu dans le document est justifié en affectant la valeur justify à la
propriété text-align de la balise d’identifiant #corps :
#corps { text-align: justify; }
Le corps du document consiste en une liste <ul>, parent de cinq éléments li qui
constituent les entrées du menu et un peu de texte encapsulé par une balise <p>.
Menus 101
Figure 7.2
Les cinq entrées de
menu sont affichées
horizontalement.
Info
Si vous aviez attribué un comportement inline aux éléments li, le résultat aurait été
identique. Cependant, il est préférable d’opter pour un comportement inline-block,
car ainsi, vous pourrez, le cas échéant, fixer leurs dimensions (width et height) et/ou
leurs marges (margin).
Les liens utilisés dans un menu sont par défaut soulignés. Il est très simple de supprimer
le soulignement en affectant la valeur none à la propriété text-decoration des
balises <a> :
a { text-decoration: none; }
Vous pouvez mettre en évidence chaque entrée de menu en l’entourant d’une bordure.
Par exemple, pour afficher une bordure pointillée noire de 1 pixel, vous utiliserez
l’instruction suivante :
li { border: 1px dotted black; }
Enfin, vous pouvez définir des arrondis autour de chaque menu en utilisant la propriété
border-radius :
li { border-radius: 15px; }
102 Chapitre 7
Si vous tenez compte de toutes ces remarques, les styles de la section intitulée „Menu
horizontal en HTML5" pourraient être transformés comme ceci (voir Figure 7.3) :
<style>
#horizontal { list-style: none; }
li {
display: inline-block;
padding-left: 1em;
padding-right: 1em;
border: 1px dotted black;
border-radius: 15px;
}
a { text-decoration: none; }
#corps { text-align: justify; }
li:hover { background: yellow; }
</style>
Figure 7.3
Quelques instructions ont
suffi pour modifier l’allure
du menu horizontal.
Menu déroulant
Pour créer un menu déroulant, il suffit d’imbriquer deux listes <ul>, la première contenant
les entrées principales du menu et la seconde, les entrées secondaires (voir Figure 7.4).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Menu déroulant</title>
<style>
#principal { height: 30px; }
#principal li {
list-style-type: none;
float: left;
width: 150px;
border-style: dashed;
border-width: 1px;
Menus 103
}
#principal li a:link, #principal li a:visited {
display: block;
background: #E0FCC8;
margin: 0;
padding: 5px 6px;
text-decoration: none;
color: black;
}
#principal li a:hover { background-color: #A5F95B; }
#principal .secondaire {
display: none;
list-style-type: none;
margin: 0;
padding: 0;
border: 0;
}
#principal .secondaire li {
float: none;
border: 0;
}
#principal .secondaire li a:link, #principal .secondaire li a:visited {
display: block;
text-decoration: none;
}
#principal .secondaire li a:hover { background-color: #A5F95B; }
#principal li:hover > .secondaire { display: block; }
</style>
</head>
<body>
<ul id="principal">
<li><a href="#">Page 1</a>
<ul class="secondaire">
<li><a href="page1-1.htm">Page 1 - Sous-page 1</a></li>
<li><a href="page1-2.htm">Page 1 - Sous-page 2</a></li>
<li><a href="page1-3.htm">Page 1 - Sous-page 3</a></li>
</ul>
</li>
<li><a href="#">Page 2</a>
<ul class="secondaire">
<li><a href="page2-1.htm">Page 2 - Sous-page 1</a></li>
<li><a href="page2-2.htm">Page 2 - Sous-page 2</a></li>
<li><a href= "page2-3.htm">Page 2 - Sous-page 3</a></li>
</ul>
</li>
<li><a href="#">Page 3</a>
<ul class="secondaire">
<li><a href="page3-1.htm">Page 3 - Sous-page 1</a></li>
<li><a href="page3-2.htm">Page 3 - Sous-page 2</a></li>
<li><a href="page3-3.htm">Page 3 - Sous-page 3</a></li>
104 Chapitre 7
</ul>
</li>
</ul>
</body>
</html>
Menus 105
Figure 7.4
Un menu horizontal
avec plusieurs
commandes
secondaires.
Info
Pour améliorer le rendu d’un menu déroulant, vous pourriez définir des arrondis et des
ombres en ajoutant quelques instructions CSS au code précédent.
106 Chapitre 7
<ul id="menu">
<li class="ui-state-disabled"><a href="#">VB.Net</a></li>
<li class="ui-state-disabled"><a href="#">Delphi</a></li>
<li>
<a href="#">HTML5/CSS3</a>
<ul>
<li class="ui-state-disabled"><a href="#">Rennes</a></li>
<li><a href="#">Paris</a></li>
<li><a href="#">Metz</a></li>
<li><a href="#">Toulouse</a></li>
</ul>
</li>
<li>
<a href="#">JavaScript</a>
<ul>
<li><a href="#">Paris</a></li>
<li><a href= "#">Rennes</a></li>
<li><a href="#">Lyon</a></li>
</ul>
</li>
<li>
<a href="#">jQuery</a>
<ul>
<li><a href="#">Paris</a></li>
<li><a href="#">Rennes</a></li>
<li class="ui-state-disabled"><a href="#">Marseille</a></li>
</ul>
</li>
<li><a href="#">PHP5/MySQL</a></li>
</ul>
</body>
</html>
Figure 7.5
Un menu vertical à deux niveaux en
jQuery.
Menus 107
La partie HTML du code est élémentaire. Elle consiste en une liste à puces principale
d’identifiant #menu :
<ul id="menu">
…
</ul>
D’une façon très classique, les entrées principales de cette liste sont des balises <li>.
Certaines d’entre elles peuvent être désactivées en leur affectant la classe ui-state-
disabled. Elles apparaissent alors en gris et ne peuvent pas être sélectionnées par
l’utilisateur :
<li class="ui-state-disabled"><a href="#">VB.Net</a></li>
Certaines balise <li> peuvent contenir une liste <ul>. Dans ce cas, elles donnent accès
à un menu secondaire composé d’une ou de plusieurs entrées (dont certaines peuvent
être désactivées en leur affectant la classe ui-state-disabled) :
<li>
<a href= "#">jQuery</a>
<ul>
<li><a href="#">Paris</a></li>
<li><a href="#">Rennes</a></li>
<li class="ui-state-disabled"><a href="#">Marseille</a></li>
</ul>
</li>
Ce code fait référence à la feuille de styles externes sunny, spécifique à jQuery UI :
<link rel="stylesheet" href="http://code.jquery.com/ui/1.10.3/themes/sunny/
➥jquery-ui.css" />
Pour modifier l’allure du menu, vous pouvez faire référence à l’une des feuilles de styles
suivantes :
http://code.jquery.com/ui/1.10.3/themes/base/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/black-tie/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/blitzer/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/cupertino/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/dark-hive/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/dot-luv/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/eggplant/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/excite-bike/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/flick/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/hot-sneaks/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/humanity/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/le-frog/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/mint-choc/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/overcast/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/pepper-grinder/jquery-ui.css
108 Chapitre 7
http://code.jquery.com/ui/1.10.3/themes/redmond/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css"
http://code.jquery.com/ui/1.10.3/themes/south-street/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/start/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/sunny/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/swanky-purse/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/trontastic/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/ui-darkness/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/ui-lightness/jquery-ui.css
http://code.jquery.com/ui/1.10.3/themes/vader/jquery-ui.css
Examinons les bibliothèques utilisées dans cette page :
<script src=http://code.jquery.com/jquery.min.js></script>
<script src=http://code.jquery.com/ui/1.10.3/jquery-ui.js></script>
Rien d’autre. Avouez que jQuery est capable de bien des prouesses !
Info
Pour aller plus loin avec les menus jQuery UI, consultez la page http://api.jqueryui.com/
menu/.
Menus 109
#menu { width: 900px; }
#menu>li {
width: 150px;
float: left;
}
</style>
Figure 7.6
Le menu est
maintenant
horizontal.
Et sa largeur, à 900 pixels :
#menu { width: 900px; }
Cette valeur correspond à la somme des largeurs des entrées de menu principales.
Dans notre exemple, il y a cinq entrées de menu principales de largeur 150 pixels, ce qui
représente un menu de 900 pixels.
Les éléments du menu ont une largeur fixe de 150 pixels et ils sont positionnés en flottant
à gauche, ce qui provoque leur passage à l’horizontale :
#menu>li {
width: 150px;
float: left;
}
110 Chapitre 7
Exercice 6
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
Modifiez le code HTML, CSS et jQuery de l’exercice 5 pour obtenir le résultat représenté
à la Figure 7.7.
Quelques indices :
■■ Utilisez la liste à puces qui se trouvait dans le corps du document pour créer un menu
jQuery UI horizontal.
■■ Choisissez le thème jQuery UI le plus approprié à la page.
■■ Pensez à définir des marges supérieure et inférieure sur le menu, afin qu’il ne masque
pas l’ombre du bandeau supérieur et qu’il soit séparé du bloc suivant.
Figure 7.7
Le menu
horizontal a pris
place.
Menus 111
8
Formulaires
et stockage local
de données
Certaines pages Web permettent aux visiteurs de saisir des données personnelles. Par
exemple, les pages d’inscription, les pages de connexion à la zone membre (login) ou
encore les pages permettant de saisir des commentaires. Ce chapitre va vous donner
toutes les informations nécessaires pour implémenter de telles pages, en HTML5, CSS3
et jQuery.
Définir un formulaire
Composés d’un ou de plusieurs champs de saisie, les formulaires sont délimités par les
balises <form> et </form> :
<form name="nom"
enctype="application/x-www-form-urlencoded|multipart/form-data|text/plain"
action="programme|action"
method="get|post"
autocomplete="on|off">
...
</form>
Où :
■■ name est le nom du formulaire.
■■ enctype détermine le type d’encodage du formulaire. Dans la plupart des formulaires,
cet attribut est omis. Une seule exception : l’envoi de fichier par formulaire. Dans ce cas,
l’attribut enctype doit être initialisé à multipart/form-data. Nous y reviendrons
en détail un peu plus loin dans ce chapitre.
■■ action est le nom du programme auquel les données doivent être transmises
(www.site.com/traitement.php par exemple) ou l’action à accomplir
(mailto:adresse e-mail par exemple).
■■ method est la méthode de transmission des données du formulaire : get poste
les données dans l’adresse URL et post dans le corps de la requête. La seconde
méthode est préférable à la première car elle n’affiche pas en clair les données
saisies dans le formulaire (ce qui pourra être gênant si des données confidentielles
sont transmises). De plus, la taille des données n’est pas limitée, alors qu’elle ne peut
dépasser 256 octets dans la méthode get.
■■ autocomplete indique si le formulaire doit être complété automatiquement (on)
ou non (off) en utilisant les données déjà saisies par l’utilisateur dans des champs
similaires.
Où :
■■ destin est l’adresse du destinataire du message ;
■■ titre est le titre du message ;
■■ texte est le texte (brut ou HTML) envoyé dans le corps du message ;
■■ de est l’en-tête du message, composé des éléments suivants, séparés entre eux par
un retour charriot (\n) :
– l’adresse mail de l’émetteur du message ;
– le type MIME du message ;
– le type du contenu ;
– le charset utilisé dans le message.
Voici un exemple de code. Ici, le code HTML "<font color=\"red\">Ce mail a
été envoyé depuis <b>un script PHP</b>.</font>" est envoyé dans le corps
du mail :
<?php
$titre = "Envoi de mail par PHP";
$texte = "<font color=\"red\">Ce mail a été envoyé depuis <b>un script PHP</b>.
➥</font>";
$destinataire = "prenom.nom.@fai.com";
$delapartde = "expediteur@fai.com";
$from = "From:".$delapartde."\n";
$from .= "MIME-version: 1.0\n";
114 Chapitre 8
$from .= "Content-type: text/html\n";
$from .= "charset: UTF-8\n";
if (!mail($destinataire,$titre,$texte,$from))
echo "Un problème s’est produit lors de l’envoi du message. Recommencez
➥SVP.";
?>
Ce code doit être stocké sur le serveur, dans un fichier d’extension .php. Si ce fichier a
pour nom "mail.php", la balise <form> sera initialisée comme ceci (à condition que le
fichier mail.php se trouve dans le même dossier que la page HTML courante) :
<form name="monFormulaire" method="post" action="mail.php">
Dans cet exemple, le texte envoyé dans le message est écrit "en dur". C’est-à-dire qu’il
est identique chaque fois que la fonction PHP mail() est sollicitée. Voyons maintenant
comment insérer dans le mail les hypothétiques champs ch1, ch2 et ch3 d’un formulaire
transmis par la méthode POST.
<?php
$ch1 = $_POST['ch1'];
$ch2 = $_POST['ch2'];
$ch3 = $_POST['ch3'];
$titre = "Envoi de mail par PHP";
$texte = "Voici les données du formulaire :<br><ul><li>ch1=".$ch1."</li>
➥<li>ch2=".$ch2."</li><li>ch3=".$ch3."</li></ul>";
$destinataire = "prenom.nom.@fai.com";
$delapartde = "expediteur@fai.com";
$from = "From:".$delapartde."\n";
$from .= "MIME-version: 1.0\n";
$from .= "Content-type: text/html\n";
$from .= "charset: UTF-8\n";
if (!mail($destinataire,$titre,$texte,$from))
echo "Un problème s’est produit lors de l’envoi du message. Recommencez
➥SVP.";
?>
Les premières lignes récupèrent les données et les stockent dans les variables $ch1,
$ch2 et $ch3. Les données ainsi récupérées sont alors insérées dans le corps du
message :
$texte = "Voici les données du formulaire :<br><ul><li>ch1=".$ch1."</li>
➥<li>ch2=".$ch2."</li><li>ch3=".$ch3."</li></ul>";
Balise Signification
<fieldset>contenu</fieldset> Groupe d’options permettant de rassembler
plusieurs champs.
<legend>texte</legend> Légende affichée dans un élément fieldset.
<label>texte</label> Simple légende textuelle.
<input type="text" name="Nom" Zone de texte.
id="identifiant" value="valeur">
<input type="button" name="Nom" Bouton.
id="identifiant" value="Légende du
bouton">
<input type="image" src="image. Bouton contenant une image.
jpg" id="identifiant">
<input type="password" name="Nom" Zone de saisie d’un mot de passe.
id="identifiant" value="valeur par
défaut">
<input type="checkbox" name="Nom" Case à cocher.
id="identifiant" value="Valeur">
<input type="radio" name="Nom" Bouton radio.
id="identifiant" value="Valeur">
<input type="hidden" name="Nom" Champ caché. Bien qu’il n’apparaisse pas
id="identifiant" value="valeur"> dans le formulaire, son contenu est envoyé au
serveur lorsque l’utilisateur clique sur le bouton
Submit.
<input type="submit" name="Nom" Bouton d’envoi, pour envoyer les données du
id="identifiant" value="Texte formulaire au serveur.
affiché sur le bouton">
<input type="reset" name="Nom" Bouton de réinitialisation du formulaire.
id="identifiant" value="Texte
affiché sur le bouton">
<input type="date" name="Nom" Champ spécialisé dans la saisie de dates
id="identifiant" title="Date(jj-mm- (seulement pour les navigateurs Opera et
aaaa)" value="Une date"> Chrome au moment où j’écris ces lignes).
<input type="time" name="Nom" Champ spécialisé dans la saisie d’heures
id="identifiant" title="Heure(hh- (seulement pour les navigateurs Opera et
mm)" value="10:00"> Chrome au moment où j’écris ces lignes).
116 Chapitre 8
<input type="datetime" name="Nom" Champ spécialisé dans la saisie de dates et
id="identifiant"> d’heures (seulement pour les navigateurs
Opera et Chrome au moment où j’écris ces
lignes).
<input type="number" name="Nom" Champ spécialisé dans la saisie des nombres.
id="identifiant" value="55">
<input type="color" name="Nom" Palette de couleurs (aucun navigateur n’est
id="identifiant" value="red"> encore compatible).
<input type="search" name="Nom" Zone de texte permettant d’effectuer des
id="identifiant" list="datalist" recherches.
value="Valeur par défaut">
<input type="range" min="-500" Curseur pour faciliter la saisie de valeurs
max="500" value="0" step="10" numériques (uniquement sur Safari au moment
name="Nom" id="identifiant"> où j’écris ces lignes).
<input type="email" name="Nom" Champ spécialisé dans la saisie d’adresses
id="identifiant"> e-mail.
<input type="url" name="Nom" Champ spécialisé dans la saisie d’adresses
id="identifiant"> URL.
<input type="tel" name="Nom" Champ spécialisé dans la saisie de numéros
id="identifiant"> de téléphone (uniquement sur les versions
mobiles des navigateurs au moment où j’écris
ces lignes).
<input type="file" name="Nom" Champ permettant de sélectionner un fichier
id="identifiant"> dans les mémoires de masse de l’ordinateur.
<datalist id="identifiant"><option Facilite la saisie en implémentant
value="valeur1">...<option l’autocomplete sur plusieurs valeurs
value="valeurN"></datalist> prédéfinies dans des éléments option.
<textarea cols="Nombre Zone de saisie multiligne.
colonnes" rows="Nombre lignes"
id="identifiant">Texte par défaut</
textarea>
<select name="Nom" Liste déroulante.
id="identifiant"><option
value="valeur1">...<option
value="valeurN"></select>
<select name="Nom" size="4" Zone de liste (ici, quatre éléments sont
id="identifiant"><option affichés).
value="valeur1">...<option
value="valeurN"></select>
<option name="Nom" size="4" Zone de liste (ici, quatre éléments sont
id="identifiant"><option affichés).
value="valeur1">...<option
value="valeurN"></select>
<output name="Nom"> Affichage d’un résultat.
Formulaire de login
Tous les sites qui disposent d’une zone membre ou sur lesquels l’utilisateur peut laisser
des messages doivent être en mesure d’identifier chaque utilisateur. C’est le rôle du
formulaire de login. Très simple, ce formulaire contient un champ pour la saisie du nom
de l’utilisateur, un champ pour la saisie du mot de passe et un bouton de soumission au
formulaire (voir Figure 8.1).
Figure 8.1
Un traditionnel formulaire
de login.
118 Chapitre 8
<body>
<form action="traitement.php" method="post">
<fieldset>
<legend>Entrez vos identifiants</legend>
<br><label>Nom d’utilisateur</label>
<input type="text" name="user" id="user"><br>
<label>Mot de passe</label>
<input type="password" name="pass" id="pass">
<input type="submit" name="connect" id="connect" value="Connexion"><br>
</fieldset>
</form>
</body>
</html>
Le formulaire est entouré par les balises <form> et </form>. Lorsque l’utilisateur
cliquera sur le bouton de soumission, les données seront transmises au programme
traitement.php en utilisant la méthode POST :
<form action="traitement.php" method="post">
</form>
Une balise <fieldset> est utilisée pour différencier visuellement les données du
formulaire du reste de la page. Dans cet exemple, la page se limite au seul formulaire,
mais je tenais à vous présenter cette technique, qui est tout aussi pratique qu’esthétique.
La balise <legend> définit le texte qui sera affiché dans la partie supérieure gauche du
cadre de la balise <fieldset> :
<fieldset>
<legend> Entrez vos identifiants </legend>
</fieldset>
Le formulaire est composé d’un champ de type text, d’un champ de type password
et d’un champ de type submit. Le premier permet de saisir le nom de l’utilisateur, le
deuxième permet de saisir le mot de passe (en substituant chaque caractère par un
caractère de remplacement) et le troisième permet d’envoyer les éléments saisis au
programme traitement.php.
Ces balises sont mises en forme par quelques lignes de CSS.
Pour aligner visuellement les zones de saisie, les labels sont redimensionnés. Étant donné
que les balises <label> sont de type inline, elles sont au préalable converties en
inline-bloc pour pouvoir être redimensionnées. Enfin, une marge à gauche de 10 pixels
est définie pour éviter que le texte des labels ne soit collé au cadre de la balise <fieldset> :
label {
display: inline-block;
width: 280px;
margin-left: 10px;
}
Le bouton est déplacé vers la droite pour s’aligner sur les zones de saisie et sa largeur
est redéfinie :
input[type="submit"] {
Afin d’aérer le formulaire, un espace est ménagé après chaque champ input :
input { margin-bottom: 10px; }
Figure 8.2
Un formulaire
de saisie de
commentaires
élémentaire.
Voici le code correspondant. Ici, on suppose que l’utilisateur s’est déjà identifié avec un
formulaire de login.
<!DOCTYPE html>
<html>
<head>
<meta charset= "UTF-8" />
<title>Formulaire d’envoi de commentaire</title>
<style type="text/css">
fieldset {
width: 700px;
background-color: #E3FAF4;
}
textarea, input[type="submit"] { margin-left: 10px; }
</style>
</head>
120 Chapitre 8
<body>
<form action="traitement.php" method="post">
<fieldset>
<legend> Entrez votre commentaire puis cliquez sur Envoyer </legend>
<br><textarea name="commentaire" id="commentaire" cols="80" rows="10">
➥</textarea>
<br><br><input type="submit" name="envoyer" id="envoyer" value="Envoyer">
➥<br><br>
</fieldset>
</form>
</body>
</html>
Puis une marge à gauche de 10 pixels est définie sur les deux champs du formulaire afin
d’éviter qu’ils ne s’affichent trop à gauche :
textarea, input[type="submit"] { margin-left: 10px; }
Figure 8.3
Ce formulaire permet
d’envoyer un fichier
au serveur.
Pour que le formulaire puisse transmettre au serveur le fichier sélectionné par l’utilisateur,
l’attribut enctype de la balise <form> est initialisé à multipart/form-data :
<form action="traitement.php" method="post" enctype="multipart/form-data">
...
</form>
122 Chapitre 8
Sondage
Pour valoriser vos visiteurs et pour mieux les connaître, vous pouvez créer des sondages
en ligne. La plupart du temps, les informations saisies se limitent à des boutons radio et
des cases à cocher, mais rien ne vous empêche d’utiliser d’autres types de champs. Dans
cet exemple, les choix de l’utilisateur se bornent à cocher un ou plusieurs boutons radio
et à sélectionner une option parmi trois (voir Figure 8.4).
Figure 8.4
Un sondage
élémentaire.
Le formulaire est plus imposant que dans les exemples précédents car le nombre de
champs est bien plus conséquent. Pour que l’utilisateur ne puisse sélectionner qu’un seul
bouton radio, nous avons donné le même nom (attribut name) aux trois boutons radio.
Si nous avions choisi trois noms différents, l’utilisateur aurait pu sélectionner les trois
boutons radio.
Le code de mise en forme CSS devrait être limpide, puisqu’il correspond, à quelques
détails près, à celui utilisé dans les exemples précédents. Nous n’y reviendrons pas.
Focus
En HTML5, il est très simple de donner le focus à un champ input de type text. En
effet, il suffit d’insérer l’attribut autofocus dans la balise correspondante. Par exemple :
<input type="text" name="nom" id="nom" autofocus>
Pour savoir quel champ a le focus, vous utiliserez des instructions jQuery. Le formulaire
représenté à la Figure 8.5 contient quatre champs input de type text. Par défaut, le
premier champ de saisie a le focus. Le formulaire est suivi par une balise <span> dans
laquelle le champ qui a le focus est identifié.
Figure 8.5
L’utilisateur a donné le
focus au troisième champ
input de type text.
124 Chapitre 8
<head>
<meta charset="UTF-8" />
<title>Focus</title>
<script src=http://code.jquery.com/jquery.min.js></script>
<style type="text/css">
label {
display: inline-block;
width: 100px;
margin-left: 10px;
}
input[type="submit"] {
margin-left: 114px;
width: 150px;
}
input { margin-bottom: 10px; }
fieldset {
width: 350px;
background-color: #E3FAF4;
}
</style>
</head>
<body>
<form action="traitement.php" method="post">
<fieldset>
<legend> Qui a le focus ? </legend>
<br><label>Prénom</label>
<input type="text" name="prenom" id="prenom" autofocus>
<br><label>Nom</label>
<input type="text" name="nom" id="nom">
<br><label>Adresse</label>
<input type="text" name="adresse" id="adresse">
<br><input type="submit" name="envoyer" id="envoyer" value="Envoyer"><br>
<br><span id="info"></span>
</fieldset>
</form>
<script>
$(function(){
$('input').focus(function(){
qalf = $(this).attr('id');
$('#info').html('Le champ ' + qalf + ' a le focus.');
});
});
</script>
</body>
</html>
Son identifiant est stocké dans la variable qalf, en le faisant précéder du signe # pour
le rendre directement utilisable :
qalf = '#' + $(this).attr('id');
La variable qalf est alors utilisée comme sélecteur pour pointer vers l’unique champ qui
a le focus, puis la propriété CSS background-color de ce champ est modifiée via la
fonction css() pour arriver au résultat souhaité :
$(qalf).css('background-color','#E3FAF4');
Ces instructions ne sont pas suffisantes : il faut également penser à restituer la couleur
blanche à l’arrière-plan de tous les champs qui n’ont pas le focus. Pour isoler ces champs,
on utilise la fonction blur() :
$('input').blur(function(){
L’identifiant de chacun des éléments concernés est tour à tour mémorisé dans la variable
qnplf (qui n’a pas le focus), en le faisant précéder du caractère # pour le rendre
directement utilisable :
qnplf = '#' + $(this).attr('id');
Cet identifiant est utilisé pour s’adresser tour à tour à tous les champs qui n’ont pas le
focus, puis modifier leur couleur d’arrière-plan :
$(qnplf).css('background-color','#FFFFFF');
126 Chapitre 8
La Figure 8.6 présente le résultat obtenu en remplaçant le code jQuery de l’exemple
précédent par celui décrit dans cette section.
Figure 8.6
Le champ qui a le focus est
facilement identifiable par
sa couleur d’arrière-plan.
Validation de données
Lorsqu’un champ de saisie est obligatoire, il suffit de lui affecter l’attribut required. À
titre d’exemple, dans ce formulaire, le champ de saisie Nom est obligatoire. Si l’utilisateur
clique sur le bouton de soumission du formulaire sans avoir renseigné le champ Nom, un
message d’erreur est généré et le formulaire n’est pas envoyé (voir Figure 8.7).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Champ de saisie obligatoire</title>
<style type="text/css">
label, input {
display: inline-block;
width: 200px;
margin-left: 10px;
}
</style>
</head>
<body>
<form id="validation">
<label>Nom</label> <input name="Nom" required>
<input type=submit value="Valider">
</form>
</body>
</html>
128 Chapitre 8
Figure 8.8
L’adresse e-mail
n’est pas correcte.
Info
Pour faciliter la reconnaissance des champs obligatoires, il est possible d’utiliser quelques
lignes de CSS. Par exemple, cette ligne affecte un arrière-plan de couleur jaune aux
champs <input> dont l’attribut required est spécifié (voir Figure 8.9) :
input:required { background:yellow; }
Figure 8.9
Les champs
obligatoires
sont clairement
identifiés.
Par exemple, pour limiter la saisie à un caractère majuscule suivi de quatre chiffres,
vous utiliserez l’expression régulière suivante :
[A-Z][0-9]{4}
Voici un exemple de code complet. La Figure 8.10 présente l’effet produit lorsque
l’utilisateur saisit une information sans respecter le modèle :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Validation par expression régulière</title>
</head>
<body>
<form action="traitement.php" method="post">
Entrez un code
<input type="text" pattern="[A-Z][0-9]{4}" title="une lettre majuscule
➥suivie de quatre chiffres">
<input type="submit" value="Valider">
</form>
</body>
</html>
130 Chapitre 8
Figure 8.10
La saisie n’est pas
valide.
Prenons un autre exemple. Pour savoir si une adresse e-mail est valide, vous pouvez
utiliser un champ de type email. Mais si vous voulez personnaliser le message affiché
lorsque l’utilisateur entre une adresse e-mail invalide, vous utiliserez un champ de type
text auquel vous appliquerez l’expression régulière suivante :
[a-z0-9._-]+@[a-z]{2,}\.[a-z]{2,4}
132 Chapitre 8
<label>Nom</label><input name="Nom"><br>
<label>e-mail</label><input type="text" name="email" pattern="[a-z0-9._-]
➥+@[a-z]{2,}\.[a-z]{2,4}" title="Mauvaise adresse e-mail"><br>
<label>Adresse URL</label><input type= "url" name="url" required><br>
<label>Téléphone</label><input type="text" name="phone" pattern="[0-9]{10,10}"
➥title="Mauvais numéro de téléphone"><br>
<input type=submit value="Valider"></p>
</form>
</body>
</html>
Le formulaire contient quatre champs de saisie : un nom, une adresse e-mail, une adresse
URL et un numéro de téléphone. Le nom n’a aucun critère de validation. L’adresse URL
est requise (attribut required). Enfin, un modèle de saisie est défini pour l’adresse
e-mail et le numéro de téléphone.
Outre les règles de mise en page du formulaire, deux règles de mise en forme sont
définies sur les champs input de type text, c’est-à-dire sur les deux champs qui
possèdent un modèle de saisie :
input[type=text]:invalid {background-color: red; }
input[type=text]:valid {background-color: green; }
Si la saisie n’est pas valide, l’arrière-plan du champ devient rouge. Il devient vert lorsque
la saisie est valide. Ce comportement est dynamique. Entendez par là que les règles de
mise en forme sont appliquées pendant la saisie. En voyant un arrière-plan de couleur
verte, l’utilisateur sait que la donnée saisie est valide (voir Figure 8.12).
Figure 8.12
L’adresse e-mail
n’est pas correcte ;
en revanche,
le numéro de
téléphone
respecte la règle
de validation.
Fonction Signification
localStorage.getItem('nom') Retourne la valeur correspondant au nom
spécifié dans l’argument
localStorage.setItem('nom', Stocke la valeur spécifiée sous le nom spécifié
'valeur') dans l’argument
localStorage.key(position) Retourne le nom de l’élément stocké à la
position spécifiée (0 correspond à la première
position de sauvegarde)
localStorage.length Retourne le nombre de données mémorisées
localStorage.clear() Efface toutes les données sauvegardées
localStorage.removeItem('nom') Efface la donnée sauvegardée sous le nom
spécifié dans l’argument
Pour bien comprendre comment utiliser ces fonctions JavaScript, rien de tel qu’un peu
de code. Dans cet exemple, vous pouvez enregistrer des données dans l’espace de
stockage local du navigateur, visualiser les données stockées, effacer une donnée ou
toutes les données (voir Figure 8.13).
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8" />
<title>Stockage local HTML5</title>
<style>
div {
border-width: 1px;
border-style: dotted;
width: 450px;
}
h2, label, input[type=button] {margin-left: 10px; }
#donnees { background-color: #F4CFD7; }
#valeurs { background-color: #CFF4EF; }
</style>
<script>
function Affiche() {
var key = "";
var NomValeur = "<tr><th>Nom</th><th>Valeur</th></tr>\n";
var i=0;
for (i=0; i<=localStorage.length-1; i++)
{
key = localStorage.key(i);
134 Chapitre 8
NomValeur += "<tr><td>"+key+"</td>\n<td>"+localStorage.getItem(key)+
➥"</td></tr>\n";
}
document.getElementById('NomValeur').innerHTML = NomValeur;
}
function Enregistre() {
var nom = document.forms.editor.name.value;
var valeur = document.forms.editor.data.value;
localStorage.setItem(nom, valeur);
Affiche();
}
function Lit() {
var nom = document.forms.editor.name.value;
document.forms.editor.data.value = localStorage.getItem(nom);
Affiche();
}
function Efface() {
var nom = document.forms.editor.name.value;
document.forms.editor.data.value = localStorage.removeItem(nom);
Affiche();
}
function EffaceTout() {
localStorage.clear();
Affiche();
}
</script>
</head>
<body onload="Affiche()">
<h1>Stockage local HTML5</h1>
<form name=editor>
<div id="donnees">
<h2>Définissez la donnée à stocker</h2>
<p><label>Nom</label> <input type="text" name="name">
<label>Valeur</label> <input type="text" name="data"></p>
<p>
<input type="button" value="Lire" onclick="Lit()">
<input type="button" value="Enregistrer" onclick="Enregistre()">
<input type="button" value="Effacer" onclick="Efface()">
<input type="button" value="Tout effacer" onclick="EffaceTout()">
</p>
</div>
<br><br>
<div id="valeurs">
<h2>Données stockées</h2>
<table id="NomValeur" border="1"></table>
</div>
</form>
</body>
</html>
136 Chapitre 8
Exercice 7
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
Définissez un formulaire d’enregistrement similaire à la Figure 8.14. Ce formulaire sera
affiché lorsque l’utilisateur cliquera sur la commande de menu Zone membre.
Figure 8.14
Le formulaire d’inscription à la zone
membre.
Avant que vous ne plongiez dans le code, voici quelques précisions importantes :
■■ Les trois champs de saisie du formulaire sont de type required.
■■ Le pseudo doit être composé de 3 à 8 caractères alphanumériques (a à z, A à Z, 0 à 9).
■■ Le mot de passe doit être composé de 5 caractères alphanumériques (a à z, A à Z,
0 à 9).
Le code PHP à utiliser est le suivant :
<?php
$mail = $_POST['mail'];
$pseudo = $_POST['pseudo'];
$pass = $_POST['pass'];
$titre = "Formulaire d’inscription mon eFormation";
$texte = "Voici les données du formulaire :<br><ul><li>ch1=".$mail.
➥"</li><li>ch2=".$pseudo."</li><li>ch3=".$pass."</li></ul>";
$destinataire="adresse@destinataire.com";
$delapartde = $mail;
$from = "From:".$delapartde."\n";
$from .= "MIME-version: 1.0\n";
$from .= "Content-type: text/html\n";
$from .= "charset: UTF-8\n";
if (!mail($destinataire,$titre,$texte,$from))
Les champs qui seront transmis à ce programme doivent donc avoir les noms suivants :
mail, pseudo et pass.
Pour vérifier le bon fonctionnement de ce code, affectez votre propre adresse e-mail à la
variable $destinataire. Vous recevrez ainsi les données saisies dans le formulaire :
$destinataire="adresse@destinataire.com";
Exercice 8
Définissez le formulaire de contact représenté à la Figure 8.15.
Figure 8.15
Le formulaire de contact du site.
Les deux champs de saisie de ce formulaire sont requis. Voici le code PHP qui vous
permettra d’envoyer les données saisies à la boîte mail de votre choix :
<?php
$mail = $_POST['mail'];
$message = $_POST['message'];
$titre = "Formulaire de contact mon eFormation";
$texte = "Voici le message de l’utilisateur : ".htmlentities($message, ENT_
➥QUOTES, "UTF-8");
$destinataire="adresse@destinataire.com";
138 Chapitre 8
$delapartde = $mail;
$from = "From:".$delapartde."\n";
$from .= "MIME-version: 1.0\n";
$from .= "Content-type: text/html\n";
$from .= "charset: UTF-8\n";
if (!mail($destinataire,$titre,$texte,$from))
echo "Un problème s’est produit lors de l’envoi du message. Recommencez
➥SVP.";
else {
echo "Les données ont été transmises.<br><br>";
echo "<a href='http://www.mediaforma.com/eformation/exercice7/index.htm'>
➥Retourner au site</a>";
}
?>
Les champs qui seront transmis à ce programme doivent donc avoir les noms suivants :
mail et message.
Pour vérifier le bon fonctionnement de ce code, affectez votre propre adresse e-mail à la
variable $destinataire. Vous recevrez ainsi les données saisies dans le formulaire :
$destinataire="adresse@destinataire.com";
Info
Pour différencier les cellules de titre des cellules de données, vous affecterez une classe
à la ligne contenant les cellules de titre et vous définirez leurs caractéristiques en CSS.
142 Chapitre 9
Figure 9.1
Ce tableau
a été créé
sans la balise
<table>.
Pour que les cellules du tableau (c’est-à-dire les balises <span>) s’affichent les unes à la
suite des autres, on les fait flotter sur le côté gauche avec la propriété float :
span {
float: left;
Un espace de 5 pixels est ménagé autour des balises <span> pour les aérer et éviter
que le texte ne soit trop proche des bordures :
padding: 5px;
Enfin, une bordure continue noire épaisse de 1 pixel est affichée autour de chaque balise
<span> :
border: 1px solid black;
Pour que chaque nouvelle ligne commence au-dessous (et non à côté) de la précédente,
la propriété clear des balises <p> est initialisée à left :
p { clear: left; }
Tableaux 143
Bordures autour des cellules
Au début du chapitre, vous avez vu qu’il était possible d’utiliser l’attribut HTML border
pour afficher une bordure autour des cellules d’un tableau. Vous pouvez aller plus loin en
utilisant la propriété CSS border.
Accessible dans les éléments table, th et td, la propriété border permet
(respectivement) de définir la bordure autour du tableau, des cellules de titre et des
cellules de données. Voici sa syntaxe :
border: épaisseur style couleur;
Où :
■■ épaisseur est l’épaisseur de la bordure : thin, medium, thick ou une valeur
numérique exprimée en pixels (px), points (pt), pourcentage (%), ou une autre unité
de mesure CSS.
■■ style est le style de la bordure : dashed, dotted, double, solid, insert,
groove, ridge ou outset.
■■ couleur est la couleur de la bordure : une couleur prédéfinie, comme Silver ou
DarkBlue, ou une valeur hexadécimale, comme #341276.
Dans cet exemple, nous traçons une bordure pointillée noire épaisse de 4 pixels autour
du tableau et une bordure continue rouge épaisse de 1 pixel autour des cellules de titre
<th> et des cellules de données <td> (voir Figure 9.2).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Bordures autour d’un tableau</title>
<style>
table
{
border: 4px dashed black;
}
th, td
{
border: 1px solid red;
}
</style>
</head>
<body>
<table>
<tr>
<th>Titre colonne 1</th>
<th>Titre colonne 2</th>
<th>Titre colonne 3</th>
</tr>
<tr>
<td>Elément 1 ligne 1</td>
<td>Elément 2 ligne 1</td>
144 Chapitre 9
<td>Elément 3 ligne 1</td>
</tr>
<tr>
<td>Elément 1 ligne 1</td>
<td>Elément 2 ligne 1</td>
<td>Elément 3 ligne 1</td>
</tr>
</table>
</body>
</html>
Figure 9.2
Mise en place
de deux styles
de bordures.
Info
L’épaisseur, le style et la couleur des quatre éléments qui composent une bordure
peuvent être différenciés en utilisant les propriétés suivantes :
■■ Épaisseur : border-top-width, border-right-width, border-bottom-width,
border-left-width.
■■ Style : border-top-style, border-right-style, border-bottom-style,
border-left-style.
■■ Couleur : border-top-color, border-right-color, border-bottom-color,
border-left-color.
Tableaux 145
Figure 9.3
Les bordures
peuvent être
séparées ou
fusionnées.
146 Chapitre 9
<td>12/08</td>
<td>21</td>
<td>5412</td>
</tr>
<tr>
<td>17/08</td>
<td>14</td>
<td>1519</td>
</tr>
</table>
</body>
</html>
Figure 9.4
Les bordures des
cellules sont espacées
de 10 pixels.
Ou encore l’instruction suivante fusionne verticalement la cellule courante avec les deux
cellules suivantes :
<td rowspan="2">contenu</td>
Pour bien comprendre le fonctionnement de ces deux attributs, rien de tel qu’un peu de
code. La Figure 9.5 représente le tableau que nous voulons afficher.
Figure 9.5
Plusieurs fusions
de cellules sont
nécessaires pour arriver
à ce résultat.
Tableaux 147
Dans ce tableau, certaines cellules n’ont pas de bordures, d’autres sont fusionnées
horizontalement ou verticalement, d’autres encore sont plus traditionnelles et occupent
un seul emplacement dans le tableau. Voici le code à l’origine de ce tableau :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Arrière-plan des cellules</title>
<style>
table { border-collapse: collapse; }
td
{
border: 1px solid black;
text-align: center;
color: blue;
font-weight: bold;
font-size: 200%;
width: 200px;
}
td.sansbord {border: none; }
</style>
</head>
</body>
<table>
<tr><td rowspan="2" class="sansbord"></td><td rowspan="2" class="sansbord">
➥</td><td rowspan="2">Année</td><td colspan="2">Bilan</td></tr>
<tr><td>Recettes</td><td>Dépenses</td></tr>
<tr><td rowspan="4">Département</td><td rowspan=2>Informatique</td>
➥<td>2012</td><td>53</td><td>50</td></tr>
<tr><td>2013</td><td>56</td><td>50</td></tr>
<tr><td rowspan="2">Mathématiques</td><td>2012</td><td>44</td><td>43</td>
➥</tr>
<tr><td>2013</td><td>48</td><td>42</td></tr>
</table>
</body>
</html>
Pour faciliter la compréhension du code, chaque ligne du tableau est décrite sur une
ligne HTML, entre les balises <tr> et </tr>. Il vous suffit de décrire ce qui doit s’afficher
dans le tableau, ligne par ligne. Examinons la première ligne :
<tr><td rowspan="2" colspan="2"class="sansbord"></td><td rowspan="2">Année</td>
➥<td colspan="2">Bilan</td></tr>
148 Chapitre 9
Examinons la troisième ligne :
<tr><td rowspan="4">Département</td><td rowspan=2>Informatique</td><td>2012</td>
➥<td>53</td><td>50</td></tr>
La première cellule doit s’étaler sur quatre lignes (rowspan="4") et la deuxième sur
deux lignes (rowspan="2"). Les cellules suivantes n’occupent qu’un emplacement.
La ligne suivante ne décrit que les cellules qui contiennent les valeurs 2013, 56 et 50. En
effet, les autres cellules ont déjà été décrites dans l’instruction précédente puisqu’elles
occupent plusieurs lignes :
<tr><td>2013</td><td>56</td><td>50</td></tr>
Je pense que vous avez compris le principe. La ligne suivante contient la cellule
Mathématiques qui s’étale sur deux lignes, et les cellules 2012, 44 et 43 :
<tr><td rowspan="2">Mathématiques</td><td>2012</td><td>44</td><td>43</td></tr>
Enfin, la dernière cellule contient les cellules 2013, 48 et 42. Les premières cellules
(Département et Mathématiques) ont été décrites dans les instructions précédentes :
<tr><td>2013</td><td>48</td><td>42</td></tr>
Tableaux 149
}
table > caption {
caption-side: bottom;
font-style: italic;
text-align: right;
}
</style>
</head>
<body>
<table border>
<caption>Titre du tableau</caption>
<tr>
<td>Elément 1 ligne 1</td>
<td>Elément 2 ligne 1</td>
<td>Elément 3 ligne 1</td>
</tr>
<tr>
<td>Elément 1 ligne 2</td>
<td>Elément 2 ligne 2</td>
<td>Elément 3 ligne 2</td>
</tr>
</table>
</body>
</html>
Figure 9.6
La légende a été mise
en forme et s’affiche
au-dessous et à droite
du tableau.
150 Chapitre 9
<style>
table {
border: 1px solid black;
text-align: center;
color: blue;
font-weight: bold;
font-size: 200%;
}
td {width: 200px;}
td.fond1 { background:url(fond1.jpg); }
td.fond2 { background:url(fond2.jpg); }
td.fond3 { background:url(fond3.jpg); }
</style>
</head>
</body>
<table>
<tr>
<td class="fond1">Date</td>
<td class="fond1">Articles</td>
<td class="fond1">Prix</td>
</tr>
<tr>
<td class="fond2">12/08</td>
<td class="fond3">21</td>
<td class="fond3">5412</td>
</tr>
<tr>
<td class="fond2">14/08</td>
<td class="fond3">10</td>
<td class="fond3">2215</td>
</tr>
<tr>
<td class="fond2">16/08</td>
<td class="fond3">15</td>
<td class="fond3">3219</td>
</tr>
<tr>
<td class="fond2">19/08</td>
<td class="fond3">17</td>
<td class="fond3">2719</td>
</tr>
</table>
</body>
</html>
Tableaux 151
Figure 9.7
Trois textures
d’arrière-plan
sont appliquées
aux cellules de
ce tableau.
152 Chapitre 9
<td class="c1">Prix</td>
</tr>
<tr>
<td class="c2">12/08</td>
<td class="c2">21</td>
<td class="c2">5412</td>
</tr>
<tr>
<td class="c3">17/08</td>
<td class="c3">14</td>
<td class="c3">1519</td>
</tr>
</table>
</body>
</html>
Figure 9.8
Alignements horizontal
et vertical dans les
cellules d’un tableau.
Tableaux 153
</style>
</head>
</body>
<table>
<tr><td>Date</td><td>Articles</td><td>Prix</td></tr>
<tr><td>12/08</td><td>21</td><td>5412</td></tr>
<tr><td>14/08</td><td>10</td><td>2215</td></tr>
<tr><td>16/08</td><td>15</td><td>3219</td></tr>
<tr><td>19/08</td><td>17</td><td>2719</td></tr>
</table>
</body>
</html>
Figure 9.9
L’alternance
des couleurs
améliore la
lisibilité du
tableau.
154 Chapitre 9
Figure 9.10
Les cellules vides
sont différenciées des
autres en jouant sur
leur couleur d’arrière-
plan.
Arrondis et ombrages
Les propriétés CSS border-radius, border-shadow et text-shadow peuvent être
utilisées dans un tableau pour (respectivement) arrondir les angles du tableau, définir un
ombrage sur le tableau et sur le texte affiché dans le tableau. Dans cet exemple, nous
allons agir sur les caractéristiques suivantes :
■■ angles arrondis ;
■■ ombrage du tableau ;
■■ ombrage du texte dans les balises <th> ;
■■ définition d’une largeur de cellule fixe et centrage des données dans les cellules.
Figure 9.11
Le tableau mis en
forme a une fière
allure !
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Arrondis et ombrages</title>
<style>
table {
border: 4px double black;
border-spacing: 0;
text-align: center;
color: blue;
font-weight: bold;
Tableaux 155
font-size: 200%;
border-radius: 15px;
box-shadow: gray 5px 5px 6px;
}
th {
color: #fff;
font-size: 110%;
text-shadow: gray 2px 2px 2px;
}
td { width: 200px; }
</style>
</head>
</body>
<table>
<tr><th>Date</th><th>Articles</th><th>Prix</th></tr>
<tr><td>12/08</td><td>21</td><td>5412</td></tr>
<tr><td>14/08</td><td>10</td><td>2215</td></tr>
<tr><td>16/08</td><td>15</td><td>3219</td></tr>
<tr><td>19/08</td><td>17</td><td>2719</td></tr>
</table>
</body>
</html>
156 Chapitre 9
Exercice 9
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
Vous allez compléter le code défini dans les exercices précédents. Définissez la page
news.htm pour afficher les news du site, comme dans la Figure 9.12.
Figure 9.12
Le résultat à
atteindre.
Comme vous le voyez, les news sont affichées dans un tableau comportant une ligne de
titre et une ligne pour chaque news. Les lignes sont colorées alternativement en gris et
en blanc, les bordures sont arrondies, et une ombre portée est définie en bas et à droite
du tableau.
Tableaux 157
10
Mise en page
Ce chapitre est très important. Il s’intéresse au nouveau découpage des pages en HTML5
et aux techniques de mise en page en CSS3. Vous y découvrirez entre autres comment
modifier le comportement block ou inline des balises, comment donner un aspect
sémantique à votre code HTML5, ou encore comment définir un affichage qui s’adapte à
la largeur de la fenêtre (adaptative Web design).
Où élément est l’élément HTML (la balise sans les signes "<" et ">") dont on désire
changer le type.
Bien qu’elle soit toujours utilisée pour des raisons de rétrocompatibilité, la catégorisation
inline et block des balises n’a plus cours en HTML5. Cette mouture du langage
définit un nouveau schéma de structuration de données : les éléments sont regroupés
de manière logique selon leurs rôles sémantiques. Par exemple, <span> et <strong>
appartiennent au groupe text-level semantics, ou encore <img>, <audio> et <video>
appartiennent au groupe embedded content. Le tableau ci-après détaille le contenu des
principaux groupes sémantiques
Le rendu inline, block ou inline-block dépend du CSS et n’a rien à voir avec
la spécification HTML5. En tant que développeur HTML5, vous ne devez donc pas
confondre les groupes d’appartenance HTML5 et le rendu CSS.
160 Chapitre 10
Figure 10.1
Une page Web
traditionnelle
constituée d’un
assemblage de
balises <div>.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Une page avec en-tête, pied de page, menu, zone annexe et zone de
➥contenu</title>
<link rel="stylesheet" href="style0.css">
</head>
<body>
<div id="entete">
<h1>En-tête du document</h1>
Texte de l’en-tête
</div>
<div id="barre-navigation">
<h2>Menu</h2>
<ul>
<li><a href="page1.htm">Page 1</a></li>
<li><a href="page2.htm">Page 2</a></li>
<li><a href="page3.htm">Page 3</a></li>
<br><br>
</ul>
</div>
<div id="barre-droite">
Texte annexe, affiché dans la partie droite de la page<br><br>
</div>
<div class="article">
Zone réservée au contenu de la page
<h2>Premier article</h2>
Texte du premier article
</div>
<div class="article">
<h2>Deuxième article</h2>
En HTML5, le code a une tout autre allure : les balises <div> disparaissent au profit de
balises ayant une plus forte connotation sémantique. Si le résultat final est très proche du
précédent (voir Figure 10.2), le code HTML a un aspect complètement différent :
Figure 10.2
Le rendu est
quasiment identique
mais, ici, les balises
<div> ont disparu
du code.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Un document HTML5 avec en-tête, pied de page, menu, zone annexe et
➥zone de contenu</title>
162 Chapitre 10
<link rel="stylesheet" href="style1.css">
<script src="Creation-elements-HTML5.js"></script>
</head>
<body>
<header>
<h1>En-tête du document</h1>
Texte de l’en-tête
</header>
<nav>
<h2>Menu</h2>
<ul>
<li><a href="page1.htm">Page 1</a></li>
<li><a href="page2.htm">Page 2</a></li>
<li><a href="page3.htm">Page 3</a></li>
</ul>
<br><br><br>
</nav>
<aside>
Texte affiché dans la partie droite de la page avec la balise <
➥aside><br><br>
</aside>
<article>
<h2>Premier article</h2>
<p>Texte du premier article</p>
</article>
<article>
<h2>Deuxième article</h2>
<p>Texte du deuxième article</p>
</article>
<footer>
<p>Copyright et e-mail du webmaster</p>
</footer>
</body>
</html>
Comme vous pouvez le voir, les balises <div> ont été remplacées par les balises
<header>, <nav>, <aside>, <article> et <footer>.
■■ <article> correspond à une entité autonome du document : par exemple, un article
(ou un ensemble d’articles) extrait d’un blog ou d’un forum.
■■ <aside> définit un contenu qui n’a pas de rapport direct avec la page. Il peut être
utilisé pour définir un menu ou pour donner accès aux archives du site.
■■ <header> et <footer> définissent l’en-tête et le pied de page d’une section ou
d’une page Web.
■■ <nav> est destiné à contenir des liens de navigation dans le site.
L’en-tête du document fait appel à la feuille de styles style1.css. Voici le code utilisé :
header, nav, article, section, footer, aside { display: block; }
header { background-color: red; }
nav {
float:left;
Dans ces instructions, notez que le rendu block (display: block;) a été affecté aux
nouveaux éléments HTML5. Cette pratique assure le support de ces nouveaux éléments
dans les navigateurs peu ou pas compatibles.
Les navigateurs Internet Explorer 8 et inférieur ne sont pas en mesure d’affecter un style
aux nouveaux éléments HTML5. En effet, puisqu’ils ne les connaissent pas, ils doivent
les intégrer au DOM via la méthode createElement. Pour ce faire, quelques lignes de
JavaScript sont nécessaires. C’est la raison d’être du script Creation-elements-HTML5.js,
invoqué dans l’en-tête du document HTML5. Voici le code utilisé :
document.createElement("footer");
document.createElement("header");
document.createElement("article");
document.createElement("nav");
document.createElement("aside");
Attention
Cette technique dépend de JavaScript. S’il n’est pas activé sur un client Internet Explorer,
les nouveaux éléments HTML5 seront de type inline par défaut, et les pages ne seront
pas bien représentées !
1.. Je devrais plutôt dire "L’affichage se fait sur une même ligne si les balises appartiennent à un groupe
sémantique de rendu inline. Il se fait verticalement si les balises appartiennent à un groupe sémantique de
rendu block." Mais je suis sûr que vous me pardonnerez cet abus de langage.
164 Chapitre 10
Positionnement static
Il s’agit du positionnement par défaut des éléments, c’est-à-dire lorsque aucune règle
de mise en page n’est définie. Les éléments positionnés de façon statique suivent le flux
normal de la page, en fonction de leur rendu (inline ou block) et des éventuels autres
éléments rencontrés sur leur chemin. Les propriétés CSS top, bottom, left et right
n’ont aucun effet sur ces éléments.
Positionnement fixed
Lorsqu’un élément a un positionnement fixed, il reste immobile dans la page. Sa
position est déterminée par ses propriétés CSS top, left, bottom et right. Quelques
conséquences pour les éléments de position fixe :
■■ Ils sont insensibles à la position des barres de défilement du navigateur.
■■ Ils sortent du flux normal de l’affichage : c’est comme s’ils n’existaient pas.
■■ Ils peuvent se superposer aux autres éléments affichés dans la page.
Voici un exemple de positionnement fixed. Ici, le paragraphe de classe fixe est positionné
à 20 pixels du bord supérieur et à 10 pixels du bord gauche de la zone d’affichage du
navigateur. Pour bien différencier ce texte du reste de la page, ses caractéristiques ont
été modifiées. Les caractères apparaissent en rouge et ont une taille trois fois supérieure
à la taille par défaut. La Figure 10.3 montre que le texte positionné en fixed est insensible
à la position de la barre de défilement verticale du navigateur.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Positionnement fixe</title>
<style type="text/css">
p.fixe {
font-size: 300%;
color: red;
position: fixed;
top: 20px;
left: 10px;
}
</style>
</head>
<body>
<p class="fixe">Texte en position fixe</p>
But I must explain to you how all this mistaken idea of denouncing pleasure and
➥praising pain was born and I will give you a complete account of the system,
➥and expound the actual teachings of the great explorer of the truth, the
➥master-builder of human happiness. No one rejects, dislikes, or avoids pleasure
➥itself, because it is pleasure, but because those who do not know how to pursue
➥pleasure rationally encounter consequences that are extremely painful. Nor
➥again is there anyone who loves or pursues or desires to obtain pain of itself,
➥because it is pain, but because occasionally circumstances occur in which
➥toil and pain can procure him some great pleasure. To take a trivial example,
➥which of us ever undertakes laborious physical exercise, except to obtain some
➥advantage from it? But who has any right to find fault with a man who chooses to
Figure 10.3
Le texte positionné en fixed
se trouve toujours au même
emplacement.
Toutes les balises qui produisent un affichage dans le navigateur peuvent être positionnées
en fixed (<p>, <img>, <table>, <div>, etc.). Supposons que vous vouliez utiliser
une image fixe en arrière-plan d’une page. Vous utiliserez la propriété background-
attachment (et non la propriété position) pour arriver à vos fins (voir Figure 10.4) :
body {
background:url(chat.jpg) top right no-repeat;
background-attachment:fixed;
}
Info
Si l’idée vous est venue d’utiliser la propriété opacity pour modifier l’opacité de
l’image d’arrière-plan, sachez que cette technique n’est pas possible. Elle aurait pour
conséquence de modifier l’opacité du texte affiché dans le corps du document, et donc
de le rendre encore moins lisible. Si vous voulez jouer sur l’opacité de l’image d’arrière-
plan, vous devez utiliser un logiciel graphique quelconque pour agir directement sur
l’image.
166 Chapitre 10
Figure 10.4
L’image d’arrière-plan est fixe dans
la page et reste insensible à la
position des barres de défilement.
Positionnement relative
Lorsqu’un élément est position de façon relative, ses propriétés top, bottom, left et
right permettent de le décaler par rapport à sa position originale.
Dans ce premier exemple, trois titres h2 sont affichés. Le premier n’est pas repositionné.
Le deuxième est décalé de 20 pixels vers la gauche et le troisième de 20 pixels vers la
droite (voir Figure 10.5).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Positionnement relative</title>
<style type="text/css">
h2.gauche20 {
position:relative;
left:-20px;
}
h2.droite20 {
position:relative;
left:20px;
}
</style>
</head>
<body>
<h2>Un titre h2 non repositionné</h2>
<h2 class="gauche20">Un titre h2 décalé de 20px à gauche</h2>
<h2 class="droite20">Un titre h2 décalé de 20px à droite</h2>
</body>
</html>
Deux remarques :
1. Lorsqu’un élément est positionné de façon relative, il peut se superposer aux autres
éléments affichés dans la page.
2. L’espace réservé à l’affichage de l’élément repositionné est toujours réservé dans le
flux de la page.
L’exemple de code suivant devrait apporter des réponses à vos questions si vous vous
en posez encore. Ici, trois titres h2 sont affichés. Le premier et le troisième ne sont pas
repositionnés. Le deuxième est décalé de 50 pixels vers le haut et vers la droite. Comme
le montre la Figure 10.6, les premier et deuxième titres h2 se superposent et l’espace
réservé au deuxième titre h2 est conservé dans le flux.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Positionnement relative</title>
<style type="text/css">
h2.hautdroite50 {
position:relative;
top:-50px;
left: 50px;
color: red;
}
</style>
</head>
<body>
<h2>Un titre h2 non repositionné</h2>
<h2 class="hautdroite50">Un titre h2 décalé de 20px à gauche</h2>
<h2>Un autre titre h2 non repositionné</h2>
</body>
</html>
168 Chapitre 10
Figure 10.6
Le deuxième titre
h2 est décalé de 50
pixels vers le haut et
la droite.
Positionnement absolute
Lorsqu’un élément est positionné de façon absolue, on définit ses coordonnées par
rapport au premier élément parent dont le positionnement n’est pas statique. En l’absence
d’un tel élément, le positionnement se fait par rapport à la balise <html>.
Voici un exemple de code. Ici, un paragraphe est positionné de façon absolue à 50 pixels
du bord supérieur et à 50 pixels du bord gauche de la page (voir Figure 10.7).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Positionnement absolute</title>
<style type="text/css">
.abs50-50 {
position:absolute;
top:50px;
left: 50px;
color: red;
font-size: 200%;
}
</style>
</head>
<body>
<p class="abs50-50">Ce texte est positionné de façon absolue à 50 pixels du
➥bord supérieur et à 50 pixels du bord gauche de la page.</p>
<p>But I must explain to you how all this mistaken idea of denouncing
➥pleasure and praising pain was born and I will give you a complete account
➥of the system, and expound the actual teachings of the great explorer of the
➥truth, the master-builder of human happiness. No one rejects, dislikes, or
➥avoids pleasure itself, because it is pleasure, but because those who do not
➥know how to pursue pleasure rationally encounter consequences that are
➥extremely painful. Nor again is there anyone who loves or pursues or desires to
➥obtain pain of itself, because it is pain, but because occasionally
➥circumstances occur in which toil and pain can procure him some great pleasure.
➥To take a trivial example, which of us ever undertakes laborious physical
➥exercise, except to obtain some advantage from it? But who has any right
➥to find fault with a man who chooses to enjoy a pleasure that has no annoying
➥consequences, or one who avoids a pain that produces resultant pleasure</p>
</body>
</html>
Figure 10.8
La ou les images
qui suivent le
<div> supprimé
se repositionnent
automatiquement sur la
gauche de la page.
170 Chapitre 10
Voici le code utilisé :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Positionnement float</title>
<script src=http://code.jquery.com/jquery.min.js></script>
<style type="text/css">
div {
border: 1px dotted black;
width: 100px;
padding: 5px;
margin-left: 10px;
float: left;
text-align: center;
}
</style>
</head>
<body>
<div id="mini1"><img src="mini1.jpg"><br><button id="bouton1">Supprimer</
➥button></div>
<div id="mini2"><img src="mini2.jpg"><br><button id="bouton2">Supprimer</
➥button></div>
<div id="mini3"><img src="mini3.jpg"><br><button id="bouton3">Supprimer</
➥button></div>
<script>
$(function(){
$('#bouton1').click(function(){
$('#mini1').css('display','none');
});
$('#bouton2').click(function(){
$('#mini2').css('display','none');
});
$('#bouton3').click(function(){
$('#mini3').css('display','none');
});
});
</script>
</body>
</html>
Examinons ce code.
Le corps du document contient trois balises <div> d’identifiants #mini1, #mini2 et
#mini3. Chacune des balises <div> contient une image et un bouton. Ce bouton a
pour identifiant #bouton1 dans le premier <div>, #bouton2 dans le deuxième et
#bouton3 dans le troisième.
Le style div modifie l’allure des trois balises <div>. Une bordure pointillée de couleur
noire épaisse de 1 pixel est affichée autour du <div>. La largeur de l’élément est fixée à
100 pixels, une marge interne de 5 pixels est définie tout autour de l’élément, une marge
à gauche de 10 pixels est définie pour espacer les <div> entre eux et un alignement
172 Chapitre 10
Le corps du document se contente de définir une balise <p> de classe multi-col et
de lui affecter un long texte. La partie intéressante du code se trouve dans le CSS3. La
classe multi-col définit la largeur des colonnes pour les navigateurs Mozilla et WebKit.
.multi-col
{
-moz-column-width: 150px;
-webkit-column-width: 150px;
column-width: 150px;
Comme vous pouvez le constater (voir Figures 10.9 et 10.10), le nombre de colonnes
dépend de la largeur de la page dans le navigateur.
Figure 10.9
Ici, le texte occupe
quatre colonnes.
Figure 10.10
La largeur de la
page étant plus
importante, le texte
occupe maintenant six
colonnes.
Si le nombre de colonnes doit rester fixe, utilisez les propriétés CSS3 -moz-column-
count, -webkit-column-count et column-count. Par exemple, pour définir trois
colonnes, quelle que soit la largeur de la fenêtre, ajoutez les trois lignes suivantes dans
la classe multi-col :
-moz-column-count: 3;
-webkit-column-count: 3;
column-count: 3;
Si nécessaire, vous pouvez également insérer un trait séparateur entre les colonnes
en utilisant les propriétés CSS3 -moz-column-rule, -webkit-column-rule et
column-rule dont voici la syntaxe :
-moz-column-rule: largeur style couleur;
Où :
■■ largeur est la largeur du trait en pixels.
■■ style est le style du trait. Il peut prendre l’une des valeurs suivantes : dotted,
dashed, solid, insert, double, groove, ridge ou outset.
■■ couleur est la couleur du trait.
Par exemple, pour définir un trait séparateur continu noir et d’épaisseur 1 pixel, vous
utiliserez les deux propriétés suivantes :
-moz-column-rule: 1px solid black;
-webkit-column-rule: 1px solid black;
column-rule: 1px solid black;
Pour terminer, sachez qu’il est possible de définir la couleur d’arrière-plan du texte avec
la propriété background et l’alignement du texte dans les colonnes avec la propriété
text-align. Par exemple, pour affecter un arrière-plan gris et pour justifier le texte
dans les colonnes, servez-vous des propriétés suivantes :
background:#ccc;
text-align:justify;
Figure 10.11
Le texte est
maintenant affiché
sur trois colonnes,
indépendamment
de la largeur de la
fenêtre.
174 Chapitre 10
Info
La propriété -webkit-column-rule rassemble plusieurs paramètres qui peuvent
être divisés en -webkit-column-rule-color, -webkit-column-rule-style et
-webkit-column-rule-width. Il en va de même de la propriété -moz-column-
rule qui peut être divisée en -moz-column-rule-color, -moz-column-rule-
style et -moz-column-rule-width. Et de la propriété column-rule qui peut être
divisée en column-rule-color, column-rule-style et column-rule-width.
Marges
Toutes les balises visuelles (c’est-à-dire celles qui affichent du contenu sur l’écran)
possèdent des marges internes et externes. Vous pouvez modifier ces marges en agissant
sur les propriétés CSS padding (marges internes) et margin (marges externes). À titre
d’exemple, le code suivant définit une balise <div> et y insère du texte. Quelques règles
mettent en évidence les marges internes et externes (voir Figure 10.12) :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Margin et padding</title>
<style>
body { background-color: yellow; }
div {
margin: 100px;
padding: 50px;
background-color: red;
width: 300px;
height: 250px;
text-align: justify;
}
</style>
</head>
<body>
<div>At vero eos et accusamus et iusto odio dignissimos ducimus qui
➥blanditiis praesentium voluptatum deleniti atque corrupti quos dolores et quas
➥molestias excepturi sint occaecati cupiditate non provident, similique sunt
➥in culpa qui officia deserunt mollitia animi, id est laborum et dolorum fuga. Et
➥harum quidem rerum facilis est et expedita distinctio. Nam libero tempore, cum
➥soluta nobis est eligendi optio cumque nihil impedit quo minus id quod maxime
➥placeat facere possimus, omnis voluptas assumenda est, omnis dolor
➥repellendus.</div>
</body>
</html>
Les marges externes de la balise <div> sont fixées à 100 pixels et les marges internes
à 50 pixels :
div {
margin: 100px;
padding: 50px;
La balise <div> est dimensionnée à 300 × 250 pixels, son arrière-plan est de couleur
rouge et le texte qui y est affiché est justifié :
width: 300px;
height: 250px;
background-color: red;
text-align: justify;
Info
Si nécessaire, il est possible de différencier les quatre marges internes ou externes en
utilisant les propriétés CSS suivantes. Pour les marges externes : margin-top, margin-
left, margin-bottom et margin-right. Pour les marges internes : padding-top,
padding-left, padding-bottom et padding-right.
176 Chapitre 10
Responsive Web Design
(Media Queries CSS)
Le Web est de plus en plus consulté sur des périphériques de petite taille (téléphones,
tablettes, netbooks). C’est pourquoi il est très important d’adapter l’affichage de vos
pages à ces nouveaux modes de consultation. Jusqu’à récemment, les concepteurs
de sites Web se voyaient contraints de créer deux versions de leurs pages : une pour
les ordinateurs et une pour les périphériques mobiles de petite taille. Aujourd’hui, les
Media Queries du langage CSS3 proposent une solution simple, élégante et très efficace
à ce problème. Ils permettent en effet de définir le style d’une page Web en fonction
de plusieurs facteurs liés à la surface d’affichage : la largeur, la hauteur, l’orientation, la
résolution, etc. Cerise sur le gâteau : la plupart des navigateurs actuels (Internet Explorer,
Firefox, Firefox Mobile, Chrome, Safari, Safari Mobile, iOS Safari, Android, Opera Mini,
Opera Mobile et BlackBerry) sont compatibles avec cette fonctionnalité.
Les Media Queries sont des expressions dont la valeur est vraie ou fausse. Lorsqu’un
Media Query a pour valeur true, les instructions situées entre les accolades qui le
suivent sont exécutées. Elles sont ignorées dans le cas contraire.
Si nécessaire, vous pouvez associer plusieurs expressions à l’aide d’opérateurs logiques :
Opérateur Signification
and et
only uniquement : masque la suite sur les navigateurs non compatibles avec les Media
Queries
not non
or ou
Les Media Queries reposent sur la propriété CSS3 @media. Le tableau suivant rassemble
quelques-unes des syntaxes utilisables :
Syntaxe Signification
@media (max-width: largeur) { …} Largeur de la fenêtre inférieure à la largeur
spécifiée
@media (max-device-width: Largeur du périphérique inférieure à la largeur
largeur) { …} spécifiée
@media (min-width: largeur1) and Largeur de la fenêtre comprise entre les deux
(max-width: largeur2) { …} largeurs spécifiées
@media (max-device-width: Largeur du périphérique inférieure à la largeur
largeur) and (orientation: spécifiée, et écran tenu horizontalement
landscape) { …}
178 Chapitre 10
Figure 10.13
La mise en forme
dépend de la
largeur de la
fenêtre.
Info
Il est également possible d’utiliser un fichier CSS ou un autre en fonction de la résolution
du périphérique/de l’écran. Pour cela, vous insérerez des éléments link du type suivant
dans l’en-tête du document. Ici, le style 600px.css est utilisé si l’écran a une largeur
inférieure à 600 pixels.
<link rel="stylesheet" media="screen and (max-width: 600px)" href="600px.css" />
Si ces quelques rudiments de Media Queries vous ont laissé sur votre faim, je vous
conseille de consulter les pages https://developer.mozilla.org/fr/docs/CSS/Media_
queries, www.w3.org/TR/css3-mediaqueries/ et www.w3.org/TR/css3-mediaqueries/
pour en savoir un peu plus.
De même, je vous conseille de rassembler vos codes jQuery dans un fichier externe et
d’y faire référence dans chacune de vos pages en utilisant une balise <script>, après
avoir invoqué la bibliothèque jQuery sur un CDN :
<script src=http://code.jquery.com/jquery.min.js></script>
<script src="monCodeJquery.js"></script>
Enfin, si vos pages sont construites sur le même modèle, vous pourrez restreindre
l’écriture de code en plaçant les parties constantes du code HTML dans autant de fichiers
que nécessaire et en invoquant ces fichiers à l’aide de l’instruction PHP $include.
Supposons, par exemple, que le début et la fin de vos pages utilisent systématiquement
le même code. Vous pourriez créer les fichiers debut.htm et fin.htm, et insérer ces deux
fichiers dans vos pages comme ceci :
Info
Pour que ce code puisse fonctionner, vous devez le stocker sur le serveur dans un fichier
d’extension .php. Bien entendu, ces instructions ne donneront aucun résultat en local,
sauf si vous installez un serveur PHP, tel WAMP Server (www.wampserver.com).
180 Chapitre 10
Exercice 10
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
Remplacez les balises <div> utilisées dans la page index.htm par leurs équivalents
sémantiques HTML5 : <header>, <nav>, <article> et <footer>.
Exercice 11
Définissez une mise en page qui s’adapte à la largeur de la fenêtre pour la page index.
htm. Lorsque la fenêtre a une largeur inférieure ou égale à 900 pixels :
■■ Supprimez le titre "eFormation HTML5 CSS3 jQuery" dans le bandeau d’en-tête.
■■ Transformez le menu <ul> en une liste <select>.
Exercice 12
Appliquez la technique décrite dans la section "Optimiser les pages d’un site Web" pour
insérer les instructions jQuery dans un fichier annexe que vous appellerez jquerysite.js.
Appliquez la technique PHP décrite dans la section "Optimiser les pages d’un site Web"
pour optimiser le découpage du fichier index.htm. Pour cela :
1. Définissez les parties constantes d’index.htm dans deux fichiers nommés debut.htm
et fin.htm.
2. Renommez le fichier index.htm en index.php.
3. Utilisez deux instructions include pour invoquer les fichiers debut.htm et fin.htm dans
le fichier index.php et, ainsi, simplifier le code de la page.
Simplifiez le code des autres pages en utilisant la même technique.
Le corps du document affiche un élément span d’id status, qui donne l’état du
document, et deux boutons de commande. Au début du chargement de la page, l’élément
span affiche le texte "En attente". Dès que le document est entièrement chargé dans le
navigateur, l’événement onload() est généré et la fonction load() affiche le message
"L’événement 'load' a été généré." dans l’élément span.
Lorsque l’utilisateur clique sur un des boutons de commande, la fonction bouton()
est exécutée. Elle affiche un message dans l’élément span qui dépend du paramètre
transmis, et donc du bouton cliqué (voir Figure 11.1).
Figure 11.1
Le premier bouton a
été cliqué.
La pseudo-classe :focus cible la balise qui a le focus (généralement une balise d’un
formulaire). Elle permet de modifier la couleur d’arrière-plan (ou un autre style quelconque)
de la balise qui a le focus. À titre d’exemple, cette instruction affecte un arrière-plan de
couleur rouge à la balise input de type text qui a le focus :
input[type=text]:focus {background: red;}
184 Chapitre 11
Gestion événementielle en jQuery
jQuery est en mesure de réagir aux événements générés par la souris, le clavier et les
éléments du DOM. Pour cela, vous devez définir une méthode de gestion événementielle
en écrivant quelque chose comme ceci :
$(sélecteur).événement(function(){
// Gestion de l’événement
});
Où :
■■ sélecteur permet de sélectionner un ou plusieurs éléments du DOM.
■■ événement est le nom de l’événement à gérer.
Par exemple, pour afficher une boîte de message lorsque l’utilisateur clique sur une
image d’id #img, vous utiliserez le code suivant :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Gestion événementielle</title>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<img id="img" src="chat250.jpg">
<script>
$(function(){
$('#img').click(function(){
alert('Vous avez cliqué sur l\'image');
});
});
</script>
</body>
</html>
Voyons maintenant comment capturer un événement fenêtre avec jQuery. Ici, une boîte
de message est affichée à chaque redimensionnement de la fenêtre.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
186 Chapitre 11
<title>Gestion événementielle</title>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<H2>Redimensionnez la fenêtre</h2>
<script>
$(function(){
$(window).resize(function(){
alert('Vous avez redimensionné la fenêtre');
});
});
</script>
</body>
</html>
Cet exemple affiche un élément span et une zone de texte <input type="text">.
Un caractère tapé dans la zone de texte est récupéré via la fonction événementielle
faitecho, déclenchée sur l’événement onkeypress. Le code de la touche utilisée est
récupéré (ev.keyCode), converti en une chaîne (String.fromCharCode()) affichée
dans l’élément span (document.getElementById("echo").innerHTML).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Gestion événementielle</title>
<script>
function faitecho(ev) {
document.getElementById("echo").innerHTML =
➥document.getElementById("echo").innerHTML + String.fromCharCode(ev.keyCode);
}
</script>
</head>
<body>
<p>echo: <span id="echo"></span></p>
<input type="text" id="saisie" onkeypress="return faitecho(event);">
</body>
</html>
188 Chapitre 11
mousemove onmousemove Lorsque le pointeur se déplace
mouseout onmouseout Lorsque le pointeur se déplace en dehors d’un élément
mouseover onmouseover Lorsque le pointeur est déplacé sur un élément
mouseup onmouseup Au relâchement du bouton de la souris
mousewheel onmousewheel Au déplacement de la roulette de la souris
scroll onscroll Lorsque la barre de défilement de l’élément est utilisée
Cet exemple capture les événements souris liés à un élément img et les affiche dans un
élément span.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Gestion événementielle</title>
<script>
function traitement(param) {
document.getElementById("activite").innerHTML = param;
}
</script>
</head>
<body>
<img src="chien250.jpg"
onclick="traitement('clic souris');"
ondblclick="traitement('double-clic souris');"
ondrag="traitement('déplacement');"
ondrop="traitement('relâchement de l''image');"
onmousedown="traitement('bouton souris enfoncé');"
onmousemove="traitement('déplacement de la souris');"
onmousemove="traitement('déplacement du pointeur en dehors de
➥l''image');"
onmouseover="traitement('déplacement du pointeur au-dessus de
➥l''image');"
onmouseup="traitement('relâchement du bouton de la souris');"
onmousewheel="traitement('déplacement de la roulette de la souris');"
>
<p>Activité : <span id="activite"></span></p>
</body>
</html>
Cette version du code chaîne les fonctions événementielles sur l’image. Nous avons
également conservé la fonction JavaScript traitement. Si vous préférez, une solution
"tout jQuery" est envisageable. Vous pourriez écrire quelque chose comme ceci pour
traiter l’événement click :
$('#img').click(function(){
$('#activite').html('clic souris');
})
190 Chapitre 11
focus onfocus Lorsqu’un élément reçoit le focus
formchange onformchange Lorsque le contenu du formulaire change
forminput onforminput Lorsque l’utilisateur entre des données dans le formulaire
input oninput Lorsqu’un élément reçoit des données entrées par
l’utilisateur
invalid oninvalid Lorsqu’un élément n’est pas valide
select onselect Lorsqu’un élément est sélectionné
submit onsubmit Lorsque le formulaire est soumis (généralement au clic sur
le bouton Submit)
Cet exemple capture les actions effectuées sur une zone de texte et un bouton Submit,
et les affiche dans un élément span.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Gestion événementielle</title>
<script>
function traitement(param) {
document.getElementById("activite").innerHTML = param;
}
</script>
</head>
<body>
<form name="MonFormulaire" method="post" >
<label>Quel est le meilleur système d’exploitation selon vous ?</label>
<input name="texte"
placeholder="Entrez votre réponse ici"
onfocus="traitement('La zone de texte a le focus');"
onblur="traitement('La zone de texte a perdu le focus');"
>
<input type="submit" value="Envoyer" onsubmit="traitement('Le bouton Submit
➥a été pressé');">
</form>
<p>Activité : <span id="activite"></span></p>
</body>
</html>
192 Chapitre 11
loadedmetadata onloadedmetadata Lorsque la durée et les autres
caractéristiques du média ont été lues
loadstart onloadstart Lorsque le navigateur commence à
charger les données du média
pause onpause Lorsque le média est mis en pause
play onplay Lorsque le média est mis en lecture
play onplay Lorsque le média a commencé à être
joué
progress onprogress Lorsque l’élément est en cours de
récupération des données pour le
média
ratechange onratechange Lorsque la vitesse de lecture change
readystatechange onreadystatechange Lorsque l’état (prêt/pas prêt) du média
change
seeked onseeked Lorsque la recherche a pris fin
seeking onseeking Pendant la recherche (attribut
seeking=true)
stalled onstalled Lorsqu’une erreur est rencontrée lors
de la récupération des données
suspend onsuspend Lorsque la récupération des données
est arrêtée avant la fin
timeupdate ontimeupdate Lorsque la position de lecture change
volumechange onvolumechange Lorsque le volume du média est
modifié
waiting onwaiting Lorsque le média n’est plus en mode
de lecture mais que l’utilisateur peut
demander une relecture
Cet exemple affiche une vidéo issue du site Mediaforma (www.mediaforma.com) dans
un élément video. Tous les événements liés à cet élément sont capturés et affichés
dans un élément span, au-dessous de l’élément video (voir Figure 11.2).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Gestion événementielle</title>
<script>
function etat(param) {
document.getElementById("activite").innerHTML = param;
}
</script>
</head>
<body>
<video id="video" src="http://www.mediaforma.com/uneminuteparjour/video/
➥godmode.mp4"
Figure 11.2
La vidéo est en cours de lecture.
194 Chapitre 11
Voici le code équivalent en jQuery :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Gestion événementielle</title>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<video id="video" src="http://www.mediaforma.com/uneminuteparjour/video/
➥godmode.mp4" poster="http://www.mediaforma.com/uneminuteparjour/thumbs/
➥godmode.jpg" controls >
</video>
<p>Activité : <span id="activite"></span></p>
<script>
$(function(){
$('#video').on('abort', function(){ $('#activite').text('onabort'); })
.on('canplay', function(){ $('#activite').text('oncanplay');
➥})
.on('canplaythrough', function(){ $('#activite').
➥text('oncanplaythrough'); })
.on('durationchange', function(){ $('#activite').
➥text('ondurationchange'); })
.on('emptied', function(){ $('#activite').text('onemptied');
➥})
.on('ended', function(){ $('#activite').text('onended'); })
.on('error', function(){ $('#activite').text('onerror'); })
.on('loadeddata', function(){ $('#activite').
➥text('onloadeddata'); })
.on('loadedmetadata', function(){ $('#activite').
➥text('onloadedmetadata'); })
.on('loadstart', function(){ $('#activite').
➥text('onloadstart'); })
.on('pause', function(){ $('#activite').text('onpause'); })
.on('play', function(){ $('#activite').text('onplay'); })
.on('playing', function(){ $('#activite').text('onplaying');
➥})
.on('progress', function(){ $('#activite').text('onprogress');
➥})
.on('ratechange', function(){ $('#activite').
➥text('onratechange'); })
.on('readystatechange', function(){ $('#activite').
➥text('onreadystatechange'); })
.on('seeked', function(){ $('#activite').text('onseeked'); })
.on('seeking', function(){ $('#activite').text('onseeking');
➥})
.on('stalled', function(){ $('#activite').text('onstalled');
➥})
.on('suspend', function(){ $('#activite').text('onsuspend');
➥})
.on('timeupdate', function(){ $('#activite').
➥text('ontimeupdate'); })
Info
Remarquez l’utilisation de la fonction on() pour définir les gestionnaires pour chaque
événement. Les événements ne sont en effet pas des fonctions directement utilisables
dans le code. Notez également le chaînage des fonctions on() pour simplifier l’écriture
du code jQuery.
À titre d’exemple, les quelques lignes de code suivantes affichent l’orientation du matériel
dans un élément span :
<!DOCTYPE html>
<html>
<head>
<title>device Orientation</title>
<script>
if (window.DeviceOrientationEvent) {
196 Chapitre 11
alert('DeviceOrientation supporté');
window.addEventListener('orientationchange', function(event) {
document.getElementById("status").innerHTML='orientation : ' + window.
➥orientation + ' degrés';
}, false);
}
</script>
</head>
<body>
<span id="status">Modifiez l’orientation de votre device</span>
</body>
</html>
À titre d’exemple, les quelques lignes de code suivantes affichent dans un élément span
l’orientation du matériel selon les axes X, Y, Z :
<!DOCTYPE html>
<html>
Info
L’API DeviceMotion retourne des accélérations et non des angles. Cependant, ces
grandeurs peuvent être assimilées. Ainsi par exemple, si vous posez votre matériel
sur un support parfaitement horizontal, les valeurs affichées pour X et Y devraient être
égales à 0.
198 Chapitre 11
Exercice 13
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
Dans cet exercice, vous allez modifier le fichier membre.php.
Capturez les frappes de l’utilisateur dans les deux premières zones de texte et
convertissez-les en caractères minuscules au fur et à mesure de la frappe. Pour cela,
vous mettrez en place un gestionnaire d’événements jQuery lié à la saisie dans chacune
des deux zones de texte.
Où :
■■ nom définit le chemin et le nom du fichier audio. Les différents formats audio utilisables
sont OGG, AAC, MP3, WAV, AIFF et AU.
■■ controls, s’il est présent, demande l’affichage d’une barre de contrôle pour agir sur
le son.
■■ preload indique comment le son doit être téléchargé avant qu’il ne soit joué : none
(aucun téléchargement), metadata (téléchargement des métadonnées associées
uniquement) ou auto (laisse le navigateur décider).
■■ loop, s’il est présent, provoque la lecture sans fin du son.
■■ muted, s’il est présent, met le volume de lecture à 0.
■■ autoplay, s’il est présent, déclenche la lecture du son dès que possible, en accord
avec l’attribut preload.
L’attribut src peut être spécifié en dehors de l’élément audio sous la forme d’un ou de
plusieurs éléments source. Ainsi, en fonction du navigateur utilisé, un format audio ou
un autre sera utilisé. Il est même possible de spécifier un lien pour télécharger le fichier
audio, dans le cas où le navigateur ne reconnaîtrait pas l’élément audio.
Attention
Tous les navigateurs ne sont pas compatibles avec les différents formats audio. Le tableau
ci-après donne un aperçu des formats utilisables dans chaque navigateur.
Info
Pour savoir si votre navigateur est compatible avec la balise HTM5 <audio>, le plus
simple consiste à afficher la page http://html5test.com (voir Figure 12.1).
Figure 12.1
Google Chrome 31 est
bien compatible avec la
balise <audio>.
Voici un exemple d’utilisation de la balise <audio>. Ici, les versions OGG, AAC, MP3, WAV,
AIFF et AU du même son ont été spécifiées dans des balises <source>. Le navigateur
utilisera le premier format avec lequel il est compatible. S’il n’est pas compatible avec
l’élément audio, un lien permettant de télécharger le son (ici, au format MP3) sera affiché.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>L’élément audio</title>
202 Chapitre 12
</head>
<body>
<audio controls preload="auto" autobuffer>
<source src="son.ogg" type="audio/ogg">
<source src="son.aac" type="audio/aac">
<source src="son.mp3" type="audio/mp3">
<source src="son.wav" type="audio/wav">
<source src="son.aiff" type="audio/aiff">
<source src="son.au" type="audio/au">
<a href="son.mp3">Télécharger <cite>le commentaire audio au format mp3
➥</cite></a>
</audio>
</body>
</html>
Figure 12.2
La balise <audio>
est bien supportée
dans Internet
Explorer 11.
Info
Si vous voulez convertir vos fichiers audio aux formats OGG, AAC, MP3, WAV, AIFF et AU,
il est conseillé de télécharger le logiciel Sothink Free Video Converter en vous rendant
sur la page www.myconverters.com/video-converter/fr/.
Figure 12.3
Les cinq boutons
permettent d’interagir
avec la balise
<audio>.
Multimédia 203
Voici le code :
<!DOCTYPE HTML>
<html>
<head>
<meta charset=UTF-8" />
<title>L’élément audio</title>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<audio id="music" controls preload="auto" autobuffer>
<source src="son.ogg" type="audio/ogg">
<source src="son.aac" type="audio/aac">
<source src="son.mp3" type="audio/mp3">
<source src="son.wav" type="audio/wav">
<source src="son.aiff" type="audio/aiff">
<source src="son.au" type="audio/au">
<a href="son.mp3">Télécharger le son au format mp3</a>
</audio>
<br>
<input type="button" value="Play" id="play" />
<input type="button" value="Pause" id="pause" />
<input type="button" value="Stop" id="stop" />
<input type="button" value="Plus fort" id="plus" />
<input type="button" value="Moins fort" id="moins" />
<script>
$(function(){
$('#play').click(function(){
$('#music')[0].play();
});
$('#pause').click(function(){
$('#music')[0].pause();
});
$('#stop').click(function(){
$('#music')[0].pause();
$('#music')[0].currentTime=0;
});
$('#plus').click(function(){
$('#music')[0].volume+=0.1;
});
$('#moins').click(function(){
$( '#music')[0].volume-=0.1;
});
});
</script>
</body>
</html>
204 Chapitre 12
Si vous voulez cacher le player audio, remplacez cette balise :
<audio id="music" controls preload="auto" autobuffer>
Par la suivante :
<audio id="music" preload="auto" autobuffer>
Où :
■■ nom définit le chemin et le nom du fichier vidéo, au format OGG ou MP4.
■■ controls, s’il est présent, demande l’affichage d’une barre de contrôle pour agir sur
la vidéo.
■■ preload indique comment la vidéo doit être téléchargée avant qu’elle ne soit
jouée : none (aucun téléchargement), metadata (téléchargement des métadonnées
associées uniquement) ou auto (laisse le navigateur décider).
■■ loop, s’il est présent, provoque la lecture sans fin de la vidéo.
■■ muted, s’il est présent, met le volume de lecture à 0.
■■ autoplay, s’il est présent, déclenche la lecture de la vidéo dès que possible, en
accord avec l’attribut preload.
L’attribut src peut être spécifié en dehors de l’élément video sous la forme d’un ou
de plusieurs éléments source. Ainsi, en fonction du navigateur, un format vidéo ou
un autre sera utilisé. Il est même possible de spécifier une variante flash et/ou un lien
pour télécharger le fichier audio, dans le cas où le navigateur utilisé ne reconnaîtrait pas
l’élément video.
L’élément video est entièrement supporté dans tous les navigateurs modernes. Attention
cependant, faute d’accord entre les différents navigateurs, vous devrez fournir plusieurs
formats vidéo (Ogg Theora, H.264, MP4 et WebM) pour assurer une compatibilité aussi
grande que possible :
■■ Ogg Theora pour les navigateurs Firefox 3.6 et supérieur, Opera 10.6 et supérieur, et
Google Chrome 6 et supérieur.
■■ MP4 codé en H.264 pour les navigateurs Internet Explorer 9 et supérieur, Safari 5 et
supérieur, et Google Chrome 6 et supérieur.
■■ WebM pour les navigateurs Opera 10.6 et supérieur, Chrome 6 et supérieur, et Firefox
3.6 et supérieur.
Pour générer des fichiers aux formats Ogg, MP4 et WebM, le plus simple consiste
à utiliser le logiciel gratuit Miro Video Converter, téléchargeable à la page
www.mirovideoconverter.com. Une fois que le logiciel est installé sur votre ordinateur,
déposez le fichier à convertir dans la fenêtre de l’application, choisissez le format cible
et cliquez sur Convert (voir Figure 12.4).
Multimédia 205
Figure 12.4
Un fichier WMV est sur le point d’être converti au
format WebM.
Le code ci-après affiche une vidéo issue du site de formation en ligne Mediaforma.
Lorsque le navigateur utilisé supporte l’élément video, il est affiché au format MP4 ou
Ogg (<source>). Dans le cas contraire, une version flash est utilisée (object). Il lui est
même possible de télécharger la vidéo (a).
<!DOCTYPE HTML>
<html>
<head>
<meta charset="UTF-8" />
<title>L’élément video</title>
</head>
<body>
<video controls>
<source src="http://www.mediaforma.com/win7/videx/nettoyage-disque.mp4"
➥type="video/mp4" />
<source src="http://www.mediaforma.com/win7/videx/nettoyage-disque.ogg"
➥type="video/ogg" />
<object width="800" height="600" type="application/x-shockwave-flash"
➥data="http://www.mediaforma.com/win7/videx/nettoyage-disque.swf">
<param name="movie" value="http://www.mediaforma.com/win7/videx/
➥nettoyage-disque.ogg" />
<param name="flashvars" value="controlbar=over&image=
➥http://www.mediaforma.com/win7/videx/nettoyer-disque.jpg&file=
➥http://www.mediaforma.com/win7/videx/nettoyage-disque.mp4" type="video/mp4" />
<img src="http://www.mediaforma.com/win7/videx/nettoyer-disque.jpg"
➥width="640" height="360" alt="Nettoyage du disque"
title="Le navigateur ne supporte pas la balise ≶video>.
➥Téléchargez la vidéo en cliquant sur le lien ci-après" />
</object>
206 Chapitre 12
<p><a href="http://www.mediaforma.com/win7/videx/nettoyage-disque.mp4">
➥Télécharger la vidéo</a>.</p>
</video>
</body>
</html>
Figure 12.5
La vidéo est lue dans Internet
Explorer.
Astuce
Pour vous assurer de la prise en compte des formats vidéo dans les navigateurs, pensez
à ajouter les trois lignes suivantes dans le fichier .htaccess, situé à la racine du site :
AddType video/ogg .ogv
AddType audio/ogg .oga
AddType video/mp4 .m4v .mp4
Multimédia 207
<title>L’élément video</title>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<video id="video">
<source src="http://www.mediaforma.com/win7/videx/nettoyage-disque.mp4"
➥type="video/mp4" />
<source src="http://www.mediaforma.com/win7/videx/nettoyage-disque.ogg"
➥type="video/ogg" />
<object width="800" height="600" type="application/x-shockwave-flash"
➥data="http://www.mediaforma.com/win7/videx/nettoyage-disque.swf">
<param name="movie" value="http://www.mediaforma.com/win7/videx/
➥nettoyage-disque.ogg" />
<param name="flashvars" value="controlbar=over&image=http:
➥//www.mediaforma.com/win7/videx/nettoyer-disque.jpg&file=http:
➥//www.mediaforma.com/win7/videx/nettoyage-disque.mp4" type= "video/mp4" />
<img src="http://www.mediaforma.com/win7/videx/nettoyer-disque.jpg"
➥width="640" height="360" alt="Nettoyage du disque"
title="Le navigateur ne supporte pas la balise ≶video>.
➥Téléchargez la vidéo en cliquant sur le lien ci-après" />
</object>
<p><a href="http://www.mediaforma.com/win7/videx/nettoyage-disque.mp4">
➥Télécharger la vidéo</a>.</p>
</video>
<br>
<input type="button" value="Play" id="play" />
<input type="button" value="Pause" id="pause" />
<input type="button" value="Stop" id="stop" />
<input type="button" value="Plus fort" id="plus" />
<input type="button" value="Moins fort" id="moins" />
<script>
$(function(){
$('#play').click(function(){
$('#video')[0].play();
});
$('#pause').click(function(){
$('#video')[0].pause();
});
$('#stop').click(function(){
$('#video')[0].pause();
$('#video')[0].currentTime=0;
});
$('#plus').click(function(){
$('#video')[0].volume+=0.1;
});
$('#moins').click(function(){
$('#video')[0].volume-=0.1;
});
});
</script>
</body>
</html>
208 Chapitre 12
Exercice 14
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
Vous allez créer la page apropos.php pour compléter le site défini dans les exercices
précédents.
Je vous propose de concevoir une vidéo (ou de la récupérer sur Internet), de la convertir
aux formats Ogg et MP4 avec Miro Video Converter et de l’afficher dans la page apropos.
php en mode autoplay, pour qu’elle se joue dès l’ouverture de la page.
Multimédia 209
13
Transformations,
transitions et
animations
Il est désormais très simple d’appliquer des transformations (translations, rotations,
changements d’échelle) en utilisant quelques instructions CSS3 ou jQuery et de les
animer avec des pseudo-classes CSS3 ou du code jQuery. Les transformations et les
animations sont supportées par la plupart des navigateurs de dernière génération :
WebKit (Safari, Chrome), Gecko (Firefox), Opera ainsi qu’Internet Explorer 9 et ultérieur.
Vous pouvez donc les utiliser sans vous préoccuper de leur compatibilité.
En règle générale, vous pouvez utiliser indifféremment des instructions CSS3 ou jQuery.
C’est une affaire de goût personnel. Le résultat obtenu sera similaire.
Transformations
Dans les pages suivantes, vous allez découvrir comment appliquer une translation, une
rotation, un changement d’échelle ou une inclinaison à un élément HTML quelconque. Si
vous voulez aller plus loin, vous pourrez définir des transformations plus complexes en
passant par une "matrice de transformation".
Translations
Tous les éléments HTML5 peuvent subir une translation par l’intermédiaire de la fonction
translate() appliquée à la propriété transform. Voici la syntaxe à utiliser :
transform: translate(h, v);
Remarquez la présence du préfixe -webkit dans le code CSS3 pour s’adresser aux
navigateurs WebKit. Alors que j’écris ces lignes, seul Google Chrome (navigateur à base
du moteur WebKit, en version 31 dans nos tests) a nécessité une propriété transform
préfixée. Les navigateurs Firefox version 25 et Internet Explorer 11 se sont contentés de la
212 Chapitre 13
version générique de la propriété transform. Pour assurer la compatibilité de ce code
avec des navigateurs plus anciens, vous pouvez vous adresser directement à plusieurs
autres navigateurs en utilisant les préfixes appropriés. Par exemple :
-moz-transform : translate(15px, -15px);
Figure 13.1
Translations CSS3 dans Internet
Explorer 11.
Info
Si la translation ne doit être appliquée que sur un des axes, vous pouvez également
utiliser les fonctions translateX(h) ou translateY(v), où h représente la
translation horizontale et v la translation verticale, en adoptant les mêmes conventions de
direction que dans la fonction translate().
Lorsqu’un décalage doit être effectué suite à une action de l’utilisateur (un clic sur un
bouton ou sur un lien par exemple), le plus simple consiste à utiliser quelques instructions
jQuery. Dans le code suivant, un clic sur le bouton décale l’image de 100 pixels vers la
droite.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Translation en jQuery</title>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<img src="chat250.jpg" id="chat"><br>
Rotations
Tous les éléments HTML5 peuvent subir une rotation via la fonction rotate() appliquée
à la propriété transform. Voici la syntaxe à utiliser :
transform: rotate(rdeg);
Où rdeg est l’angle de la rotation en degrés. Une valeur positive provoque une rotation
dans le sens horaire, et une valeur négative provoque une rotation dans le sens
trigonométrique.
Voici un exemple d’utilisation de cette propriété. Le résultat de ce code, affiché dans
Firefox, est représenté à la Figure 13.2.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Rotations</title>
<style>
div {
width: 200px;
height: 60px;
background-color: SkyBlue;
margin-top: 120px;
border-color: black;
border-width: 5px;
border-style: dashed;
display: inline-block;
}
.rotdroite45 { transform : rotate(45deg); -webkit-transform :
➥rotate(45deg); }
.rotgauche90 { transform : rotate(-90deg); -webkit-transform : rotate
➥(-90deg); }
</style>
</head>
<body>
<div style="border-width: 5px;">
La <div> originale
</div>
<div class="rotdroite45">
214 Chapitre 13
La <div> après une rotation à droite de 45°
</div>
<div class="rotgauche90">
La <div> après une rotation à gauche de 90°
</div>
</body>
</html>
Figure 13.2
Rotation CSS3 dans
Firefox 25.
Lorsqu’une rotation doit être effectuée suite à une action de l’utilisateur (un clic sur un
bouton ou sur un lien par exemple), le plus simple consiste à utiliser quelques instructions
jQuery. Dans le code suivant, un clic sur le bouton applique une rotation de 45° vers la
droite à une balise <div>.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Translation en jQuery</title>
<style type="text/css">
div {
background-color: red;
width: 200px;
height: 200px;
Changements d’échelle
Les éléments HTML5 peuvent subir un changement d’échelle quand la fonction scale()
est appliquée à la propriété CSS3 transform. Voici la syntaxe à utiliser :
transform: scale(ex, ey);
Où ex et ey représentent les facteurs d’échelle selon les axes des abscisses et des
ordonnées. Par défaut, si ey n’est pas spécifié, il est supposé égal à ex.
Le code ci-après applique deux changements d’échelle sur une image (voir Figure 13.3) :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Changements d’échelle</title>
<style>
.e200 {
-webkit-transform : scale(2);
transform : scale(2);
}
.e50 {
-webkit-transform : scale(.5);
transform : scale(.5);
}
</style>
</head>
<body>
<img src="cheval250.jpg">
<img src="cheval250.jpg" class="e200">
<img src="cheval250.jpg" class="e50">
216 Chapitre 13
</body>
</html>
Figure 13.3
Les images se
chevauchent.
Comme vous pouvez le voir, les trois images se superposent. En fait, elles sont affichées
comme si chacune avait la taille de l’image originale. Pour régler ce problème, vous
définirez une marge entre elles avec la propriété CSS margin :
img { margin: 30px; }
Figure 13.4
La propriété margin a
réglé le problème.
Figure 13.5
L’image originale a
subi un changement
d’échelle scaleX(2).
Lorsqu’un changement d’échelle doit être effectué suite à une action de l’utilisateur (un
clic sur un bouton ou sur un lien par exemple), le plus simple consiste à utiliser quelques
instructions jQuery. Dans le code suivant, un clic sur le bouton applique à une image
alternativement un agrandissement ou un retour à la taille normale.
<!DOCTYPE html>
<html>
<head>
218 Chapitre 13
<meta charset="UTF-8" />
<title>Changement d’échelle en jQuery</title>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<img src="chien250.jpg" id="chien"></div>
<button id="echelle">Changer l’échelle</button>
<script>
$(function(){
$('#echelle').click(function(){
$('#chien').toggle(function(){ $(this).css('transform','scale(0)'); },
function(){ $(this).css('transform','scale(1)'); });
});
});
</script>
</body>
</html>
Info
Jusqu’ici, nous n’avons pas utilisé la fonction jQuery toggle(). Très pratique, elle
permet d’exécuter alternativement une fonction ou une autre. Ici, le premier clic sur le
bouton provoque le redimensionnement de l’image jusqu’à sa disparition (scale(0)). Le
deuxième l’affiche dans sa taille originale (scale(1)). Le troisième la fait disparaître. Le
quatrième lui rend sa taille originale, etc.
Inclinaisons
Les éléments HTML5 peuvent être inclinés avec la fonction skew() appliquée à la
propriété CSS3 transform. Voici la syntaxe à utiliser :
transform: skew(ax, ay);
Où ax et ay représentent les angles d’inclinaison selon les axes des abscisses et des
ordonnées. Les valeurs positives de ax inclinent l’élément dans le sens trigonométrique.
Quant aux valeurs positives de ay, elles l’inclinent vers l’arrière. Par défaut, si ay n’est
pas spécifié, il est supposé égal à 0. Dans ce cas, il n’y a donc pas d’inclinaison selon
l’axe des ordonnées.
Le code ci-après applique des inclinaisons sur une image (voir Figure 13.6).
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Inclinaison</title>
<style>
img { margin-top: 60px; margin-left: 40px; }
.xy15 {
-webkit-transform : skew(15deg, 15deg);
transform : skew(15deg, 15deg);
}
</style>
</head>
<body>
<img src="chien250.jpg">
<img src="chien250.jpg" class="xy15">
<img src="chien250.jpg" class="xy-25">
</body>
</html>
Figure 13.6
Inclinaison selon les
axes X et Y.
Si l’inclinaison ne doit être appliquée que sur un des axes, vous pouvez également
utiliser les fonctions skewX(ax) ou skewY(ay), où ax et ay représentent les angles
d’inclinaison selon les axes des abscisses et des ordonnées.
Info
Ce qui a été dit dans les sections précédentes concernant l’utilisation de code jQuery
s’applique également à la fonction skew(). Libre à vous d’utiliser quelques lignes de
jQuery pour incliner un élément suite à une action de l’utilisateur.
Matrices
D’un point de vue mathématique, toutes les transformations CSS3 peuvent être
représentées par une matrice 3 × 3 de la forme suivante :
220 Chapitre 13
Figure 13.7
Matrice de transformation.
Figure 13.8
Lien entre les anciennes et les nouvelles coordonnées.
Figure 13.9
Matrices de transformation.
Figure 13.10
Rotation de
90 degrés dans
le sens inverse
trigonométrique.
</style>
</head>
<body>
<img src="cheval250.jpg">
<img src="cheval250.jpg" class="mat90">
</body>
</html>
222 Chapitre 13
Figure 13.11
La rotation a été
effectuée via la
fonction matrix().
Figure 13.12
Transformations
multiples.
Info
Ce qui a été dit dans les sections précédentes concernant l’utilisation de code jQuery
s’applique également à la fonction matrix(). Vous pouvez donc appliquer une matrice à
un élément HTML suite à une action de l’utilisateur.
Transitions
Vous pouvez animer les transformations CSS3 avec des pseudo-classes ou du code
jQuery comme facteurs déclenchants. Ainsi, par exemple, une rotation ou une translation
peut être affichée progressivement lorsque l’utilisateur déplace le pointeur ou clique
sur un élément quelconque. Cette fabuleuse nouveauté réside dans la propriété CSS3
transition dont voici la syntaxe :
transition: propriété durée type délai;
224 Chapitre 13
<body>
<p class="anim-couleur">Placez le pointeur sur ce texte</p>
</body>
</html>
L’animation sera linéaire et elle durera deux secondes. La valeur all étant appliquée
au premier paramètre, toutes les propriétés modifiées pour cet élément seront
automatiquement animées. Ici, seule une translation est appliquée à l’image, mais on
aurait pu également ajouter une disparition progressive, une rotation ou un quelconque
autre effet.
Pour vous en convaincre, modifiez la pseudo-classe animation:hover comme suit :
.animation:hover
{
transform: translate(50px, 0) rotate(360deg);
-webkit-transform: translate(50px, 0) rotate(360deg);
opacity: 0;
}
Maintenant, lorsque l’image est pointée, elle subit simultanément une translation, une
rotation et une disparition via la propriété opacity.
226 Chapitre 13
}
</style>
</head>
<body>
<button id="animer">Cliquez ici pour animer la <div></button>
<button id="revenir">Cliquez ici pour réinitialiser la <div></button>
<div id="madiv">Une simple balise <div></div>
<script>
$(function(){
$('#animer').click(function(){
$('#madiv').css('top', '150px');
});
$('#revenir').click(function(){
$('#madiv').css('top', '100px');
});
});
</script>
</body>
</html>
Figure 13.13
Ces deux boutons
agissent sur la propriété
top de la balise <div>.
Examinons le code.
La partie HTML5 définit deux <button> d’identifiants animer et revenir et une <div>
d’identifiant madiv.
La partie CSS3 définit les caractéristiques de la balise <div> : position (top, left), taille
(width, height), marges internes (padding), couleur d’arrière-plan (background),
type de la transition (transition: top).
La partie jQuery définit les gestionnaires événementiels liés aux clics sur les deux
boutons. Tous deux modifient l’attribut top de la balise <div> en utilisant la fonction
css() :
$('#madiv').css('top', '150px');
Ce code est certes élémentaire mais, en y insérant des instructions plus évoluées
(notamment en agissant sur la propriété transform), vous pourrez commander des
animations à la demande.
Apparition et disparition
Dans les pages précédentes, vous avez appris à faire disparaître progressivement
un élément HTML en utilisant la propriété transition et en jouant sur l’opacité de
l’élément. Pour simplifier encore la tâche, vous pouvez faire appel aux fonctions jQuery
show() et hide(). Ces fonctions peuvent être utilisées avec zéro, un, deux ou trois
arguments :
■■ Sans argument, la disparition ou l’apparition dure 400 millisecondes.
■■ Lorsqu’un argument est spécifié, il peut indiquer une durée (slow, fast ou en
millisecondes) ou un mode de disparition/d’apparition (linear, swing, easeInQuad,
etc.) Reportez-vous à la page http://api.jqueryui.com/easings/ pour savoir quelles
constantes vous pouvez utiliser.
■■ Lorsque deux arguments sont spécifiés, ils indiquent la durée de l’animation et la
fonction à utiliser lorsque l’animation est terminée (fonction de callback).
■■ Lorsque trois arguments sont spécifiés, ils indiquent la durée de l’animation, le mode
de disparition/d’apparition et la fonction à utiliser lorsque l’animation est terminée.
À titre d’exemple, le code suivant fait disparaître progressivement une image lorsqu’elle
est survolée par la souris et la fait réapparaître lorsque le pointeur se trouve en dehors
de la zone d’affichage originale de l’image.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Apparition et disparition progressive en jQuery</title>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<img src="cheval250.jpg" id="image">
<script>
$(function(){
$('#image').mouseenter(function(){
$(this).hide(1000);
});
$('#image').mouseleave(function(){
$(this).show(1000);
});
});
</script>
</body>
</html>
228 Chapitre 13
Les fonctions jQuery mouseenter() et mouseleave() sont exécutées lorsque le
pointeur de la souris (respectivement) entre puis sort de la zone d’affichage du sélecteur.
Ici, l’élément concerné est l’image d’identifiant #image :
$('#image').mouseenter(function(){ ... });
$('#image').mouseleave(function(){ ... });
Figure 13.14
Les quatre balises
<div> disparaissent
tour à tour.
Cette balise est à nouveau affichée en une seconde avec la fonction show() :
$('div').first().show(1000,function suivant2(){
Une fois la balise affichée, la fonction de callback suivant2() est exécutée. Cette
fonction affiche la balise <div> suivante, si elle existe. Une fois l’affichage terminé, la
fonction suivant2() est exécutée de façon récursive jusqu’à ce que la dernière balise
<div> soit affichée :
$(this).next().show(1000, suivant2);
230 Chapitre 13
Fondu enchaîné
Les fonctions fadeOut() et fadeIn() permettent respectivement de faire disparaître
et de faire apparaître progressivement des éléments HTML quelconques. La syntaxe de
ces fonctions est la même que celle des fonctions show() et hide(). Elles peuvent
donc admettre zéro, un, deux ou trois arguments. Reportez-vous à la section précédente
pour en savoir plus au sujet de ces arguments.
Dans ce code, deux images de même taille sont affichées l’une sur l’autre. Lorsque le
pointeur de la souris est placé au-dessus de l’image visible, elle est progressivement
cachée pour révéler l’autre image. Inversement, lorsque le pointeur est déplacé en
dehors de l’image, la première image apparaît progressivement en cachant celle qui était
visible.
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Fondu enchaîné en jQuery</title>
<style type="text/css">
img {
position: absolute;
top: 100px;
left: 100px;
}
#f1 { z-index: 2; }
#f2 { z-index: 1; }
</style>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<img src="fondu1.jpg" id="f1">
<img src="fondu2.jpg" id="f2">
<script>
$(function(){
$('#f1').mouseenter(function(){
$('#f1').fadeOut(2000);
});
$('#f1').mouseleave(function(){
$('#f1').fadeIn(2000);
});
});
</script>
</body>
</html>
Les deux images sont placées dans le DOM à l’aide de deux balises <img> :
<img src="fondu1.jpg" id="f1">
<img src="fondu2.jpg" id="f2">
La propriété z-index est utilisée pour décider quelle image sera au-dessus de l’autre.
Ici, c’est l’image d’identifiant #f1 qui sera visible par défaut, car sa propriété z-index a
la plus grande valeur :
#f1 { z-index: 2; }
#f2 { z-index: 1; }
Les événements qui déclenchent l’animation sont le début et la fin du survol de l’image
#f1 :
$('#f1').mouseenter(function(){ ... });
$('#f1').mouseleave(function(){ ... });
Lorsque le pointeur survole l’image #f1, un fadeOut de deux secondes lui est appliqué,
ce qui provoque sa disparition progressive :
$('#f1').fadeOut(2000);
Lorsque le pointeur ne survole plus l’image #f1, un fadeIn de deux secondes lui est
appliqué, ce qui provoque son apparition progressive :
$('#f1').fadeIn(2000);
Animations personnalisées
La fonction animate() permet d’animer une propriété CSS quelconque. Cette fonction
admet plusieurs syntaxes, mais nous utiliserons uniquement celle-ci :
animate({ propriété1: valeur1, propriété2: valeur2, etc. },
durée, modèle, function(){
// Instructions exécutées après l’animation
});
Où :
■■ propriété1, propriété2, etc., sont les propriétés à animer.
■■ valeur1, valeur2, etc., sont les valeurs à affecter aux propriétés correspondantes.
■■ durée est la durée de l’animation en millisecondes.
■■ modèle est le modèle de progression de l’animation (swing ou linear).
■■ function() est la fonction de callback. Ses instructions seront exécutées lorsque
l’animation sera terminée.
À titre d’exemple, nous allons utiliser la fonction animate() pour déplacer une balise
<div> afin de lui faire décrire un carré de 200 pixels de côté. Voici le code utilisé :
<!DOCTYPE html>
<html>
232 Chapitre 13
<head>
<meta charset="UTF-8" />
<title>Animate() jQuery</title>
<style type="text/css">
div {
position: absolute;
width: 150px;
height: 150px;
top: 50px;
left: 50px;
background-color: green;
border: 2px dotted black;
}
</style>
<script src=http://code.jquery.com/jquery.min.js></script>
</head>
<body>
<button id="animation">Cliquez ici pour animer la balise <div>
➥</button><br>
<div></div>
<script>
$(function(){
$('#animation').click(function(){
$('div').animate({left: '250px'})
.animate({top: '250px'})
.animate({left: '50px'})
.animate({top: '50px'});
});
});
</script>
</body>
</html>
Supposons que vous vouliez afficher la date et l’heure système dans une page Web.
Pour cela, la fonction setInterval() est tout indiquée. Il suffira en effet d’écrire les
instructions nécessaires à l’affichage de l’heure toutes les secondes et de lancer cette
fonction toutes les secondes.
Avant de passer au code, vous devez savoir que l’heure système est accessible en
définissant une variable JavaScript de type Date et en lui appliquant les fonctions
getHours(), getMinutes() et getSeconds() pour récupérer les heures, les
minutes et les secondes. Voici le code à utiliser :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Horloge élémentaire</title>
</head>
<body>
<script src=http://code.jquery.com/jquery.min.js></script>
<div id="heure"></div>
<script>
$(function() {
function horloge(){
var hms = new Date();
var h, m, s;
h = hms.getHours();
if (h<10) h = "0" + h;
m = hms.getMinutes();
if (m<10) m = "0" + m;
s = hms.getSeconds();
234 Chapitre 13
if (s<10) s = "0" + s;
$('#heure').html(h + ' : ' + m + ' : ' + s);
}
setInterval(horloge,1000);
});
</script>
</body>
</html>
La fonction horloge() commence par créer un objet Date. Elle définit ensuite les
variables h, m et s, et les initialise avec les fonctions getHours(), getMinutes()
et getSeconds(). Pour que les heures, les minutes et les secondes soient toujours
affichées avec deux chiffres, la valeur des variables h, m et s est testée. En fonction
du résultat, un "0" vient éventuellement préfixer la composante h, m et/ou s. L’heure
système est enfin affichée dans la balise d’id heure à l’aide d’une instruction jQuery (voir
Figure 13.15) :
$('#heure').html(h + ' : ' + m + ' : ' + s);
Figure 13.15
L’heure est bien
affichée au
format HH:MM:SS.
Figure 13.16
Les cinq images à
utiliser dans le slider.
Pour faciliter les choses, il est conseillé de créer une image unique contenant les cinq
images mises bout à bout. Vous appellerez cette image slider.jpg (voir Figure 13.17).
Figure 13.17
Les cinq images ont été placées les unes derrière les autres.
Les images slider1.jpg à slider5.jpg ont une taille égale à 600 × 250 pixels.
L’image slider.jpg doit donc avoir une taille égale à 3 000 × 250 pixels. Pour obtenir l’effet
recherché, vous décalerez l’image vers la gauche de 600, 1 200, 1 800 puis 2 400 pixels.
J’en ai bien assez dit. Je vous suggère donc de vous mettre au codage sans plus attendre.
236 Chapitre 13
14
Mise à jour
avec AJAX
Ce chapitre va s’intéresser à une technique de programmation impressionnante : AJAX.
Avec quelques instructions jQuery, vous allez pouvoir mettre à jour une portion d’une
page Web sans toucher au reste de la page. Les applications de cette technique sont
aussi nombreuses qu’exaltantes ! Vous pourrez, par exemple, réaliser un chat, afficher le
nombre de visiteurs connectés à votre site ou encore les cours de la Bourse…
Charger un fichier
Pour mettre à jour un élément sur une page Web en utilisant des données stockées sur
un serveur, le plus simple consiste à utiliser la méthode jQuery load() :
load('URL de l’élément', function() {
//une ou plusieurs instructions exécutées après le chargement des données
});
La fonction de callback est facultative. Si elle est présente, les instructions qui la
composent seront exécutées lorsque le fichier aura été entièrement rapatrié par la
méthode load().
À titre d’exemple, ce document HTML contient deux boutons et un élément div. Le
premier bouton va être utilisé pour afficher un texte dans l’élément div et le deuxième
pour afficher une image dans ce même élément :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Chargement AJAX avec load()</title>
<style>
#zone {
width: 300px;
height: 315px;
border-style: solid;
border-width: 3px;
border-color: black;
}
</style>
</head>
<body>
<script src=http://code.jquery.com/jquery.min.js></script>
<button id="charge-texte">Charger le texte</button>
<button id="charge-image">Charger l’image</button><br/><br/>
<div id="zone"></div>
<script>
$(function() {
$('#charge-texte').on('click', function(){
$('#zone').load('texte.htm');
});
$('#charge-image').on('click', function(){
$('#zone').load('image.htm');
});
});
</script>
</body>
</html>
Dans cet exemple, aucune fonction callback n’étant spécifiée dans les paramètres
de la méthode load(), cette dernière se contente de charger les fichiers HTML
correspondants et de les afficher dans l’élément div.
Voici le code du fichier texte.htm :
<p>
<font size="3"><i>Lorem <b>ipsum</b> dolor sit amet, consectetur adipiscing
➥elit. Sed non risus. Lectus tortor, dignissim sit amet, adipiscing nec,
➥ultricies sed, dolor. Cras elementum ultrices diam. Maecenas ligula massa,
➥varius a, semper congue, euismod non, mi. Proin porttitor, orci nec nonummy
➥molestie, enim est eleifend mi, non fermentum diam nisl sit amet erat. Duis
➥semper.</i></font>
</p>
238 Chapitre 14
Figure 14.1
Seul le contenu du
<div> a été mis
à jour lorsque le
bouton a été cliqué.
$.get()
La méthode load() n’est pas la seule à pouvoir récupérer des données via AJAX. Vous
pouvez également utiliser :
■■ la fonction jQuery $.get() pour obtenir des données envoyées par le serveur en
utilisant une requête HTTP GET ;
■■ la fonction jQuery $.post() pour obtenir des données envoyées par le serveur en
utilisant une requête HTTP POST.
Vous utiliserez la fonction $.get() si les données envoyées au serveur sont de petite
taille. Vous utiliserez la fonction $.post() si les données envoyées au serveur sont de
grande taille et/ou contiennent des informations confidentielles (un mot de passe, par
exemple).
Voici la syntaxe de la fonction $.get() :
$.get(URL, function() {
// Une ou plusieurs instructions exécutées lorsque les données ont été
➥rapatriées
});
À titre d’exemple, nous allons exécuter un fichier PHP afin d’extraire les données qui y
sont stockées. Ces données correspondent aux trois lois de la robotique d’Isaac Asimov.
L’URL passée sera du type suivant :
donnees?l=1 // pour obtenir la première loi
donnees?l=2 // pour obtenir la deuxième loi
donnees?l=3 // pour obtenir la troisième loi
Les premières lignes définissent le tableau $loi et y mémorisent les trois lois de la
robotique.
La valeur passée dans l’URL est récupérée et stockée dans la variable $l :
$l=$_GET["l"];
240 Chapitre 14
$.get('donnees.php?l=1',function(data){
$('#zone').html(data);
});
});
$('#loi2').on('click', function(){
$.get('donnees.php?l=2',function(data){
$('#zone').html(data);
});
});
$('#loi3').on('click', function(){
$.get('donnees.php?l=3',function(data){
$('#zone').html(data);
});
});
});
</script>
</body>
</html>
Le corps du document définit un titre h2, trois boutons et un élément div d’id #zone.
<h2>Les lois de la robotique, selon Isaac Asimov</h2>
<button id="loi1">Loi N° 1</button>
<button id="loi2">Loi N° 2</button>
<button id="loi3">Loi N° 3</button><br/>
<div id="zone"></div>
Lorsque le premier bouton est cliqué, une requête GET est effectuée sur l’URL
http://www.mediaforma.com/eformation/donnees.php?l=1 :
$('#loi1').on('click', function(){
$.get('donnees.php?l=1',function(data){
Lorsque les données ont été rapatriées, la fonction callback s’exécute. Les données
récupérées sont affichées dans l’élément div #zone :
$('#zone').html(data);
Les deux autres boutons ont un comportement similaire, à ceci près qu’ils envoient
(respectivement) les paramètres l=2 et l=3 au programme PHP. Ceci afin d’afficher la
deuxième et la troisième loi de la robotique.
La Figure 14.2 représente le résultat obtenu lorsque l’utilisateur clique sur le premier
bouton.
$.post()
Dans l’exemple précédent, les paramètres passés apparaissaient dans l’URL. Pour garder
les paramètres secrets ou pour passer des données de taille importante, vous utiliserez
une requête POST.
Voici la syntaxe de la fonction $.post() :
$.post(URL, {donnée1: 'valeur1', donnée2: 'valeur2',…}, function() {
// Une ou plusieurs instructions exécutées lorsque les données ont été
➥rapatriées
});
Ici, les données sont passées dans le deuxième paramètre de la fonction $.post().
Nous allons modifier le code du programme précédent pour accéder aux données via
une requête POST.
L’URL interrogée aura pour nom "donneesPost.php". Une seule donnée nommée "l" sera
communiquée. Elle aura pour valeur 1, 2 ou 3 selon la loi à afficher.
Le programme PHP est légèrement différent :
<?php
$loi = array("Un robot ne peut porter atteinte à un être humain, ni, restant
➥passif, permettre qu’un être humain soit exposé au danger.",
"Un robot doit obéir aux ordres que lui donne un être humain, sauf
➥si de tels ordres entrent en conflit avec la Première loi.",
"Un robot doit protéger son existence tant que cette protection
➥n’entre pas en conflit avec la Première ou la Deuxième loi.");
$l=$_POST["l"];
echo "<u>Loi de la robotique N° ".$l."</u><br><br>";
242 Chapitre 14
echo "<b>".$loi[$l-1]."</b>";
?>
Le résultat est bien entendu le même que pour la requête $.get() (voir Figure 14.3).
$.ajax()
La fonction $.ajax() permet d’émettre des requêtes AJAX. Elle admet de très nombreux
paramètres. Pour avoir une description exhaustive de cette fonction, reportez-vous à la
documentation en ligne : http://api.jquery.com/jQuery.ajax/.
Dans cet ouvrage, nous utiliserons l’une des syntaxes de la fonction $.ajax() :
$.ajax(options);
244 Chapitre 14
Requête GET via la fonction $.ajax()
Voici l’équivalent du code get.htm réécrit en utilisant la fonction $.ajax() :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Requête get $.ajax()</title>
<style>
#zone {
width: 300px;
height: 315px;
border-style: solid;
border-width: 3px;
border-color: black;
}
</style>
</head>
<body>
<script src=http://code.jquery.com/jquery.min.js></script>
<h2>Les lois de la robotique, selon Isaac Asimov</h2>
<button id="loi1">Loi N° 1</button>
<button id="loi2">Loi N° 2</button>
<button id="loi3">Loi N° 3</button><br><br>
<div id="zone"></div>
<script>
$(function() {
$('#loi1').on('click', function(){
$.ajax({
type: 'GET',
url: 'donnees.php?l=1',
timeout: 3000,
success: function(data){
$('#zone').html(data);
},
error: function(){
$('#zone').html('Cette requête AJAX n\'a pas abouti');
}
});
});
$('#loi2').on('click', function(){
$.ajax({
type: 'GET',
url: 'donnees.php?l=2',
timeout: 3000,
success: function(data){
$('#zone').html(data);
},
error: function(){
$('#zone').html('Cette requête AJAX n\'a pas abouti');
Le code est bien plus "verbeux" qu’avec la fonction $.get(), mais il est aussi très simple
à comprendre, facile à maintenir et plus complet. Ici, nous avons introduit un message
d’erreur si la requête n’aboutit pas :
error: function(){
$('#zone').html('Cette requête AJAX n\'a pas abouti');
}
Figure 14.4
Le troisième bouton
a été cliqué.
246 Chapitre 14
Requête POST via la fonction $.ajax()
Voici l’équivalent du code post.htm (voir la section intitulée "$.post()") réécrit en
utilisant la fonction $.ajax() :
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Requête post $.ajax()</title>
<style>
#zone {
width: 300px;
height: 315px;
border-style: solid;
border-width: 3px;
border-color: black;
}
</style>
</head>
<body>
<script src=http://code.jquery.com/jquery.min.js></script>
<h2>Les lois de la robotique, selon Isaac Asimov</h2>
<button id="loi1">Loi N° 1</button>
<button id="loi2">Loi N° 2</button>
<button id="loi3">Loi N° 3</button><br><br>
<div id="zone"></div>
<script>
$(function() {
$('#loi1').on('click', function(){
$.ajax({
type: 'POST',
url: 'donneesPost.php',
data: {l:'1'},
timeout: 3000,
success: function(data){
$('#zone').html(data);
},
error: function(){
$('#zone').html('Cette requête AJAX n\'a pas abouti');
}
});
});
$('#loi2').on('click', function(){
$.ajax({
type: 'POST',
url: 'donneesPost.php',
data: {l:'2'},
timeout: 3000,
success: function(data){
$('#zone').html(data);
248 Chapitre 14
Exercice 16
Retrouvez les fichiers d'exercices et leurs corrigés sur le
site compagnon http://moneformation.pearson.fr
En utilisant une requête AJAX, affichez le cours du CAC 40 dans la page principale du
site index.htm. Le but recherché est représenté à la Figure 14.5.
Figure 14.5
Le cours du CAC 40 est affiché dans la balise <article>.
Pour arriver à ce résultat, vous ferez appel au programme litCac40.php dont voici le code :
<?php
$path = "http://download.finance.yahoo.com/d/quotes.csv?s=%5EFCHI&f=l1";
$yahooquote = fopen($path, "r");
$line = fgets($yahooquote); // Récupération du CAC 40
echo "<br /><br />Le CAC 40 vaut ".$line. "points."; // Affichage
fclose($yahooquote);
?>
Choisir un hébergeur
Pour que votre site soit accessible sur le Web, vous devez choisir un hébergeur
de sites. De très nombreux hébergeurs sont présents, tant en France qu’à
l’étranger. Pour vous aider dans votre choix, vous pouvez consulter des annuaires
d’hébergement, comme www.hebergementweb.org, www.guide-hebergeur.fr ou
www.10meilleurshebergementsweb.fr. Ces annuaires sont à prendre "avec précaution",
mais ils vous aideront à débroussailler le terrain…
Pour commencer, vous devrez choisir le type de l’hébergement : dédié ou mutualisé. Dans
un hébergement dédié, un serveur Web est entièrement alloué à votre site. En revanche,
dans un hébergement mutualisé, votre site partage un serveur avec d’autres sites. Dans
la plupart des cas, un hébergement mutualisé est largement suffisant. Si la réactivité de
ce type d’hébergement peut être inférieure à celle d’un serveur dédié (vous partagez en
effet la bande passante, le processeur, la mémoire et les accès disque avec les autres
sites), le prix de l’hébergement peut être divisé par dix ou plus ! Personnellement, j’utilise
un hébergement mutualisé pour tous mes sites. Certains hébergent des vidéos, d’autres
uniquement du texte et des images. Certains totalisent 100 à 200 visiteurs uniques par
jour, d’autres 1 000 à 1 500. Pour l’instant, aucun utilisateur ne s’est plaint de la lenteur de
mes sites. Je vous conseille donc d’opter pour un hébergement mutualisé. Vous pourrez
toujours faire évoluer votre compte vers un hébergement dédié si le besoin s’en fait
sentir.
Le serveur Web peut fonctionner sous Linux ou sous Windows. Pour choisir le système le
mieux adapté à vos besoins, posez-vous les questions suivantes :
1. Avez-vous l’intention de programmer en PHP ou en Perl et/ou d’associer votre site à
une base de données MySQL ?
2. Allez-vous utiliser des outils de développement Microsoft, tels que Visual Studio, pour
développer des sites ASP ?
Dans le premier cas, Linux est le choix qui s’impose. Dans le second, une seule solution,
vous devez opter pour un serveur ASP. Enfin, si vous n’avez aucune réponse à ces
questions et/ou si vous ne comprenez pas leur signification, décidez-vous pour un serveur
Linux. Il offrira autant de fonctionnalités que son confrère Windows à un coût inférieur.
Figure 15.1
Les domaines
monsiteamoi.eu
et monsiteamoi.
net sont
disponibles. Mais
pas les domaines
monsiteamoi.fr ni
monsiteamoi.com.
Lorsque vous avez trouvé un nom de domaine approprié et disponible, cliquez sur
Commander (ou sur un autre lien/bouton équivalent) puis suivez la procédure de
réservation de nom de domaine. Quelques instants après avoir créé votre nom de domaine
et réservé un espace chez un hébergeur, vous recevez un e-mail qui vous informe que
votre espace sera actif dans un délai d’environ 24 à 48 heures (voir Figure 15.2).
252 Chapitre 15
Figure 15.2
Le nom de domaine
sera créé sous peu.
Vous devrez donc vous armer de patience et attendre jusqu’à l’activation de votre espace.
Cet e-mail contient également :
1. Les informations permettant d’accéder à votre espace client : votre nom d’utilisateur
et votre mot de passe.
2. Les informations permettant d’accéder à la messagerie associée à votre nom de
domaine.
3. Les codes nécessaires pour vous connecter à votre espace en FTP : le nom du serveur
FTP, le login et le mot de passe.
Ces informations seront nécessaires pour transférer vos fichiers dans votre espace.
Vous allez maintenant uploader vos fichiers HTML, CSS et JS sur votre espace Web.
Lancez FileZilla. Lancez la commande Gestionnaire de sites dans le menu Fichier ou
appuyez sur Ctrl + S. Une boîte de dialogue intitulée Gestionnaire de sites s’affiche.
Cliquez sur Nouveau site. Entrez le nom de votre site et appuyez sur Entrée. Ce nom n’a
aucune importance en soi : il sert simplement à identifier votre espace Web.
Reportez-vous à l’e-mail qui vous a été envoyé par votre hébergeur. Vous y trouverez les
informations permettant d’accéder à votre espace FTP (voir Figure 15.4).
Figure 15.4
Toutes les informations
nécessaires sont
contenues dans l’e-mail de
l’hébergeur.
254 Chapitre 15
Plusieurs informations sont nécessaires pour établir une connexion FTP avec votre
espace Web :
■■ Entrez le nom du serveur FTP dans la zone de texte Hôte.
■■ Choisissez Normale dans la liste déroulante Type d’authentification.
■■ Entrez votre Login FTP dans la zone de texte Identifiant et votre mot de passe FTP
dans la zone de texte Mot de passe (voir Figure 15.5).
Figure 15.5
L’accès au serveur
FTP est maintenant
paramétré.
Ces informations entrées, cliquez sur OK pour fermer la boîte de dialogue en enregistrant
la nouvelle connexion.
Lancez la commande Gestionnaire de sites dans le menu Fichier ou appuyez sur Ctrl + S,
puis double-cliquez sur la connexion que vous venez de créer dans la zone de liste
Sélectionnez une entrée.
Votre espace Web apparaît dans le volet droit de la fenêtre de FileZilla et les mémoires
de masse de l’ordinateur dans le volet gauche. Sélectionnez un à un les fichiers à placer
sur le serveur FTP dans le volet gauche et déposez-les dans le volet droit en utilisant la
technique du glisser-déposer de Windows (voir Figure 15.6).
Supposons que votre nom de domaine soit www.monsiteamoi.eu. Si vous uploadez le fichier
album-photo.htm à la racine du site, il sera accessible à l’adresse www.monsiteamoi.eu/
album-photo.htm.
Cette fois-ci, cet ouvrage est bel et bien terminé. J’espère que vous y avez appris
beaucoup de choses, et je vous souhaite beaucoup de succès avec vos sites Web.
256 Chapitre 15
Index
Symboles A
: a 27, 54
empty 154 a:visited 54
first-child 31 abort 192
first-letter 32 absolute 164, 169
first-line 32 afterprint 185
focus 32, 184 AJAX 237, 249
invalid 132 charger un fichier 237
lang 32 Album photos 85
link 31 Alias 37
valid 132 alt 75
visited 31 animate() 232
# 32 Animations 211
$() 4, 37 en jQuery 226
$.ajax() 244, 245, 247 personnalisées 232
$.get() 239 Apparition 228
$.post() 242 Arrière-plan d'un conteneur 77
<figcaption> 78 Arrondis 89
<figure> 78 article 163
@font-face 50 ASCII 29
-khtml 5 aside 163
<link> 14 attr() 40
@media 177 Attributs des caractères 49
-moz 5 audio 201
-ms 5 jQuery 203
22 autofocus 124
-o 5
<span> 191 B
-webkit 5
b 24
background:url 150
Index 257
background-color 59, 150 modification progressive 224
background-image 47 Créer un nom de domaine 252
background-position 47 css() 39
background-repeat 47 CSS 2, 29
Balises 3 dans les balises 13
beforeonload 185 feuille de styles externe 14
beforeprint 185 feuille de styles interne 13
Bibliothèque jQuery 7, 16 vs HTML 15
block 43, 159, 160 CSS3 12
blur 185, 190 préfixe 5
body 21 cursive 47
BOM 9
border 75 D
border-collapse 145
datalist 117
border-radius 93
Date 234
border-spacing 146
dblclick 188
box-shadow 89
dd 44
br 22
Déclaration de type de document 4
Byte Order Mark 9
delay() 233
C Détecter l'inclinaison d'un appareil 197
DeviceOrientationEvent 196
CAC 40 249 dfn 44
callback 228 Différer une animation 233
canplay 192 Disparition 228
canplaythrough 192 display 79
Centrer une image dans un conteneur 79 DOCTYPE 4
change 190 Document Object Model 4
Changements d'échelle 216 Documents, organisation 160
Charset 9 DOM 4
checked 34 drag 188
Choisir un hébergeur 251 dragend 188
Chrome 7 dragenter 188
class 30, 75 dragleave 188
Classe 30 dragover 188
Clavier, événements 187 dragstart 188
click 188 drop 188
Code dt 44
multifichier 19 DTD 4
tout en un 19 durationchange 192
Code ASCII 29
color 59 E
color-stop 70
edits 160
colspan 147
Éléments 3
Compatibilité 4
arrondir 93
contains 34
audio 201
contextmenu 190
em 24
Corps du document 21
embedded content 160
Couleur
emptied 192
d'arrière-plan 59
empty 34
des éléments 59
enabled 34
du texte 59
258 Index
enctype 121 font-style 49
ended 192 font-variant 50
error 186, 192 font-weight 49
Événements footer 163
clavier 187 formchange 191
formulaires 190 forminput 191
médias 192 forms 160
orientation 196 Formulaires 113
souris 188 de login 118
Exercices d'envoi de fichier 121
1 42 de saisie de commentaires 120
2 57 éléments 116
3 72 envoi par e-mail 114
4 88 événements 190
5 97 FTP 253
6 111
7 137 G
8 138
Gestion événementielle 183
9 157
en CSS 184
10 181
en HTML 183
11 181
en jQuery 185
12 181
getHours() 234
13 199
getMinutes() 234
14 209
getSeconds() 234
15 236
Google Chrome 7
16 249
gradient 62, 65, 67
Expression régulière 129
Gradient
F diagonal 65
horizontal 64
fadeIn() 231 linaire multiple 65
fadeOut() 231 linéaire 62
fantasy 47 radial 67
Fenêtre à deux couleurs 67
événements 185 multiple 70
Feuille de styles 4 restreint 69
externe 12, 14 vertical 63
interne 12, 13 grouping content 160
fFormulaire
définir 113 H
fieldset 116
h1 23
FileZilla 253
h6 23
Firefox 6
haschange 186
first-of-type 33
header 163
fixed 164, 165
Hébergeur 251
float 72, 170
height 75
focus 186, 191
hide() 228
Focus 124
Horloge 235
Fondu enchaîné 231
html() 38
font-family 47
HTML 2
font-size 48
commentaires 11
Font Squirrel 52
Index 259
validation 11 L
html5test 4
label 116
I Langue
de traitement 10
i 24 du document 9
id 28, 75 primaire 10
Images 75 last-child 33
alt 75 last-of-type 34
border 75 legend 116
class 75 Légendes 78
empiler 82 li 25
height 75 Liens
id 75 e-mail 29
insérer 75 hypertexte 27, 54
légender 78 vers un fichier 29
liens hypermédia 78 linear-gradient 62, 65
préchargement 83 Link 13
réactives 84 Listes
survol 81 à puces 25
title 75 HTML 44
width 76 numérotées 25
img 75 personnaliser 45
img:hover 81 list-style-image 45
Inclinaison 197, 219 list-style-type 34, 45
inline 43, 159, 160 load 186
inline-block 159, 160 load() 237
input 191 loadeddata 192
input:required 129 loadedmetadata 193
input type= 116, 117 loadstart 193
Insérer une image 75 localStorage 134
interactive elements 160
Internet Explorer 9 5 M
invalid 191
ISO-8859-1 9 Marges 175
margin 175
J mark 25
Matrices 220
jQuery 3, 7, 37 matrix 222
chaînage 41 Media Queries 177
enchaîner plusieurs disparitions/ Médias, événements 192, 196
apparitions 229 menu 99
sélecteur CSS 37 Menus 99
sélecteurs spécifiques 38 déroulant 103
horizontal 109
K vertical 106
keydown 187 horizontal 100
keypress 187 vertical flottant 99
keyup 187 message 186
Konqueror 5 Meta 9, 10
metadata 160
Midori 5
260 Index
Mise en forme 15 ondragstart 188
Mise en ligne d'un site 251 ondrop 188
Mise en page 159 ondurationchange 192
sur plusieurs colonnes 172 onemptied 192
monospace 47 onended 192
mousedown 188 onerror 186, 192
mousemove 189 onfocus 186, 191
mouseout 189 onformchange 191
mouseout() 82 onforminput 191
mouseover 189 onhaschange 186
mouseover() 82 oninput 191
mouseup 189 oninvalid 191
mousewheel 189 onkeydown 187
Mozilla 5 onkeypress 187
MP4 205 onkeyup 187
Multicolonnage 172 online 186
multipart/form-data 121 onload 186
onloadeddata 192
N onloadedmetadata 193
onloadstart 193
nav 163
only-child 34
Nom de domaine 252
only-of-type 34
not 34
onmessage 186
Notepad++ 6, 7
onmousedown 188
nth-child 33
onmousemove 189
nth-last-child 33
onmouseout 189
nth-last-of-type 33
onmouseover 189
nth-of-type 33
onmouseup 189
onmousewheel 189
O
onoffline 186
offline 186 ononline 186
Ogg Theora 205 onpagehide 186
ol 26 onpageshow 186
Ombrages 89 onpause 193
Omni Web 5 onplay 193
onabort 192 onpopstate 186
onafterprint 185 onprogress 193
onbeforeonload 185 onratechange 193
onbeforeprint 185 onreadystatechange 193
onblur 185, 190 onredo 186
oncanplay 192 onresize 186
oncanplaythrough 192 onscroll 189
onchange 190 onseeked 193
onclick 188 onseeking 193
oncontextmenu 190 onselect 191
ondblclick 188 onstalled 193
ondrag 188 onstorage 186
ondragend 188 onsubmit 191
ondragenter 188 onsuspend 193
ondragleave 188 ontimeupdate 193
ondragover 188 onundo 186
Index 261
onunload 186 Rendu 160
onvolumechange 193 required 127
onwaiting 193 resize 186
opacity 225 Responsive Web Design 177
Opera 5 RGB 59
option 117 RGB() 60
output 117 RGBA 59
RGBA() 61
P root 33, 160
Rotations 214
p 23
rowspan 147
padding 94, 175
padding-left 47 S
pagehide 186
pageshow 186 Safari 5
Pages Web, optimiser 179 sans-serif 47
Paragraphes 23 scale 216
pause 193 scaleX 218
play 193 scaleY 218
Polices 47 scripting 160
libres de droits 52 scroll 189
popstate 186 sections 160
position 164 seeked 193
Positionnement seeking 193
absolute 169 select 117, 191
fixed 165 Sélecteurs
relative 167 CSS 30, 32
static 165 de classe 30
Préfixes 5 évolués 33
CSS3 5 hiérarchiques 33
progress 193 selection 34
Propriétés, modification progressive 224 serif 47
Pseudo-classes 31 setInterval() 234
first-child 31 show() 228
focus 32 Site Web 1
hover 32 skew 219
lang 32 small 25
link 31 Sondage 123
visited 31 Souris, événements 188
Pseudo-éléments Squelette standard 7, 10
first-letter 32 stalled 193
first-line 32 static 164, 165
Stockage local de données 113, 134
R storage 186
strong 24
radial-gradient 67
Styles, feuille de styles interne 13
ratechange 193
submit 191
readystatechange 193
suspend 193
Recommandation candidate 5
redo 186 T
Référencement 10
relative 164, 167 table 141
262 Index
Tableaux 141 matrice 220
ajouter une légende 149 transition 223
alignement dans les cellules 152 Transitions 211, 223
arrière-plan des cellules 150 Translations 211
arrondis et ombrages 155 Transparence
bordures 144 et opacité 61
fusionnées 145 modification progressive 225
séparées 145
cellules vides 154 U
définir 141, 142
u 25
espacer les cellules 146
ul 25
fusionner des cellules 147
undo 186
lignes paires et impaires 153
unload 186
tabular data 160
UTF-8 9
Tags 3
Taille des caractères 48
V
target 34
text-align 152 Validation
textarea 117 d'adresses URL 128
text-decoration 49, 55 de données 127
Texte, ombrage 92 d'e-mails 128
text-indent 50 du code 11
text-level semantics 160 par une expression régulière 129
text-shadow 92 validator.nu 11
text-transform 49 vertical-align 79, 152
Timer 234 video 193, 205
timeupdate 193 jQuery 207
title 75 volumechange 193
Title 10
Titre du document 10 W
Titres et sous-titres 23
tr:nth-child() 153 waiting 193
Transférer les fichiers en FTP 253 Webkit 5
transform 211, 216, 219, 222 WebM 205
Transformations 211 width 76
animer 225
échelle 216
Z
inclinaison 219 z-index 82
Index 263