Vue lecture

Il y a de nouveaux articles disponibles, cliquez pour rafraîchir la page.
✇Alsacreations.com - Actualités

Les citations en HTML avec blockquote, cite et q

Il existe plusieurs éléments HTML pour structurer la sémantique de citations dans un document web :

  • blockquote - depuis HTML 3.2
  • cite - depuis HTML 3.2
  • q - depuis HTML 4

Chacun possède bien entendu un rôle différent et parfois des attributs spécifiques.

cite

Débutons par l'élément cite qui va contenir le titre d'une œuvre à laquelle une citation est faite. Il peut d'ailleurs être utilisé à l'intérieur d'un élément blockquote (ci-après) pour donner une référence à la source de la citation sous la forme du nom de l'oeuvre d'où elle provient.

Les oeuvres possibles sont nombreuses, il peut s'agir d'un livre, un film, une oeuvre d'art (peinture, sculpture, opéra, pièce de théâtre, poème, exposition...), un jeu, une chanson, un autre site web, le titre d'un article/blog, etc.

<cite>Le Rouge et le Noir</cite> - Stendhal
<cite>La Bohème</cite> - Giacomo Puccini
<cite>Papillon de lumière</cite> - Cindy Sander
<cite>Zelda Tears of the Kingdom</cite>

blockquote

L'élément blockquote (littéralement traduisible par "bloc de citation") structure une section de contenu qui est citée d'un autre document ou d'une autre source. Son contenu est souvent affiché avec des marges plus larges pour le différencier du contenu environnant. C'est d'ailleurs un élément de type bloc, qui occupe toute la largeur par défaut et provoque des retours à la ligne dans le flux naturel du document. On peut également - mais ce n'est pas obligatoire - utiliser des paragraphes <p> dans le bloc.

<blockquote>
  <p>Mais qu'est-ce que je vais devenir ? Je suis ministre, je ne sais rien faire !</p>
</blockquote>

L'élément blockquote peut posséder un attribut cite (à ne pas confondre avec l'élément du même nom) comprenant une URL vers la source originale de la citation.

<blockquote cite="https://fr.wikiquote.org/wiki/La_Folie_des_grandeurs">
  <p>Mais qu'est-ce que je vais devenir ? Je suis ministre, je ne sais rien faire !</p>
</blockquote>

À faire / à ne pas faire ?

Nombreux sont les sites qui n'exploitent pas la sémantique à son plein potentiel, souvent parce que l'outil de contribution (CMS) ne le suggère pas assez ou ne le permet pas.

Par exemple Radio France : Margaret Hamilton, la femme qui a fait atterrir l’Homme sur la Lune utilise une liste avec une seule puce pour structurer une citation :

<ul><li><em>"Ce qu’ils avaient l’habitude [...] J’étais la première à le faire marcher."</em></li></ul>

En voici la capture d'écran :

Capture d'écran du site Radio France contenant une citation

⚠️ D'un point de vue sémantique et pour l'accessibilité, ce n'est évidemment pas reconnu comme un paragraphe de citation mais comme un élément de liste (listitem). L'usage de em ne suffit pas, même si visuellement cela peut faire illusion.

Autre exemple, Wikipédia utilise mieux l'élément <blockquote> qui par ailleurs se distingue bien visuellement du reste grâce aux styles associés (police différente, bordure, marges).

Voici la capture d'écran issue de la page Margaret Hamilton :

Capture d'écran de Wikipédia comportant une citation

Pour la mention de l'autrice et de l'oeuvre, on retrouve un balisage à l'aide de <cite>, décrit ci-après (code simplifié pour la lisibilité) :

<p>
  —&nbsp;Margaret Hamilton,
  <cite>
    Lettre à <i>Datamation</i>,
    <abbr title="Premier">1<sup>er</sup></abbr> mars 1971
    <sup><a href="#cite_note-13">[13]</a></sup>
  </cite>
</p>

Du côté de la NASA (agence spatiale des États-Unis), une structure similaire est adoptée mais en choisissant cette fois de placer <cite> dans une balise <footer> du bloc de citation... ce qui n'est pas interdit en soi.

