Quantcast
Channel: Alsacreations.com - Apprendre
Viewing all 405 articles
Browse latest View live

Astuce : Les attributs async et defer pour

$
0
0

Deux attributs HTML permettent de modifier le comportement des balises <script> et plus particulièrement pour le chargement des ressources JavaScript :

  • async : charger/exécuter les scripts de façon asynchrone.
  • defer : différer l'exécution à la fin du chargement du document.

Ils sont souvent confondus avec pourtant des conséquences différentes. À l'heure où les performances sont surveillées de plus en plus près par les robots d'indexation, et les temps de chargement scrutés pour le confort des utilisateurs, leur usage est le bienvenu.

Ces attributs sont reconnus par tous les navigateurs modernes actuels : Firefox 3.6+, Chrome, Safari, à partir d'Internet Explorer 10 et bientôt Opera. Y compris dans les versions mobiles. Si un moteur ne comprend pas l'un ou l'autre, ceci ne se révélera pas bloquant pour l'interprétation du document, les performances resteront simplement "non optimisées".

Attributs async et defer, effets communs

Le but de ces deux attributs, décrits en détails ci-après, est principalement de charger et lancer l'interprétation de code JavaScript sans bloquer le rendu HTML (son affichage à l'écran). Ils ne concernent en général que des interprétations de codes situés dans des fichiers externes (lorsque l'attribut src est utilisé) et viennent assouplir la pratique communément admise de placer - dans la mesure du possible - les balises <script> à la fin du document juste avant la fermeture de </body>.

Le goulot

Cette dernière recommandation provient d'un comportement que les navigateurs ne peuvent éviter : par défaut (et pour simplifier), toute balise <script> rencontrée met en attente le moteur HTML/CSS car le navigateur ne sait pas si le code JavaScript va contenir des instructions spécifiques à exécuter immédiatement qui pourront avoir une conséquence importante sur... le code HTML/CSS lui-même, notamment avec la fonction document.write(). Il va donc falloir effectuer des requêtes HTTP vers le serveur pour chaque fichier JavaScript externe, attendre les réponses, recueillir le code et l'exécuter. Ces actions prennent souvent plusieurs dizaines de millisecondes. Avec plusieurs éléments <script> comme on le voit souvent dans le code source des pages et applications web, le ralentissement du chargement en est multiplié d'autant.

Exemple brut

Pour examiner les cas de figure pouvant se présenter, partons d'une page-type dans laquelle se situent des balises <script> dans l'en-tête, le corps et la fin du document. L'une d'entre elles fait appel à un fichier script-lent.js qui comme son nom l'indique met volontairement un peu plus d'une seconde à être délivré par le serveur.

<!doctype html>
<html>
<head>
<title>Test JS</title>
<script>if(typeof console!='undefined') console.time('Timing');</script>
<script src="script-lent.js"></script>
</head>
<body>

<p>Script dans <head> et avant </body></p>
<script>if(typeof console!='undefined') console.debug('Affichage du body HTML');</script>

<script src="script.js"></script>
<script src="script2.js"></script>
<script>if(typeof console!='undefined') console.timeEnd('Timing');</script>
</body>
</html>

Dans ce cas de figure, nous observons le comportement suivant :

Du côté réseau :

Verdict

  • Le premier fichier (script-lent.js) ralentit tous les autres, il met plus d'une seconde à être chargé et interprété.
  • Le téléchargement des autres scripts démarre en même temps.
  • Mais il faut tout de même attendre l'obtention de script-lent.js pour que le document soit affiché (ce qui correspond à la barre verticale bleue représentant l'événement DOMContentLoaded)
  • Délai final avant affichage : 1.25 seconde
  • Le chronomètre nommé Timing placé à la fin du contenu de la page mesure un temps total de 1.065 seconde, ce qui veut dire que son exécution prend place après toutes les autres balises <script>

L'attribut defer

Antérieur à la vague HTML5, l'attribut defer existait déjà dans les "anciennes" versions d'Internet Explorer. Il signifie que le navigateur peut charger le(s) script(s) en parallèle, sans stopper le rendu de la page HTML. Contrairement à async, l'ordre d'exécution des scripts est préservé, en fonction de leur apparition dans le code source HTML. Il est par ailleurs reporté à la fin du parsing du DOM (avant l'événement DOMContentLoaded). De nos jours, cet attribut présente moins d'intérêt car les navigateurs disposent par défaut de techniques internes pour télécharger les ressources en parallèle sans nécessairement attendre les autres.

<script src="code.js" defer></script>

Reprenons le premier code en ajoutant l'attribut defer.

Exemple avec defer

<!doctype html>
<html>
<head>
<title>Test JS</title>
<script>if(typeof console!='undefined') console.time('Timing');</script>
<script src="script-lent.js" defer></script>
</head>
<body>

<p>Script dans <head> et avant </body></p>
<script>if(typeof console!='undefined') console.debug('Affichage du body HTML');</script>

<script src="script.js" defer></script>
<script src="script2.js" defer></script>
<script>if(typeof console!='undefined') console.timeEnd('Timing');</script>
</body>
</html>

Dans ce cas de figure, nous observons le comportement suivant :

Côté réseau :

Verdict :

  • Peu ou pas de différence par rapport à l'exemple précédent, car le navigateur charge déjà en parallèle les fichiers.
  • Il faut tout de même attendre l'exécution du premier (script-lent.js) pour voir du contenu apparaître sur la page puisque le moteur a pour règle de conserver l'ordre d'exécution en fonction de l'apparition des balises <script> dans le code source.
  • Délai final avant affichage : 1.20 seconde
  • En revanche, le chronomètre Timing est beaucoup plus court (quelques ms), toutes les autres balises <script> ayant été virtuellement déplacées après ce dernier, à la fin du document avec defer, il prend donc place avant leur interprétation.

L'attribut async

Nouveau venu dans HTML5, async signifie que le script pourra être exécuté de façon asynchrone, dès qu'il sera disponible (téléchargé). Cela signifie aussi que le navigateur n'attendra pas de suivre un ordre particulier si plusieurs balises <script> sont présentes, et ne bloquera pas le chargement du reste des ressources, notamment la page HTML. L'exécution aura lieu avant l'événement load lancé sur window et ne sera valable que pour les scripts externes au document, c'est-à-dire ceux dont l'attribut src mentionne l'adresse.

<script src="code.js" async></script>

Ce comportement est bien pratique pour gagner en temps de chargement, il faut cependant l'utiliser avec prudence : si l'ordre n'est pas respecté, un fichier exécuté de façon asynchrone ne pourra attendre le chargement d'un précédent, par exemple s'il en utilise des fonctions voire un framework. Il ne faudra pas non plus compter appeler document.write() pour écrire dans le document HTML puisqu'il sera impossible de savoir à quel moment les actions seront déclenchées.

En résumé, n'écrivez pas ça :

<!-- Attention le code ci-dessous est un contre-exemple, ne PAS utiliser -->
<script src="jquery.js" async></script>
<script src="autre_script_utilisant_jquery.js" async></script>

Reprenons le premier test en ajoutant l'attribut.

Exemple avec async

<!doctype html>
<html>
<head>
<title>Test JS</title>
<script>if(typeof console!='undefined') console.time('Timing');</script>
<script src="script-lent.js" async></script>
</head>
<body>

<p>Script dans <head> et avant </body></p>
<script>if(typeof console!='undefined') console.debug('Affichage du body HTML');</script>

<script src="script.js" async></script>
<script src="script2.js" async></script>
<script>if(typeof console!='undefined') console.timeEnd('Timing');</script>
</body>
</html>

Dans ce cas de figure, nous observons le comportement suivant :

Côté réseau :

Verdict

  • L'affichage peut se produire dès la réception du code HTML (voir la barre verticale bleue correspondant à l'événement DOMContentLoaded)
  • Le téléchargement des autres scripts reste semblable
  • Mais l'ordre n'est pas préservé : chaque script est exécuté dès qu'il est disponible, et script-lent.js est le dernier à survenir.
  • Délai final avant affichage : 0.16 seconde soit 8 fois moins qu'avant
  • Le chronomètre nommé Timing placé à la fin du contenu de la page est exécuté rapidement, juste après l'affichage HTML, sans attendre les autres balises <script>

Notes complémentaires

Selon la nature des scripts à exécuter, les deux attributs peuvent être utilisés ensemble.

