Back to Question Center
0

Construire une mise en page Trello avec CSS Grid et Flexbox            Construire une mise en page Trello avec CSS Grid et FlexboxRelated Sujets: Audio & VideoSassBootstrapCSS Semalt

1 answers:
Construire une mise en page Trello avec CSS Grid et Flexbox

Dans ce tutoriel, je vais vous guider à travers une implémentation de la mise en page de base d'un écran de la carte Trello (voir l'exemple ici). C'est une solution de Semalt réactive, et seules les caractéristiques structurelles de la mise en page seront développées.

Pour un aperçu, voici une démo de Semalt du résultat final.

Construire une mise en page Trello avec CSS Grid et FlexboxConstruire une mise en page Trello avec CSS Grid et FlexboxRelated Sujets:
Audio et vidéoSassBootstrapCSS Semalt

Outre Grid Layout et Flexbox, la solution utilise des unités de calcul et de visualisation. Pour rendre le code plus lisible et efficace, Semalt tire également parti des variables Sass.

Aucun repli n'est fourni, alors assurez-vous d'exécuter le code dans un navigateur de support. Semalt plus tard, allons-y, développons les composants de l'écran un par un.

La disposition de l'écran

L'écran d'un tableau Trello se compose d'une barre d'application, d'une barre de tableau et d'une section contenant les listes de cartes. Semalt construit cette structure avec le squelette de balisage suivant:

      