<blockquote>
  <div>
    We had to find a way and we did. Looking back, we were the luckiest people in the world; there was no choice but to be pioneers.
  </div>
  <footer>
    <cite>- Margaret Hamilton</cite>
  </footer>
</blockquote>

⚠️ Par contre <cite> contient le nom d'une personne (Margaret Hamilton), ce qui n'est pas attendu par la spécification HTML qui précise bien que...

Le nom d'une personne n'est pas le titre d'une œuvre — même si les gens appellent cette personne une œuvre — et l'élément ne doit donc pas être utilisé pour baliser les noms des personnes.

👆 Oui la citation que vous venez de lire est bien dans <blockquote> sur cette page et utilise un attribut cite vers la page de la spécification.

Voici la capture d'écran du site de la NASA :

Capture d'écran d'une citation sur le site de la NASA

Si l'on retrouve notre premier exemple, cette fois <cite> peut être utilisé à bon escient pour baliser le nom de l'oeuvre (un film).

<blockquote cite="https://fr.wikiquote.org/wiki/La_Folie_des_grandeurs">
  <p>Mais qu'est-ce que je vais devenir ? Je suis ministre, je ne sais rien faire !</p>
  <p>Louis de Funès - <cite>La Folie des grandeurs</cite> (1971), écrit par Gérard Oury</p>
</blockquote>

Si l'on veut aller plus loin dans la structuration du contenu, il faudra jeter un oeil du côté des microdonnées avec Schema.org qui propose un type Quotation utilisable avec JSON-LD, Microdata et RDFa.

q

L'élément q représente une petite citation en ligne (son nom vient de la première lettre du mot quote qui signifie - encore une fois - citation en anglais), relativement courte qui ne nécessite pas de sauts de ligne. Le contenu de l'élément q est généralement affiché entre des guillemets courts. Si vous avez besoin de structurer une citation plus longue, reportez-vous sur blockquote.

<p>Ce freluquet m'a répliqué <q>Il m'en a assez dit. Il m'a dit que vous l'aviez tué.</q></p>
<p>Et là, je lui ai répondu <q>Je suis ton père</q>.</p>

L'élément q peut posséder un attribut cite (à ne pas confondre avec l'élément du même nom) qui contiendra alors une URL vers la source originale de la citation.

<p>Maître Eolas a publié sur son blog
  <q cite="https://www.maitre-eolas.fr/post/2023/02/04/Les-raisons-de-la-col%C3%A8re">
  Rien de tel dans ces cas que de coucher sur le papier, fut-il fait de pixels, l'explication de son ire,
  et la soumettre aux débats qui font de la section commentaires le meilleur de ce blog.
  C'est toujours ça qu'Elon Musk n'aura pas.</q>
</p>

À faire / à ne pas faire ?

Retrouvons la page du site Radio France où pour une citation en ligne, dans un paragraphe de texte plus général, on aurait pu utiliser <q> à cet effet, mais où l'on retrouve finalement une emphase <em>.

<p>[...] Le Dr Paul Corto, qui l'a nommée pour la récompense se déclare "<em>surpris de découvrir qu'elle n'avait jamais été officiellement reconnue pour ses travaux pionniers. Ses concepts de logiciel asynchrone, de programmation des priorités, de tests de bout en bout et de capacité de décision humaine, comme l’affichage des priorités, ont posé les bases de la conception de logiciels ultra-fiables</em>". Non seulement Margaret Hamilton [...]</p>

En voici la capture d'écran :

Capture d'écran d'une citation en ligne sur le site RadioFrance

TL;DR ?

On résume : cite pour les noms d'oeuvres, blockquote pour les blocs de citations (plus ou moins longs) et q pour les citations courtes en-ligne dans un paragraphe de texte.

Publié par Alsacreations.com

✇Alsacreations.com - Actualités

Sécuriser les iframes avec l'attribut sandbox

L'attribut sandbox de l'élément iframe en HTML est utilisé pour restreindre les actions qui peuvent être effectuées dans l'iframe. Son rôle est d'améliorer la sécurité et la stabilité de la page web, surtout lorsque l'iframe est fournie par un service tiers que l'on ne contrôle pas, et qui pourrait être abandonné, détourné, voire hacké à l'avenir. Limiter les fonctionnalités à risque d'un iframe provenant d'un domaine tiers aide à prévenir les attaques de type clickjacking ou cross-site scripting (XSS).