En général, les scripts créés dynamiquement (c'est-à-dire par des instructions JavaScript elles-mêmes et non par des balises <script>), se voient automatiquement affublés de l'attribut/comportement async puisqu'il ne sont pas liés à un ordre logique déclaré dans le DOM.

Voir également le commentaire de jpvincent ci-après.


Astuce : L’accélération matérielle au service de vos animations CSS

$
0
0

C'est quoi l'accélération matérielle ?

flash

Comme le dit fort à propos Wikipédia : L'accélération matérielle consiste à confier une fonction spécifique effectuée par le processeur à un circuit intégré dédié qui effectuera cette fonction de façon plus efficace.

Dans le monde du Web cette possibilité concernera généralement les animations, et reposera sur la présence de deux éléments essentiels :

  • Le processeur : CPU (Central Processing Unit)
  • La carte graphique : GPU (Graphic Processing Unit)

Quel intérêt pour nos pages web ?

Certaines propriétés CSS affectent directement ou indirectement la taille de la boîte d'un élément : width, height, mais aussi margin, padding, border, top, right, bottom, left, etc.

Lorsque l'on modifie l'une de ces valeurs via CSS, le navigateur se voit contraint de recalculer la boîte ainsi que celles qui l'entourent et de "repeindre" la page (repaint).

Ce comportement est généralement insignifiant… sauf en cas de transition ou d'animation CSS : le navigateur, via le processeur, doit alors recalculer tous les éléments à chaque étape-clé de la transition !

La conséquence de cet effort du processeur se traduit par des effets de ralentissements et des saccades qui peuvent devenir très gênantes sur des périphériques de faible puissance, et en particulier sur des tablettes et smartphones.

Lors de vos animations CSS, pensez dans un premier temps à éviter les propriétés de "boîte" (citées précédemment) et remplacez-les avantageusement par des équivalents beaucoup plus performants (mais parfois moins compatibles) telles que les transformations : translations, rotations, déformations.

Et quand ce n'est pas possible,… il sera alors grand temps d'activer l'accélération matérielle via CSS, et le gain en fluidité sera immédiat et perceptible !

Activer l'accélération matérielle (AM) en CSS ?

limite 50 km/h

Appliquer une transformation CSS force un élément à s'afficher dans un "calque" indépendant du reste des éléments, permettant alors au navigateur de le traiter différemment.

L'une des possibilités offertes est alors de basculer tous les traitements et calculs de cet élément du côté de la carte graphique (GPU), et non plus du processeur (CPU). Bref, on active l'accélération matérielle.

Une transformation CSS "classique" (translate, rotate, skew, scale, matrix) ne suffit pas à activer l'accélération matérielle, il est nécessaire que cette transformation passe via l'axe de la profondeur (axe Z). En clair, il faut opérer une transformation 3D.

Voici une liste de déclarations CSS 3D permettant d'activer l'accélération matérielle sans altérer l'affichage ou la position de l'élément :

  • transform: translateZ(0);
  • transform: translate3d(0,0,0);
  • perspective: 1000; backface-visibility: hidden;

Les propriétés de transformations 3D sont plutôt bien supportées par les navigateurs, mais dans tous les cas, n'oubliez pas d'ajouter les préfixes constructeurs de rigueur (-webkit-, -moz-, -ms-, -o-) nécessaires tant que la spécification W3C du module des transformations 3D n'est pas finalisée.

Notez également que certains filtres CSS (CSS3 filters, actuellement à l'état de brouillon), WebGL, la vidéo et l'élément HTML5 <canvas> contribuent également à l'activation de la carte graphique.

Certains navigateurs permettent d'afficher les informations de la carte graphique et notamment si l'accélération est possible. Par exemple dans Firefox, la commande est  about:support, et dans Chrome la syntaxe est chrome://gpu :

GPU

Un exemple concret ?

Pour mieux comprendre la mise en pratique de l'accélération matérielle, je vous propose un court exemple concret. Le but est de faire apparaître un menu de navigation en transition lors d'un événement :

nav {
	transform: translate3d(-100%,0,0); /* activation de l'AM */
	transition: transform .4s;
}
nav.open {
	transform: translate3d(0,0,0);
}

Variante (plus compatible si les transformations 3D ne sont pas supportées) :

nav {
	position: absolute;
		left: -100%;
	transform: translateZ(0);  /* activation de l'AM */
	transition: left .4s;
}
nav.open {
	left: 0;
}

Les snippets de navigation responsive sur la page goetter.fr/nav activent tant que faire se peut l'accélération matérielle. Je vous invite à les décortiquer et vous les approprier.

Pratique aussi pour les filtres CSS

speed

Les filtres CSS, actuellement en brouillon dans les spécifications, offrent de nouvelles possibilités graphiques fort intéressantes : flou, noir et blanc, sépia, contraste, luminosité, etc.

Cependant, à l'instar des animations, certains filtres CSS tels que blur (flou) posent des problèmes de lenteur sur mobiles.

Dans ce cas, activer l'accélération matérielle vous sera également d'une grande utilité.

Et aussi pour le lissage des polices !

Le lissage des polices laisse souvent à désirer sur Chrome Windows, je ne vous l'apprends sans doute pas. Sachez que dans ce domaine aussi l'activation de l'accélération matérielle peut faire des miracles.

Prenez deux caractères agrandis et tournés. Dans le premier cas, opérez une rotation simple à l'aide d'une transformation classique. Dans le second cas, ajoutez une transformation CSS 3D afin de solliciter la carte graphique. Vous serez bluffés par le résultat (à voir sur CodePen) :

span {
	display: inline-block;
	-webkit-transform: rotate(60deg);
}
span+span {
	-webkit-transform: rotate(60deg) translate3d(0,0,0);
}

Accélération Materielle et lissage de police

Conclusion

Activer l'accélération matérielle favorise la fluidité des animations CSS, mais provoque également d'autres effets bénéfiques pour les périphériques dont le processeur est parfois à la traîne.

Sachez en profiter sans toutefois en abuser : les cartes graphiques de nos anciens mobiles ne sont pas non plus des foudres de guerre et pourraient facilement pâtir d'un excès de zèle dans vos choix d'activation matérielle.

Outil : Rendu par défaut des éléments HTML

Outil : Schnaps.it, le générateur de template HTML5

$
0
0

Alsacréations est fier de vous annoncer la naissance de Schnaps.it, notre nouvel outil de génération de code HTML / CSS !

Schnaps.it

Combinaison de plusieurs outils existants (KNACSS,  Schnapsum et Squelettor), Schnaps.it offre une palette de fonctionnalités lorsque vous débutez un nouveau projet web :

  • il permet de construire un squelette HTML vide très rapidement
  • il offre la possibilité de concevoir des gabarits de mise en page simple (une, deux, trois colonnes, hauteurs identiques, etc.) basés sur le mini framework KNACSS
  • il propose du faux-texte "Lorem Ipsum" en version alsacienne provenant de Schnapsum.

Le générateur de gabarits permet d'affiner certains réglages visuels des différents éléments (largeur, marges internes, marges externes, alignement de texte, etc.).

Une fois vos réglages effectués, il ne vous reste plus qu'à récupérer l'ensemble des fichiers en un clic !

générateur HTML

Un grand merci à Laetitia Bonanni, stagiaire dans l'agence Alsacréations pour ce joli travail réalisé tant du point de vue graphique que technique !

Astuce : Optimisation des pré-chargements avec prefetch, dns-prefetch et prerender

$
0
0

Les navigateurs rivalisent d'ingéniosité pour diminuer le temps de chargement des pages, ou du moins le faire ressentir à l'utilisateur. Quelques tentatives de pré-chargement automatique furent réalisées dans le passé, sans toutefois rencontrer un succès immédiat. En effet, effectuer une requête nécessite de "deviner" par avance quelles pages seront les plus pertinentes à pré-charger, avec plus ou moins de justesse et de risques :

  • cela consomme de la bande passante - peut-être inutilement si le visiteur décide de ne pas continuer sa navigation dans le sens de l'anticipation
  • cela consomme des ressources locales (mémoire vive, disque dur, etc)
  • cela peut fausser les statistiques du serveur si elles n'ignorent pas ces requêtes

Désormais, des moteurs de navigateurs courants tels que Firefox, Internet Explorer 9/10/11+ et Chrome peuvent exploiter les directives de la balise <link> et de l'attribut rel (relation) avec certains mots-clés pour pré-charger des URLs précises, que ce soit du code HTML, CSS, JavaScript, images, etc.

Ces techniques sont à utiliser avec une extrême précaution. Mal employées, elles peuvent vous causer plus de tort que de bien et gêner vos utilisateurs (voir les différents cas évoqués précédemment).

Prefetch

Une relation prefetch va déclencher le pré-chargement du fichier mentionné par le lien (attribut href), afin de le placer en cache.

Cette instruction figure dans la spécification côté WhatWG (Links) et W3C (HTML5 Links). Elle est supportée par Mozilla Firefox, Chrome et IE9+.

<link rel="prefetch" href="http://www.mondomaine.com/autre_page.html">
<link rel="prefetch" href="http://www.mondomaine.com/autre_feuille_de_styles.css">

On ne peut pas spécifier d'adresse globale de répertoire, de caractère joker (*), de fichier à télécharger/enregistrer, ou d'autre protocole que http/https. Ne passons pas à côté des choses simples.

Il faut se servir de cette directive avec parcimonie pour ne pas pénaliser la bande passante du visiteur (qui est peut-être sur du bas-débit/mobile) et du serveur. De toute manière, les navigateurs imposent des limites ; par exemple Internet Explorer 11 ne tolère que 10 ressources pré-chargées.

Quand utiliser prefetch ?

Lorsque la navigation logique de l'utilisateur a toutes les chances d'aboutir sur un lien précis, par exemple :

  • Lorsqu'il consulte une suite de pages (présentation, slideshow, slides, résultats de recherche paginés...) et qu'il y a une forte probabilité qu'il passe à la suivante.
  • Pour anticiper des images ou des feuilles de styles qui auront toutes les chances de s'afficher sur les pages principales du site, ou de l'application web.

Tests et vérifications

Comment distinguer une requête envoyée au serveur pour un pré-chargement d'une consultation réelle ? Le navigateur peut le signaler avec un en-tête HTTP supplémentaire. Par exemple Firefox envoie X-moz: prefetch, qui pourra se retrouver avec PHP dans $_SERVER['HTTP_X_MOZ'] mais ceci peut évoluer au cours du temps et n'est pas standardisé.

Tous les bons outils de développement (Firebug, F12, etc) pourront afficher les requêtes partant vers le serveur.

La spécification précise également que l'on peut placer cette relation avec les éléments <link>, <a> et <area>.

Dns-prefetch

Dans ce cas, le pré-chargement sera en réalité une requête DNS menée par anticipation, pour résoudre un nom de domaine en adresse IP, sans attendre de le rencontrer dans le code source de la page ou d'une page suivante. Ces requêtes peuvent parfois nécessiter quelques dizaines de millisecondes, et il y en a d'autant plus qu'un document fait appel à des ressources issues de domaines variés.

Note : Cette instruction n'est pas encore standardisée. Elle est reconnue par Mozilla Firefox, Google Chrome et IE10+.

<link rel="dns-prefetch" href="http://www.autredomaine.com/">

Ou sans protocole :

<link rel="dns-prefetch" href="//www.autredomaine.com/">

Si l'on sait par avance que www.mondomaine.com fera ultérieurement appel à des pages, images, CSS, JavaScript de www.autredomaine.com, ou de cdn.mondomaine.com, il pourra être utile de tenter de prédire ce comportement et de gagner du temps sur les requêtes DNS qui seront nécessaires pour convertir ces différents domaines ou sous-domaines en adresses IP (entre 50 et 250 ms généralement).

Certains navigateurs - notamment Chrome - utilisent aussi cette fonctionnalité sans vous demander votre avis et sans déclaration explicite dans un code HTML ; par exemple selon l'historique de l'utilisateur (les 10 derniers domaines visités avant fermeture) et/ou par diviniation de ce qu'il va taper dans la barre d'adresse. Pour voir quelques statistiques DNS sur ce moteur, consultez la page chrome://dns/

Prerender

Le pré-rendu de document va passer la main au moteur d'interprétation pour mettre en cache (mémoire) par avance une page afin de l'afficher quasiment instantanément si le visiteur y accède en ayant déjà un "rendu graphique".

Note : Cette instruction n'est pas encore standardisée. Elle est reconnue par Google Chrome et IE11+.

<link rel="prerender" href="http://www.mondomaine.com/autre_page.html">

Dans ce cas de figure, l'API PageVisibility pourra être utile pour se renseigner sur l'état précis du rendu de la page avec la propriété document.visibilityState (alors égale à prerender). On peut ajouter dans la valeur de l'attribut rel le mot-clé prefetch pour les navigateurs le supportant mais pas encore prerender.

Pour citer un exemple, Internet Explorer 11+ ne pré-calcule qu'une page à la fois. Il agit aussi intelligemment en n'exécutant cette instruction que si le document y faisant appel est au premier plan (onglet actif) et visible. La page de destination est effacée de la mémoire, entre autres :

  • si le visiteur décide de diriger ses clics vers une autre URL
  • s'il n'y accède pas dans un délai de 5 minutes
  • s'il change de fenêtre/onglet actif
  • si l'adresse renvoie une erreur HTTP (famille des 400, 500, etc)
  • si la page destination utilise <audio> ou <video>

On retrouve ces conditions du côté de Google Chrome, qui y ajoutera aussi une annulation en cas de :

  • demande d'identification HTTP ou de page HTTPS
  • création de popup
  • ressources système trop occupées
  • requête AJAX (XMLHttpRequest) avec méthode PUT/POST/DELETE
  • navigation privée

Ce navigateur permet d'examiner l'activité du pre-rendering via la page interne chrome://net-internals/#prerender. Il n'y a (a priori) pas d'en-tête HTTP spécifique envoyé donc pas de possibilité de distinguer un prerender d'une requête classique.

Chrome prerender

Un petit site de test a été mis au point sur http://prerender-test.appspot.com/ pour détecter l'activation (ou non) de cette fonctionnalité.

Il faut retenir qu'on peut aussi injecter ce type de balise avec JavaScript, de préférence dans la section <head>, c'est alors la dernière présente qui prendra le pas sur les autres.

Outil : LearnLayout

$
0
0

LearnLayout est un mini-site d'apprentissage dédié au positionnement en CSS.

Parfaitement adapté aux débutants (display, modèle de boîte, float, position, inline-block), le tutoriel n'exclut pas les intégrateurs chevronnés puisqu'il aborde des sujets avancés tels que clearfix, box-sizing, media queries, multicolonnes, flexbox et les frameworks CSS.

Astuce : Convertir du Flash (SWF) en HTML5 avec Swiffy

$
0
0

Qu'on l'aime ou non, la technologie Flash existe encore et aucune date d'enterrement n'est prévue par Adobe. Utilisé à bon escient, il est toujours possible d'en avoir plein les mirettes avec des animations sexy. Pourtant, une difficulté voit le jour : plusieurs plate-formes ne supportent pas l'installation du plug-in Flash. Alors, pourrait-on rendre ces animations HTML5 friendly ? C'est ce que nous propose Google avec Swiffy !

Cet outil est destiné à convertir le contenu Flash (SWF) en code HTML5, ce qui permet de le faire fonctionner sur des supports qui, à la base, ne supportent pas Flash comme les mobiles et tablettes (Android, iOS...). Théoriquement, cela devrait fonctionner sur toutes les plates-formes grâce aux standards.

Test en situation réelle

Faisons un essai avec un fichier relativement classique.

  • L'animation boucle
  • Au survol, l'animation réagit
  • Au clic également
  • Il y a différents effets (opacité, flou de mouvement..)
  • Poids : 33.3 Ko
  • Non libre de droits

Fusée

Une animation Flash des plus simples, vous en conviendrez

Choix de la méthode de conversion

L'extension pour le logiciel Flash

Swiffy propose une extension à télécharger.

  1. Direction la page de téléchargement : Swiffy Extension for Flash Professional
  2. Installez l'extension en utilisant Adobe Extension Manager
  3. L'extension est directement utilisable dans Flash

Uploader un fichier SWF sur le site

  1. Allez sur le site de l'extension : Google Swiffy
  2. Uploadez votre fichier SWF (1 Mo maximum) si vous possédez les autorisations nécessaires
  3. Un aperçu avant / après vous est directement proposé

Résultat du test

Après avoir utilisé la seconde méthode voici ce que nous obtenons :

D'un côté nous avons l'animation originale au format Flash de l'autre le résultat de la conversion. Il faut dire que cela fonctionne plutôt bien. Il suffit alors simplement de récupérer la page HTML générée en faisant un clic droit "enregistrer la cible du lien sous...".

Demo

Avantages

  • La qualité est sensiblement la même
  • Les effets sont respectés
  • Les évènements souris sont préservés
  • Cela fonctionne partout, même sur mobile
    (ici sur un iPhone 3GS doté d'IOS6 et un Samsung Wave sous BADA 2.0)

Inconvénients

  • C'est un peu moins fluide
  • ... Et surtout le poids ! Il faut au préalable charger un fichier JavaScript (runtime.js) qui contient des instructions de base au framework Swiffy et qui à lui seul pèse 250 Ko. Le code de l'animation elle-même (hors framework) monte à 50 Ko (consultez le code source de la démonstration), ce qui nous fait un total de 300 Ko.

Conclusion

"Google Swiffy" fonctionne bien ! Même très bien pour notre animation. Hélas les 250 Ko du script de base plus les 50 Ko de l'animation sont dissuasifs face aux 33 Ko du fichier SWF (Flash). Utiliser cet outil pour simplement remplacer une petite animation Flash n'est donc pas la bonne solution, surtout sur mobile lorsque la bande passante est limitée. Peut être qu'avec des animations plus conséquentes, et sans autre alternative réelle, le jeu en vaut-il plus la chandelle ?

Nous manquons toujours d'outils performants et agréables à utiliser pour générer des animations à la manière de l'environnement Flash qui est très pratique, sans devoir écrire de ligne de code complexe pour définir des paramètres d'animation et importer de multiples ressources. Adobe a bien lancé Edge Animate qui ressemble de près à l'IDE Flash mais les fichiers produits restent tout autant lourds à exploiter. Les techniques Canvas et SVG ont encore quelques progrès à faire au niveau de la génération du code nécessaire et du support par les navigateurs notamment pour ce qui concerne SVG animé.

Tutoriel : Découverte du framework CSS KNACSS

$
0
0

KNACSS, un "framework CSS" ?

KNACSS est une feuille de styles CSS de base pour débuter ses projets d'intégration web, conçue par Raphaël Goetter et Alsacréations. Concentré de bonnes pratiques, de conventions de nommage, d'astuces et de bouts de code réutilisables, KNACSS peut être considéré comme un véritable mini "framework CSS".

KNACSS

Attention, la plupart des techniques présentes dans KNACSS nécessitent un niveau de compétence minimal en CSS pour être exploitées au meilleur de leurs possibilités. Il est par exemple conseillé d'être à l'aise avec les bases générales et connaître les différents positionnements classiques (float, clear, position, inline-block, etc.). En clair, ce n'est pas un outil adapté aux débutants complets.

Voici une liste non exhaustive des fonctionnalités que l'on trouvera dans KNACSS :

  • un reset CSS
  • des classes réutilisables
  • des snippets CSS
  • des aides au positionnement
  • du positionnement avancé (FlexBox)
  • un support navigateur allant jusqu'à IE6
  • des grilles simples et des gouttières
  • du Responsive webdesign
  • des classes pour les tableaux
  • des classes pour les formulaires
  • une version LESS
  • une version Sass

Pour se distinguer des gros frameworks multitâches tels que Twitter Bootstrap, 960gs ou Blueprint, KNACSS (qui pèse moins de 5 Ko minifié) ne vous propose pas de plugins JavaScript, ni de designs et d'enrobages prédéfinis… cela vous évite de devoir vous compliquer la vie à les écraser au début de chaque projet :)

Pour vous faire une première idée du code utilisé, n'hésitez pas à consulter dès à présent le code commenté de KNACSS.

Installation

Il suffit de placer un appel vers la feuille de style unique KNACSS au sein de votre section <head> avec une balise <link>.

<link rel="stylesheet" href="knacss.css" media="all">

Le moyen le plus simple de récupérer KNACSS est de passer par le Builder (constructeur), où vous pouvez paramétrer votre produit selon vos besoins.

Passons à présent à la première étape de notre découverte...

Retrouvez l'intégralité de ce tutoriel multi-pages en ligne


Tutoriel : Menu de navigation avec amélioration progressive

$
0
0

L'ouvrage "Adaptive Web Design" d'Aaron Gustafson, dont nous avons fait le retour de lecture récemment est un excellent condensé du principe de développement par "Amélioration Progressive" (progressive enhancement) dans le Web.

Nous allons tenter de comprendre cette approche et en quoi elle est primordiale à travers un cas concret : la conception d'un menu de navigation responsive.

Amélioration progressive ?

livre Adaptive Webdesign

L'amélioration progressive, ou "web design adaptatif", n'est pas une question de compatibilité. Il n'est pas question de savoir "dois-je supporter IE6 ou non ?", cela va au-delà de ces basses considérations :)

L'enjeu est plutôt de comprendre :

  • de quoi est composé le parc des agents utilisateurs et périphériques susceptibles de tirer information de votre site (navigateurs, moteurs de recherche, synthèses vocales, imprimantes, smartphones)
  • le plus petit dénominateur commun à tous les agents utilisateurs afin que le contenu soit toujours restitué
  • d'enrichir progressivement l'expérience utilisateur pour les agents utilisateurs qui supportent ces améliorations

Plus schématiquement, et selon Aaron Gustafson, l'amélioration progressive c'est passer d'une expérience minimale vers l'expérience exceptionnelle :

  1. Le contenu textuel
  2. La sémantique HTML
  3. L'enrichissement visuel
  4. L'interaction avec le visiteur
  5. L'accessibilité

Note : l'amélioration progressive possède son alter ego, la dégradation gracieuse. Cette dernière part du principe inverse : tous les navigateurs récents doivent être privilégiés, et l'on autorise des alternatives, bidouilles, scripts pour pallier les déficiences des anciens.

Le contenu et l'information, l'essence du Web

Cette façon de percevoir les choses modifie sensiblement l'approche "compatibilité navigateurs". En effet, à partir du moment où le 1er niveau est atteint, le site est forcément "compatible" sur tous les agents utilisateurs. Tout les autres paliers contribuent à enrichir progressivement l'expérience de l'utilisateur.

Bien que semblant basique à mettre en pratique, cette philosophie de conception a l'avantage de bien remettre les choses au point et à leur place.

Et surtout, ça nous rappelle une priorité qui doit surclasser toutes les autres : n'entravez jamais l'accès au contenu.

Et malheureusement, les entraves à l'accès au contenu sont plus nombreuses qu'on ne le croit :

  • des liens, ou des navigations, ne fonctionnant qu'avec JavaScript ou Flash
  • des contenus masqués par défaut en CSS
  • des contenus en display: none alors qu'ils devraient être perceptibles aux lecteurs d'écran
  • des contenus "faussés" (des alt ou title ne servant que de conteneurs de mots-clés)
  • des images, vidéos sans alternative textuelle ou sous-titrage
  • des tailles de contenus minuscules et non agrandissables
  • etc.

Accessibility extension

Exemple concret : une navigation responsive en JavaScript

Passons aux choses sérieuses : mettons tout cela en pratique en prenant comme exemple un menu de navigation responsive.

Voir la démonstration

Menu responsive

1er palier : le contenu textuel

Rien de particulier à ce stade, il s'agit de conférer aux liens des contenus explicites :

  • Accueil,
  • À propos,
  • Blog web,
  • Alsacréations,
  • Contact.

Même hors de son contexte, ce contenu demeure explicite… à condition que tous les visiteurs connaissent ce qu'est un "blog" et savent ce qu'est "Alsacréations".

Profitons-en pour les dépanner un peu et enrichissons l'information lorsqu'il le faut. Un attribut title sera parfait pour une infobulle :

<a href="http://www.alsacreations.com" title="Alsacréations, communauté d'apprentissage web"><Alsacréations</a>

N'abusez pas, comme on le voit souvent, de l'attribut title, en le casant sur tous vos liens. Il n'est utile que s'il véhicule une information supplémentaire. Si vous l'appliquez partout, vous ne ferez que parasiter la lecture des synthèses vocales.

2e palier : la sémantique HTML

Le bon choix des éléments

La sémantique commence par le choix judicieux et approprié des éléments HTML (balises) afin que les agents utilisateurs puissent exploiter leurs fonctions.

Il m'a semblé naturel d'opter pour l'élément HTML5 <nav>, contenant une liste de liens (<ul>, <li>, <a>). La présence des éléments de liste n'est pas obligatoire, c'est plus par habitude que par réelle nécessité.

<nav>
	<ul>
		<li><a href="">Accueil</a></li>
		<li><a href="">À propos</a></li>
		<li><a href="">Blog web</a></li>
		<li><a href="" title="">Alsacréations</a></li>
		<li><a href="">Contact</a></li>
	</ul>
</nav>

Pour rappel, l'élément HTML5 <nav> n'est pas supporté par les anciennes versions d'Internet Explorer. Par exemple, pour IE8 et inférieur, vous devrez créer cet élément dans le DOM ou employer le célèbre polyfill HTML5Shim.

Un identifiant pour le menu

Les liens d'évitement sont bénéfiques à la navigation clavier et pour les déficients visuels. Dans cette optique, ajoutons un identifiant (id) à la navigation afin de servir d'ancre aux liens d'évitement; Il nous servira également de marqueur plus tard pour JavaScript :

<nav id="navigation">
Les microdonnées

Nous pourrions en profiter pour enrichir la sémantique via HTML5 microdata car la documentation Schema.org nous fournit des microdonnées spécifiques à la navigation d'un site web : il s'agit de SiteNavigationElement.

Cependant, à l'heure actuelle, il faut bien avouer que nous ne savons pas très bien si cette microdonnée de navigation est déjà exploitée par les agents utilisateurs ou les moteurs de recherche. Libre à vous d'attendre un peu qu'elle se démocratise (ou pas) avant de l'employer en production.

3e palier : enrichissement visuel (CSS, images, vidéos)

Allez hop ! On passe à l'étape graphique, l'enrichissement le plus perceptible. Mais cela demeure un enrichissement comme un autre, rien de plus.

Nous allons appliquer les styles CSS en gardant à l'esprit que tous les navigateurs ne supportent pas les dernières fioritures de CSS3.

Cette navigation prendra forme en tenant compte des considérations d'ergonomie et d'accessibilité (taille de police, contrastes de couleurs, taille du lien cliquable). Quel que soit l'agent utilisateur, l'information doit être exploitable.

Nous disposons de plusieurs moyens pour cibler le bloc de navigation en CSS :

  • nous pouvons cibler directement l'élément <nav> (mais attention, il peut y avoir plusieurs <nav> dans une page),
  • il est possible de se servir du sélecteur d'id (en ce qui me concerne, je ne suis pas très fan car il a trop de poids dans le calcul des sélecteurs),
  • nous pourrions ajouter un attribut de type class="nav-main" (mais c'est peut-être un peu dommage de surcharger le code HTML pour cela),
  • nous servir du sélecteur d'attribut via [id=navigation] ou encore [role=navigation] (que l'on aborde dans la dernière étape)

Personnellement, j'ai fait le choix de cibler à l'aide de [id=navigation].

Les styles de base demeureront très basiques :

[id=navigation] ul {
	margin: 0; padding: 0;
	list-style: none;
}
[id=navigation] a {
	display: block;
	padding: 0.8em;
	background: #4A7377;
	color: #fff;
	text-decoration: none;
}
Styles pour mobiles

On passe à présent aux styles dédiés aux petits écrans. Pour cela, rien de mieux que des CSS3 media queries pour appliquer des styles aux fenêtres de moins de 768 pixels de large :

@media (max-width: 767px) {...}

Les media queries ne sont pas reconnus par IE8 et versions inférieures. Dans notre démarche d'amélioration progressive, cela n'est pas du tout un obstacle : les vieux IE disposeront de l'affichage de base. De plus, nous avons limité ces styles aux périphériques de fenêtre inférieure à 768px, donc généralement les smartphones… où ces antiques navigateurs n'existent pas !

Pour les smartphones, l'opération principale consiste à générer en CSS un bouton d'action "burger" en caractère unicode qui symbolisera le menu quand il sera rétracté :

[id=navigation]:after {
	content: "\2261"; /* symbole unicode du "burger" */	
	position: absolute;
		top: -5.5rem; right: 4px;
		z-index: 42;
	width: 4rem;
	text-align: center;
	color: #000;
	font-size: 5rem;
	font-weight: bold;
	line-height: 1;
}

Menu burger

Aller plus loin

Tant qu'on y est, il pourrait être de bon ton de produire des améliorations visuelles (CSS) selon les périphériques. Par exemple :

  • adapter la taille cliquable des liens selon la résolution (taille et DPI) des mobiles,
  • modifier les contrastes ou passer la couleur de texte en noir sur imprimante,
  • ajouter des fioritures graphiques pour navigateurs récents (coins arrondis, dégradés),
  • etc.

4e palier : interactions avec le visiteur (JavaScript, Flash)

Lors du clic ou du touch sur le bouton "burger", le menu de navigation doit se rétracter ou se déployer.

Pour ce faire, plusieurs techniques sont envisageables. Parmi celles-ci, nous avons choisi JavaScript notamment parce que ce langage se prête parfaitement à cette fonctionnalité. Mais sachez que d'autres langages (CSS) auraient pu faire l'affaire également.

L'un des soucis de JavaScript est qu'il n'y a pas de tolérance à la panne : si JavaScript n'est pas activé ou est bloqué, le menu - qui est un contenu essentiel de la page - risque de ne pas être restitué car masqué.

Pour nous assurer que le contenu de la navigation soit toujours accessible (1er palier), nous ajoutons la classe .nav-opened par défaut dans la balise <nav> :

<nav id="navigation" class="nav-opened">

Le menu doit être affiché et ouvert par défaut au chargement de la page. Ainsi, si JavaScript n'est pas activé, le menu demeurera déployé et fonctionnel.

[id=navigation].nav-opened ul {
	max-height: 25em;
}

Au contraire, si JavaScript est fonctionnel, sa première mission sera de rétracter le menu en supprimant la classe .nav-opened.

if (window.innerWidth<768) {
	t = document.getElementById('navigation'); 
	if(t) {
		t.classList.toggle('nav-opened');
		t.onclick=function(){ t.classList.toggle('nav-opened');} 
	}
}

Les styles suivants s'appliqueront alors :

[id=navigation] ul {
	max-height: 0;
	overflow: hidden;
}

Pour information, on rétracte le menu en jouant sur une combinaison max-height + overflow, ce qui permettra de l'ouvrir progressivement via une transition CSS3 par la suite :

-webkit-transition: max-height .4s;
transition: max-height .4s;
Aller plus loin

L'usage de JavaScript nécessite souvent d’implémenter des fonctionnalités et détections complémentaires qui complexifient le code initial mais en faciliteront l'emploi dans toutes les circonstances (onresize, timeout, zoom utilisateur, etc.). À vous de voir jusqu'où vous souhaitez parfaire le code minimal actuel.

5e palier : enrichissement de l'accessibilité

Parvenu à ce dernier palier, profitez-en pour refaire une dernière vérification de routine :

  • Le contenu est-il toujours compréhensible hors contexte ?
  • Le contraste entre la couleur de texte et la couleur de fond est-il suffisant ? 
  • Le menu est-il fonctionnel si CSS est indisponible ou non reconnu par les navigateurs ?
  • Le menu est-il fonctionnel si JavaScript est indisponible ou non reconnu par les navigateurs ?
  • Avez-vous testé l'accessibilité de la page via une synthèse vocale (VoiceOver, Nvda) ?
Navigation au clavier
Autre excellente pratique pour l'accessibilité : permettez la navigation au clavier en attribuant des styles CSS également lors de l'état :focus des liens de navigation (vous pouvez tester la navigation clavier à l'aide des touches tab ou maj + tab).

Pour nos amis IE6 et IE7, qui ne reconnaissent pas la pseudo-classe :focus, nous emploierons :active qui, en raison d'un bug, déclenchera également les styles lors de la navigation au clavier sur ces anciens navigateurs.

La navigation au clavier sera sans doute inutile sur mobile, mais redoutablement efficace sur écran de bureau :

[id=navigation] a:hover, [id=navigation] a:focus, [id=navigation] a:active {
	background: #295155;
}
Enrichissement via Landmarks ARIA

Les spécifications W3C d'accessibilité, WAI-ARIA, prévoient des régions nommées (landmarks) que les agents utilisateurs doivent savoir exploiter. Par exemple, la région "navigation", valeur de l'attribut HTML ARIA role, désigne la navigation prinicipale du document.

Tous les agents utilisateurs récents reconnaissent ce landmark et traitent l'élément comme tel, cela vient en complément du sens apporté par l'élément HTML <nav> :

<nav role="navigation" id="navigation" class="nav-opened">

Conclusion

L'exemple de ce menu de navigation vous l'a peut-être fait comprendre : l'amélioration progressive est un travail du quotidien et chaque détail peut avoir son importance.

Ne cherchez pas absolument la perfection, car elle n'existe pas. Cet exemple est d'ailleurs forcément perfectible. Par contre, pensez avant tout à vos utilisateurs en priorité, et non à la technologie qui vous ferait plaisir : l'essentiel est que le contenu et les informations puissent toujours être véhiculées.

revoir la démonstration

Et maintenant c'est à vous de jouer, qu'avez-vous prévu de faire pour faciliter la vie à vos visiteurs ?

Retrouvez l'intégralité de ce tutoriel multi-pages en ligne

Article : Abréviations sur le web, balisage sémantique et exemples de code

$
0
0

Les règles typographiques de la langue française sont merveilleuses, riches et alambiquées à la fois. Surtout appliquées au Web.

Par exemple, la règle générale pour les abréviations  – même s’il existe maintes exceptions – est l’emploi de la lettre initiale suivie par les lettres significatives de la fin de mot. Ces lettres significatives sont affichées en bas-de-casse et mises en supérieur.

L’ignorance de cette règle conduit à des "variations" plus ou moins problématiques, telles que :

  • Mme [absence de lettres en supérieur] pour Madame ;
  • [capitale M suivi de &deg; et non pas la lettre ‘o’] pour le Métro ;
  • [le chiffre ‘un’ suivi de <sup>&egrave;</sup>] en tant qu’abréviation pour première (d’autres variations constatées sont 1èr ou 1ère) au lieu de 1<sup>re</sup>.

Par ailleurs, l'emploi (fréquent) de l'élément <sup> engendre deux inconvénients :

  • premièrement, cet élément correspond bien à la présentation voulue, mais n’apporte pas de sens ;
  • deuxièmement, nous n’avons pas accès au mot ainsi raccourci sous sa forme non-abrégée, ce qui pourrait utile pour les moteurs de recherche et les dispositifs d’accessibilité.

Or, il existe un élément spécifique pour traiter le cas des abréviations : <abbr>.

Note : <abbr> a remplacé l'élément obsolète <acronym> dans les spécifications HTML5

Utilisons donc l'élément <abbr>, accompagné de tout autre élément ou classe qui nous facilite la création de sens. Par exemple :

<abbr class="superior">M<span>ada</span>me</abbr>

En l’absence des feuilles de style, ceci affichera la forme non-abrégée : "Madame".

En présence d’une feuille de style adéquate, le contenu peut être stylé pour un écran comme suit :

.superior {
	display: inline-block;
	font-size: 80%;
	vertical-align: 60%;
	line-height: 0.5em;
}
.superior:first-letter {
	font-size: 125%;
	vertical-align: -60%;
}
abbr span {
	position: absolute;
	left: -7000px;
	overflow: hidden;
}

Aparté : les valeurs pour font-size et vertical-align ont été choisies pour leur harmonie ainsi que leur correspondance avec les pratiques habituelles de la typographie, tout en respectant un souci de lisibilité à des tailles réduites. Bien sûr, ici on explore une technique, et je ne cherche pas à être normatif en ce qui concerne tous les aspects des styles présentés ici. Vous êtes libre d’adapter ces valeurs à vos besoins spécifiques. Le nom de classe .superior a été choisi en rappel de la balise <sup>.

Explications

  • La classe .superior contient le mot abrégé, et est nécessaire pour constituer une ligne de base commune au texte de l’abréviation. Ensuite nous réduisons la force du corps du texte dans ce bloc à 80% de la hauteur courante, une valeur qui, sur écran, convient pour les valeurs supérieures.
  • La propriété vertical-align déplace le texte vers une position supérieure, en tenant compte non seulement du changement de force du texte en question, mais aussi de la distance nécessaire.
  • La propriété line-height est nécessaire afin d’empêcher des changements à l’interligne causé par les lettres mises en supérieures. La valeur de 0.5em réduit l’interligne de notre bloc de manière à ne pas influencer l’interligne ailleurs dans le bloc parent.
  • Suivant l’application de la règle .superior, le texte de notre bloc est maintenant mise en supérieur et il flotte au-dessus de la ligne de base. Il convient donc de ramener la première lettre vers le bas.
  • Le sélecteur :first-letter est supporté par l’ensemble des navigateurs actuels, et même des versions antérieures.
  • L’augmentation à 125% pour la propriété font-size restaure la taille originale suivant la réduction à 80%.
  • La valeur négative pour vertical-align tire la première lettre vers le bas, la recollant sur la ligne de base.
  • Enfin, la règle  abbr span {} cache le texte ne faisant pas partie de l’abréviation, empêchant son affichage à l’écran.

J’ai bien cherché une balise plus approprié que <span> pour ce cas — parmi eux <b> et <i>, désormais dévolus aux changements purement stylistiques — mais j’ai décidé en fin de compte qu’il n’y avait pas un meilleur élément.

Extension de la technique pour d’autres cas

Les abréviations pour boulevard ou faubourg suivent la même règle, sauf il n’y a pas l’utilisation du texte mise en supérieure. Dans ce cas, la même règle CSS peut toujours s’appliquer.

21 <abbr>b<span>oulevar</span>d</abbr> des Champs-Élysées
105 <abbr>f<span>aubour</span>g</abbr> Saint-Antoine

En n’utilisant pas la classe .superior sur la balise <abbr>, seule la règle pour abbr span { } s’applique, et ainsi le texte est caché à l’écran.

Utilisation avec les microformats

Pour enrichir sémantiquement le contenu j’ai voulu tester comment intégrer cette proposition avec le microformat hCard dans le but d’apporter le plus de sens possible. Prenons une hCard ‘basique’...

<div class="vcard" lang="fr">
  <div class="fn n">
    <span class="honorific-prefix">Mme</span>
    <span class="given-name">Jeanne</span>
    <span class="additional-name">Antoinette</span>
    <span class="family-name">Poisson</span>
  </div><!-- /.fn -->
</div><!-- /.vcard -->

Aparté : le format hCard ne semble pas avoir de champ/attributs pour des titres de noblesse – dans ce cas, Marquise de Pompadour. L’attribut honorific-suffix ne semble pas approprié... Plus de recherche à faire, je pense...

En tout cas, utilisant la technique développée précédemment donne ceci :

<div class="vcard" lang="fr">
  <div class="fn n">
    <span class="honorific-prefix">M<span>ada</span>me</span>
    <span class="given-name">Jeanne</span>
    <span class="additional-name">Antoinette</span>
    <span class="family-name">Poisson</span>
  </div><!-- /.fn -->
</div><!-- /.vcard -->

Les règles CSS doivent être adaptées pour devenir :

.honorific-prefix {
  display: inline-block;
  font-size: 80%;
  vertical-align: 60%;
  line-height: 0.5em;
}
.honorific-prefix:first-letter {
  font-size: 125%;
  vertical-align: -60%;
}
.honorific-prefix span {
  position: absolute;
  left: -7000px;
  overflow: hidden;
}

Tout fonctionne correctement. Rajoutons l’adresse...

<div class="vcard" lang="fr">
  <div class="fn n">
    <span class="honorific-prefix">M<span>ada</span>me</span>
    <span class="given-name">Jeanne</span>
    <span class="additional-name">Antoinette</span>
    <span class="family-name">Poisson</span>
  </div><!-- /.fn -->
  <div class="adr">
    <div class="extended-address">Château d’Évreux</div>
    <div class="street-address">55 rue du Faubourg-Saint-Honoré</div>
    <span class="postal-code">75008</span>
    <span class="locality">Paris</span>
    <div class="country-name">France</div>
  </div><!-- /.adr -->
</div><!-- /.vcard -->

Ainsi, si je veux utiliser une abréviation pour Faubourg je peux faire comme suit :

<div class="vcard" lang="fr">
  <div class="fn n">
    <span class="honorific-prefix">M<span>ada</span>me</span>
    <span class="given-name">Jeanne</span>
    <span class="additional-name">Antoinette</span>
    <span class="family-name">Poisson</span>
  </div><!-- /.fn -->
  <div class="adr">
    <div class="extended-address">Château d’Évreux</div>
    <div class="street-address">55 rue du
    <abbr>F<span>aubour</span>g</abbr>-Saint-Honoré</div>
    <span class="postal-code">75008</span>
    <span class="locality">Paris</span>
    <div class="country-name">France</div>
  </div><!-- /.adr -->
</div><!-- /.vcard -->

Comme la règle pour Faubourg n’emploie pas de texte mise en supérieure, je n’ai besoin que de cibler la balise <span>, seulement les autres, en ajoutant la règle .street-address abbr span.

La version révisée :

.honorific-prefix {
  display: inline-block;
  font-size: 80%;
  vertical-align: 60%;
  line-height: 0.5em;
}
.honorific-prefix:first-letter {
  font-size: 125%;
  vertical-align: -60%;
}
.street-address abbr span, .honorific-prefix span {
  position: absolute;
  left: -7000px;
  overflow: hidden;
}

Si on veut la totale, on peut aussi ajouter les attributs de titre. Ce qui donne une carte complétée comme suit :

<div class="vcard" lang="fr">
  <div class="fn n">
    <span class="honorific-prefix" title="Madame">M<span>ada</span>me</span>
    <span class="given-name">Jeanne</span>
    <span class="additional-name">Antoinette</span>
    <span class="family-name">Poisson</span>
  </div><!-- /.fn -->
  <div class="adr">
    <div class="extended-address">Château d’Évreux</div>
    <div class="street-address">55 rue du<abbr title="Faubourg">F<span>aubour</span>g</abbr>-Saint-Honoré</div>
    <span class="postal-code">75008</span>
    <span class="locality">Paris</span>
    <div class="country-name">France</div>
  </div><!-- /.adr -->
</div><!-- /.vcard -->

L’emploi de l’anglais pour les noms de classes

Même si le texte affiché est français, et attribué en tant que tel, par convention les noms des balises, classes, propriétés, règles et valeurs en HTML, CSS, et pour les microformats, proviennent de l’anglais. En suivant cette manière de faire, il y a une meilleure chance à ce que les moteurs de recherche et autres robots ‘comprennent’ mieux nos classes et attributs.

Limitations

  • Cette technique ne convient pas pour les abréviations qui débutent par plus d’une lettre au départ.
  • Une propriété line-height explicite est nécessaire sur le bloc parent, et donc le texte qu’il contient, afin d’assurer l’alignement sur la ligne de base.
  • La dépendance sur quelques chiffres ou valeurs ‘magiques’, c’est-à-dire, qu’ils fonctionne ici mais n’ont pas une mode de calcul qui assure leur fiabilité avec d’autres polices...

Outil : Red Pen

$
0
0

RedPen est un site bien pratique pour envoyer votre design (format image) et obtenir une URL courte à partager. Avec cette adresse, vous pouvez ajouter des annotations partagées entre différentes personnes. Très pratique pour recueillir les avis, ou proposer une maquette graphique à un client. Tout ceci sans complexité supplémentaire.

Redpen vous demande simplement une adresse E-mail pour vous prévenir de l'arrivée de nouveaux commentaires sur vos réalisations. Petit détail, tant que vous gardez la fenêtre ouverte, vous n'aurez pas de notifications par mail.

Tutoriel : Canvas 3D (WebGL) plus facile avec Three.js

$
0
0

Nous avons tous déjà vu des sites de grandes marques nous en mettant plein la vue avec des animations 3D interactives, ou des démonstrations technologiques qui font rêver. On pense ici à quelques berlines allemandes parfaitement modélisées qu’il est possible d’inspecter sous tous ses angles avec un simple mouvement de la souris... Bien souvent développées en Flash avec la librairie Papervision3D ces animations en jettent un max, mais restent dépendantes du plug-in d'Adobe qui est de moins en moins populaire et "incompatible" tablette et smartphone.

Aujourd’hui la tendance est au HTML5 et CSS3, parsemé d’un peu de JavaScript. Ô chance, le W3C et ses contributeurs ont justement prévu de passer par Canvas (qui permet déjà de dessiner dans une page web en 2D) pour exploiter une scène 3D avec les standards du web.

Comment et pour qui ?

Pour ceux qui ne le savent pas, il existe deux composants HTML5 pour dessiner :

  • Canvas, qui permet de faire du dessin bitmap (en pixel)
  • SVG pour le dessin vectoriel, souvent utilisé en cartographie (à l'exception de Google Maps ou OpenStreetMap qui utilisent des mosaïques d'images)

Je ne m’attarderai pas sur ces composants, le web regorge de sujets qui en parlent déjà très bien.

WebGL

Il existe en réalité un troisième composant qui est lui dédié à la 3D, il s’agit de WebGL qui se base sur le standard 3D OpenGL. Il permet d’exploiter les pilotes de la carte graphique et de tirer ainsi profit de l’accélération matérielle, un atout majeur pour des rendus performants de formes et/ou de textures complexes. En gros WebGL permet de générer un rendu 3D calculé par la carte graphique dans votre navigateur. Sous entendu : cette feignasse de carte graphique qui ne sert pas à grand chose pour le rendu d’une page Web va enfin se rendre utile.

Seulement ce qu’il faut savoir, c’est que comme avec beaucoup des nouveautés apportées par HTML5, il y a encore des restrictions liées à l’implémentation de ces standards par les navigateurs.

Ainsi je vais peut-être refroidir les ardeurs de certains; WebGL est supporté par :

  • Firefox à partir de la version 4 ;
  • Chrome à partir de la version 9 ;
  • Safari seulement si activé depuis le menu développement ;
  • Internet Explorer à partir de la version 11 seulement

Les mobiles, souvent soumis à plus de contraintes d'économie d'énergie reconnaissent pour la plupart déjà ces instructions via les moteurs embarqués mais elles sont désactivées par défaut. Et comme ce n’est pas pas très encourageant, mais qu'il y a du mieux depuis que Microsoft s'y est mis, il faut ajouter à cela que certaines cartes graphiques ne supportent pas WebGL. C’est notamment le cas sur certains modèles de Mac. Voir BlacklistsAndWhitelists WebGL (informations de support plus détaillées).

Bon bon bon... alors pourquoi je vous parle de ça si visiblement on ne peux pas encore l’utiliser en production à l’heure actuelle ? Et bien déjà parce que comme beaucoup de choses apportées par HTML5 c’est fun et dans un avenir proche ça deviendra viable en production. Et parce que ça ne fait pas de mal de se faire un peu plaisir avec les nouvelles techno sur des projets innovants. Parce que l’innovation c’est le progrès et que c’est bon pour l’économie !

Et la petite surprise du chef c’est qu’on peut quand même faire un peu de 3D sans WebGL ! Et oui, car la 3D finalement ça reste du dessin 2D auquel on ajoute une perspective (comment ça je simplifie un peu trop ?). De fait, on peut utiliser Canvas et SVG pour dessiner en 3D.

Alors je vous rassure, il n’est pas question de s’amuser à faire des calculs savants à bases de matrices ou autres calculs trigonométriques, il y a des gens très calés en la matières qui nous ont mâché le travail en amont et c’est là que je vais vous parler de la librairie Three.js.

Three.js

La librairie Three.js

Three.js c’est donc une bibliothèque JavaScript qui va nous permettre de faire de la 3D à la même manière que Papervision3D le permettait en ActionScript dans Flash, mais cette fois-ci en ayant recours à la technologie de notre choix pour le rendu. Le même code écrit avec Three.js pourra donc être utilisé avec Canvas (2D) ou WebGL.

Attention cependant, WebGL utilise l’accélération matérielle de la carte graphique, bien plus habile avec les calculs matriciels, ce dont Canvas est incapable. Il y a donc de grosses différences de performances entre l’utilisation des deux technologies. Canvas ne pourra donc être utilisé que pour des rendus relativement simples si l’on ne veut pas voir le navigateur flancher sous la masse de calculs.

Commençons par télécharger la librairie à l’adresse suivante sur le dépôt Github : https://github.com/mrdoob/three.js/ (cliquez sur Download ZIP).

Puis initialisons une page HTML comme vous en avez l’habitude. Dans cette page nous allons inclure la librairie Three.js et ajouter un conteneur dans le body. Et juste avant de fermer le body on ajoute un balise script dans laquelle nous insérerons le code JavaScript pour initialiser notre scène en 3D.

<!doctype html>
<html>
  <head>
    <title>Mon premier rendu 3D avec Three.js</title>
    <meta charset="utf-8">
    <link  href="css/main.css" rel="stylesheet"/>
  </head>
<body>
    
  <div id="container"></div>

  <script src="http://mrdoob.github.com/three.js/build/three.min.js"></script>
  <script type="text/javascript">
  <!-- C'est ici que nous utiliserons Three.js -->
  </script>
</body>
</html>

Nous allons donc initialiser notre scène avec le code suivant :

var renderer, scene, camera, mesh;

init();

function init(){
    // on initialise le moteur de rendu
    renderer = new THREE.WebGLRenderer();

    // si WebGL ne fonctionne pas sur votre navigateur vous pouvez utiliser le moteur de rendu Canvas à la place
    // renderer = new THREE.CanvasRenderer();
    renderer.setSize( window.innerWidth, window.innerHeight );
    document.getElementById('container').appendChild(renderer.domElement);

    // on initialise la scène
    scene = new THREE.Scene();

    // on initialise la camera que l’on place ensuite sur la scène
    camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 10000 );
    camera.position.set(0, 0, 1000);
    scene.add(camera);
    
    // on créé un  cube au quel on définie un matériau puis on l’ajoute à la scène 
    var geometry = new THREE.CubeGeometry( 200, 200, 200 );
    var material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } );
    mesh = new THREE.Mesh( geometry, material );
    scene.add( mesh );

    // on effectue le rendu de la scène
    renderer.render( scene, camera );
}

Ces fonctions ne viennent pas du néant, vous pouvez les retrouver dans la documentation Three.js.

Et là, oh magie, vous devriez voir... un cube rouge s’afficher.

Démonstration

“Tout ça pour ça” me direz-vous ? Oui, mais ce carré est en 3D. Si, si je vous l’assure, et je vais même vous le prouver ! Pour s'en rendre compte, rien de mieux que de le faire tourner sur lui même. On commence par ajouter une fonction animate() qui sera appelée récursivement pour mettre à jours les attributs de l'objet à animer.

function animate(){
    requestAnimationFrame( animate );
    mesh.rotation.x += 0.01;
    mesh.rotation.y += 0.02;
    renderer.render( scene, camera );
}

On ajoute un appel à cette fonction juste après l’appel à la fonction init() précédente, puis nous pouvons maintenant retirer la fonction de rendu dans la fonction init() puisque l’appel se fait maintenant via la fonction animate(). Voilà le code final :

var renderer, scene, camera, mesh;

init();
animate();

function init(){
    // on initialise le moteur de rendu
    renderer = new THREE.WebGLRenderer();

    // si WebGL ne fonctionne pas sur votre navigateur vous pouvez utiliser le moteur de rendu Canvas à la place
    // renderer = new THREE.CanvasRenderer();
    renderer.setSize( window.innerWidth, window.innerHeight );
    document.getElementById('container').appendChild(renderer.domElement);

    // on initialise la scène
    scene = new THREE.Scene();

    // on initialise la camera que l’on place ensuite sur la scène
    camera = new THREE.PerspectiveCamera(50, window.innerWidth / window.innerHeight, 1, 10000 );
    camera.position.set(0, 0, 1000);
    scene.add(camera);
    
    // on créé un  cube au quel on définie un matériau puis on l’ajoute à la scène 
    var geometry = new THREE.CubeGeometry( 200, 200, 200 );
    var material = new THREE.MeshBasicMaterial( { color: 0xff0000, wireframe: true } );
    mesh = new THREE.Mesh( geometry, material );
    scene.add( mesh );
}

function animate(){
    // on appel la fonction animate() récursivement à chaque frame
    requestAnimationFrame( animate );
    // on fait tourner le cube sur ses axes x et y
    mesh.rotation.x += 0.01;
    mesh.rotation.y += 0.02;
    // on effectue le rendu de la scène
    renderer.render( scene, camera );
}

Actualisez la page et vous devriez maintenant voir le cube tourner sur lui même. Félicitations, vous savez maintenant faire une animation en véritable 3D dans votre navigateur !

Démonstration

Textures et éclairage

Une dernière petite étape va consister remplacer notre cube par une sphère et à lui appliquer une texture (image JPEG) que nous allons éclairer avec une lumière directionnelle pour donner un peu de cachet à tout ça.

On va donc remplacer la partie concernant la création du cube par le code suivant :

// on créé la sphère et on lui applique une texture sous forme d’image
var geometry = new THREE.SphereGeometry( 200, 32, 32 );
var material = new THREE.MeshBasicMaterial( { map: THREE.ImageUtils.loadTexture('metal.jpg', new THREE.SphericalReflectionMapping()), overdraw: true } );
mesh = new THREE.Mesh( geometry, material );
scene.add( mesh );

// on ajoute une lumière blanche
var lumiere = new THREE.DirectionalLight( 0xffffff, 1.0 );
lumiere.position.set( 0, 0, 400 );
scene.add( lumiere );

Et voilà ! Vous avez une sphère métallique qui tourne sur elle même avec un beau reflet lumineux. Consultez le code source de la démonstration pour bien visualiser les différentes parties entrant en jeu.

Démonstration

Attention, désormais pour des contraintes de sécurité, certaines opérations 3D et notamment le chargement d'images de textures imposent de consulter les pages en mode http:// et non pas en local sur votre disque (file://). Consultez la console JavaScript pour vérifier s'il y a des bugs.

Conclusion

On va s’arrêter là pour le moment. Sachez simplement que la librairie permet beaucoup de libertés. Vous pouvez par exemple :

  • charger des objets 3D modélisés avec votre logiciel de modélisation 3D préféré (3DS Max, Maya, Blender...) et exportés au format Collada pour les importer dans votre scène et les animer ensuite.
  • brancher des événements JavaScript clavier/souris (onclick, onkeypress...) pour piloter la vue 3D
  • exploiter l'API Gamepad pour contrôler vos jeux avec une manette de jeu, ou bien encore Pointer Lock pour la souris.

Techniquement il est tout à fait possible de faire un jeux vidéo 3D complet comme Doom ou Quake 2.

On peut d'ailleurs citer l'excellent travail de Thibaut Despoulain qui a réalisé un superbe jeu de course du nom de HexGL avec Three.js et HTML5.

HexGL

Soyons fous, il serait envisageable de texturiser un objet 3D avec un vidéo via l’API Video de HTML5 qui pourrait elle même se baser sur l’API WebRTC et la méthode getUserMedia() pour capturer la webcam de l’utilisateur (Quelle est l'utilité de faire ça ? Je n'en sais rien mais c'est un bon exemple de la complémentarité des nouveaux composants de HTML5).

Plus loin

Retrouvez l'intégralité de ce tutoriel multi-pages en ligne

Outil : Prepros

$
0
0

Prepros est un "environnement de travail" (workflow) graphique destiné aux projets d'intégrations HTML et CSS basés sur des préprocesseurs tels que LESS, Sass/Compass et Stylus.

Ce logiciel est OpenSource (licence MIT), disponible sur Windows et Mac, gratuit dans sa version de base (largement suffisante), et offre de nombreuses fonctionnalités d'optimisations et d'automatisations.

prepros

Compilation des préprocesseurs

Prepros compile automatiquement les langages LESS, Sass, SCSS, Stylus, Jade, Slim, Coffeescript, LiveScript, Haml et Markdown. Rien que ça.

Vous pouvez choisir le format de sortie du fichier CSS, à savoir : normal, compact ou minifié.

De plus, l'outil dispose de gestions de logs et d'erreurs assez pratiques.

Compression des images

Prepros offre la possibilité de compresser les images de votre projet (JPG, PNG, GIF). À noter toutefois que l'outil d'optimisation d'images est manuel (image par image) et ne vaut pas les ténors dans le domaine même s'il est déjà très bon.

Concaténation JavaScript

Prepros minifie et concatène (réunit) les divers fichiers JavaScript pour n'en obtenir qu'un en production.

Préfixes automatiques

Inutile de vous soucier des préfixes constructeurs (-moz-, -webkit-, etc.) car l'outil peut s'en charger automatiquement pour vous. 

Et il le fait très intelligemment puisqu'il reconnaît même les anciennes syntaxes de propriétés afin de les rendre compatibles multi-navigateurs (par exemple pour les dégradés CSS3 ou les différentes versions du module flexbox).

LiveReload sur différents périphériques

Associé à une extension Chrome, Prepros offre la possibilité d'afficher en ligne son projet et surtout de voir rafraîchir la page automatiquement.

Il est également possible de tester sur mobiles et tablettes grâce au serveur intégré et à l'adresse IP qui est communiquée par l'outi.

FTP en un clic

Cette dernière fonctionnalité (réservée à l'offre payante - 19USD) permet de transférer tous les fichiers, ou uniquement ceux modifiés, vers un serveur FTP.

Conclusion

Au final, Prepros est un environnement de travail particulièrement pratique : il suffit d'enregistrer votre fichier pur qu'il soit automatiquement compilé, préfixé, minifié, mis en ligne et rafraîchi dans le navigateur !

D'autres outils de ce type existent : CodeKit (Mac uniquement) et Mixture.io.

Si vous connaissez déjà l'un de ces outils, n'hésitez pas à partager votre expérience ici.

Outil : Real Favicon Generator

$
0
0

Real Favicon Generator est un outil gratuit en ligne permettant de vérifier et de générer des fichiers "favicon" pour son site web.

Bien plus complet que d'autres outils du même acabit, RFG ne se contente pas de la version favicon de bureau mais également des versions pour smartphones et tablettes iOS, Android et Windows Phone.

Ainsi, s'il manque certaines version ou tailles d'icones, ou que leur taille n'est pas correctement spécifiée, l'outil ne manquera pas de vous en faire part.

Une fois l'audit réalisé, Real Favicon Generator vous propose de concevoir l'ensemble des fichiers (ZIP) et vous livre le code HTML à copier dans vos pages.

Tutoriel : Réduire le poids d'une image SVG : d'Illustrator à l'export final

$
0
0

Beaucoup d’articles prônent l'usage du format d'image SVG pour les illustrations et icônes sur les sites web. Le SVG étant un format vectoriel, il a le très gros avantage de permettre le redimensionnement des images à l’infini sans dégradation. Cette propriété est particulièrement utile si l’on veut s’abstraire de la notion de pixel absolu et que l’on veut des graphismes qui ne deviennent pas flous sur des écrans dits retina ou à grande densité de pixels, sans avoir à créer et charger deux jeux d’images différents.

Un des inconvénients du format SVG peut parfois être son poids. Dans ce tutoriel nous allons utiliser comme exemple le logo de KNACSS pour voir ce qu’il est possible de faire en amont dans Adobe Illustator au moment de la création du SVG pour l'optimiser. Je précise à ce stade que ces optimisations sont faites dans une optique d’utiliser le logo sur le web, si vous souhaitez l’utiliser pour de l'impression vous n’aurez forcément pas les mêmes contraintes. Nous verrons ensuite plusieurs techniques et outils d’export d’Illustrator vers le format SVG et deux outils pour une optimisation du code du fichier final.

Nous ne verrons pas comment embarquer un fichier SVG dans un projet et je vous renvoie à l’article Un logo cliquable SVG avec alternatives pour y retrouver plusieurs techniques. Pour le support de SVG, consultez le tableau disponible sur caniuse.

Ce qui nous intéresse ici c’est de voir comment on peut “préparer” son fichier vectoriel dans Illustrator pour gagner pas mal de poids : le SVG au régime c’est parti !

Bien préparer son fichier vectoriel

Avant même de vous parler de la jolie boîte de dialogue de l’export SVG, voici quelques conseils de conception en amont qui peuvent réduire considérablement le poids du fichier et vous éviter au passage quelques incompatibilités.

Filtre et effets

Sachez tout d’abord que même si le SVG reconnaît certains filtres, tous les filtres et effets disponibles de base dans le logiciel Illustrator sont loin d’être supportés officiellement en SVG. Je vous conseille également d’éviter les dégradés de filet. Si vos couleurs résultent d’un effets de transparence avec un mode de fusion, sachez que le mode de fusion ne sera pas reproductible en SVG, il faudra donc récupérer une couleur proche pour vos zones de fusion.

opacité et mode de fusion

(à gauche le rendu navigateur, à droite le rendu Illustrator avec un mode de fusion “superposition” sur le premier et “éclaircir” sur le second)

Consultez Creating SVG vector graphics for maximum browser compatibility si vous souhaitez plus de détails sur ce qui est faisable dans Illustrator et compatible en SVG.

Dans le cas du logo KNACSS, j’utilisais un effet de grain sur le côté droit de la saucisse. La première étape a donc été de convertir cette texture en vecteur.

Simplification des tracés et optimisation des points

Au niveau des règles de bases, une fois votre logo finalisé :

  • pensez à convertir et décomposer les lignes en tracés fermés pour une meilleure apparence,
  • pensez à convertir votre texte également en tracés,
  • simplifiez les tracés pour voir le moins de points possibles : moins vous aurez de points, plus votre SVG sera léger,
  • évitez autant que possible les images liées dans vos fichiers,
  • utilisez les options du path finder pour fusionner les formes.

Attention, ces actions rendent votre fichier moins facilement modifiable, je vous conseille donc de faire une sauvegarde du fichier de travail avec les tracés en ligne et le texte en police d’écriture.

Au niveau de la simplification des points vous pouvez manuellement utiliser l’outil Warp tool (SHIFT + R) pour retirer des points (voir tutoriel vidéo SVG for the Web: Using the Warp Tool in Illustrator CC sur Adobe TV). Une autre solution consiste à utiliser la boite de dialogue de simplification de tracés disponible sous Objet > Tracé > Simplifier. À vous de trouver le bon réglage au niveau des curseurs.

Simplification des points

Dans le cas de mon logo, j’ai optimisé à la main mon effet de grain en supprimant certains points. Combiné à l’outil de simplification des tracés et une fusion des tracés, je suis passée d’un logo de 66.1 Ko à 26.50 Ko.

Travail sur les couleurs

A ce stade là, jeter un coup d’oeil au couleurs du fichier peut être une bonne idée. Vous avez dans Illustrator un outil totalement génial qui s’appelle Recolor Artwork (correction de l’équilibre des couleurs en français il me semble) qui permet de changer les couleurs en un clic, mais vous donne aussi un aperçu rapide du nombre de couleurs utilisées dans votre illustration.

En jetant un oeil aux couleurs du logo KNACSS je me suis rendu compte que j’avais beaucoup de micro-nuances du même rouge. L’outil permet très facilement de réassigner à différentes plages la même couleur.

Attention je ne dis pas qu’il faut supprimer les couleurs de votre logo au détriment de la direction artistique et richesse de l’illustration, mais dans mon cas, j’avais vraiment des couleurs très proches. Voici le rendu avant / après, je suis passée de 26.5 Ko à 21.1 Ko.

Remplacement de couleurs

Un fichier SVG reste un fichier de code, avoir moins de couleurs permet de plus facilement les factoriser (dans un style CSS par exemple à l’intérieur du fichier) et donc d’avoir moins de caractères pour l’écriture du fichier final.

En allant plus loin, cela permet également potentiellement de changer des couleurs directement en les injectant dans le fichier (via JavaScript par exemple), mais ce n’est pas l’objet de l’article ;)

Options d’export vers SVG depuis Illustrator

(Les captures suivantes ont été réalisées sous Illustrator CC en 2013. Certaines de ces options n’existent peut-être pas sur d’anciennes versions)

Pour exporter du SVG depuis Illustrator, il vous suffit d’utiliser fichier > enregistrer sous et choisir le format .SVG. C’est là que ça se complexifie puisque l’on vous présente une boite de dialogue avec pleins d’options. Je n’entrerai pas dans tous les détails des options mais si vous êtes curieux je vous encourage à lire l’article de Michael Chaize Export SVG for the web with Illustrator CC.

Pour les alergiques à l’anglais, voici un résumé des options qui nous intéressent :

  • utilisez le profil SVG 1.1,
  • pour les polices SVG (format défini par le W3C) et Only Glyphes used (la 2e option) mais attention à ce que votre police soit une webfont. Vous pouvez aussi utilisez l’option Convert to outline au lieu de SVG pour ne pas avoir à convertir vous même la police en tracés,
  • option d’image : lier l’image, en faisant attention au chemin et en la compressant en plus pour éviter un surpoids. Évitez également de cocher la case “Conserver les fonctions d’édition d’Illustrator” si vous ne voulez pas exploser le poids du fichier,
  • Positions décimales : 1 qui permet d’arrondir au dixième les décimaux des points,
  • Cocher la case “Produire moins d’éléments <tspan>”,
  • Cocher la case “Utiliser l’élément <textPah> pour le texte curviligne.

Export SVG

Et sinon pour ceux qui n’ont pas envie de s’embêter avec les configurations, ou veulent aller plus vite je vous propose deux plugins :

Les deux en plus de l’export SVG vous permettent d’accéder à d’autres formats (PNG, JPG) et d’exporter plusieurs calques à la fois (pratique pour des icônes).

J’ai une préférence pour le second plugin puisqu'il a dans les paramètres les options d’export décrites au dessus, mais vous ne pourrez pas l’utiliser si vous avez une version plus ancienne que la Creative Cloud.

Une dernière solution pour ceux qui ont la Creative Cloud consiste à copier votre illustration/logo icone, et coller directement dans un éditeur de texte. Oui, vous avez bien lu, copiez vos tracés, collez dans l’éditeur, vous obtiendrez du SVG (plus ou moins optimisé par contre).

Réduire le poids du fichier final

Une fois le fichier généré, une dernière optimisation est possible avec plusieurs outils.

SVGO-GUI est une application disponible sur Mac OS X, Windows et Linux (et en package Node.js) qui vous permet d’encore gagner un peu de poids sur votre logo SVG. Il vous suffit d’un petit drag & drop de votre fichier dans l’outil. Attention, cela va remplacer le fichier, je vous conseille donc encore une fois de faire une copie au cas où. Avec ce petit outil, le poids de mon SVG final est passé à 14.7 Ko.

Optimisation avec SVGO-GUI

Il existe également un outil en ligne qui s’appelle SVG Optimiser qui vous permet d’appliquer différentes optimisations, et de comparer les deux images avant d’enregistrer.

Pour aller plus loin, on peut encore enfin configurer le serveur pour faire en sorte d'appliquer une compression Gzip sur les fichiers. Je vous renvoie à l’article Utiliser, optimiser et servir des fichiers SVG pour plus de détails.

Conclusion

Dans le cas de mon logo KNACSS, le fichier de base de travail .AI faisait plus de 200 Ko. Je suis passée ensuite d’un SVG de 66 Ko à un peu de plus de 14 Ko. Les plus gros gains ont été effectués en retravaillant directement le fichier d’origine dans le logiciel.

Rappelons que le but ici n’est pas de dégrader la direction artistique parfois très riche d’un logo, mais d’optimiser certains points qui seront “invisibles” à l’oeil une fois que le logo sera utilisé sur un site.

Retrouvez l'intégralité de ce tutoriel multi-pages en ligne


Outil : Tanaguru Contrast-Finder

$
0
0

Un outil de plus pour vérifier si les couleurs sont accessibles ? Pas vraiment. Tanaguru Contrast-Finder fait ce que de nombreux autres outils ne font pas : trouver et proposer des jeux de couleurs accessibles proches de celles que vous venez de tester. Fini les tâtonnements à la pipette pour trouver LA bonne couleur !

Après avoir renseigné les couleurs de texte et d’arrière plan, si le jeu de couleur n’est pas valide alors l’outil proposera plusieurs couleurs plus ou moins proches et accessibles. Vous n’aurez plus qu’à choisir.

L’outil propose quelques options vraiment intéressantes comme la possibilité de sélectionner la couleur à modifier (couleur du texte ou couleur de fond), le ratio minimum ou encore si les résultats doivent proposer des couleurs valides très proches de la couleur initiale.

C’est un logiciel libre sous licence AGPL développé par Open-S et disponible sur GitHub.

Outil : Dareboost

$
0
0

Dareboost se présente comme un site d'analyse et conseil en performance et qualité web.

C'est un outil d'audit en ligne comme il en existe d'autres, mis à part que celui-ci dispose de nombreux atouts qui le différencient de ses confrères, notamment en regard de son périmètre très large :

  • Performances d'affichage
  • Validation / Compatibilité navigateurs
  • Accessibilité
  • Bonnes pratiques SEO
  • Bonnes pratiques jQuery / JavaScript
  • Conseils côté serveur et durée de cache
  • etc.

Et surtout : l'outil est gratuit (et le restera) et il est français !

Certains conseils et certaines évaluations méritent encore toutefois d'être un peu plus explicites pour le commun des mortels, mais dans l'ensemble il s'agit d'un très bon point de départ pour dégrossir les principaux points de progrès de votre site web.

Attention, Dareboost est encore en version beta et n'est pas complètement exempt de bugs ou d'anomalies, cependant leurs auteurs sont plutôt ouverts au dialogue et prompts à corriger les défaillances de l'outil.
Si le coeur vous en dit, un Forum / FAQ est d'ailleurs à votre disposition pour faire évoluer ce produit. Notez, par exemple, qu'une version d'audit pour sites mobiles est prévue dans les tuyaux :)

Tutoriel : Bower pour les nuls (comme moi)

$
0
0

Bower

Vous êtes intégrateur ou développeur front-end ? Vous avez envie de vous faciliter la vie tout en étant quelque peu allergique à la ligne de commande (un peu comme moi en fait) ?

Vous adorez votre job mais vous croulez sous le nombre de tâches répétitives qui vous empêchent de vous concentrer sur votre coeur de métier ?

Alors sachez que Bower fait partie d'une panoplie de services de nouvelle génération destinés à automatiser un maximum de tâches à votre place. Le but de cet outil développé par l'équipe de Twitter est de gérer les dépendances de votre projet.

C'est quoi, une dépendance ?

Laissez-moi deviner : lorsque vous débutez un nouveau projet, votre première tâche est de créer (ou de copier-coller) l'arborescence de vos fichiers et dossiers.

Votre mission suivante est d'aller visiter un par un les outils incontournables pour votre projet : jQuery, Modernizr, Bootstrap, etc. et d'installer les nouvelles versions de ces outils… ou alors de mettre à jour vos propres modules les uns après les autres.

Avouez que vous gagneriez du temps à ne plus vous soucier de ce genre de tâches répétitives quotidiennes.

Eh bien figurez-vous que ça tombe bien : tous les outils tels que jQuery, Modernizr ou Bootstrap sont des dépendances que Bower va vous aider à installer en une ligne de code !

La liste des dépendances inscrites dans le registre de Bower est pour le moins impressionnante, et parmi lesquelles vous trouverez un bon nombre de célébrités :

  • Twitter Bootstrap
  • jQuery
  • html5boilerplate
  • font-awesome
  • modernizr
  • html5shiv
  • normalize
  • jQuery mobile
  • grunt
  • purecss
  • respond
  • raphael
  • zepto
  • phonegap
  • yepnope
  • … knacss

Une base de NodeJS et Git

Deux pré-requis sont nécessaires au bon fonctionnement de Bower :

  • Node.js (et son manager NPM, Node Packaged Modules)
  • Git

Si vous avez déjà compris ce que cela implique, ne prenez pas cet air apeuré : je suis passé par là moi aussi et je m'en suis sorti presque indemne. Il est vrai que vous allez devoir ouvrir votre console et taper quelques lignes de commande.

NodeJS

Installer NodeJS et Git

Sans trop de surprise, vous trouverez les liens d'installation de Node.js sur… le site officiel Node.js.

L'installation de Git pour tous les systèmes, quant à elle, se passe via http://git-scm.com/downloads. Il y a d'autres liens d'installation de Git possibles sur Windows mais celle-là est recommandée et surtout c'est celle que j'ai choisi d'utiliser :)

Note pour Windows : lors de l'installation de Git, vous aurez trois alternatives. Choisissez la deuxième afin d'inscrire Git dans les variables d'environnement du système (voir plus loin).

GitWindows

Ces deux modules essentiels étant installés, on va pouvoir passer aux choses sérieuses.

You shall not PATH !

À ce stade, il est primordial de vérifier que les modules NPM et Git sont bien répertoriées dans les Variables d'Environnement (PATH) de votre système d'exploitation.

À titre d'exemple, sur Windows, ces données se trouvent dans Système > Paramètres système avancés > Variables d'Environnement.

Vérifiez que la variable PATH contient les chemins vers NPM et Git, par exemple ainsi :

C:\Users\***\AppData\Roaming\npm; C:\Program Files (x86)\Git\bin

Si tel n'est pas le cas, il faut ajouter ces chemins au sein de la variable en la modifiant.

PATH

Bravons la ligne de commande !

Il est temps à présent d'ouvrir la console, qui se révèle indispensable pour installer et exécuter Bower. Cela va bien se passer, promis.

Si vous êtes sur Windows, il vous suffit de passer par le menu Démarrer > Exécuter et d'y taper simplement cmd, et valider.
Vous pouvez également, directement au sein d'un dossier, effectuer un Shift + clic droit > ouvrir une fenêtre de commandes ici (voir illustration) :

ouvrir CMD

Installer Bower

Votre console ouverte, l'installation de Bower s'exécute en une simple instruction :

npm install -g bower

C'est tout.

Bower en action !

À présent prêt à l'emploi, Bower va vous permettre d'installer, de mettre à jour ou de désinstaller toutes les dépendances qui vous semblent nécessaires à vos projets.

Ouvrez la console et positionnez le chemin sur votre dossier de projet. Le plus simple est de commencer à écrire "cd " puis de glisser votre dossier directement dans la console (voir illustration animée).

cmd.exe

Charger une dépendance

Nous allons à présent installer notre première dépendance. Il s'agira - au hasard - de KNACSS, le mini framework CSS.

Dans la console, positionnez-vous sur votre dossier de travail et exécutez simplement :

bower install knacss

L'ensemble du projet Github KNACSS, à sa dernière version, se verra automatiquement téléchargé et installé dans un dossier "bower_components" de votre projet ! (Dans l'illustration animée suivante, le dossier KNACSS est généré dans un répertoire "/inc")

