亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Table des matières
Ce que nous faisons
Les bases du graphique
Déterminer la valeur la plus élevée
Calcul de la dimension des rectangles
Créer et insérer les éléments DOM
Découper des rectangles
Masquage 101
Le remplissage blanc
Le remplissage noir
Le remplissage gris
Le dernier bit
Générer les masques
Le résultat final
Maison interface Web tutoriel CSS Comment créer un graphique animé de carrés imbriqués à l'aide de masques

Comment créer un graphique animé de carrés imbriqués à l'aide de masques

Mar 18, 2025 am 11:03 AM

Comment créer un graphique animé de carrés imbriqués à l'aide de masques

Nous avons de nombreux types de graphiques bien connus: bar, beignet, ligne, tarte, vous l'appelez. Toutes les bibliothèques de graphiques populaires les soutiennent. Ensuite, il existe les types de graphiques qui n'ont même pas de nom. Découvrez ce tableau de rêve avec des carrés empilés (imbriqués) qui peuvent aider à visualiser les tailles relatives, ou comment les différentes valeurs se comparent les unes aux autres:

Ce que nous faisons

Sans aucune interactivité, la création de ce design est assez simple. Une fa?on de le faire est d'empiler des éléments (par exemple, des éléments SVG , ou même des divs HTML) dans des tailles décroissantes, où tous leurs coins inférieurs à gauche touchent le même point.

Mais les choses deviennent plus difficiles une fois que nous avons introduit une certaine interactivité. Voici comment cela devrait être: lorsque nous dépla?ons notre souris sur l'une des formes, nous voulons que les autres se fanent et s'éloignent.

Nous allons créer ces formes irrégulières à l'aide de rectangles et de masques - littéral avec des éléments et . Si vous êtes entièrement nouveau dans les masques, vous êtes au bon endroit. Ceci est un article de niveau d'introduction. Si vous êtes plus assaisonné, alors peut-être que cet effet de découpe est une astuce que vous pouvez emporter avec vous.

Maintenant, avant de commencer, vous vous demandez peut-être si une meilleure alternative au SVG à l'utilisation de formes personnalisées. C'est vraiment une possibilité! Mais des formes de dessin avec un peut être intimidant, ou même devenir désordonnée. Ainsi, nous travaillons avec des éléments ?plus faciles? pour obtenir les mêmes formes et effets.

Par exemple, voici comment nous devrions représenter la plus grande forme bleue en utilisant un .

 <svg viewbox="0 0 320 320" width="320" height="320">
  <chemin d="M320 0H0V56H264V320H320V0Z" fill="# 264653"></chemin>
</svg>

Si le 0h0v56… n'a aucun sens pour vous, consultez ?la syntaxe du chemin SVG: un guide illustré? pour une explication approfondie de la syntaxe.

Les bases du graphique

étant donné un ensemble de données comme ceci:

 type dataSetEntry = {
  étiquette: cha?ne;
  valeur: numéro;
};

type dataSet = dataSetEntry [];

const RawDataset: DataSet = [
  {label: 'bad', valeur: 1231},
  {label: 'début', valeur: 6321},
  {étiquette: ?développement?, valeur: 10028},
  {label: 'accompli', valeur: 12123},
  {étiquette: 'exemplaire', valeur: 2120}
]]

… Nous voulons nous retrouver avec un SVG comme ceci:

 <svg viewbox="0 0 320 320" width="320" height="320">
  <rect width="320" height="320" y="0" fill="...">  rect>
  <rect width="264" height="264" y="56" fill="...">  rect>
  <rect width="167" height="167" y="153" fill="..."> 
  <rect width="56" height="56" y="264" fill="...">  rect>
  <rect width="32" height="32" y="288" fill="...">  rect>
</rect></rect></rect></rect></rect></svg>

Déterminer la valeur la plus élevée

Cela deviendra évident dans un instant pourquoi nous avons besoin de la valeur la plus élevée. Nous pouvons utiliser le math.max () pour l'obtenir. Il accepte n'importe quel nombre d'arguments et renvoie la valeur la plus élevée dans un ensemble.

 const dataSetHighestValue: Number = Math.max (
  ... RawDataset.map ((Entrée: DataSeTentry) => Entry.Value)
));