Dans le document ou l'application web, on ajoute une balise <iframe> à l'endroit où l'on souhaite inclure le contenu d'un autre site. Par exemple :

<iframe src="https://www.example.org/contenu.html"></iframe>
  • L'absence de l'attribut sandbox, signifie par défaut que tout est permis : attention dino danger.
  • La présence de sandbox ou sandbox="" (sans valeur) signifie que toutes les restrictions sont appliquées par défaut : sécurité maximum.
  • L'énumération d'une ou plusieurs valeurs préfixées par allow va lever les restrictions une par une.

Par exemple, pour autoriser l'exécution de JavaScript, l'ouverture de pop-up et l'accès aux éléments de la page parente, on va utiliser la syntaxe suivante :

<iframe src="https://www.example.org/contenu.html" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>

Voici d'autres autorisations possibles :

  • allow-same-origin : permet au contenu de l'iframe d'être traité comme provenant de la même origine.
  • allow-downloads : autorise les téléchargements.
  • allow-scripts : autorise l'exécution de JavaScript dans l'iframe.
  • allow-popups : autorise l'ouverture de pop-up à partir de l'iframe.
  • allow-forms : autorise l'utilisation de formulaires dans l'iframe.
  • allow-top-navigation : autorise le contenu de l'iframe à charger une nouvelle page dans la fenêtre du navigateur.
  • allow-pointer-lock : autorise l'utilisation de la fonctionnalité de verrouillage du curseur/pointeur.
  • allow-orientation-lock : autorise le blocage de l'orientation de l'écran (sur smartphone/tablette notamment).
  • allow-presentation : autorise le lancement d'une session de présentation.

Cet attribut est épaulé par une directive CSP (Content-Security-Policy) qui définit ces valeurs au niveau des en-têtes HTTP renvoyées par le serveur, par exemple Content-Security-Policy: sandbox; ou Content-Security-Policy: sandbox allow-downloads;

Publié par Alsacreations.com

✇Alsacreations.com - Actualités

Sécuriser les iframes avec l'attribut sandbox

L'attribut sandbox de l'élément iframe en HTML est utilisé pour restreindre les actions qui peuvent être effectuées dans l'iframe. Son rôle est d'améliorer la sécurité et la stabilité de la page web, surtout lorsque l'iframe est fournie par un service tiers que l'on ne contrôle pas, et qui pourrait être abandonné, détourné, voire hacké à l'avenir. Limiter les fonctionnalités à risque d'un iframe provenant d'un domaine tiers aide à prévenir les attaques de type clickjacking ou cross-site scripting (XSS).

Dans le document ou l'application web, on ajoute une balise <iframe> à l'endroit où l'on souhaite inclure le contenu d'un autre site. Par exemple :

<iframe src="https://www.example.org/contenu.html"></iframe>
  • L'absence de l'attribut sandbox, signifie par défaut que tout est permis : attention dino danger.
  • La présence de sandbox ou sandbox="" (sans valeur) signifie que toutes les restrictions sont appliquées par défaut : sécurité maximum.
  • L'énumération d'une ou plusieurs valeurs préfixées par allow va lever les restrictions une par une.

Par exemple, pour autoriser l'exécution de JavaScript, l'ouverture de pop-up et l'accès aux éléments de la page parente, on va utiliser la syntaxe suivante :

<iframe src="https://www.example.org/contenu.html" sandbox="allow-same-origin allow-scripts allow-popups allow-forms"></iframe>

Voici d'autres autorisations possibles :

  • allow-same-origin : permet au contenu de l'iframe d'être traité comme provenant de la même origine.
  • allow-downloads : autorise les téléchargements.
  • allow-scripts : autorise l'exécution de JavaScript dans l'iframe.
  • allow-popups : autorise l'ouverture de pop-up à partir de l'iframe.
  • allow-forms : autorise l'utilisation de formulaires dans l'iframe.
  • allow-top-navigation : autorise le contenu de l'iframe à charger une nouvelle page dans la fenêtre du navigateur.
  • allow-pointer-lock : autorise l'utilisation de la fonctionnalité de verrouillage du curseur/pointeur.
  • allow-orientation-lock : autorise le blocage de l'orientation de l'écran (sur smartphone/tablette notamment).
  • allow-presentation : autorise le lancement d'une session de présentation.

