Fermer

juin 4, 2018

Faire carte d'identité Avengers en HTML et CSS


Supposons que Tony Stark souhaite reconcevoir les cartes d'identité des Avengers, et il a besoin de notre aide pour les créer en HTML et en CSS. Alors comment pouvons-nous vous aider? Nous allons utiliser Flexbox tout au long du tutoriel pour faire la mise en page tout en plongeant dans des flexbox imbriqués pour certaines mises en page avancées. Nous allons également utiliser des bordures arrondies et transparentes pour créer des arcs de science-fiction en CSS, puis les animer en utilisant des animations CSS autour de l'image de l'Avenger. Enfin, nous utiliserons les propriétés box-shadow et text-shadow pour donner à notre carte d'identité une dernière touche de science-fiction.

À la fin du tutoriel, nous allons construire une carte d'identité Avengers animée de science-fiction, et également apprendre les bases de Flexbox, Flexbox imbriqué, animations CSS, bordures, ombres, et de nombreuses autres propriétés CSS fréquemment utilisées.

Fond d'écran pleine page

Nous avons besoin d'un div qui couvre tout l'écran. Nous allons utiliser ce div comme arrière-plan pour placer la carte d'identité:

Faisons en sorte que le div couvre toute la page et donne un arrière-plan sombre:

 body {
  marge: 0px;
}
.id-card-wrapper {
  hauteur: 100vh;
  largeur: 100%;
  couleur de fond: # 122023;
}

Pourquoi utiliser 100vh et non 100% pour la hauteur?

Si vous regardez attentivement vous remarquerez que nous avons utilisé 100% pour la largeur, mais " 100vh "pour la hauteur. L'unité vh signifie «hauteur de la fenêtre». C'est une unité de fenêtre, d'autres unités de fenêtre sont: vw vmin et vmax .

Alors, pourquoi devrions-nous utiliser 100vh au lieu de 100% pour la hauteur? Eh bien, une dimension basée sur % est relative à son élément parent. Donc, si nous définissons la hauteur du id-card-wrapper à 100%, cela signifierait que la hauteur de id-card-wrapper couvrirait 100% de la hauteur de son élément parent (qui est l'élément body ).

Le problème est que, par défaut, l'élément body ne couvre pas la hauteur de tout l'écran. La largeur de l'élément body est 100% par défaut c'est pourquoi nous pouvons utiliser width: 100% sur id-card-wrapper mais comme la hauteur n'est pas 100% par défaut le la même chose ne fonctionnera pas pour la hauteur.

Puisqu'une unité de fenêtre est relative à la fenêtre, et non l'élément parent, régler la hauteur à "100vh" fera que l'élément couvrira toute la hauteur de la zone visible (viewport), les dimensions du parent.

Si vous voulez plonger plus profondément dans les unités de fenêtre, consultez cet article Fun with Viewport Units sur CSS-Tricks. Une dernière chose, il y a plusieurs façons de créer un fond de page complet, Chris Coyier les répertorie bien dans ce post .

Pourquoi margin: 0px On Body?

les navigateurs affichent par défaut une marge autour du corps. Si nous ne mettons pas cette marge à 0, nous obtiendrons un espace blanc autour de la div id-card-wrapper .

Centrer avec Flexbox

Il y a plusieurs façons de centrer. Maintenant que notre arrière-page pleine page est prête, créons le div qui contiendra notre carte d'identité. Nous mettrons seulement "Test" comme contenu, et construirons la mise en page en premier:

Test     

Et ajoutez quelques styles:

 .id-card {
  bordure: 2px solide # 0AE0DF;
  largeur maximale: 30em;
  marge: auto;
  couleur: #fff;
  rembourrage: 1em;
}

Nous utilisons la propriété border pour donner une bordure solide de 2px de couleur # 0AE0DF à l'élément id-card . div "est un élément de bloc, il couvrira toute la largeur de l'élément parent par défaut. Mais nous ne voulons pas que cela dépasse 30em donc nous avons défini la propriété max-width sur 30em .

Wait, What Is ] Encore?

Voici ce que W3C a à dire à propos de l'unité "em":

"Le em est simplement la taille de la police. Dans un élément avec une 2in police, 1em signifie donc 2en . "

