Pour ajouter une fenêtre d'informations, il faut :
- ajouter un bouton d'ouverture
- prévoir une fenêtre (lightbox) , masquée par défaut.
- éventuellement, prévoir un voile sombre (darkbox), masqué par défaut : il permet de focaliser l'attention sur la lightbox, et évite que l'utilisateur n'intergisse par mégarde avec les autres fonctions de l'applications.
- Dans la fenêtre (lightbox) ne pas oublier le bouton de fermeture.
Dans le fichier HTML
Le HTML est la partie structurelle de l'application. Elle se trouve généralement dans index.html.
On place le bouton d'ouverture
<button id="bouton-aide" onclick="ouvre(divAide)"></button>
Soit à l'intérieur d'une "div" existante (contenant déjà d'autres boutons, par exemple), soit juste avant la balise fermant le "body" en fin de document, si l'on préfère un placement indépendant (absolu).
On place éventuellement la darkbox
<div id="darkbox" class="hide"></div>
On lui donne la classe "hide" (on déclarera plus loin que hide = masqué).
On place la lightbox
On lui affecte également une classe "hide" comme la darkbox.
L'exmple ci-dessous est structuré pour présenter :
- un titre
- un bouton de fermeture
- le contenu de la lighbox Ce contenu est lui-même structuré en sous-titres (h2). Les éléments de liste sont entre balises "li"
<div id="aide" class="lightbox hide">
<button class="bouton-fermer" onclick="ferme(divAide)"></button>
<h1>Aide</h1> <!-- Le titre -->
<div class="contenu-lightbox"> <!-- Le contenu -->
<p>Ceci est un paragraphe.</p>
<p>Ceci est un paragraphecontenant <a target="_blank" href="https://forge.aeif.fr/">un lien</a>, observez comment il est structuré.</p>
<h2>Ceci est un sous-titre</h2>
<ul> <!-- Début d'une zone de liste-->
<li>Élément de liste</li>
<li>Élément de liste</li>
<li>Élément de liste</li>
</ul> <!-- Fin d'une zone de liste-->
<h2>Encoure un un sous-titre</h2>
<p>Ceci est un paragraphe.</p>
<p>Ceci est un paragraphe.</p>
<p>Ceci est un paragraphe <strong>avec des mots en gras</trong>.</p>
</div>
Dans le javascript
Le javascript est la partie algorithmique de l'application, elle se trouve dans un fichier à l'extension js (souvent script.js ou main.js). Son but est d'effectuer des modifications dynamiques du HTML.
On va ajouter quelques lignes au début du fichier :
// À mettre en début de script
const darkbox = document.getElementById('darkbox');
const divAide = document.getElementById('aide');
// À mettre où on veut
function ouvre(div){
div.classList.remove('hide');
darkbox.classList.remove('hide');
}
function ferme(div){
div.classList.add('hide');
darkbox.classList.add('hide');
}
Ces fonctions sont appelées par les boutons qu'on a placés dans le HTML, via l'attribut "onclick". Elles affectent ou désaffectent la classe "hide" aux éléments qu'on veut afficher ou masquer.
Le CSS
C'est la partie "décoration". On va ajouter des règles, soit pour un objet en particulier #objetparticulier soit pour une classe d'objets : .classedobjets. L'exemple ci-desous produit :
- une darkbox noire à 50% d'opacité
- une lighbox de largeur et hauteur 50%, centrée verticalement et horizontalement
- le bouton d'ouverture positionné en absolu dans le coin en bas à droite Vous pouvez adapter les règles d'affichage selon vos besoins.
À penser !
- Cet exemple appelle images/question.svg et images/bouton_fermer.svg . Pour que cela fonctionne il faut donc avoir un sous-dossier nommé images avec deux images ainsi nommées à l'intérieur.
- Vérifiez dans la feuille de style qu'il n'y a pas déjà des sélecteurs utilisant ces noms (comme #bouton-aide, #darkbox etc. , les sélecteurs précèdent toujours une accolade ouvrante).
- Pour adapter le style vous pouvez modifier, ajoute ou supprimer des propriétés. Gardez bien toujours le ; en fin de ligne.
#bouton-aide {
position: fixed; /* permet que la position ne soit pas affectée par le scroll de la page */
z-index: 100; /* Pour être à peu près sûr de passer au premier plan */
/* Les dimensions; la position, l'apparrence ... */
bottom: 20px;
right: 20px;
width: 80px;
height: 80px;
background-image: url(images/question.svg);
background-position: center;
background-repeat: no-repeat;
background-size: 90%;
border-radius: 10px;
}
#darkbox {
/* Elle doit prendre toute la largeur et toute la hauteyr */
position: fixed;
z-index: 999; /* O la place sous la lightbox */
width: 100%;
height: 100%;
top: 0px;
left: 0px;
background-color: rgba(0,0,0,0.5);
}
.lightbox {
position: fixed;
z-index: 1000; /* O la place sur la lightbox */
display: flex;
flex-direction: column;
width: 60%;
height: 60%;
top: 50%;
left: 50%;
padding: 10px; /* Marge intérieure */
border-radius: 20px; /* Coins arrondis */
box-shadow: 0px 0px 15px #ffffff; /* Ombre transparente blanche */
border: 2px solid #000000; /* Bordure de 2px noire */
transform: translateX(-50%) translateY(-50%); /* Pour centrer dans la page */
background-color: #ffffff; /* Couleur de fond */
}
.lightbox h1 { /* Le titre */
font-family: Arial, Helvetica, sans-serif;
font-size: 36px;
min-height: 36px;
margin: 10px;
}
.contenu-lightbox {
flex: 1;
font-size: 16px;
font-family: Arial, Helvetica, sans-serif;
overflow-y: auto;
text-align: left;
width: fit-content;
margin: auto;
}
.bouton-fermer {
position : fixed;
top: 10px;
right: 10px;
width: 30px;
height: 30px;
background-image: url(images/bouton_fermer.svg);
background-size: contain;
background-color: transparent;
border: none;
outline: none;
}
.hide {
display: none !important; /* Les objets de classe hide sont masqués */
}