install bower

Pour savoir quelles autres dépendances peuvent être ainsi automatiquement récupérées, il suffit de vérifier leur existence dans le répertoire de Bower.

Pour installer une dépendance dans une version précise, ce n'est guère plus compliqué. Il suffit de préciser la version souhaitée à la suite d'un dièse (#) :

bower install knacss#2.9.1

Mettre à jour une dépendance

Pour mettre à jour une ou plusieurs dépendances de votre projet, l'ordre à donner est update :

bower update knacss

Il est également possible de gérer plusieurs dépendances à la fois.

Pour cela, la création d'un fichier bower.json contenant toutes les informations requises est nécessaire.

Voici un exemple-type de fichier JSON :

{
	"name": "projet",
	"dependencies": {
		"knacss": "latest",
		"html5shiv": "latest",
		"box-sizing-polyfill": "latest",
		"modernizr": "latest",
		"jquery": "1.10.2"
	}
}

Pour en savoir plus sur la configuration du fichier bower.json, n'hésitez pas à consulter le fichier Google Drive "Bower Specs".

Voici en image comment installer toute une liste de dépendances en quelques secondes :

bower install 2

Modifier le chemin par défaut

Le chemin par défaut d'installation des dépendances est bower_components.

Vous pouvez modifier cette destination en créant un fichier dédié que vous devrez nommer .bowerrc et qui se trouvera dans le voisinage de bower.json.

Voici un exemple de contenu de .bowerrc indiquant à Bower que les fichiers à gérer se trouvent dans le répertoire "inc" :

{
  "directory": "inc/"
}

Enregistrer votre dépendance dans le répertoire de Bower

Chacun est libre d'ajouter son propre outil au sein du registre de Bower, sous deux conditions :

  • il doit être à libre disposition sur Github
  • un fichier bower.json doit être présent à la racine du projet

Voici à titre d'exemple le fichier bower.json décrivant la dépendance KNACSS :

{
  "name": "KNACSS",
  "version": "2.9.1",
  "homepage": "http://www.knacss.com/",
  "authors": [
    "Raphaël GOETTER, Alsacreations"
  ],
  "description": "KNACSS is a minimalist, responsive and extensible style sheet to kick-start your HTML / CSS projects. It relies on common best practices and experience on the topic.",
  "main": "css/knacss.css",
  "keywords": [
    "css", "framework", "reset", "responsive", "rwd", "boilerplate", "workflow"
  ],
  "license": "WTFPL",
  "ignore": [
    "**/.*",
    "node_modules",
    "bower_components",
    "test",
    "less/knackLESS.zip",
    "tests",
    "README.md"
  ]
}

L'enregistrement à proprement parler passe par l'instruction bower register, suivi du nom de l'application et du chemin vers le fichier Git. Par exemple :

bower register knacss git@github.com:raphaelgoetter/KNACSS.git

Bower vous demande alors une validation, que vous acceptez et c'est fini : votre dépendance devrait à présent apparaître dans le répertoire de Bower.

(Merci à Thierry Lau pour son aide précieuse sur cette partie)

Conclusion

Bien que pratique et rapide, Bower n'en demeure pas moins un "simple" gestionnaire de dépendances : il n'est pas prévu pour construire des dossiers de projets complets, ni pour concaténer ou minifier des ressources. Pour ce genre d'aspirations, et pour aller plus loin, il vous faudra lorgner du côté d'autres outils tels que Yeoman ou Grunt.

Mais ceci est une autre histoire…

jack bower

Retrouvez l'intégralité de ce tutoriel multi-pages en ligne

Article : C'est quoi le Responsive Web Design ?

$
0
0

Consacré "mot-clé de l'année 2013" par le célèbre magazine Mashable, le Responsive Web design (RWD) est aujourd'hui incontournable dans nos projets web (et dans les cahiers des charges de nos clients)… mais demeure toujours aussi confus et insaisissable même chez les professionnels !

Voici donc une petite introduction pour mieux comprendre ce phénomène...

Ébauche de définition

multiscreen 2

Le Responsive Web design est une approche de conception Web qui vise à l'élaboration de sites offrant une expérience de lecture et de navigation optimales pour l'utilisateur quelle que soit sa gamme d'appareil (téléphones mobiles, tablettes, liseuses, moniteurs d'ordinateur de bureau).