Cela signifie que si votre navigateur a une taille de police par défaut de 14px, alors 30em sera égal à 30 × 14 = 420px

Mais, pourquoi utiliser em unité au lieu de px ?

Regardez, le ] em unité est relative à la taille de la police. Supposons que vous utilisez un navigateur avec une taille de police par défaut de 14px. Maintenant, si quelqu'un voit votre projet depuis un autre navigateur qui a 16px comme taille de police par défaut, alors devinez ce qui arrivera

Le contenu à l'intérieur aura besoin de plus d'espace, mais votre div a une largeur fixe, briser la disposition.

C'est toujours une bonne idée d'avoir des dimensions qui évoluent avec le contenu, au lieu de le fixer à des pixels arbitraires.

Pourquoi ne pas "margin: auto" Centre Le div Verticalically? **

Nous savons déjà que nous pouvons centrer un élément de bloc horizontalement en utilisant margin: auto mais cela ne fonctionne pas pour le centrage vertical.


 Capture d'écran d'un élément horizontal [19659033] La marge automatique centre l'élément horizontalement
</figcaption></figure>
<p> Et si je vous disais que "margin: auto" fonctionne aussi verticalement? En fait, en mode normal, ce n'est pas le cas. Mais dans les nouveaux modes de mise en page comme la flexbox, la marge <code>: auto </code> fonctionne aussi pour le centrage vertical. Allez-y et faites le <code> id-card-wrapper </code> un flexbox pour le voir vous-même: </p>
<pre><code class= .id-card-wrapper {   hauteur: 100vh;   largeur: 100%;   couleur de fond: # 122023;   affichage: flex; }

Résultat:


 Capture d'écran d'un élément centré horizontalement et verticalement
La marge automatique centre l'élément horizontalement et verticalement si l'élément est un élément flexible.

Comme vous pouvez le voir, notre div id-card est maintenant centré horizontalement et verticalement. Nous configurons simplement display: flex sur la div id-card-wrapper div. Lorsque vous réglez display: flex sur un élément, cet élément devient un [flex-container] et ses éléments enfants deviennent flex-items . Check out " Concepts de base de Flexbox " sur MDN

D'accord, cela a centré notre élément, mais pourquoi a-t-il perdu sa largeur? Le id-card div est un élément de bloc, et puisque les éléments de bloc sont par défaut 100% de largeur, pourquoi le div a-t-il perdu ce comportement au niveau du bloc lorsqu'il est devenu un élément flexible?

n'a pas perdu son comportement de bloc. Ce qui se passe est que, dès que le div arrive dans le contexte de flexbox, l'algorithme de flexbox note que la div ne possède aucune propriété width (nous lui donnons seulement max-width ), puis il définit la largeur initiale à 0.

Nous pouvons changer ce comportement en définissant explicitement la largeur initiale de l'élément en utilisant la propriété flex-basis comme ceci: [19659006].carte d'identité {
  flex-base: 100%;
  bordure: 2px solide # 0AE0DF;
  largeur maximale: 30em;
  marge: auto;
  couleur: #fff;
  rembourrage: 1em;
}

Et maintenant, le résultat ressemble à ce qui était attendu:


 Capture d'écran d'un ensemble flex-item avec flex-basis réglé à 100%
La largeur initiale du flex-item set à 100% en utilisant "flex-basis" ".

Flexbox imbriqués

Maintenant, notre div id-card est prêt pour le contenu. Créons un div de profil et deux sections dp et desc . Le dp div contiendra la photo de profil de l'Avenger, et desc div contiendra la description de cet Avenger:

            
                Tester             
Test desc             
        
    

Nous savons que le div id-card est un flex-item, mais le div que nous venons de créer à l'intérieur de id-card (le profile-row div) n'est pas un élément flexible. Oui, seuls les défunts directs des flex-containers deviennent des flex-items, mais pas les petits-enfants.

Donc, profile-row est une div normale, et nous allons en faire un flex-container par réglage affichage: flex à lui. Cela fera ses éléments enfants, dp et desc flex-items:

 .profile-row {
  affichage: flex;
}

Maintenant, nous pouvons utiliser la propriété flex-basis pour faire la div dp 33,3% large et la desc div 66,6% large:

. profile-row .dp {
  flex-basis: 33,3%;
}
.profile-row .desc {
  flex-grow: 66,6%;
}

Voici ce que nous obtenons:


 Capture d'écran de deux flex-items d'affilée avec 33,3% et 66,6% de largeur
Nous pouvons définir l'espace que les éléments occuperaient en utilisant la propriété "flex-basis".

Image de profil

Pour l'image du profil, nous allons utiliser une jolie image de Iron Man pour la carte d'identité de Stark ( téléchargez-la ici ). Inclure l'image en utilisant la balise img dans le div div:

            
                             
Test desc             
        
    

Et donnez-lui quelques styles:

 .profile-row .dp img {
  largeur maximale: 100%;
  border-radius: 50%;
}
.profile-row .desc {
  rembourrage: 1em;
}

Nous définissons max-width: 100% pour l'élément img car l'élément img affiche par défaut l'image dans sa résolution d'origine.

Si l'image est 500px × 500px, elle sera affichée dans cette dimension. Mais nous ne le voulons pas. Au lieu de cela, nous voulons que l'image soit aussi large que la div dp c'est pourquoi nous avons mis sa largeur maximale à 100%.

] border-radius propriété à 50% . Nous faisons cela pour afficher l'image comme un cercle:


 Capture d'écran de l'image arrondie d'Iron Man avec le texte de démonstration