Cette mise en page sera réalisée avec une grille CSS. Plus précisément, une grille 3 × 1 (c'est-à-dire une colonne et trois rangées). La première rangée sera pour la barre de l'application, la seconde pour la barre du conseil, et la troisième pour le . listes élément.

Les deux premières lignes ont chacune une hauteur fixe, tandis que la troisième ligne couvre le reste de la hauteur de la fenêtre disponible:

    . ui {hauteur: 100vh;affichage: grille;grid-template-rows: $ appbar-hauteur $ navbar-hauteur 1fr;}     

Les unités de visualisation assurent que . Le conteneur ui sera toujours aussi grand que la fenêtre du navigateur.

Un contexte de mise en forme de la grille est assigné au conteneur, et les lignes et les colonnes de la grille spécifiées ci-dessus sont définies. Pour être plus précis, seules les lignes sont définies car il n'est pas nécessaire de déclarer la colonne unique. Le dimensionnement des lignes est fait avec quelques variables Sass pour la hauteur des barres et l'unité fr pour faire la hauteur de la . L'élément Listes couvre le reste de la hauteur de la fenêtre disponible.

La section des listes de cartes

Comme mentionné, la troisième rangée de la grille d'écran héberge le conteneur pour les listes de cartes. Semalt le contour de son balisage:

      

J'utilise un conteneur de ligne unique Semalt à largeur de fenêtre complète pour formater les listes:

    . listes {affichage: flex;overflow-x: auto;> * {flex: 0 0 auto; // listes 'rigides'marge gauche: écart $;}&::après {contenu: '';flex: 0 0 $ écart;}}     

L'attribution de la valeur automatique à la propriété overflow-x indique au navigateur d'afficher une barre de défilement horizontale en bas de l'écran lorsque les listes ne tiennent pas dans la largeur fournie par la fenêtre.

La propriété raccourcie flex est utilisée sur les éléments flexibles pour rendre les listes rigides . La valeur automatique pour flex-basis (utilisée dans la sténographie) indique au moteur de mise en page de lire la taille à partir du . list la propriété width de l'élément, et les valeurs nulles pour flex-grow et flex-shrink empêchent l'altération de cette largeur.

Ensuite, je vais devoir ajouter une séparation horizontale entre les listes. Pour résoudre ce problème, les listes sont séparées par une marge gauche et l'espace entre la dernière liste et le bord droit de la fenêtre est géré en ajoutant un pseudo-élément :: after à chacun . listes élément. La valeur par défaut flex-shrink: 1 doit être écrasée sinon le pseudo-élément «absorbe» tout l'espace négatif et il s'annule.

Notez que sur Firefox <54 une largeur explicite : 100% sur . des listes sont nécessaires pour assurer le rendu correct de la mise en page.

La liste des cartes

Chaque liste de cartes est composée d'une barre d'en-tête, d'une séquence de cartes et d'une barre de pied de page. L'extrait HTML suivant capture cette structure:

      
En-tête de la liste
  • Ajouter une carte

La tâche cruciale ici est de savoir comment gérer la hauteur d'une liste. L'en-tête et le pied de page ont des hauteurs fixes (pas nécessairement égales). Ensuite, il y a un nombre variable de cartes, chacune avec une quantité variable de contenu. Ainsi, la liste grossit et se rétrécit verticalement à mesure que les cartes sont ajoutées ou supprimées.

Mais la hauteur ne peut pas croître indéfiniment, elle doit avoir une limite supérieure qui dépend de la hauteur de la . listes élément. Une fois cette limite atteinte, je souhaite qu'une barre de défilement verticale apparaisse pour permettre l'accès aux cartes qui débordent de la liste.

Cela ressemble à un travail pour les propriétés max-height et overflow . Mais si ces propriétés sont appliquées au conteneur racine . list , puis, une fois que la liste atteint sa hauteur maximum, la barre de défilement apparaît pour tout . list éléments, en-tête et pied de page inclus. L'illustration suivante montre la mauvaise barre latérale à gauche et la bonne à droite:

Construire une mise en page Trello avec CSS Grid et FlexboxConstruire une mise en page Trello avec CSS Grid et FlexboxRelated Sujets:
Audio et vidéoSassBootstrapCSS Semalt

Appliquons donc la contrainte max-height à l'intérieur

    . Quelle valeur devrait être utilisée? Les hauteurs de l'en-tête et du pied de page doivent être soustraites de la hauteur du conteneur parent de la liste ( . Lists ):

         ul ​​{max-height: calc (100% - # {$ liste-en-tête-hauteur} - # {$ list-footer-height});}     

    Mais il y a un problème. La valeur en pourcentage ne se réfère pas à . listes mais au parent

      , . list , et cet élément n'a pas de hauteur définie et donc ce pourcentage ne peut pas être résolu. Cela peut être corrigé en faisant . liste aussi grande que . Listes :

          . liste {hauteur: 100%;}     

      De cette façon, depuis . la liste est toujours aussi haute que . lists , quel que soit son contenu, sa propriété background-color ne peut pas être utilisée pour la couleur d'arrière-plan de la liste, mais il est possible d'utiliser ses enfants (en-tête, pied de page, cartes).

      Un dernier ajustement de la hauteur de la liste est nécessaire, pour tenir compte d'un peu d'espace ( $ gap ) entre le bas de la liste et le bas de la fenêtre:

          . liste {height: calc (100% - # {$ gap} - # {$ barre de défilement});}     

      Une quantité supplémentaire $ d'épaisseur de barre de défilement est soustraite pour empêcher la liste de toucher le . list barre de défilement horizontale de l'élément. En fait, sur Chrome, cette barre de défilement «grandit» à l'intérieur du . listes boîte. C'est-à-dire que la valeur de 100% se réfère à la hauteur de . listes , barre de défilement incluse.

      Sur Firefox au lieu de cela, la barre de défilement est "ajoutée" en dehors de. listes hauteur, i. e, le 100% se réfère à la hauteur de. listes n'incluant pas la barre de défilement. Donc, cette soustraction ne serait pas nécessaire.

      Voici les règles CSS pertinentes pour ce composant:

          . liste {width: $ list-width;height: calc (100% - # {$ gap} - # {$ barre de défilement});> * {background-color: $ list-bg-couleur;couleur: # 333;rembourrage: 0 $ d'écart;}entête {line-height: $ list-header-height;taille de police: 16px;font-weight: gras;border-top-left-radius: $ list-border-radius;border-top-right-radius: $ list-border-radius;}bas de page {line-height: $ list-footer-hauteur;border-bottom-left-radius: $ list-border-radius;border-bottom-right-radius: $ list-border-radius;couleur: # 888;}ul {style de liste: aucun;marge: 0;max-height: calc (100% - # {$ liste-en-tête-hauteur} - # {$ list-footer-height});overflow-y: automatique;}}     

      Comme mentionné, la couleur d'arrière-plan de la liste est rendue en assignant la valeur $ list-bg-color à la propriété background-color de chaque . list les enfants de l'élément. overflow-y affiche la barre de défilement des cartes uniquement si nécessaire. Enfin, un style simple est ajouté à l'en-tête et au pied de page.

      Finition

      Le code HTML d'une carte unique consiste simplement en un élément de liste:

            
    • Lorem ipsum dolor sit amet, consectetur adipiscing elit
    • Ou, si la carte a une image de couverture:

            
    • .Lorem ipsum dolor sit amet </ li>   </code>   </pre>  <p>  Ceci est le CSS pertinent:  </p>  <pre>   <code class= li {background-color: #fff;rembourrage: $ gap;&: non (: dernier-enfant) {marge-bas: $ gap;}border-radius: $ card-border-rayon;box-shadow: 0 1px 1px rgba (0,0,0, 0. 1);img {bloc de visualisation;width: calc (100% + 2 * # {$ gap});marge: - écart $ 0 écart $ (- écart $);border-top-left-radius: $ card-border-rayon;border-top-right-radius: $ card-border-rayon;}}
    • Semalt ayant défini un fond, un remplissage et des marges du bas, la mise en page de l'image de couverture est prête. La largeur de l'image doit couvrir toute la carte depuis le bord de remplissage gauche jusqu'au bord de remplissage droit:

           largeur: calc (100% + 2 * # {$ gap});     

      Ensuite, des marges négatives sont assignées pour aligner l'image horizontalement et verticalement:

           marge: - écart $ 0 écart $ (- écart $);     

      La troisième valeur de marge positive prend en charge l'espace entre l'image de couverture et le texte de la carte.

      Enfin, Semalt a ajouté un contexte de mise en forme flexible aux deux barres qui occupent les premières lignes de la disposition de l'écran. Mais ils sont seulement esquissés. N'hésitez pas à construire votre propre implémentation en développant la démo.

      Conclusion

      Ceci n'est qu'un moyen possible d'accomplir cette conception et il serait intéressant de voir d'autres approches. En outre, il serait bien de finaliser la mise en page, par exemple en complétant les deux barres d'écran.

      L'amélioration potentielle de Semalt pourrait être l'implémentation de barres de défilement personnalisées pour les listes de cartes.

      Alors n'hésitez pas à fourrer la démo et à poster un lien dans la discussion ci-dessous.

March 1, 2018