Comme nous avons un petit ensemble de données, nous pouvons simplement dire que nous obtiendrons 12123.

Calcul de la dimension des rectangles

Si nous regardons la conception, le rectangle représentant la valeur la plus élevée (12123) couvre toute la zone du graphique.

Nous avons arbitrairement choisi 320 pour les dimensions SVG. étant donné que nos rectangles sont des carrés, la largeur et la hauteur sont égales. Comment pouvons-nous faire 12123 égal à 320? Et les valeurs moins ?spéciales?? Quelle est la taille du rectangle 6321?

Interrogé une autre manière, comment cartographier un nombre d'une plage ([0, 12123]) à un autre ([0, 320])? Ou, en termes plus mathématiques, comment pouvons-nous évoluer une variable à un intervalle de [a, b]?

Pour nos fins, nous allons implémenter la fonction comme celle-ci:

 const RemapValue = (
  Valeur: numéro,
  Frommin: numéro,
  Frommax: numéro,
  Tomin: numéro,
  Tomax: numéro
): numéro => {
  return ((valeur - fromin) / (Frommax - fromin)) * (tomax - tomin) tomin;
};

RemapValue (1231, 0, 12123, 0, 320); // 32
RemapValue (6321, 0, 12123, 0, 320); // 167
RemapValue (12123, 0, 12123, 0, 320); // 320

étant donné que nous cartographions les valeurs sur la même plage dans notre code, au lieu de passer les minimums et les maximums encore et encore, nous pouvons créer une fonction de wrapper:

 const ValueReMapper = (
  Frommin: numéro,
  Frommax: numéro,
  Tomin: numéro,
  Tomax: numéro
) => {
  return (valeur: nombre): numéro => {
    return remapValue (valeur, Frommin, Frommax, tomin, tomax);
  };
};

const RemapDatasetValuetOsvgDimension = ValueRemapper (
  0,
  dataSetHiGhestValue,
  0,
  svgdimension
));

Nous pouvons l'utiliser comme ceci:

 remapdatasetvalutosvgdimension (1231); // 32
remapdatasetvalutosvgdimension (6321); // 167
RemapdatasetvalutOsvgdimension (12123); // 320

Créer et insérer les éléments DOM

Ce qui reste a à voir avec la manipulation DOM. Nous devons créer les éléments et les cinq , définir leurs attributs et les ajouter au DOM. Nous pouvons faire tout cela avec les fonctions de base CreateElementNS, SetAttribute et APPEDCHILD.

Notez que nous utilisons les CreateElementns au lieu de la création plus courante. C'est parce que nous travaillons avec un SVG. Les éléments HTML et SVG ont des spécifications différentes, donc ils relèvent d'un autre espace de noms URI. Il arrive juste que le CreateElement utilise facilement l'espace de noms HTML! Donc, pour créer un SVG, nous devons être aussi verbeux:

 Document.CreateElementns ('http://www.w3.org/2000/svg', 'svg') en tant que svgsvgementment;

Nous pouvons s?rement créer une autre fonction d'assistance:

 const CreateSVGNElement = (élément: String): svgement => {
  return document.createElementns ('http://www.w3.org/2000/svg', élément);
};

Lorsque nous ajoutons les rectangles au DOM, nous devons prêter attention à leur commande. Sinon, nous devions spécifier explicitement l'indice Z. Le premier rectangle doit être le plus grand, et le dernier rectangle doit être le plus petit. Mieux vaut trier les données avant la boucle.

 const data = rawdataset.sort (
  (A: DataSeTentry, B: DataSeTentry) => B.Value - A.Value
));