Nous ne fabriquons pas l'élément img flex-item, mais le mettons dans un élément flexible

Faire des arcs en CSS

Tony nous rend visite pendant que nous fabriquons cette carte d'identité, et dit que ça n'a pas l'air de la science-fiction.
Pas de problème, faisons-le plus de science-fiction. Nous ferons deux arcs en rotation autour de l'image. Insérez le premier arc dp-arc-inner à l'intérieur de l'élément dp :

            
                
                             
Test desc             
        
    

Positionnez-le en CSS:

 .profile-row .dp {
  flex-basis: 33,3%;
  position: relative;
}
.profile-row .dp img {
  largeur maximale: 100%;
  border-radius: 50%;
  bloc de visualisation;
}
.profile-row .dp .dp-arc-interne {
  position: absolue;
  largeur: 100%;
  hauteur: 100%;
  bordure: 6px solide # 0AE0DF;
  haut: -6px;
  à gauche: -6px;
}

Nous voulons que le div arc se chevauche sur le div dp . Le problème est que les éléments ne se chevauchent pas en HTML.
Toutefois, si nous définissons la position d'un élément comme absolute cet élément est retiré du flux normal du document et nous pouvons définir sa position comme nous le souhaitons.

Positionnement par défaut des éléments HTML est statique . Nous mettons position: absolute le dp-arc-inner pour le rendre absolument positionné. Maintenant nous pouvons utiliser left top bottom et right propriétés pour définir sa position.

left top bottom et right propriétés sont relatives au premier élément parent dans la hiérarchie qui est positionné "relativement". C'est pourquoi nous avons placé la position : relative sur la div dp . Si nous ne le faisons pas, les propriétés gauche supérieure inférieure et droite seront définies respectivement à l'écran, pas l'élément dp

Encore une chose, nous mettons display: block sur l'élément img . Pourquoi? Parce que img éléments sont en ligne-bloc par défaut, et en-bloc-bloc éléments affichent un petit espace sur ses côtés et le fond.

Cela ne cause aucun problème, mais un petit écart autour de l'image dans notre cas va compenser la position de l'arc. Nous avons donc défini l'élément img en tant qu'élément de bloc.

Ensuite, faisons apparaître le div "dp-arc-inner" comme un arc:

 .profile-row .dp .dp-arc -inner {
  position: absolue;
  largeur: 100%;
  hauteur: 100%;
  bordure: 6px solide transparent;
  border-top-color: # 0AE0DF;
  border-radius: 50%;
  haut: -6px;
  à gauche: -6px;
}

Ce que nous faisons est, au lieu de définir la bordure pour tous les côtés avec la couleur # 0AE0DF nous mettons tous les côtés comme transparents, puis nous donnons seulement la bordure supérieure la couleur # 0AE0DF . Ensuite, nous mettons le border-radius: 50% pour le contourner:


 Capture d'écran de l'image arrondie d'Iron Man entourée d'un arc
Les marges négatives compensent la largeur de la bordure à l'arc