Une expérience utilisateur "Responsive" réussie implique un minimum de redimensionnement (zoom), de recadrage, et de défilements multidirectionnels de pages.

Le terme de "Responsive Web design" a été introduit par Ethan Marcotte dans un article de A List Apart publié en mai 2010.
Il décrira par la suite sa théorie et pratique du responsive dans son ouvrage "Responsive Web Design" publié en 2011. Celle-ci se limite à des adaptations côté client (grilles flexibles en pourcentages, images fluides et CSS3 Media Queries).

RWD-wireframes est un très bon outil visuel permettant de créer rapidement de simples gabarits responsive en quelques clics. Il est très parlant pour un client ;)

RWD wireframes

Site dédié, application ou responsive ?

Nous disposons actuellement de trois moyens pour véhiculer le contenu web sur des appareils connectés : un site dédié, une application native et une version responsive de site web.

Sachez que chaque solution a des avantages et des inconvénients : selon vos besoins et contraintes (notamment de budget et de délais), il pourra être parfaitement pertinent d'opter pour l'une ou l'autre.

Un site dédié

web mobile

Un projet de site dédié consiste à concevoir deux ou plusieurs entités différentes selon le dispositif visé : un site principal, un site pour smartphones, un site pour tablettes, etc.

Généralement, un test initial côté serveur détecte le type d'appareil et renvoie vers une adresse web dédiée (m.monsite.com par exemple).