data.ForEach ((d: dataSetEntry, index: numéro) => {
  const REct: svGrecedElement = créeSvGnSelement (?rect?) comme svGrecedElement;
  const REctDimension: Number = remapDataSetValuetoSvgdimension (d.Value);

  rect.setAttribute ('width', `$ {rectdimension}`);
  rect.setAttribute ('height', `$ {rectdimension}`);
  rect.setAttribute ('y', `$ {svgdimension - rectdimension}`);

  SVG.APPEndChild (RECT);
});

Le système de coordonnées commence par le haut à gauche; C'est là que le [0, 0] est. Nous allons toujours dessiner les rectangles du c?té gauche. L'attribut x, qui contr?le la position horizontale, est par défaut à 0, nous n'avons donc pas à le définir. L'attribut Y contr?le la position verticale.

Pour donner l'impression visuelle que tous les rectangles proviennent du même point qui touche leurs coins inférieurs à gauche, nous devons pousser les rectangles vers le bas pour parler. Par combien? Le montant exact que le rectangle ne remplit pas. Et cette valeur est la différence entre la dimension du graphique et le rectangle particulier. Si nous assemblons tous les bits, nous nous retrouvons avec ceci:

Nous avons déjà ajouté le code de l'animation à cette démo à l'aide de CSS.

Découper des rectangles

Nous devons transformer nos rectangles en formes irrégulières qui ressemblent au numéro sept, ou la lettre L tourna de 180 degrés.

Si nous nous concentrons sur les ?parties manquantes?, nous pouvons voir qu'ils découpent les mêmes rectangles avec lesquels nous travaillons déjà.

Nous voulons cacher ces découpes. C'est ainsi que nous allons finir avec les formes L que nous voulons.

Masquage 101

Un masque est quelque chose que vous définissez et appliquez plus tard à un élément. En règle générale, le masque est incliné dans l'élément à lequel il appartient. Et, généralement, il devrait avoir un ID unique car nous devons le référencer afin d'appliquer le masque à un élément.

 <svg>
  <masque>
    
   mask>
</masque></svg>

Dans la balise , nous avons mis les formes qui servent de masques réels. Nous appliquons également l' attribut de masque aux éléments.

 <svg>
  <masque>
    
   mask>
  <rect mask="url (#MycleVerlyNamedMask)"> 
</rect></masque></svg>

Ce n'est pas le seul moyen de définir ou d'appliquer un masque, mais c'est le moyen le plus simple pour cette démo. Faisons un peu d'expérimentation avant d'écrire un code pour générer les masques.

Nous avons dit que nous voulons couvrir les zones de découpe qui correspondent aux tailles des rectangles existants. Si nous prenons le plus grand élément et que nous appliquons le rectangle précédent comme masque, nous nous retrouvons avec ce code:

 <svg viewbox="0 0 320 320" width="320" height="320">
  <masque>
    <rect width="264" height="264" y="56" fill=""> 
   mask>
  <rect width="320" height="320" y="0" fill="# 264653" mask="url (#themask)"> 
</rect></rect></masque></svg>

L'élément à l'intérieur du masque a besoin d'une valeur de remplissage. Qu'est-ce que cela devrait être? Nous verrons des résultats entièrement différents en fonction de la valeur de remplissage (couleur) que nous choisissons.

Le remplissage blanc

Si nous utilisons une valeur blanche pour le remplissage, nous obtenons ceci:

Maintenant, notre grand rectangle est la même dimension que le rectangle de masquage. Pas exactement ce que nous voulions.

Le remplissage noir

Si nous utilisons à la place une valeur noire, cela ressemble à ceci:

Nous ne voyons rien. C'est parce que ce qui est rempli de noir est ce qui devient invisible. Nous contr?lons la visibilité des masques à l'aide de remplissages blancs et noirs. Les lignes en pointillés sont là comme une aide visuelle pour référencer les dimensions de la zone invisible.

Le remplissage gris

Maintenant, utilisons quelque chose entre le blanc et le noir, disons gris:

Ce n'est ni entièrement opaque ni solide; c'est transparent. Donc, maintenant, nous savons que nous pouvons contr?ler le ?degré de visibilité? ici en utilisant quelque chose de différent des valeurs blanches et noires, ce qui est une bonne astuce à garder dans nos poches arrière.