Bon, créons un arc de plus, dp-arc-outer :

            
                
                
                             
Test desc             
        
    

Et le style de la même manière:

 .profile-row .dp .dp-arc-outer {
  position: absolue;
  largeur: calc (100% + 12px);
  hauteur: calc (100% + 12px);
  bordure: 6px solide transparent;
  border-bottom-color: # 0AE0DF;
  border-radius: 50%;
  haut: -12px;
  à gauche: -12px;
}

Wow, quelle est cette chose calc là-bas?

Calc est une fonction CSS qui calcule l'expression mathématique qui lui est donnée. Regardez, nous avons eu l'arc interne avec la largeur et la hauteur de 100% et une bordure de 6px, non? Cela fait de la largeur totale de l'arc intérieur 6px + 100% + 6px .

Maintenant, si nous voulons que l'arc extérieur soit plus grand que l'arc intérieur, nous devons le faire 100% + 12px de large. C'est ici que la fonction calc () vient à la rescousse.

Notez également que nous utilisons border-bottom-color pour cet arc car nous voulons que l'arc s'affiche

Sortie:


 Capture d'écran de l'image arrondie d'Iron Man entourée de deux arcs
La fonction calc ajoute 12px pour créer l'écart de 6px entre l'arc et l'image

Animation des arcs

Nos arcs sont prêts, faisons-les tourner autour de l'image maintenant. Nous pouvons le faire avec l'aide des animations CSS.