Les avantages des sites web dédiés sont :

  • La possibilité d'affiner précisément la structure du site et ses contenus en regard du périphérique utilisé
  • La possibilité de cibler et de s'adapter à des fonctionnalités variées (notamment le touch)
  • Peut être une alternative "rapide", en attendant une refonte complète (et responsive) de son site web

Mais un site dédié n'est pas exempt d'inconvénients :

  • Le contenu dupliqué ("duplicate content")
  • La maintenance de plusieurs versions de site et de plusieurs adresses web (moins facilement indexables par un moteur de recherche)
  • La détection côté serveur ("UA sniffing") souvent biaisée ou non à jour

Une application native

Une application native est un produit développé spécifiquement dans divers "langages" (iOS, Android, WindowsPhone) et qui se télécharge et se référence au sein d'un "Store" (AppStore, Google Play, Windows store).

Cela lui confère certains avantages :

  • La prise en charge facilitée de fonctionnalités natives (touch, accéléromètre, notifications, GPS, etc.)
  • Un installation possible sur son périphérique
  • Une totale "acclimatation" au périphérique (ergonomie, performances, densité de pixels)
  • La présence de sa marque sur l'AppStore (pour ne citer que lui) et de pouvoir disposer d'un "raccourci" sur le smartphone de l'utilisateur