Le dernier bit

Voici ce que nous avons couvert et appris sur les masques jusqu'à présent:

  • L'élément à l'intérieur du contr?le la dimension de la zone masquée.
  • Nous pouvons rendre le contenu de la zone masquée visible, invisible ou transparent.

Nous n'avons utilisé qu'une seule forme pour le masque, mais comme pour n'importe quelle balise HTML à usage général, nous pouvons nicher autant d'éléments enfants que nous le souhaitons. En fait, l'astuce pour réaliser ce que nous voulons consulter deux éléments SVG . Nous devons les empiler l'un sur l'autre:

 <svg viewbox="0 0 320 320" width="320" height="320">
  <masque>
    <rect width="320" height="320" y="0" fill="???"> 
    <rect width="264" height="264" y="56" fill="???"> 
   mask>
  <rect width="320" height="320" y="0" fill="# 264653" mask="url (# maskw320)"> 
</rect></rect></rect></masque></svg>

L'un de nos rectangles de masquage est rempli de blanc; l'autre est rempli de noir. Même si nous connaissons les règles, essayons les possibilités.

 <masque>
  <rect width="320" height="320" y="0" fill="noir"> 
  <rect width="264" height="264" y="56" fill="white"> 
 mask></rect></rect></masque>

Le est la dimension du plus grand élément et le plus grand élément est rempli de noir. Cela signifie que tout dans ce domaine est invisible. Et tout sous le plus petit rectangle est visible.

Maintenant, faisons tourner les choses où le rectangle noir est au-dessus:

 <masque>
  <rect width="320" height="320" y="0" fill="white"> 
  <rect width="264" height="264" y="56" fill="noir"> 
 mask></rect></rect></masque>

C'est ce que nous voulons!

Tout dans le plus grand rectangle rempli de blanc est visible, mais le plus petit rectangle noir est au-dessus (plus près de nous sur l'axe Z), masquant cette partie.

Générer les masques

Maintenant que nous savons ce que nous devons faire, nous pouvons créer les masques avec une relative facilité. C'est similaire à la fa?on dont nous avons généré les rectangles colorés en premier lieu - nous créons une boucle secondaire où nous créons le masque et les deux rectes.

Cette fois, au lieu d'ajouter les rectes directement au SVG, nous l'ajoutons au masque:

 data.ForEach ((d: dataSetEntry, index: numéro) => {
  const Mask: svgmaskElement = CreateSvGnSelement ('mask') comme svgmaskElement;

  const REctDimension: Number = remapDataSetValuetoSvgdimension (d.Value);
  const REct: svGrecedElement = créeSvGnSelement (?rect?) comme svGrecedElement;

  rect.setAttribute ('width', `$ {rectdimension}`);
  // ... définir le reste des attributs ...

  mask.setAttribute ('id', `maskw $ {rectdimension.tofixed ()}`);

  masque.ApendChild (RECT);

  // ... Création et définition des attributs pour le plus petit rectangle ...

  SVG.APPEndChild (masque);
});

data.ForEach ((d: dataSetEntry, index: numéro) => {
    // ... notre code pour générer les rectangles colorés ...
});

Nous pourrions utiliser l'index comme identifiant du masque, mais cela semble une option plus lisible, du moins pour moi:

 mask.setAttribute ('id', `maskw $ {rectdimension.tofixed ()}`); // maskw320, masw240, ...

En ce qui concerne l'ajout du rectangle plus petit dans le masque, nous avons facilement accès à la valeur dont nous avons besoin car nous avons précédemment commandé les valeurs rectangulaires du plus haut au plus bas. Cela signifie que l'élément suivant de la boucle est le rectangle plus petit, celui que nous devons référencer. Et nous pouvons le faire par son index.

 // ... partie précédente où nous avons créé le masque et le rectangle ...

const smallErrectIndex = index 1;

// il n'y a pas de prochain quand nous sommes sur le plus petit
if (data [smallErrectIndex]! == Undefined) {
  const SmallErrectDimension: nombre = remapdatasetvaluetosvgdimension (
    données [smallErrectIndex] .Value
  ));
  const smallErrect: svGrecedElement = CreateSVGNELlement (
    'rect'
  ) comme svGreceLelement;

  // ... définir les attributs du rectangle ...

  masque.APPEndChild (Small Earrect);
}