Toute animation nécessite trois choses de base: l'état de départ de l'animation, l'état final de l'animation et le temps qu'il faut pour passer de l'état initial (vitesse de l'animation).

Nous pouvons fournir ces données en CSS comme ceci:

 .profile-row .dp .dp-arc-inner {
  position: absolue;
  largeur: 100%;
  hauteur: 100%;
  bordure: 6px solide transparent;
  border-top-color: # 0AE0DF;
  border-radius: 50%;
  haut: -6px;
  à gauche: -6px;

  animation-durée: 2s;
  nom-animation: rotation-horloge;
}
@keyframes rotate-clock {
  de {
    transformer: tourner (0deg);
  }
  à {
    transformer: tourner (360deg);
  }
}

Nous utilisons "@keyframes" pour définir l'animation. Les mots clés "from" et "to" sont utilisés pour définir l'état de début et de fin de l'animation.

Dans l'état de départ, nous tournons l'arc de 0 degré en utilisant transform: rotate (0deg) et dans l'état final, nous tournons l'arc à 360 degrés en utilisant la transformation : rotation (360deg) .

Pour utiliser cette animation sur un élément, nous devons donner le nom de l'animation ( rotate-clock dans notre cas) à la propriété nom-animation de cet élément. C'est ce que nous faisons avec animation-name: rotate-clock .

Nous devons aussi dire combien de temps l'animation doit durer. Nous l'avons fait en mettant la propriété "animation-duration" à "2s".

Voir le Pen Avengers ID Card – 1 par Kunal Sarkar ( @supersarkar ) le CodePen .

Vous remarquerez deux problèmes dans la sortie. Un, l'arc est tourné une seule fois, nous voulons qu'il continue à tourner, et deux, l'animation n'est pas linéaire. L'animation est rapide au début et à la fin, nous voulons qu'elle tourne avec la même vitesse tout au long de l'animation.

Pour résoudre ces problèmes, nous utiliserons la propriété animation-itération-count pour continuer l'animation infinie times, et animation-timing-function propriété pour obtenir une animation linéaire:

 .profile-row .dp .dp-arc-inner {
  position: absolue;
  largeur: 100%;
  hauteur: 100%;
  bordure: 6px solide transparent;
  border-top-color: # 0AE0DF;
  border-radius: 50%;
  haut: -6px;
  à gauche: -6px;

  animation-durée: 2s;
  nom-animation: rotation-horloge;
  animation-itération-compte: infini;
  animation-timing-function: linéaire;
}

Voir le stylo Carte d'identité Avengers – 2 par Kunal Sarkar ( @supersarkar ) le CodePen .

Bon, l'arc interne tourne maintenant comme prévu. Maintenant, animons l'arc extérieur de la même façon, mais dans la direction opposée:

 .profile-row .dp {
  flex-basis: 33,3%;
  position: relative;
  marge: 24px;
}
.profile-row .dp .dp-arc-outer {
  position: absolue;
  largeur: calc (100% + 12px);
  hauteur: calc (100% + 12px);
  bordure: 6px solide transparent;
  border-bottom-color: # 0AE0DF;
  border-radius: 50%;
  haut: -12px;
  à gauche: -12px;

  animation-durée: 2s;
  nom-animation: rotate-anticlock;
  animation-itération-compte: infini;
  animation-timing-function: linéaire;
}
@keyframes rotate-anticlock {
  de {
    transformer: tourner (0deg);
  }
  à {
    transformer: tourner (-360deg);
  }
}

Nous avons seulement changé l'état "à" pour l'arc extérieur. Au lieu de le faire tourner à 360 degrés, nous l'avons fait pivoter à 360 degrés pour obtenir une animation dans le sens inverse des aiguilles d'une montre.

Notez que nous avons ajouté 24px de marge au .dp pour qu'il ne soit pas t être trop congestionné. Voici à quoi ressemble notre résultat maintenant:

Voir le stylo Avengers Carte d'identité – 3 par Kunal Sarkar ( @supersarkar ) le CodePen .

Utilisation d'une police Google Sci-Fi

Tony rend visite à nouveau, et cette fois, il est content de l'endroit où nous allons. Une seule chose cependant, il demande d'utiliser une police de science-fiction.

Pas de problème, nous allons utiliser la police Orbitron de Google Fonts. Google Fonts donne une mine de polices gratuitement et cette police particulière correspond à notre exigence ici

Cliquez sur "Sélectionner cette police":


 Capture d'écran de la police de Google de la police Orbitron
Vous verrez le "Sélectionnez cette police "lien une fois que vous visitez le lien de police de Google

Un survol apparaîtra en bas. Clique dessus. Vous obtiendrez deux codes: le code à copier dans votre code HTML, et le code police-famille à utiliser dans votre CSS:


 Capture d'écran de la police de police de Orbitron avec la police sélectionnée
Lorsque vous cliquez sur le lien "Sélectionner cette police", une fenêtre contextuelle s'affiche avec le lien et le code "font-family" de cette police

Copiez le code dans votre fichier HTML juste au-dessus de la ligne où vous incluez votre feuille de style

Maintenant, ajoutons quelques détails d'Iron Man dans la div desc :

            
                
                
                             

Tony Stark

Force: Costume d'Ironman

Faiblesse: Aucun (e)

Connu sous: Iron Man

            
        
    

Dans notre CSS, nous allons utiliser le code font-family de Google Fonts pour définir la police de "desc" div:

 .profile-row .desc {
  famille de polices: 'Orbitron', sans-serif;
  couleur: # a4f3f2;
}
.profile-row .desc h1 {
  marge: 0px;
}

Attendez une seconde, pourquoi mettons-nous la marge de h1 à 0?

Tous les éléments de titre ( h1 h2 h3 h4 et h5 ) sont affichés avec une certaine marge autour de lui par les navigateurs. Ce n'est généralement pas un problème, mais nous ne voulons pas les lacunes supérieures et inférieures autour des éléments de la rubrique en ce moment. C'est pourquoi nous avons mis à zéro la marge pour l'élément h1 .

Regardons la sortie:

Voir le stylo Avengers ID Card – 4 par Kunal Sarkar ( ] @supersarkar ) le CodePen .

Oh non! Qu'est-ce qui s'est passé?

Ce qui se passe est que la hauteur de la div dp augmente.

Normalement, si le contenu de la div desc est plus haut que la hauteur du dp div alors rien n'arrive au div dp . Cependant, dans la mise en page flexbox, la hauteur de la div dp augmentera aussi avec la hauteur de la div desc

