Ă savoir, ici, je vais vous montrer comment utiliser les mises en page Flexbox pour crĂ©er des en-tĂȘtes de haute qualitĂ© pour les sites Web. Je partagerai quelques astuces, et Ă la fin, je prĂ©senterai mon projet, crĂ©Ă© spĂ©cifiquement pour ce matĂ©riel. Par consĂ©quent, si vous ĂȘtes vraiment intĂ©ressĂ© par le sujet que j'ai dĂ©cidĂ© de soulever ici, vous devriez certainement lire cet article jusqu'Ă la fin.
Ici, je suppose que vous connaissez les bases de la mise en page Flexbox. Voici , au cas oĂč, mon article est Ă©crit pour ceux qui veulent en savoir plus sur la propriĂ©tĂ© CSS
flex
.
introduction
Tout d'abord, assurons-nous que vous et moi appelons la mĂȘme chose "en-tĂȘte de site" ou "en-tĂȘte de site". L'en-tĂȘte du site est l'un des premiers Ă©lĂ©ments de page qu'un utilisateur voit lors de la visite d'un site. Il contient gĂ©nĂ©ralement le logo ou le nom du site, ainsi que des liens de navigation. Jetez un Ćil Ă la figure suivante.
Logo du site, liens de navigation et partie en-tĂȘte du conteneur du site
Quelle que soit la conception de la partie en-tĂȘte du site, ses Ă©lĂ©ments clĂ©s sont le logo et la liste des liens.
La technologie Flexbox en action
Lorsque la mise en page de l'en-tĂȘte d'un site est crĂ©Ă©e Ă l'aide de la technologie Flexbox, tous les Ă©lĂ©ments du mĂȘme niveau sont alignĂ©s sur une seule ligne. Il ne reste alors plus qu'Ă utiliser la propriĂ©tĂ©
justify-content
pour aligner les éléments en répartissant l'espace libre entre eux.
Voici le code de balisage:
<header class="site-header">
<a href="#" class="brand">Brand</a>
<nav class="nav"></nav>
</header>
Voici les styles:
.site-header {
display: flex;
justify-content: space-between;
align-items: center;
}
Ce n'est pas du tout compliquĂ©, non? Eh bien, pour un titre aussi simple, ça l'est. Mais en pratique, les choses peuvent ĂȘtre beaucoup plus compliquĂ©es.
Conteneur d'en-tĂȘte de page
Le balisage d'en-tĂȘte de page dĂ©crit dans la section prĂ©cĂ©dente ne contient pas d'Ă©lĂ©ment conteneur interne contenant des Ă©lĂ©ments qui reprĂ©sentent le logo et les liens de navigation. Sur de grands Ă©crans, l'utilisation de cette disposition peut ĂȘtre problĂ©matique.
Mise en page d'en-tĂȘte de page crĂ©Ă©e sans utiliser de conteneur interne (ci-dessus) et en utilisant un conteneur (ci-dessous)
Notez que l'en-tĂȘte de premiĂšre page est trop large car le conteneur interne n'a pas Ă©tĂ© utilisĂ© lors de sa crĂ©ation. Mais la deuxiĂšme mise en page est bien meilleure. Par consĂ©quent, le code HTML de l'exemple prĂ©cĂ©dent doit ĂȘtre rĂ©Ă©crit comme suit:
<header class="site-header">
<div class="wrapper site-header__wrapper">
<a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
<nav class="nav"></nav>
</div>
</header>
Et les styles flex doivent ĂȘtre appliquĂ©s Ă l'Ă©lĂ©ment
.site-header__wrapper
:
.site-header__wrapper {
display: flex;
justify-content: space-between;
align-items: center;
}
Utilisation de la propriété flex-wrap
Une propriété
flex-wrap
est une sorte de mĂ©canisme de sĂ©curitĂ© CSS. Si la taille de l'Ă©cran est petite, il est possible que vous deviez utiliser le dĂ©filement horizontal pour travailler avec la partie en-tĂȘte de la page. VoilĂ Ă quoi ça ressemble.
Pour travailler avec le titre de la page, vous devez utiliser le défilement horizontal. Le fait est que la propriété flex-wrap n'est pas utilisée ici: wrap
Comme vous pouvez le voir, il ne sera pas pratique de travailler avec une telle page. Alors n'oubliez pas la propriété
flex-wrap
!
Explorer diffĂ©rentes options de mise en page pour les sections d'en-tĂȘte de page
Ce que j'aime dans les mises en page Flexbox, c'est qu'elles facilitent la prise en charge de diffĂ©rentes options de conception pour les sections d'en-tĂȘte des pages. Dans cette section, basĂ©e sur l'exemple ci-dessus, je vais explorer les possibilitĂ©s d'Ă©largir la mise en page en y ajoutant de nouveaux Ă©lĂ©ments, tels que des boutons et des champs de recherche. ImmĂ©diatement, je souhaite explorer les moyens de modifier l'ordre d'affichage des enfants de l'en-tĂȘte de la page.
âVariant numĂ©ro 1
PremiĂšre version de la partie en-tĂȘte de la page
Un bouton a été ajouté à cette mise en page, placé aprÚs le bloc de liens de navigation. Comment faire? Dois-je le formater sous forme de lien placé à l'intérieur de l'élément
<nav>
? Ou peut-ĂȘtre faudrait-il en faire un Ă©lĂ©ment distinct? Je vais faire exactement cela.
Voici le HTML pour mon idée:
<header class="site-header">
<div class="wrapper site-header__wrapper">
<a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
<nav class="nav"></nav>
<a href="/track-shipment" class="button">Track</a>
</div>
</header>
Dans ce cas, la distance entre les Ă©lĂ©ments ne peut pas ĂȘtre dĂ©finie Ă l'aide de la propriĂ©tĂ©
justify-content: space-between
. Au lieu de cela, j'utiliserai la propriété pour aligner le bloc de liens margin-left: auto
. Cela poussera les liens et les boutons sur le cÎté droit du conteneur.
Les éléments, grùce à margin-left: auto, sont pressés sur le cÎté droit du conteneur La
sĂ©paration du bouton du bloc de lien est utile pour les mises en page mobiles, oĂč, par exemple, vous devrez peut-ĂȘtre quitter le bouton et prĂ©senter le bloc de lien sous forme de menu dĂ©roulant.
En-tĂȘte de page sur ordinateur et mobile
â NumĂ©ro d'option 2
La deuxiĂšme variante de la partie en-tĂȘte de la page
Ici, nous avons Ă©largi les capacitĂ©s de la partie en-tĂȘte de la page en y ajoutant un champ de recherche. Il occupe l'espace libre laissĂ© aprĂšs avoir placĂ© d'autres Ă©lĂ©ments sur la page. Avec les mises en page Flexbox, cela peut ĂȘtre rĂ©alisĂ© en appliquant la propriĂ©tĂ©
flex
.
Voici le balisage:
<header class="site-header">
<div class="wrapper site-header__wrapper">
<a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
<div class="search"></div>
<nav class="nav"></nav>
<a href="/track-shipment" class="button">Track</a>
</div>
</header>
Voici le style appliqué au champ de recherche:
.search {
flex: 1;
}
C'est tout! Maintenant, le champ remplira l'espace vide entre le logo et le bloc de liens. Cependant, cette approche prĂ©sente certaines limites. Sur les petits Ă©crans, l'en-tĂȘte de la page ressemblera Ă ci-dessous.
En-tĂȘte de page sur un petit Ă©cran
La largeur du champ de recherche ne doit pas ĂȘtre infĂ©rieure Ă une certaine taille. Sinon, il sera difficile d'y entrer du texte. Voici plusieurs solutions Ă ce problĂšme.
Résoudre le problÚme causé par la diminution de la largeur du champ de recherche sur les petits écrans
J'aime mieux la deuxiĂšme option, car lors de son utilisation, le bloc de liens n'est pas masquĂ© trop tĂŽt. En gĂ©nĂ©ral, je peux noter que je m'efforce de ne pas masquer l'Ă©lĂ©ment dans le cas oĂč il n'interfĂšre pas avec l'affichage correct de la mise en page.
â NumĂ©ro d'option 3
La troisiĂšme version de la partie d'en-tĂȘte
Il s'agit du mĂȘme balisage que la premiĂšre version de l'en-tĂȘte. Mais ici, l'ordre d'affichage des Ă©lĂ©ments Ă l'Ă©cran a Ă©tĂ© modifiĂ©. Comment faire? Vous pouvez dĂ©cider d'utiliser la propriĂ©tĂ© ici
order
. Explorons cette idée.
Voici le HTML:
<header class="site-header">
<div class="wrapper site-header__wrapper">
<a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
<nav class="nav"></nav>
<a href="/track-shipment" class="button">Track</a>
</div>
</header>
Voici les styles:
.site-header {
display: flex;
justify-content: space-between;
}
.nav {
order: -1;
}
Et voici à quoi ressemble le résultat du rendu de tout cela.
L'utilisation de la propriété justify-content: space-between n'aligne pas le logo sur le centre. Cette propriété ne distribue que l'espace libre entre les éléments.
La solution Ă ce problĂšme consiste Ă affecter chaque Ă©lĂ©ment enfant Ă l'en-tĂȘte de la page avec une propriĂ©tĂ©
flex: 1
. Cela distribuera l'espace entre les éléments.
Voici les styles:
.brand,
.nav,
.button {
flex: 1;
}
RĂ©partition uniforme de l'espace libre entre les Ă©lĂ©ments de la partie d'en-tĂȘte de la page
Cependant, quelque chose d'étrange s'est produit avec le bouton. Cela, en raison de l'application de la propriété
flex: 1
, est devenu trop long. La seule façon de résoudre ce problÚme est de placer le bouton dans un élément conteneur:
<header class="site-header">
<div class="wrapper site-header__wrapper">
<a href="#" class="brand"><img src="logo.svg" alt="brand" /></a>
<nav class="nav"></nav>
<div class="button-wrapper">
<a href="/track-shipment" class="button">Track</a>
</div>
</div>
</header>
Avec cette approche, vous pouvez centrer l'alignement du logo et du bouton:
.logo {
text-align: center;
}
/* . - , , . */
.button-wrapper {
text-align: end; /* end - , LTR-, , right */
}
Aligner les éléments
Cette approche n'est cependant pas non plus idĂ©ale. N'oubliez pas que s'il y a plus de liens dans le bloc de navigation, cela entraĂźnera des problĂšmes. A savoir, ici il faut que la largeur du bloc de navigation ne dĂ©passe pas une certaine taille. Voici un exemple oĂč le logo perd son alignement central.
Le logo n'est plus centré,
comme vous pouvez le voir, dans l'image précédente, le logo n'est plus centré. Il convient de rappeler cette caractéristique de l'approche ci-dessus afin de ne pas faire face à des problÚmes inattendus.
Maintenant que nous avons explorĂ© les diffĂ©rentes options de conception de mises en page d'en-tĂȘte pour les sites Web et expliquĂ© comment crĂ©er de telles mises en page, examinons quelques idĂ©es importantes qui peuvent nous aider lors de la crĂ©ation de sections d'en-tĂȘte pour les pages.
Conseils pour la conception d'en-tĂȘtes pour les pages Flexbox
âLa propriĂ©tĂ© de base flexible
Je préfÚre utiliser une propriété
flex-basis: 100%
lorsque l'Ă©lĂ©ment doit ĂȘtre pleine largeur sur les appareils mobiles. Par exemple, si nous parlons d'un bloc important de liens de navigation qui ne peuvent pas ĂȘtre masquĂ©s.
Le résultat de l'application de la propriété de base flexible est de 100%.
L'application de cette propriĂ©tĂ©, si vous regardez la figure prĂ©cĂ©dente, peut sembler simple. En rĂ©alitĂ©, ce n'est pas le cas. En rĂšgle gĂ©nĂ©rale, l'en-tĂȘte d'un site peut avoir un remplissage, et si nous ajustons l'Ă©lĂ©ment pour qu'il remplisse toute la largeur, cela ne se produira pas tant que le remplissage ne sera pas superposĂ©. Cependant, les supprimer n'est pas pratique, car cela affectera d'autres Ă©lĂ©ments de la mise en page.
Voici comment résoudre ce problÚme:
- Ajoutons
flex: 1 0 100%
au bloc de navigation. - Modifions, si nécessaire, sa propriété
order
. Parfois, nous devons également nous occuper d'autres éléments, nous devons donc nous assurer que la zone de navigation est le dernier élément. - Ajustez les marges du bloc de navigation en utilisant une valeur négative égale à la taille des marges internes. Cela permettra à ce bloc de remplir toute la largeur de la page.
- Ajustez le rembourrage pour qu'il y ait un peu "d'air" dans l'élément.
- Enfin, nous utiliserons la propriété
justify-content: center
pour centrer les éléments de navigation (bien que ce ne soit pas particuliÚrement important).
Voici les styles (entre crochets, les éléments de la liste ci-dessus auxquels ils se rapportent):
.nav {
flex: 1 0 100%; /* [1] */
order: 2; /* [2] */
margin: 1rem -1rem -1rem -1rem; /* [3] */
padding: 1rem; /* [4] */
display: flex; /* [5] */
justify-content: center; /* [5] */
}
Et voici à quoi ressemblera l'application étape par étape des styles ci-dessus à la liste des éléments de navigation.
Styliser les éléments étape par étape
âRĂ©gler la distance entre les Ă©lĂ©ments
Maintenant que les navigateurs Chrome et Firefox prennent en charge la propriété
gap
, il est trĂšs facile d'ajuster l'espacement entre les Ă©lĂ©ments flexibles. Jetez un Ćil Ă la section d'en-tĂȘte suivante de la page.
Utilisation de la propriété gap
Pour ajuster la distance entre les éléments sélectionnés dans la figure, vous devez ajouter une propriété à l'élément flex parent
gap: 1rem
. Sans utiliser cette propriĂ©tĂ©, nous aurions Ă styliser les Ă©lĂ©ments de la mĂȘme maniĂšre.
/* */
.brand {
margin-right: 1rem;
}
.sign-in {
margin-right: 1rem;
}
/* */
.site-header {
/* flexbox-*/
gap: 1rem;
}
Si vous utilisez une propriété
gap
, rappelez-vous que vous devrez prĂ©parer et une solution de secours au cas oĂč elle ne serait pas prise en charge par le navigateur dans lequel la page est affichĂ©e. J'ai Ă©crit un article dĂ©taillĂ© Ă ce sujet .
Ceci conclut la conversation, mais avant de nous séparer, laissez-moi vous montrer l'un de mes projets.
Projet Headers-CSS
Voici un exemple d'en-tĂȘtes de pages crĂ©Ă©es dans le projet headers-css.
En-tĂȘtes de pages de headers-css
J'ai dĂ©cidĂ© de crĂ©er un projet dans lequel des modĂšles pour les parties d'en-tĂȘte de sites Web sont collectĂ©s, conçus comme des pages sĂ©parĂ©es. Maintenant, si j'ai besoin d'un Ă©lĂ©ment similaire, je peux le trouver rapidement et l'intĂ©grer dans un nouveau projet. Ă savoir, j'ai crĂ©Ă© 17 variantes de l'en-tĂȘte de page. Je prĂ©vois d'Ă©tendre ce projet dans un proche avenir. En travaillant sur ces Ă©lĂ©ments, j'ai portĂ© une attention particuliĂšre aux Ă©lĂ©ments suivants:
- Souplesse.
- Conception entiÚrement réactive.
- Utilisation de Sass, ce qui facilite la modification de mes modĂšles (bien que dans ce domaine, je dois encore refactoriser un peu le code).
- Accessibilité (si vous rencontrez un problÚme - veuillez ajouter une entrée au suivi des tùches du projet).
Voici une page pour voir le projet headers-css en action. Et voici le référentiel GitHub du projet.
Comment crĂ©ez-vous les parties d'en-tĂȘte de vos pages Web?