Source: Importing CSS Breakpoints Into JavaScript (adapté pour Magento 2).
!important: ce tuto demande à créer/modifier un certain nombre de fichiers. Le respect de l’organisation de ces derniers dans l’arborescence de votre thème est capital pour le bon fonctionnement de la fonctionnalité présentée. Vous pourrez bien-sûr modifier les emplacements des fichiers, mais pensez dans ce cas à mettre à jour tous les chemins en conséquence.
L’arborescence utilisée dans le code source fourni est mise à plat plus bas.
Intérêt pour le développeur Magento 2 d’importer les breakpoints LESS pour une exploitation avec javascript?
Magento 2 permet, par le biais de l’outil matchMedia.js, de déclencher du code javascript/jQuery en fonction d’un point de rupture. Extrait de la documentation officielle à ce sujet:
1 2 3 4 5 6 7 8 9 10 11 12 |
/*...*/ mediaCheck({ media: '(min-width: 768px)', // Switch to Desktop Version entry: function () { /* The function that toggles page elements from desktop to mobile mode is called here */ }, // Switch to Mobile Version exit: function () { /* The function that toggles page elements from mobile to desktop mode is called here*/ } }); /*...*/ |
On remarque que la valeur du point de rupture est renseignée de manière statique (768px): media: '(min-width: 768px)'
. Ce procédé a ses limites. Le jour où la valeur de ce breakpoint est modifiée dans la feuille de style, il faudra mettre à jour à la main toutes les déclarations faites avec matchMedia.
Le but est donc de rendre dynamique la valeur de media:
.
Partie LESS:
Si il n’existe pas encore dans votre thème, créer un dossier app/design/frontend/<Vendor_name>/<theme_name>/web/css/vendor/less-curious/
et y placer, à la racine, l’intégralité des fichiers disponibles sur ce repository Git.
A ce stade, il est surtout important que les fichiers for.less
et for-each.less
soient accessibles respectivement depuis les chemins suivants:
app/design/frontend/<Vendor_name>/<theme_name>/web/css/vendor/less-curious/src/for.less
app/design/frontend/<Vendor_name>/<theme_name>/web/css/vendor/less-curious/src/for-each.less
- Note: le repo Git pouvant disparaître du jour au lendemain, un backup au format ZIP est disponible ici 😉.
- Note #2: si vous regardez le code source du projet less-curious, vous remarquerez peut-être que ce dernier est déprécié et que l’auteur fournit un lien vers une version plus actuelle, full JS à intégrer avec un pré-processeur comme Grunt. Problème: j’ai eu beau suivre les bonnes pratiques d’intégration d’un plug-in pour grunt-contrib-less dans le système mis en place dans Magento 2, je n’ai rien réussi à compiler… UPDATE (pas testé) 05/11/2019: la solution se situe peut-être dans la mise en place d’une configuration custom de Grunt.
Si il n’existe pas encore dans votre thème, créer un dossier app/design/frontend/<Vendor_name>/<theme_name>/web/css/source/devtools/
.
Créer le fichier app/design/frontend/<Vendor_name>/<theme_name>/web/css/source/devtools/_js-mediaqueries.less
et placez-y le code ci-dessous:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
@import "../../vendor/less-curious/src/for.less"; //@import "../../vendor/less-curious/src/for-each.less"; body:before { content: "smartphone"; display: none; // Prevent from displaying. } // Retrieve default breakpoints values from here: // "lib/web/css/source/lib/variables/_responsive.less" // (also, if any, add your custom breakpoints to the list too) @breakpoints: screen__xxs @screen__xxs, screen__xs @screen__xs, screen__s @screen__s, screen__m @screen__m, screen__l @screen__l, screen__xl @screen__xl; .for(@breakpoints); .-each(@value) { @breakpoint-key: extract(@value, 1); @media (min-width: extract(@value, 2)) { body:before { content: "@{breakpoint-key}"; } } } // Activate for front-end hints .jsBreakpoints-hints { position: fixed; z-index: 99999; top: 10px; right: 10px; &.is-active { display: block; } &:hover { cursor: pointer; } .breakpoint { background-color: #ca322c; color: white; display: inline-block; padding: 2px 4px; } } |
Dans le fichier app/design/frontend/<Vendor_name>/<theme_name>/web/css/source/_theme.less
, ajouter la ligne suivante JUSTE EN-DESSOUS des potentielles surcharges que vous avez faites des variables pré-déclarées dans le(s) thème(s) parent(s) dont votre thème va hériter:
1 2 3 |
// Import _js-mediaqueries.less from _theme.less, // RIGHT AFTER declarations (overrides) of existing variables. @import "../source/devtools/_js-mediaqueries.less"; |
Partie JS:
Créer le fichier app/design/frontend/<Vendor_name>/<theme_name>/web/js/js-mediaqueries.js
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
require([ 'jquery' ], function($){ 'use strict'; $(function () { // to ensure that code evaluates on page load var breakpoint = {}; breakpoint.refreshValue = function () { this.value = window.getComputedStyle( document.querySelector('body'), ':before' ).getPropertyValue('content').replace(/\"/g, ''); }; // Activate for front-end hints $('<div id="jsBreakpoints" class="jsBreakpoints-hints"><span class="breakpoint breakpoint-isCurrent"></span></div>').appendTo('body'); $(window).resize(function () { breakpoint.refreshValue(); // Activate for front-end hints $('.breakpoint-isCurrent', '#jsBreakpoints').html(breakpoint.value); }).resize(); // Activate for front-end hints $('#jsBreakpoints').on('click', function(){ $(this).remove(); }); }); }); |
Créer ou adapter le fichier app/design/frontend/<Vendor_name>/<theme_name>/requirejs-config.js
:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
// How To add JS file in frontend for all pages // https://magento.stackexchange.com/a/131635 var config = { map: { '*': { 'jsMediaqueries': 'js/js-mediaqueries' } }, // Shim: when you're loading your dependencies, requirejs loads them all // concurrently. You need to set up a shim to tell requirejs that the library // (e.g. a jQuery plugin) depends on another already being loaded (e.g. depends // on jQuery). shim: { 'jsMediaqueries': { deps: ['jquery'] } } }; |
Partie XML:
Créer le fichier app/design/frontend/<Vendor_name>/<theme_name>/Magento_Theme/layout/default_head_blocks.xml
:
Note: si ce fichier existe déjà dans votre thème, ajouter simplement la ligne <script src="js/js-mediaqueries.js" />
entre les balises <head>
.
1 2 3 4 5 |
<page xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:View/Layout/etc/page_configuration.xsd"> <head> <script src="js/js-mediaqueries.js" /> </head> </page> |
Commandes à exécuter en bash:
- Un
cache:clean
$ rm -rf pub/static/*; rm -rf var/view_preprocessed/*
Un process Grunt doit tourner ou une compilation des assets front-end via une commande Magento doit être faite.
Arborescence complète, selon les fichiers de ce tuto:
- app/design/frontend/[Vendor_name]/[theme_name]/
- Magento_Theme/
- layout/
- default_head_blocks.xml
- layout/
- web/
- css/
- source/
- devtools/
- _js-mediaqueries.less
- vendor/
- less-curious/
- src/
- for.less
- for-each.less
- src/
- less-curious/
- _theme.less
- devtools/
- source/
- js/
- js-mediaqueries.js
- css/
- requirejs-config.js
- Magento_Theme/