Nous ne voulons pas la dp div pour augmenter en hauteur avec le desc div, et nous pouvons le faire en utilisant [align-self] (https://developer.mozilla.org/en-US/docs/Web/CSS/align -self) sous-propriété de flexbox:

 .profile-row .dp {
  flex-basis: 33,3%;
  align-self: centre;
  position: relative;
  marge: 24px;
}

Voir le stylo Carte d'identité Avengers – 5 par Kunal Sarkar ( @supersarkar ) le CodePen .

Le align-self: center rend le dp div au centre en gardant sa hauteur identique.

Ajout de Glow

Ajoutons un peu de lueur.

Mais attendez, CSS n'a aucune propriété de lueur.

Aucun problème, il possède la propriété [text-shadow] (https://developer.mozilla.org/en-US/docs/Web/CSS/text-shadow) . Si nous donnons une couleur vive à l'ombre, l'ombre aura l'air brillante:

 .profile-row .desc {
  famille de polices: 'Orbitron', sans-serif;
  couleur: # d3f8f7;
  texte-ombre: 0px 0px 4px # 12a0a0;
  espacement des lettres: 1px;
}

Dans la propriété texte-ombre la première valeur, 0px correspond au décalage x, à quel point l'ombre est éloignée du texte dans la direction x. La deuxième valeur, 0px est le décalage y, nous indiquant à quel point l'ombre est éloignée du texte dans la direction y. La troisième valeur, 4px est la quantité de flou que vous voulez donner à l'ombre. La quatrième valeur, # 12a0a0 est la couleur de l'ombre.

Notez que nous avons également ajouté un espace 1px entre les lettres du texte en utilisant [letter-spacing] (https: //developer.mozilla. org / en-US / docs / Web / CSS / letter-spacing) propriété parce que le texte semblait un peu encombré.

Ensuite, ajoutons un peu d'ombre à la carte d'identité et à l'image:

. carte d'identité {
  flex-base: 100%;
  largeur maximale: 30em;
  bordure: 1px solide rgb (97, 245, 245);
  marge: auto;
  couleur: #fff;
  rembourrage: 1em;
  couleur de fond: # 0D2C36;
  boîte-ombre: 0px 0px 3px 1px # 12a0a0, encart 0px 0px 3px 1px # 12a0a0;
}
.profile-row .dp img {
  largeur maximale: 100%;
  border-radius: 50%;
  bloc de visualisation;
  box-shadow: 0px 0px 4px 3px # 12a0a0;
}

La propriété texte-ombre donne l'ombre au texte, et la [box-shadow] (https://developer.mozilla.org/en-US/docs/Web/CSS/box-shadow) propriété donne l'ombre aux éléments.

Les trois premières valeurs pour box-shadow sont les mêmes que text-shadow : x-offset, y-offset, et brouiller. La quatrième valeur est combien vous voulez que l'ombre se propage, et la cinquième valeur est la couleur de l'ombre.

Remarquez comment nous donnons deux ombres, extérieure et intérieure, à la carte d'identité div dans une seule ligne:

 boîte-ombre: 0px 0px 3px 1px # 12a0a0, encart 0px 0px 3px 1px # 12a0a0;

Les cinq premières valeurs créent une ombre extérieure. Ensuite, le mot-clé "inset" spécifie que les cinq valeurs suivantes sont pour l'ombre interne. Nous séparons les deux avec un .

Voir le stylo Avengers Carte d'identité par Kunal Sarkar ( @supersarkar ) le CodePen .

La carte d'identité Avengers est prête. Yay!

Wrapping Up

Dans ce tutoriel, nous avons appris comment créer un arrière-plan pleine page et centrer les éléments avec Flexbox et les marges automatiques. Nous avons vu l'utilisation basique de Flexbox et des Flexbox imbriqués pour faire des mises en page à une seule dimension.

Si vous voulez approfondir Flexbox, consultez " Un guide complet de Flexbox " de Chris Coyier sur CSS-Tricks . Si vous êtes plus un apprenant vidéo, alors vous apprécierez le cours gratuit de 20 vidéos par Web Bos à Flexbox.io .

Nous avons également utilisé des animations CSS et la rotation pour transformer des arcs animés, cependant , nous avons utilisé un nombre limité de propriétés et de valeurs CSS. Si vous voulez en savoir plus sur les animations CSS, vous allez adorer ce guide détaillé MDN .

Enfin, les éléments lumineux ont donné à notre carte d'identité un look de science-fiction unique. Nous avons utilisé la propriété "box-shadow" pour donner de l'éclat à nos éléments. Parfois, définir manuellement les valeurs de la propriété "box-shadow" devient fastidieux. Utilisez Box Shadow CSS Generator de CSSmatic pour générer facilement des ombres de boîte.

 Éditorial Smashing (rb, ra, il)




Source link