… Mais aussi certains inconvénients :

  • Un développement spécifique dans plusieurs langages (propres à iOS, Android, WindowsPhone, etc.)
  • Le coût du développement, des licences, et de la maintenance pour chaque système d'exploitation
  • Un contenu non indexable par un moteur de recherche web classique
  • La mise à jour de l'application nécessite une action de l'utilisateur

Une version responsive

À l'heure où des centaines de tailles et formats d'écrans différents se connectent à chaque instant, la méthode du Responsive Web design apparaît comme la "solution de facilité" en vertu de son objectif principal:

s'adapter à tout type d'appareil de manière transparente pour l'utilisateur

  • Des coûts et des délais généralement inférieurs aux techniques citées précédemment
  • Une maintenance de projet facilitée (une seule feuille de style, un seul fichier HTML, etc.)
  • Une mise à jour transparente et un déploiment multi-plateformes
  • Le Responsive peut être envisagé après la conception initiale du site (même si ce n'est pas l'idéal)

Les inconvénients ne sont cependant pas nuls :

  • De bonnes connaissances techniques, et une veille technologique constante, sont indispensables
  • Il est nécessaire de prévoir des tests nombreux et variés tout au long du projet ("device labs", simulateurs)
  • Il est difficile de contourner les limites ergonomiques et de performances des navigateurs web
  • Faire du responsive, c'est… plus long que de ne rien faire (25% du temps supplémentaire)

