Maison >interface Web >tutoriel CSS >Migrer vers Flexbox en coupant la moutarde
En tant que développeurs frontaux, le moment est venu de s'éloigner de l'utilisation de chars CSS et de plonger dans le nouveau monde passionnant de Flexbox. Les flotteurs CSS sont une approche datée des dispositions de style; Ils sont disponibles dans Internet Explorer depuis la version 4.0 et les solutions de contournement sont nécessaires pour les rendre malléables (y compris le piratage de ClearFix et l'utilisation de la pseudo-classe pour les colonnes d'emballage).
.Le sujet principal de cet article est de savoir comment implémenter Flexbox sur plusieurs navigateurs en tenant compte de sa fragmentation. Si vous voulez vous familiariser avec Flexbox, il existe de nombreuses bonnes ressources disponibles, et je recommande fortement ce qui suit:
À la fin de cet article, vous devriez pouvoir:
Le module de mise en page flexible de la boîte (A.K.A. Flexbox) est une nouvelle façon de structurer les dispositions dans CSS. Il a subi plusieurs révisions et a évolué de manière significative dans son existence relativement courte. Au moment de la rédaction du temps, Flexbox est toujours un projet de travail W3C, mais, comme d'autres normes, cela ne devrait pas le rendre peu attrayant dans un environnement de production.
Il y a trois itérations de la norme, communément appelée l'ancienne syntaxe, la syntaxe de Tweener et la nouvelle syntaxe.
Les limites de Flexbox sont bien documentées:
Enveloppement (flex-wrap) est une caractéristique importante de la spécification, qui est nécessaire pour créer une grille réactive. Pour cette raison, il est préférable de cibler uniquement les versions de syntaxe et de navigateur Tweener qui implémentent pleinement la nouvelle syntaxe.
Cela nous laisse avec les versions de navigateur suivantes:
Comme il y a des navigateurs avec une part de marché importante qui ne prend pas en charge Flexbox, celles-ci devraient se rendre à l'utilisation des flotteurs CSS. Mais comment cela peut-il être exprimé dans le code? Quelle est la meilleure façon de différencier les versions du navigateur qui devraient recevoir CSS avec des flotteurs au lieu de Flexbox? Quelle stratégie peut être utilisée pour garantir que les versions de Firefox qui soutiennent la nouvelle syntaxe mais ne prennent pas en charge l'emballage sont identifiées comme héritées?
Présentation: couper la moutarde.
Si vous ne l'avez pas entendu comme terme technique auparavant, «Couper la moutarde» a été inventée par l'équipe de développement de BBC News. Le terme provenait du fait que le site Web de la BBC doit répondre à un vaste public international et cibler des versions et des appareils de navigation en particulier aurait été une solution lourde.
Le nœud du concept identifie le navigateur / périphérique / agent utilisateur est utilisé et sert des polyfills pour faire fonctionner le site. L'existence de fonctionnalités spécifiques est détectée du côté client et donc la solution la plus appropriée pour la technologie disponible est livrée.
La détection des fonctionnalités n'est pas nouvelle. L'article de la BBC susmentionné a été publié en mars 2012 et bien qu'il ait gagné en popularité, il est surprenant de voir des sites Web mettant en œuvre des classes conditionnelles spécifiques à l'IE telles que popularisées par Paul Irish en 2008.
Modernizr (contribué à Paul Irish) est une question de détection des fonctionnalités:
Profiter de nouvelles technologies Web cool est très amusante, jusqu'à ce que vous deviez prendre en charge les navigateurs qui sont à la traîne. Modernizr vous permet de rédiger facilement JavaScript conditionnel et CSS de gérer chaque situation, que ce soit un navigateur prend en charge une fonctionnalité ou non. Il est parfait pour faire une amélioration progressive facilement.
Bien que CSS ait désormais une détection des fonctionnalités natives, il n'a actuellement pas suffisamment de part de marché pour être viable pour une utilisation réelle. Le reste de cet article discutera comment abandonner les commentaires conditionnels de l'IE en faveur de la détection des fonctionnalités en JavaScript.
Chaque projet nécessite un ensemble différent de fonctionnalités pour fonctionner. Il existe plusieurs façons dont la détection des fonctionnalités peut être réalisée, dont la plus facile comprend:
L'approche la plus efficace est la mise en œuvre de la vanille JavaScript. Il est rapide (car il ne nécessite pas que le client télécharge des bibliothèques supplémentaires) et ne nécessite aucun traitement supplémentaire. Cette approche est loin d'être parfaite car il y a des problèmes connus; Cependant, il existe des moyens de surmonter les problèmes communs de détection des caractéristiques.
[b] La détection du rowser est devenue un enchevêtrement impossible et est largement tombée en désaccord, pour être remplacée par quelque chose de bien mieux - détection de caractéristiques.
[…] La détection des fonctionnalités n'est pas complètement fiable non plus - il y a des moments où il échoue.
- James Edwards
Choisir Modernizr pour couper la moutarde peut ne pas être aussi efficace (car il nécessite le téléchargement et le traitement des clients), mais la détection manuelle du support Flex-Wrap n'est pas une tâche simple. Il est également important de noter que bien que Modernizr version 2 ne détecte pas Flex-Wrap, la version 3 le fait! La fonction est étiquetée comme un enveloppement de ligne flexible.
Bien que l'option existe pour utiliser les classes CSS attachées à la racine du document produite par Modernizr (par exemple: html.flexwrap), il est préférable de servir des fichiers CSS séparés pour chaque expérience pour réduire la taille de téléchargement du site.
Les développeurs de nouvelles de la BBC se réfèrent à deux types de navigateurs:
quelqu'un de l'équipe a commencé à les qualifier de «navigateurs HTML4» et de «navigateurs HTML5», ce que nous constatons est plus facile à communiquer le sentiment aux personnes non techniques.
- BBC Responsive News
Cette justification était parfaitement valable lorsque vous considérez le climat du paysage du navigateur en 2012; Cependant, à mesure que de nouvelles fonctionnalités deviennent disponibles, la division n'est pas nécessairement aussi claire. Flexbox, par exemple, n'est pas entièrement pris en charge dans tous les navigateurs "HTML5".
Une approche robuste consiste à faire la différence entre les versions de navigateur «hérité» et «moderne». De plus, certains projets peuvent nécessiter plusieurs divisions où les navigateurs à mi-chemin (ou «transitionnels») peuvent être identifiés.
Commencez par créer les fichiers suivants:
Voici à quoi ressemblera notre fichier index.html:
<span><span><!DOCTYPE html></span> </span><span><span><span><html</span> class<span>="no-js"</span>></span> </span> <span><span><span><head</span>></span> </span> <span><span><span><title</span>></span>Cutting the mustard<span><span></title</span>></span> </span> <span><span><span><script</span> src<span>="javascripts/dependencies.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><noscript</span>></span> </span> <span><span><span><link</span> rel<span>="stylesheet"</span> href<span>="stylesheets/legacy.css"</span>></span> </span> <span><span><span></noscript</span>></span> </span> <span><!-- ... --> </span> <span><span><span></head</span>></span> </span> <span><span><span><body</span>></span> </span> <span><span><span><div</span> class<span>="container"</span>></span> </span> <span><span><span><div</span> class<span>="cell cell-1"</span>></span>Cell 1<span><span></div</span>></span> </span> <span><span><span><div</span> class<span>="cell cell-2"</span>></span>Cell 2<span><span></div</span>></span> </span> <span><span><span><div</span> class<span>="cell cell-3"</span>></span>Cell 3<span><span></div</span>></span> </span> <span><span><span><div</span> class<span>="cell cell-4"</span>></span>Cell 4<span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></body</span>></span> </span><span><span><span></html</span>></span></span>
Remarquez qu'il n'y a pas de commentaires conditionnels IE? Il suffit de nettoyer et un code HTML valide. Et si le navigateur n'a pas de JavaScript activé, il reprendra l'utilisation de Legacy.css quel que soit son niveau de soutien.
Vous pouvez également remarquer que les balises de script sont en haut de la page HTML. En effet, Modernizr devrait traiter et injecter les feuilles de style avant que le navigateur ne peint pour la première fois. Cela réduit la repeinte et aide à éviter un éclair de contenu non utilisé (FOUC). Mais n'oubliez pas que la plupart des balises de script seraient en bas de la page.
Notre fichier hérité.css contiendra les éléments suivants:
<span><span>.container</span> { </span><span>} </span> <span>/* clearfix */ </span><span><span>.container:after</span> { </span> <span>content: ""; </span> <span>display: table; </span> <span>clear: both; </span><span>} </span> <span><span>.cell</span> { </span> <span>width: 50%; </span> <span>float: left; </span><span>} </span> <span>/* wrapping */ </span><span><span>.cell:nth-child(<span>2n+1</span>)</span> { </span> <span>clear: left; </span><span>} </span> <span>/* for visiblity */ </span><span><span>.cell-1</span> { background-color: #000; color: #fff; } </span><span><span>.cell-2</span> { background-color: #666; color: #fff; } </span><span><span>.cell-3</span> { background-color: #ccc; color: #000; } </span><span><span>.cell-4</span> { background-color: #fff; color: #000; }</span>
Cette implémentation comprend un piratage ClearFix et la pseudo-classe: Nth-Child pour l'emballage. Cela fonctionne dans la plupart des navigateurs; Cependant, Internet Explorer 8 nécessite une sélectivizr ou une solution équivalente pour faire fonctionner le sélecteur.
Ensuite, notre fichier moderne.css:
<span><span>.container</span> { </span> <span>/* Internet Explorer 10 </span><span> */ </span> <span>display: -ms-flexbox; </span> <span>-ms-flex-wrap: wrap; </span> <span>/* Chrome 21-28 </span><span> * Safari 6.1+ </span><span> * Opera 15-16 </span><span> * iOS 7.0+ </span><span> */ </span> <span>display: -webkit-flex; </span> <span>-webkit-flex-wrap: wrap; </span> <span>/* Chrome 29+ </span><span> * Firefox 28+ </span><span> * Internet Explorer 11+ </span><span> * Opera 12.1 & 17+ </span><span> * Android 4.4+ </span><span> */ </span> <span>display: flex; </span> <span>flex-wrap: wrap; </span><span>} </span> <span><span>.cell</span> { </span> <span>-webkit-flex: 1 0 50%; </span> <span>-ms-flex: 1 0 50%; </span> <span>flex: 1 0 50%; </span><span>} </span> <span>/* for visiblity */ </span><span><span>.cell-1</span> { background-color: #000; color: #fff; } </span><span><span>.cell-2</span> { background-color: #666; color: #fff; } </span><span><span>.cell-3</span> { background-color: #ccc; color: #000; } </span><span><span>.cell-4</span> { background-color: #fff; color: #000; }</span>
Ne soyez pas découragé par la taille de ce fichier. Les commentaires le rendent plus grand, mais ceux-ci facilitent le développement de comprendre ce que chaque section cible.
Ensuite, nous rédigeons le code pour les dépendances.js.
Comme mentionné, nous devons générer une version de Modernizr (version 3) qui détecte la prise en charge de la propriété Flex-Wrap. Incluez le code en haut du fichier javascript.
<span>/* Include Modernizr v3 with 'Flex line wrapping' here */ </span> <span>(function() { </span> <span>var isModern = Modernizr.flexwrap; </span> <span>var link = document.createElement('link'); </span> link<span>.rel = 'stylesheet'; </span> link<span>.type = 'text/css'; </span> link<span>.href = 'stylesheets/' + (isModern ? 'modern' : 'legacy') + '.css'; </span> <span>document.getElementsByTagName('head')[0].appendChild(link); </span><span>})();</span>
Vous pouvez éventuellement augmenter les exigences pour une expérience moderne en ajoutant à l'iSmodern Boolean. Par exemple:
<span>var isModern = Modernizr.flexwrap && 'querySelector' in document;</span>
Vous pouvez utiliser SASS pour abstraction de votre approche pour implémenter Flexbox. Cela réduit la taille de la sortie CSS et le rend plus facile à entretenir:
<span><span><!DOCTYPE html></span> </span><span><span><span><html</span> class<span>="no-js"</span>></span> </span> <span><span><span><head</span>></span> </span> <span><span><span><title</span>></span>Cutting the mustard<span><span></title</span>></span> </span> <span><span><span><script</span> src<span>="javascripts/dependencies.js"</span>></span><span><span></script</span>></span> </span> <span><span><span><noscript</span>></span> </span> <span><span><span><link</span> rel<span>="stylesheet"</span> href<span>="stylesheets/legacy.css"</span>></span> </span> <span><span><span></noscript</span>></span> </span> <span><!-- ... --> </span> <span><span><span></head</span>></span> </span> <span><span><span><body</span>></span> </span> <span><span><span><div</span> class<span>="container"</span>></span> </span> <span><span><span><div</span> class<span>="cell cell-1"</span>></span>Cell 1<span><span></div</span>></span> </span> <span><span><span><div</span> class<span>="cell cell-2"</span>></span>Cell 2<span><span></div</span>></span> </span> <span><span><span><div</span> class<span>="cell cell-3"</span>></span>Cell 3<span><span></div</span>></span> </span> <span><span><span><div</span> class<span>="cell cell-4"</span>></span>Cell 4<span><span></div</span>></span> </span> <span><span><span></div</span>></span> </span> <span><span><span></body</span>></span> </span><span><span><span></html</span>></span></span>
Il est important de comprendre les différences entre les flotteurs Flexbox et CSS. Votre mise en œuvre ne sera pas exactement la même dans chacune des expériences - mais la notion d'amélioration progressive signifie qu'il n'est pas nécessairement nécessaire.
Par exemple, par défaut, Flexbox étirera toutes les cellules de la même ligne pour avoir la même hauteur. Par conséquent, si une cellule est de 3 lignes et la ligne adjacente est de 10 lignes de long, l'arrière-plan s'étendra sur les deux cellules à 10 lignes. La secours pour les flotteurs CSS ne le fera pas et les deux cellules auront des hauteurs inégales.
Tester la mise en page dans plusieurs navigateurs est toujours une exigence, mais n'oubliez pas que forcer la valeur de l'ismoderne à false en javascript peut aider à tester les solutions héritées dans n'importe quel navigateur:
<span><span>.container</span> { </span><span>} </span> <span>/* clearfix */ </span><span><span>.container:after</span> { </span> <span>content: ""; </span> <span>display: table; </span> <span>clear: both; </span><span>} </span> <span><span>.cell</span> { </span> <span>width: 50%; </span> <span>float: left; </span><span>} </span> <span>/* wrapping */ </span><span><span>.cell:nth-child(<span>2n+1</span>)</span> { </span> <span>clear: left; </span><span>} </span> <span>/* for visiblity */ </span><span><span>.cell-1</span> { background-color: #000; color: #fff; } </span><span><span>.cell-2</span> { background-color: #666; color: #fff; } </span><span><span>.cell-3</span> { background-color: #ccc; color: #000; } </span><span><span>.cell-4</span> { background-color: #fff; color: #000; }</span>
Dans cet article, j'ai fourni les bases de l'utilisation de la détection des fonctionnalités pour servir deux feuilles de styles différentes sur la même base de code HTML. Il s'agit d'un moyen extrêmement efficace de commencer le processus de mise à niveau des flotteurs CSS et de réduire la dépendance aux commentaires conditionnels IE.
Bien que l'accent ait été mis sur la détection du support pour Flexbox, il est important de noter que de nouvelles fonctionnalités sont développées pour les navigateurs, cette approche pour couper la moutarde peut être adaptée et évoluée pour s'adapter aux exigences futures.
Une fois qu'Internet Explorer 10 redonne de popularité avec la part de marché du navigateur dans votre secteur cible, vous pourrez peut-être abandonner la syntaxe de Tweener et livrer du code plus maigre uniquement grâce à l'utilisation de la nouvelle syntaxe.
Alors maintenant que vous avez toute la théorie, pourquoi ne pas vous familiariser avec Flexbox dans votre prochain projet?
La migration vers Flexbox est une étape importante dans le développement Web moderne. Flexbox, ou disposition flexible de la boîte, est un modèle de disposition Web CSS3 qui permet de disposer automatiquement des éléments réactifs dans un conteneur en fonction de la taille de l'écran. Cela signifie que la disposition de vos pages Web peut facilement s'adapter à différentes tailles d'écran, garantissant une expérience utilisateur transparente sur divers appareils. Il simplifie également le processus de conception d'une structure de mise en page flexible et réactive sans utiliser de flotteur ou de positionnement.
Servir le JavaScript hérité aux navigateurs modernes peut avoir un impact significatif sur les performances de votre site Web. Le héritage JavaScript est souvent gonflé avec du code inutile dont les navigateurs modernes n'ont pas besoin. Ce code supplémentaire peut ralentir votre site Web car le navigateur doit télécharger, analyser, compiler et l'exécuter. En servant JavaScript moderne aux navigateurs modernes, vous pouvez améliorer le temps de chargement de votre site Web et les performances globales.
Pour éviter de servir le javascript hérité aux navigateurs modernes, vous pouvez utiliser le motif module / nomodule. Ce modèle vous permet de créer deux faisceaux distincts de votre JavaScript - un faisceau moderne et «module» et un bundle hérité, «nomodule». Les navigateurs modernes qui comprennent l'attribut «type =» '' téléchargeront le bundle moderne, tandis que les navigateurs plus anciens l'ignoreront et téléchargeront le bundle hérité à la place.
Flexbox offre plusieurs avantages par rapport aux méthodes de mise en page traditionnelles. Il permet des structures de mise en page flexibles, ce qui facilite la conception de sites Web réactifs. Il simplifie également l'alignement, la distribution et l'ordre des éléments dans un conteneur. Avec Flexbox, vous pouvez facilement obtenir des dispositions et des alignements complexes qui seraient difficiles avec CSS traditionnelle.
Migrer vers Flexbox peut être un complexe processus, en particulier pour les grands projets existants. Il est important de bien comprendre le modèle Flexbox avant de commencer la migration. Commencez par expérimenter avec des dispositions simples, passant progressivement à des dispositions plus complexes. Utilisez une approche étape par étape, migrant un composant à la fois et testez soigneusement chaque modification.
Des outils comme Google Lighthouse, GTMetrix et WebPageTest peuvent vous aider à identifier si vous servez un JavaScript hérité aux navigateurs modernes. Ces outils fournissent des rapports de performances détaillés, mettant en évidence les domaines où les performances de votre site Web peuvent être améliorées.
Bien que Flexbox soit un modèle de mise en page moderne, il a un certain niveau de soutien dans les navigateurs plus âgés. Cependant, il peut y avoir des incohérences et des bogues. Il est recommandé d'utiliser des outils comme AutopRefixer, qui peuvent ajouter les préfixes du fournisseur nécessaire à votre CSS, assurant la compatibilité avec les navigateurs plus âgés.
Quels sont les défis courants lors de la migration vers Flexbox?
Il existe de nombreuses ressources en ligne pour en savoir plus sur Flexbox et le JavaScript moderne. Des sites Web comme CSS-Tricks, MDN Web Docs et SitePoint offrent des guides et tutoriels complets. De plus, les plateformes de codage en ligne comme CodeCademy et FreeCodeCamp fournissent des leçons interactives sur ces sujets.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!