CSS to Figma Auto Layout : Flexbox et Grid vers Auto Layout
CSS to Figma Auto Layout : comment flex-direction, gap, padding, alignement, flex-grow, wrap, grid et max-width deviennent de l'Auto Layout, avec conseils.
EUREKA! · · 10 min de lecture
Si vous écrivez du code front-end, l'Auto Layout de Figma vous semble familier : une direction, un espacement, du padding, un alignement, des enfants en hug ou en fill. On est tenté de croire que le passage CSS to Figma Auto Layout est une traduction un pour un. Ce n'est pas le cas. Flexbox et Grid sont plus riches, le navigateur résout des marges, des pourcentages et des tailles intrinsèques que l'Auto Layout ne modélise pas, et un même rendu visuel peut provenir de CSS très différents.
Ce guide explique comment HTML to Frames transpose les mises en page CSS en Auto Layout, pourquoi chaque résultat est vérifié par rapport au navigateur, où se situent les limites et comment écrire un CSS qui s'importe proprement.
L'approche : la géométrie d'abord, puis la déduction
Un convertisseur naïf lit display: flex et recopie les propriétés. Cela casse vite : un conteneur flex avec gap: 0 et des marges sur les enfants, un élément block qui ressemble seulement à une pile verticale, ou une grille qui s'affiche comme deux rangées bien nettes.
HTML to Frames part de ce que le navigateur a réellement rendu :
- Construire au pixel près. La page est d'abord construite dans Figma avec des positions absolues issues de la géométrie mesurée par le navigateur.
- Parcourir de l'intérieur vers l'extérieur. En partant des frames les plus profonds, le plugin déduit piles verticales, piles horizontales, rangées qui passent à la ligne, espacements, padding et alignement à partir des positions et des tailles.
- Ajouter le sens responsive. Le contenu centré devient Center, les conteneurs à largeur maximale restent centrés, les cartes de même taille et
flex-growdeviennent Fill, et dans une barre « logo … menu … icônes », l'élément d'espacement devient Fill. - Vérifier. L'Auto Layout est appliqué, puis la position de chaque enfant est comparée à l'original, avec une tolérance de 2 px.
- Se replier en sécurité. Si cela ne tient pas, un plan plus simple est essayé. S'il échoue aussi, le frame conserve ses positions absolues avec des contraintes adaptées (Stretch, Scale, Center, Min, Max).
Comme la déduction part de la géométrie rendue, une pile d'éléments block devient un Auto Layout vertical tout comme une colonne flex. Le mécanisme CSS compte moins que le résultat. Pour une vue d'ensemble, voir L'Auto Layout expliqué.
Le tableau de correspondance
Voici comment les motifs CSS courants sont généralement transposés. Considérez-le comme le résultat attendu, pas comme une promesse ; la vérification a le dernier mot.
| CSS | Résultat Auto Layout dans Figma | Remarques |
|---|---|---|
flex-direction: column | Auto Layout vertical | L'empilement en flux block normal aboutit aussi ici |
flex-direction: row | Auto Layout horizontal | |
row-reverse, column-reverse | Pile dans l'ordre rendu | Les calques suivent l'ordre visuel |
gap: 24px | Espacement des éléments 24 | Mesuré à partir des distances réelles |
| Marges égales entre éléments frères | Espacement des éléments | Déduit lorsque les distances sont cohérentes |
padding: 32px 24px | Padding haut/bas 32, gauche/droite 24 | Mesuré à partir du décalage des enfants |
justify-content: flex-start | Axe principal : début | |
justify-content: center | Axe principal : centre | |
justify-content: flex-end | Axe principal : fin | |
justify-content: space-between | Space between, ou l'élément d'espacement devient Fill | Les barres d'en-tête deviennent souvent logo, Fill, icônes |
align-items: center | Axe secondaire : centre | |
align-items: stretch | Enfants en Fill sur l'axe secondaire | Lorsque les enfants s'étirent réellement |
flex: 1 / flex-grow: 1 | Fill container sur l'axe principal | Les cartes de même taille deviennent des éléments Fill égaux |
width fixe sur un enfant | Largeur fixe | |
| Enfant dimensionné selon son contenu | Hug contents | |
flex-wrap: wrap | Rangées qui passent à la ligne | Utilise le mode wrap de l'Auto Layout |
display: grid avec colonnes égales | Rangées qui passent à la ligne, ou piles imbriquées | Selon ce qui passe la vérification |
grid-template-columns avec fusions | Piles horizontales/verticales imbriquées | Ou position absolue si les fusions se chevauchent |
max-width + margin: 0 auto | Conteneur centré dans un frame pleine largeur | Le conteneur reste centré au redimensionnement |
position: absolute | Position absolue dans son frame, avec contraintes | Les chevauchements n'entrent pas dans une pile |
position: fixed / sticky | Comportement fixe ou sticky en mode Present | Les en-têtes fonctionnent dans les prototypes |
z-index | Ordre des calques | Conforme à l'empilement du navigateur |
transform: rotate() / scale() | Rotation et mise à l'échelle appliquées | Skew et 3D pas encore pris en charge |
Flexbox en détail
Direction et ordre
flex-direction détermine si un conteneur devient une pile horizontale ou verticale. Comme la déduction s'appuie sur les positions rendues, les directions inversées et order produisent simplement des calques dans l'ordre visuel. Ce que vous voyez dans le navigateur est ce que vous obtenez dans le panneau des calques.
Gap et padding
gap est l'entrée la plus propre : une distance unique et cohérente entre les enfants, qui correspond directement à l'espacement des éléments de l'Auto Layout. Les marges entre éléments frères fonctionnent lorsqu'elles sont cohérentes. Lorsqu'elles ne le sont pas, par exemple 16, 24, 16, le plugin ne peut pas les représenter par un seul espacement, et la vérification choisira un autre plan ou conservera les positions absolues.
Le padding est mesuré à partir de l'endroit où les enfants se trouvent réellement dans le conteneur : padding, largeurs de border et marges internes contribuent tous au résultat.
Justify et align
justify-content correspond à l'alignement sur l'axe principal et align-items à l'alignement sur l'axe secondaire. Le cas intéressant est space-between. Dans un en-tête du type « logo … menu … icônes », le plugin transforme l'élément d'espacement en Fill : au redimensionnement, le logo reste à gauche, les icônes restent à droite et le milieu s'étire. C'est le sens responsive attendu, plutôt qu'une valeur d'espacement fixe qui ne fonctionne qu'à une seule largeur.
flex-grow et Fill
Les enfants avec flex-grow ou flex: 1 deviennent Fill container. Les rangées de cartes égales deviennent des éléments Fill égaux : redimensionner le frame parent redimensionne les cartes ensemble, comme dans le navigateur.
Passage à la ligne
flex-wrap: wrap correspond au mode wrap de l'Auto Layout, qui produit des rangées passant à la ligne. C'est l'équivalent naturel des listes de tags, murs de logos et grilles de cartes construits en Flexbox.
CSS Grid en détail
L'Auto Layout de Figma est un modèle de piles, pas une grille à deux dimensions. Les mises en page Grid sont donc transposées vers la structure la plus proche qui passe la vérification :
- Les grilles uniformes (colonnes égales, espacements égaux) deviennent généralement des rangées qui passent à la ligne.
- Les grilles asymétriques (une barre latérale et une colonne principale, une répartition 2:1) deviennent généralement des piles imbriquées : une pile horizontale de piles verticales, ou l'inverse.
- Les cellules fusionnées ou qui se chevauchent et qui ne se décomposent pas en piles conservent leurs positions absolues avec des contraintes.
Dans tous les cas, le rendu visuel correspond au navigateur dans la tolérance. Ce qui change, c'est la part du frame que vous pouvez redimensionner de façon fluide dans Figma.
Positionnement absolu, centrage et marges auto
position: absolute
Un badge positionné en absolu, une forme décorative ou une surcouche n'ont pas leur place dans une pile, car ils chevauchent leurs éléments frères. Ces éléments conservent leurs positions absolues, et le plugin leur attribue des contraintes pour qu'ils se comportent correctement quand le parent est redimensionné : un badge épinglé en haut à droite reste en haut à droite, une surcouche plein cadre s'étire.
max-width et margin: auto
Le conteneur de contenu classique, max-width: 1200px; margin: 0 auto, devient un conteneur centré dans un frame pleine largeur. C'est aussi là qu'intervient la Site width : le plugin mesure la largeur de design réelle de la page à l'import. Les designs pleine largeur arrivent en 1920 avec le contenu centré, les sites réellement centrés dans un conteneur à la largeur de ce conteneur, et les sites fluides en 1440. La valeur mesurée préserve la logique de votre conteneur.
Marges auto dans un conteneur flex
margin-left: auto sur un enfant flex le repousse à la fin, un motif courant dans les barres de navigation. Comme space-between, c'est déduit de la géométrie, généralement sous la forme d'un élément d'espacement Fill qui maintient l'élément repoussé contre le bord.
Pourquoi la vérification compte
Sans vérification, les convertisseurs n'ont que deux mauvaises options : appliquer l'Auto Layout partout et accepter que certains frames se décalent, se chevauchent ou s'effondrent, ou éviter l'Auto Layout et vous livrer des calques absolus figés.
HTML to Frames applique l'Auto Layout, puis vérifie la position de chaque enfant à 2 px près. Si un frame échoue, un plan plus simple est essayé ; s'il échoue aussi, le frame reste en position absolue. Le design ne casse jamais. Vous pouvez être sûr que ce que vous voyez dans Figma correspond au navigateur, et que l'Auto Layout obtenu tient réellement.
L'écran de résultat affiche la part globale d'Auto Layout et, pour les frames restés en position absolue, indique pourquoi (diagnostics). La question « pourquoi ce n'est pas en Auto Layout ? » devient ainsi quelque chose sur quoi vous pouvez agir dans votre CSS.
Dans nos tests sur de vrais sites, l'Auto Layout a été déduit sur environ 86 à 97 % des frames, par exemple 93 % sur un site produit et 88 % sur Linear et Stripe. Vos chiffres dépendent de la façon dont le CSS est écrit.
Les limites à connaître
- La sémantique de grille à deux dimensions n'existe pas dans l'Auto Layout ; les grilles deviennent des rangées qui passent à la ligne ou des piles imbriquées, et les fusions complexes peuvent rester en position absolue.
- Un espacement incohérent entre éléments frères ne peut pas s'exprimer par un espacement unique.
- Les chevauchements (marges négatives, enfants en absolu) gardent ces éléments en position absolue.
- Les transformations skew et 3D, les clip-paths
path(), les masques multicouches et les couleurs Display-P3 ne sont pas encore convertis. - Le contenu intégré comme les iframes, canvas WebGL et vidéos sans image d'aperçu arrive sous forme de capture de son bloc.
- Une largeur à la fois. Chaque écran est mis en page à sa propre largeur. Utilisez le Responsive set (Desktop, Tablet, Mobile) pour capturer chaque breakpoint dans un frame distinct.
Conseils : écrire un CSS qui s'importe proprement
Ces habitudes rendent vos mises en page plus souvent transposables en Auto Layout, et ce sont de toute façon de bonnes pratiques CSS.
- Utilisez
gapplutôt que des marges entre éléments frères. Une valeur cohérente correspond directement à l'espacement des éléments. - Gardez un espacement cohérent au sein d'un conteneur. Les espacements mixtes forcent des replis.
- Préférez Flexbox pour les mises en page à une dimension. Navigations, barres d'outils, groupes de boutons et rangées de cartes se transposent directement.
- Utilisez Grid avec des pistes égales pour les grilles de cartes. Des colonnes uniformes deviennent des rangées propres qui passent à la ligne.
- Enveloppez les mises en page asymétriques dans des conteneurs explicites. Une barre latérale et une zone de contenu dans leur propre rangée flex produisent des piles imbriquées claires.
- Utilisez
flex: 1pour les éléments qui doivent s'étirer. Cela signale un Fill. - Centrez le contenu avec
max-widthetmargin: 0 auto. Il devient un conteneur centré qui reste centré. - Réservez
position: absoluteaux vraies surcouches. Ne l'utilisez pas pour la mise en page ordinaire. - Évitez les marges négatives pour la mise en page. Elles créent des chevauchements impossibles à empiler.
- Nommez les couleurs avec des propriétés personnalisées. Avec Styles & variables (Pro),
--brand-primarydevient une variablebrand/primary. - Utilisez du vrai texte. Le texte dans des images ne peut pas devenir des calques de texte modifiables.
Voir votre propre correspondance
Le moyen le plus rapide de comprendre comment votre CSS est transposé, c'est de l'importer. Collez du code ou envoyez un dossier via le parcours HTML to Figma, capturez un build local avec l'extension Chrome, ou demandez à un outil d'IA de l'envoyer via MCP. Ouvrez ensuite l'écran de résultat, vérifiez la part d'Auto Layout et lisez les diagnostics des frames restés en position absolue.
Activez Reference screenshot (Pro) pour ajouter un calque masqué et verrouillé de la page d'origine, afin de basculer entre l'import et le rendu du navigateur. Activez Detailed layers (Pro) lorsque vous voulez une structure de calques plus détaillée.
Pour en savoir plus sur la façon dont les pages deviennent des frames, lisez la page sur la conversion HTML to frame, et consultez les fonctionnalités pour tout ce que l'outil d'import prend en charge. La documentation détaille chaque option d'import.
Questions fréquentes
- HTML to Frames lit-il mon CSS pour créer l'Auto Layout ?
- Il s'appuie sur la géométrie rendue par le navigateur plutôt que de recopier les propriétés CSS. La page est d'abord construite au pixel près, puis piles, espacements, padding et alignement sont déduits de l'intérieur vers l'extérieur. La position de chaque enfant est vérifiée à 2 px près : le résultat correspond à ce que le navigateur a dessiné, que la mise en page provienne de Flexbox, de Grid ou d'un simple flux block.
- Comment CSS Grid est-il converti alors que Figma n'a pas d'Auto Layout en grille ?
- Les grilles sont transposées vers la structure la plus proche qui passe la vérification. Les grilles uniformes à colonnes égales deviennent généralement des rangées qui passent à la ligne, les mises en page asymétriques des piles horizontales et verticales imbriquées, et les cellules avec fusions complexes ou chevauchements conservent leurs positions absolues avec des contraintes. Dans tous les cas, le rendu visuel correspond au navigateur.
- Que se passe-t-il quand un frame ne peut pas passer en Auto Layout ?
- Un plan de mise en page plus simple est d'abord essayé. S'il échoue lui aussi à la vérification, le frame conserve ses positions absolues et reçoit des contraintes adaptées comme Stretch, Scale, Center, Min ou Max, pour continuer à bien se comporter au redimensionnement. L'écran de résultat indique pourquoi chacun de ces frames est resté en position absolue, ce qui vous aide à ajuster votre CSS.
- flex-grow devient-il Fill container dans Figma ?
- Oui, dans les cas typiques. Les enfants qui s'agrandissent avec flex-grow ou flex: 1 deviennent Fill container, et les rangées de cartes égales deviennent des éléments Fill égaux. Dans les barres d'en-tête où logo, menu et icônes sont écartés, l'élément d'espacement devient Fill pour que les éléments extérieurs restent épinglés aux bords quand vous redimensionnez le frame.
- Quelle part d'une page finit généralement en Auto Layout ?
- Dans nos tests sur de vrais sites, l'Auto Layout a été déduit sur environ 86 à 97 % des frames, par exemple 93 % sur un site produit et 88 % sur Linear et Stripe. Les résultats dépendent de la façon dont le CSS est écrit ; des espacements cohérents, Flexbox et des conteneurs explicites augmentent cette part.
Arrêtez de redessiner le web.
Collez un lien et obtenez en quelques secondes de vrais calques Figma, modifiables et responsive. Gratuit pour commencer — 10 imports par mois.