Au final, le Responsive Web design n'est qu'un moyen parmi d'autres de parvenir à ses objectifs mais ne doit pas être considéré comme la seule éventualité ni comme une "solution magique" à tous les problèmes.

D'ailleurs, il est fréquent qu'un cumul de différentes méthodes soit employé : par exemple un site à la fois dédié et responsive, ou un site responsive garni de certaines détections côté serveur (on parle alors de RESS), etc.

Le site mediaqueri.es est une excellente ressource pour découvrir d'autres sites web responsive à travers un annuaire.

multiscreen

Responsive, Adaptatif ou Liquide ?

En France, et selon Wikipedia, le Responsive Web Design est un synonyme de "site web adaptatif".

Techniquement, il conviendrait de distinguer les sites web Responsive, Adaptatifs et Liquides :

  • Un site web Liquide (ou fluide) est un site web dont les largeurs de colonnes sont exprimées en unités variables (pourcentages, em, vw, etc.) et qui s'adapte généralement automatiquement à la taille de fenêtre, jusqu'à une certaine mesure
  • Un site web Responsive est un site web fluide associé à des méthodes CSS3 Media Queries permettant de modifier les styles (ré-organisation de la page par exemple) selon certains critères, pour s'adapter complètement à la taille d'écran.
  • Un site web Adaptatif va beaucoup plus loin : il prend en compte tous les aspects de performance (chargements conditionnels de ressources), d'accessibilité, d'ergonomie spécifique, etc.