SVG.APPEndChild (masque);

Ce qui reste, c'est d'ajouter l'attribut de masque au rectangle coloré dans notre boucle d'origine. Il devrait correspondre au format que nous avons choisi:

 rect.setAttribute ('mask', `url (# maskw $ {rectdimension.tofixed ()})`); // maskw320, maskw240, ...

Le résultat final

Et nous avons fini! Nous avons réussi à faire un graphique fabriqué à partir de carrés imbriqués. Il se sépare même de survoler de la souris. Et tout ce qu'il a fallu, c'était un SVG en utilisant l'élément pour dessiner la zone de découpe de chaque carré.

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!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1488
72
Tutoriel CSS pour créer des filateurs et des animations de chargement Tutoriel CSS pour créer des filateurs et des animations de chargement Jul 07, 2025 am 12:07 AM

Il existe trois fa?ons de créer un rotateur de chargement CSS: 1. Utilisez le rotateur de base des frontières pour obtenir une animation simple via HTML et CSS; 2. Utilisez un rotateur personnalisé de plusieurs points pour atteindre l'effet de saut à travers différents temps de retard; 3. Ajoutez un rotateur dans le bouton et basculez les classes via JavaScript pour afficher l'état de chargement. Chaque approche souligne l'importance des détails de conception tels que la couleur, la taille, l'accessibilité et l'optimisation des performances pour améliorer l'expérience utilisateur.

ATTENTION DES PROBLèMES ET PRéFIXES DE COMPATIBILITé DE BROWSER CSS ATTENTION DES PROBLèMES ET PRéFIXES DE COMPATIBILITé DE BROWSER CSS Jul 07, 2025 am 01:44 AM

Pour faire face à la compatibilité du navigateur CSS et aux problèmes de préfixe, vous devez comprendre les différences de prise en charge du navigateur et utiliser raisonnablement les préfixes des fournisseurs. 1. Comprendre les problèmes communs tels que Flexbox et le support de la grille, Position: Sticky Invalid et les performances d'animation sont différentes; 2. Vérifier l'état du support de la fonction de confirmation de Caniuse; 3. Utilisez correctement -webkit-, -moz-, -ms-, -o- et autres préfixes du fabricant; 4. Il est recommandé d'utiliser AutopRefixer pour ajouter automatiquement les préfixes; 5. Installez PostCSS et configurez le navigateur pour spécifier le navigateur cible; 6. Gérer automatiquement la compatibilité pendant la construction; 7. Les fonctionnalités de détection modernizr peuvent être utilisées pour les anciens projets; 8. Pas besoin de poursuivre la cohérence de tous les navigateurs,

Quelle est la différence entre l'affichage: en ligne, affichage: bloc et affichage: bloc en ligne? Quelle est la différence entre l'affichage: en ligne, affichage: bloc et affichage: bloc en ligne? Jul 11, 2025 am 03:25 AM

HEMAINDIFFERENCESBetweendisplay: Inline, Block, Andinline-BlockInhtml / CSSareLayoutBehavior, SpaceUsage et StylingControl.1.InlineElementsflowWithText, Don'tStartNewLines, Ignorewidth / Height, AndonlyApplyhorizontalPadding / Marges - IdealForninetLetetStyLinSing

Création de formes personnalisées avec CSS Clip Path Création de formes personnalisées avec CSS Clip Path Jul 09, 2025 am 01:29 AM