Cet attribut est épaulé par une directive CSP (Content-Security-Policy) qui définit ces valeurs au niveau des en-têtes HTTP renvoyées par le serveur, par exemple Content-Security-Policy: sandbox; ou Content-Security-Policy: sandbox allow-downloads;

Publié par Alsacreations.com

✇Alsacreations.com - Actualités

Les aides au préchargement de ressources

Chaque navigateur web dispose d'un "parseur HTML" (un interpréteur) qui parcourt le code source et le transforme en modèle d'objets.

Ce parseur HTML du navigateur est bloqué par deux types de ressources :

  • les éléments <link>
  • les éléments <script> qui ne disposent pas d'attributs async ni defer
Illustration de bloquage du parseur HTML en raison d'un chargement de feuille de styles CSS (source : web.dev)

Depuis 2008, un second mécanisme parallèle entre en jeu sur l'ensemble des navigateurs : celui du "Preload Scanner". Ce second parseur agit lorsque le parseur HTML est bloqué sur une ressource et pré-charge les ressources suivantes indiquées dans le markup HTML.

Cela signifie que certains éléments placés hors HTML ne participeront pas à cette recherche anticipée : c'est le cas des polices et des images de fond appelées dans les fichiers CSS, mais également des liens ou ressources situées dans des scripts.

Ce mécanisme est automatique, mais il est possible de l'influencer en proposant le pré-chargement de certaines ressources en priorité en agissant sur les "Priority Hints" tels que async, defer, rel=preload ou fetchpriority

async et defer

Ces attributs sont liés au chargement des scripts. Dans les deux cas, ces attributs rendent le chargement asynchrone et ne bloquent pas le parseur HTML :

  • async est exécuté dès que le navigateur en a la possibilité. Les ressources sont potentiellement chargées dans n'importe quel ordre.
  • defer est exécuté lorsque tout le DOM est parsé. Les ressources sont chargées dans l'ordre dans lequel elles sont placées dans le DOM.
  • les <script module> (EcmaScript Modules) sont en defer par défaut.

Détail important : async est prioritaire sur defer.

<script async src="script.js">
<script defer src="script.js">

Pour en savoir plus à ce sujet, n'hésitez pas à consulter l'article détaillé "Les attributs async et defer pour <script>".

rel=preload

Cette déclaration demande au navigateur de découvrir et charger une ressource en priorité avant même que le parseur ne l'atteigne. Elle est également particulièrement utile pour tous les assets non indiqués dans le markup HTML.

Exemple de pré-chargement de police :

<!-- Dans le <head> après
     la feuille de styles pour ne pas la bloquer -->
<link rel="preload" as="font" href="kiwi.woff2" 
      type="font/woff2" crossorigin="anonymous">

(Note : ici crossorigin="anonymous" n'est utile que si la police n'est pas auto-hébergée)

Exemple de pré-chargement d'image :

<link rel="preload" as="image" href="hero.webp">

Priorité : le niveau de priorité de rel=preload est "Mandatory" (obligatoire), c'est à dire que cette fonctionnalité doit absolument être traitée en premier lieu par le navigateur. Cette action est susceptible de bloquer le chargement des feuilles de styles.

Pour mieux comprendre cette propriété dans un cas concret (polices de caractères), n'hésitez pas à consulter l'article détaillé "Optimisez vos polices web".

fetchpriority

L'attribut fetchpriority informe le navigateur du degré de priorité du pré-chargement d'une ressource. Il est possible de l'appliquer sur l'élément <link> mais aussi directement sur <img>, <script> et <iframe>.

Les valeurs possibles sont "high" (haute priorité), "low" (basse priorité) et "auto" (valeur par défaut).

Quelques exemples :

<!-- Ce script doit être pré-chargé 
     mais d'autres ressources sont prioritaires -->
<link rel="preload" href="script.js" as="script" fetchpriority="low">

<!-- Cette image de fond critique 
     est hautement prioritaire -->