et techniquement, le RWD ça implique quoi ?

Iceberg

Depuis sa première appellation en 2010, le Responsive Web design a quelque peu évolué. Il nécessite actuellement - en général - les technologies et méthodes suivantes:

  • Une grille fluide, où les largeurs des éléments de structure sont débarrassées des unités de pixels
  • Des images, des médias et des contenus flexibles leur permettant de ne pas "déborder de leur parent" lorsque celui-ci se restreint
  • Une adaptation de l'affichage au Viewport du terminal
  • Des CSS3 Media Queries permettant d'appliquer différentes règles de styles CSS selon la taille, l'orientation ou le ratio du device
  • Éventuellement des adaptations conditionnelles (menu de navigation) côté client, basées sur JavaScript ou jQuery
  • Une philosophie "Mobile First" et "Enrichissement progressif" facilitant l'accessibilité, la compatibilité et la performance des pages produites
  • De plus en plus souvent de parties détectées et générées côté serveur (RESS), là aussi notamment pour accélérer l'affichage de certains composants ou ressources.

Au final, le Responsive Web design, c'est pas si facile !

Ressources

Crédits illustration "iceberg" : Stéphanie Walter

Article : Détecter le support des fonctionnalités avec @supports

$
0
0

La règle @supports, également nommée “règle conditionnelle”, permet de détecter la reconnaissance de certaines propriétés CSS au sein du navigateur.

Introduite au sein des spécifications dans le module des CSS conditionnelles, au même titre que les Media Queries, la règle @supports se rapproche de ce que peut nous offrir un outil tel que Modernizr, à savoir détecter le support ou non d’une fonctionnalité CSS chez votre visiteur afin de prévoir une alternative au besoin.

Compatibilité

Au statut de “Candidate recommendation”, @supports est actuellement compatible sur les navigateurs suivants, selon Can I Use :

Navigateurs Versions Détails
Firefox Firefox 22+
Firefox Mobile 28+

Supporté depuis Firefox 17 en activant une preference du navigateur

Chrome Chrome 28+
Chrome Mobile 33+
 
Opera Opera 12.1+
Opera Mobile 16+
 
Android Browser Android Browser 4.4+  

Syntaxe générale

À l’instar des autres règles-at, @supports intègre une ou plusieurs règles au sein d’un bloc d’accolades.

La - ou les - condition(s) doivent être individuellement entourées de parenthèses.

Voici un exemple de règle conditionnelle valide :

@supports  (hyphens: auto) {
  p {
    hyphens: auto;
    }
}

Les règles conditionnelles suivantes sont invalides :

@supports  (hyphens) { /* valeur obligatoire */
  ...
}

@supports  (hyphens: auto and text-align-last:justify) { /* parenthèses individuelles obligatoire */
  ...
}

Opérateurs

La règle @supports accepte les opérateurs suivants :

  • not (négation),
  • and (et),
  • or (ou)

Exemples

Tester le support d’une propriété préfixée avec or

@supports  (-webkit-filter: sepia(1)) or (filter: sepia(1)) {
  .sepia {
    -webkit-filter: sepia(1);
    filter: sepia(1);
    }
}

Tester la non-reconnaissance d’une propriété avec not

@supports not (height: 100vh) {
  html, body {height: 100%; margin: 0; padding: 0}
  .content {min-height: 100%; display: table}
}
@supports  (height: 100vh) {
  .content {height: 100vh;}
}

Tester à l’aide d’une combinaison d’opérateurs

Dans le code suivant, le test est vérifié si display: flex est supporté et si display: grid n’est pas supporté :

@supports  (display: flex) and ( not (display: grid) ) {
  body {
    display: flex;
    }
}

Gare aux faux-négatifs !

La règle @supports est parfois moins bien supportée que la propriété testée, et les résultats peuvent en être faussés.

Par exemple dans le test suivant, le module CSS3 Grid Layout est bien supporté par Internet Explorer 10, mais c’est @supports qui n’est pas reconnu sur ce navigateur !

@supports  (display: -ms-grid) or (display: grid) {
  div {
    display: -ms-grid;
    display: grid;
    }
}

Version JavaScript

Pour information, l’équivalent JavaScript de la règle @supports se présente sous la forme de la méthode CSS.supports().

Les spécifications proposent deux types de syntaxes pour cette méthode :

if( CSS.supports( 'property', 'value') )  { }

if( CSS.supports( '(property: value) and (property: value') ) { }

Ressources

Viewing all 405 articles
Browse latest View live