Mois : septembre 2017

[Foundation 6] Erreur « Error: Syntax error, unrecognized expression: ##panel2 » avec le composant Tabs

Si vous avez cette erreur en utilisant le code de base du composant Tabs de Foundation 6 for Sites :

…il faut retirer l’attribut data-tabs-target="#panel2" du code qui est donné en exemple. C’est lui qui fout la m*&$e.

[Responsive design][SASS] Un tableau responsive en mode No More Tables (version 2017)

Sources sur github.com – responsive-tables.

Source de départ: No more tables – This technique was developed by Chris Coyier (@chriscoyier) and described in his post Responsive Data Tables at css-tricks.com. While you’re there, you should probably check out the Responsive Tables Roundup post, which showcases all these techniques and more.

Demo JSFiddle.net

jQuery (si besoin de fixer les hauteurs des rangées)

[Responsive design][jQuery][SASS] Un tableau responsive en mode Flip Scroll (version 2017)

Sources sur github.com – responsive-tables.

Source de départ: Responsive Tables – Flip Scroll. his technique was first published by David Bushell (@dbushell). For the full low down on this technique visit his post on the technique, Responsive Tables (2). While you’re there, it’s also worth checking out his responsive calendar proof of concept.

Demo jsFiddle.net; Même chose (optimisé par Anthony)

Attention: le système de mediaqueries SASS/JS dans le code qui va suivre est issu de Foundation 6.

[jQuery] Utiliser la méthode .map() pour récupérer des informations, les stocker dans un tableau et les réutiliser

Version à utiliser


Version obsolète

Code sans les commentaires:

[Handlebars] Recettes, astuces, bonnes pratiques

Boucler dans un tableau en excluant le premier élément

Source: Handlebars.js – loop an array excluding the first element?

Utiliser un même markup HTML pour afficher une liste de membres ayant chacun des caractéristiques différentes

facets.yml

Code HTML

Résultat en front:

[jQuery][CSS][Internet Explorer] Bug de détection de la pseudo-classe :hover ou de l’événement mouseover sur une bordure CSS

Problème:

Sous IE (Internet Explorer), j’ai un menu déroulant dropdown dont la partie déroulée (les sous-niveaux) se masque involontairement lorsqu’elle est survolée au passage de la souris.

Autrement dit, IE (même les versions les plus récentes) n’est pas capable de détecter une bordure CSS comme un élément « physique ». Dans le cas de mon menu, le sous-niveau est encadré par une bordure grise de 10px d’épaisseur. Lorsqu’on navigue à la souris et qu’on fait le chemin de l’entrée « Particuliers » vers le sous-menu correspondant (cf. capture ci-dessous), le curseur traverse la bordure ce qui a pour effet une perte de focus et une disparition prématurée de la partie déroulée. (La bordure incriminée est en noir dans ma capture – lorsque le curseur de la souris passe dessus, le sous-menu disparaît).

Solution:

Ne pas utiliser la propriété CSS border pour un habillage se trouvant sur le passage de la souris. 🙂
J’ai d’abord tenté (sans succès) de remplacer la border-top par une ombre interne avec la propriété CSS box-shadow et la valeur inset.

La solution qui fonctionne consiste à utiliser un dégradé CSS (gradient). On commence par générer son dégradé via un outil en ligne comme Ultimate CSS Gradient Generator par Colorzilla.

Le code CSS généré est le suivant:

Suivant les navigateurs qu’on souhaite supporter, on peut réduire le code à cette ligne (à condition d’utiliser un outil d’auto-prefixage CSS qui rajoute les -moz, -webkit, -o, -ms en fonction du scope de navigateurs et OS prédéfinis) :

Il reste ensuite à modifier cette ligne en fonction de notre besoin. Dans mon cas, remplacer par les bonnes couleurs et remplacer l’unité % par du px pour coller aux 10px de ma bordure:

[jQuery][Foundation 6] Détecter la direction du scroll et agir sur des éléments Sticky

Plug-in scrollDirection disponible sur GitHub: https://github.com/franklang/detect-scroll-direction.

Les bases de la mise en place

Le composant Sticky de Foundation 6 for Sites permet de fixer des éléments dans la fenêtre. La technique est utilisée par de nombreux sites pour, par exemple, laisser le bandeau affiché lorsque l’utilisateur scrolle vers le bas de la page.