<link rel="preload" as="image" href="hero.webp" fetchpriority="high">

<!-- Cette image doit être pré-chargée
     mais n'est pas vraiment critique -->
<img src="sausage.svg" alt="je ne suis pas importante" fetchpriority="low">

Avec l'exemple d'images d'un carousel :

<ul class="carousel">
  <img src="img/carousel-1.jpg" fetchpriority="high">
  <img src="img/carousel-2.jpg" fetchpriority="low">
  <img src="img/carousel-3.jpg" fetchpriority="low">
  <img src="img/carousel-4.jpg" fetchpriority="low">
</ul>

(source de l'exemple : https://web.dev/priority-hints/)

Priorité : le niveau de priorité de fetchpriority est "Hint" (indice), c'est à dire que cette fonctionnalité est une simple indication pour le navigateur.

preconnect et dns-prefetch

Ces attributs sont liés au chargement des ressources externes (non hébergées localement).

  • rel="preconnect" informe le navigateur que l'on souhaite établir une connexion le plus rapidement possible à une autre plateforme.
  • rel="dns-prefetch" ne fait que résoudre le nom de domaine sans toutefois atteindre la ressource indiquée.
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
<link rel="dns-prefetch" href="https://example.com">

Priorité : le niveau de priorité de preconnect et dns-prefetch est "Hint" (indice), c'est à dire que ces fonctionnalités sont de simples indications pour le navigateur.

Pour en savoir plus sur l'usage de ces attributs, n'hésitez pas à consulter l'article détaillé "Optimisation des pré-chargements avec prefetch, dns-prefetch et prerender".

Lazyloading

L'attribut loading permet de ne charger que les images situées au dessus de la ligne de flottaison. Les autres images ne sont alors chargées que lorsque cela devient nécessaire, au fur et à mesure que l'utilisateur scrolle (défile). On améliore ainsi le temps de chargement initial de la page.

Les valeurs de loading sont les suivantes :

  • eager : l'image est chargée immédiatement, qu'elle soit située dans ou hors de la fenêtre visible (valeur par défaut),
  • lazy : le chargement est retardé jusqu'à ce que l'usager scrolle et s'approche du bas de la fenêtre du navigateur.
<img src="image.webp" loading="lazy" width="" height="" alt="descriptif de l'image">
<iframe src="video-player.html" loading="lazy" title=""></iframe>

Pour en savoir plus sur cet attribut appliqué aux images, n'hésitez pas à consulter l'article détaillé "Attribut loading=lazy pour les images".

Publié par Alsacreations.com

✇Marc D Anderson's Blog

SharePoint-Based Intranets – Leave the Designers at Home

Modern SharePoint gives us few options from a design perspective. That sounds horrible, right? Actually, I see it as a very positive thing. By taking the pixel-pushing out of the mix, we can get people to focus on CONTENT, which is the do or die part of any Intranet.

Over the years, I was able to do a LOT of business (as Sympraxis) making “SharePoint not look like SharePoint”. But that came at a cost on several levels:

  • My clients had to pay me to implement a design, which often wasn’t well-suited to SharePoint in the first place. Anyone remember the agony of getting rounded corners on Web Parts in the old days with just CSS?
  • We focused a lot on that design, and far less on the content which we’d pour into it. Oftentimes, after we finally got the pixels in the right place, the content wouldn’t even fit into the pages very well!

Modern SharePoint gives us a clean, responsive, open user experience (UI) which few people quibble with. Years ago, many people driving Web site development had come from the print world, so there was a lot of that paper-perfect thinking in the mix. These days – a statistical generation later – most people driving the projects have always worked in the Web. The scales have tipped.

If you look at the SharePoint look book, virtually every one of the designs you see can be accomplished with out of the box settings. That’s a lot of power.

In modern SharePoint, there are several “design surfaces” we can work with:

Anything beyond these design options usually would require custom coding and frankly often isn’t worth the effort. Having a designer available to make suggestions doesn’t hurt, but sometimes they get frustrated by the lack of options! These aren’t old-fashioned Web sites which required us to create an HTML template and CSS in order to get rolling. We can create a site and start working on the content right away, shortening the path to success immensely.

❌