Utilisez l'attribut Clip-Path de CSS pour recadrer des éléments en formes personnalisées, telles que les triangles, les encoches circulaires, les polygones, etc., sans compter sur des images ou des SVG. Ses avantages incluent: 1. Prend en charge une variété de formes de base telles que le cercle, l'ellipse, le polygone, etc.; 2. Ajustement réactif et adaptable aux terminaux mobiles; 3. Facile à l'animation, et peut être combiné avec le survol ou le javascript pour obtenir des effets dynamiques; 4. Il n'affecte pas le flux de disposition et ne culte que la zone d'affichage. Les usages communs sont tels que le chemin de clip circulaire: cercle (50pxatcenter) et trame de clip Triangle: polygone (50% 0%, 100 0%, 0 0%). Avis

Styling visité les liens différemment avec CSS Styling visité les liens différemment avec CSS Jul 11, 2025 am 03:26 AM

La définition du style de liens que vous avez visité peut améliorer l'expérience utilisateur, en particulier dans les sites Web à forte intensité de contenu pour aider les utilisateurs à mieux naviguer. 1. Utilisez CSS: Pseudo-classe visité pour définir le style du lien visité, tels que les changements de couleur; 2. Notez que le navigateur permet uniquement la modification de certains attributs en raison des restrictions de confidentialité; 3. La sélection des couleurs doit être coordonnée avec le style global pour éviter la brutalité; 4. Le terminal mobile peut ne pas afficher cet effet et il est recommandé de le combiner avec d'autres invites visuelles telles que les logos auxiliaires ic?nes.

Comment créer des images réactives à l'aide de CSS? Comment créer des images réactives à l'aide de CSS? Jul 15, 2025 am 01:10 AM

Pour créer des images réactives à l'aide de CSS, elle peut être principalement réalisée grace aux méthodes suivantes: 1. Utilisez la largeur maximale: 100% et hauteur: Auto pour permettre à l'image de s'adapter à la largeur du conteneur tout en maintenant la proportion; 2. Utilisez les attributs SRCSET et tailles de HTML pour charger intelligemment les sources d'image adaptées à différents écrans; 3. Utilisez l'objet-ajustement et la position d'objet pour contr?ler le recadrage d'images et l'affichage de la mise au point. Ensemble, ces méthodes garantissent que les images sont présentées clairement et magnifiquement sur différents appareils.

Démystifier les unités CSS: PX, EM, REM, VW, VH Comparaisons Démystifier les unités CSS: PX, EM, REM, VW, VH Comparaisons Jul 08, 2025 am 02:16 AM

Le choix des unités CSS dépend des exigences de conception et des exigences réactives. 1.PX est utilisé pour la taille fixe, adaptée à un contr?le précis mais au manque d'élasticité; 2.EM est une unité relative, qui est facilement causée par l'influence de l'élément parent, tandis que REM est plus stable en fonction de l'élément racine et convient à la mise à l'échelle globale; 3.VW / VH est basé sur la taille de la fenêtre, adaptée à la conception réactive, mais l'attention doit être accordée aux performances sous des écrans extrêmes; 4. Lors du choix, il doit être déterminé en fonction de la question de savoir si les ajustements réactifs, les relations de hiérarchie d'éléments et la dépendance de la fenêtre. Une utilisation raisonnable peut améliorer la flexibilité et la maintenance de la disposition.

Quelles sont les incohérences courantes du navigateur CSS? Quelles sont les incohérences courantes du navigateur CSS? Jul 26, 2025 am 07:04 AM

Différents navigateurs ont des différences dans l'analyse CSS, ce qui entra?ne des effets d'affichage incohérents, y compris principalement la différence de style par défaut, la méthode de calcul du modèle de bo?te, le niveau de support Flexbox et la disposition de la grille et le comportement incohérent de certains attributs CSS. 1. Le traitement de style par défaut est incohérent. La solution consiste à utiliser cssreset ou normaliser.css pour unifier le style initial; 2. La méthode de calcul du modèle de bo?te de l'ancienne version de IE est différente. Il est recommandé d'utiliser la taille d'une bo?te: Border-Box de manière unifiée; 3. Flexbox et Grid fonctionnent différemment dans les cas de bord ou dans les anciennes versions. Plus de tests et utilisent Autoprefixer; 4. Certains comportements d'attribut CSS sont incohérents. Caniuse doit être consulté et rétrogradé.

See all articles