Il manque cependant une fonctionnalité très ergonomique, notamment sur les plus petits devices (smartphones, petites tablettes) qui consiste à masquer le bandeau lorsque l’utilisateur scrolle vers le bas de la page et à l’afficher dès qu’il scrolle vers le haut (afin qu’il n’ait pas besoin de scroller jusqu’au haut de page pour atteindre le menu, par exemple). Et cette seconde technique est présente sur de plus en plus de sites (https://wpformation.com/ – visionner avec un Smartphone, http://www.eurosport.fr/cyclisme/ – visionner avec un Smartphone).

On commence par mettre en place le composant Sticky (jusque là, pas de dev spé : tout est disponible dans Foundation.

Ensuite, on ajoute en spé (via jQuery) un data-attribute nommé data-scroll-direction sur l’élément HTML de la page. La valeur de ce data-attribute sera down ou up selon que l’utilisateur scrolle vers le bas ou vers le haut de la page.

On cible ensuite les éléments à masquer au scroll down.

Illustration:

1. L’utilisateur arrive sur la page; elle se présente comme ceci:

2. L’utilisateur a scrollé vers le bas. Dans notre exemple, une partie seulement du bandeau est masquée. On laisse en Sticky le moteur de recherche car il est très important sur ce site.

3. L’utilisateur a scrollé vers le haut (1px de scroll vers le haut suffit). La partie masquée du bandeau réapparait.

Appliquer une animation et un délais

Utilisation du projet animate.css

Importer le projet https://daneden.github.io/animate.css/ dans votre propre projet (j’utilise npm pour celà). On charge uniquement les animations dont on a besoin:

Agir sur votre élément Sticky en invoquant les animations et en ajoutant un temps d’exécution:

La fonction hideWithDelay

Permet d’appliquer une classe .hide (qui n’est autre qu’un display: none;) issue de Foundation 6 for Sites au bout de x secondes, qui correspond au temps qu’il faut à votre animation CSS pour se terminer. Dans notre exemple, l’animation CSS mettra 300ms à s’exécuter mais on ajoute la classe .hide au bout de 290ms pour éviter un effet de flash à l’écran:

Résolution d’erreurs, bugs…

Des éléments de la page ou l’ascenseur de la fenêtre se mettent à clignoter (flickering, blinking)

Source: sticky header blinking.

Testé et fonctionnel sur un projet en prod: il suffit de mettre une hauteur fixe à l’élément sticky. Si votre site/appli est Responsive, que la hauteur est différente d’un breakpoint à l’autre et que vous avez la chance d’utiliser Foundation For Sites (v6 dans mon exemple) :

Même solution en vanilla JS (mais avec Lodash)

Cas particulier: les éléments sticky disparaissent totalement en haut de l’écran (avec effet d’animation) avant de réapparaître brutalement

ATTENTION: on part bien du composant Sticky de Foundation for Sites v6, animé via la bibliothèque animate.css (et plus précisément l’animation slideOutUp). Ce cas particulier peut éventuellement vous donner des pistes si vous utilisez un autre composant sticky et une autre bibliothèque d’animation, mais il existe aujourd’hui d’autres moyens de produire un effet de smooth scroll qu’il vaut mieux privilégier.

Pour ce qui est de la qualité de cette soultion, ne la cherchez pas… Mais elle a le mérite de fonctionner!

Dans ce cas là, les animations proposées par la bibliothèque Animate.css peuvent ne pas convenir. Dans la déclaration CSS transform: translate3d(0, -100%, 0); la valeur de -100% correspond à la hauteur de l’élément. C’est ce fait qu’on voit l’élément sticky scroller entièrement hors-champ avant de réapparaître brutalement.

Mon idée: appliquer temporairement (le temps de l’animation) un margin-top de la hauteur de l’élément à ce dernier afin qu’il s’arrête aux limites de la fenêtre, puis retirer ce style.

Ressources en ligne:

Nouvelle version:

Ma nouvelle animation:

Une fonction javascript qui s’occupe d’appliquer le margin-top (qui peut posséder une valeur dynamique):

…qu’on applique avec un tout petit délais histoire de laisser le temps au DOM de se mettre à jour:

Ancienne version:

Ma nouvelle animation:

…appliquée à mes éléments avec l’ajout de forwards:

Une fonction javascript qui s’occupe d’appliquer le margin-top (qui peut posséder une valeur dynamique):

…qu’on applique avec un tout petit délais histoire de laisser le temps au DOM de se mettre à jour:

[Bootstrap][Foundation] Bug du composant Dropdown sur iPad et iPhone

Problème: les composants Dropdown de Bootstrap et Foundation ne s’activent pas sur iPad et iPhone alors qu’ils fonctionnent sur n’importe quel périphérique sous Android.

Solution: il s’agit juste d’un problème de markup. Il faut obligatoirement utiliser l’élément <button type="button">Mon dropdown qui fonctionne sur les mobiles d'Apple</button> et surtout pas l’élément <a> (même avec un attribut role="button".

Moralité: Apple, c’est de la grosse daubasse.

[CSS] Des mediaqueries adaptées à chaque marque et version de smartphones et tablettes

Principalement Apple et Samsung, mais pas que … Device Specific CSS Media Queries Collection.

Version de début septembre 2017; vérifier le git pour la version la plus à jour.