Comment construire un graphique en anneau semi-circulaire avec CSS

Bien que HTML5 Canvas et SVG soient peut-être des solutions plus élégantes pour la création de graphiques, dans ce didacticiel, nous allons apprendre à créer notre propre graphique en anneau avec du simple CSS..

Pour avoir une idée de ce que nous allons créer, jetez un œil à la démo de CodePen intégrée ci-dessous:

Balisage HTML

Nous commençons avec des balises très basiques; une liste non ordonnée avec un envergure élément à l'intérieur de chacun des éléments de la liste: 

  • CSS
  • HTML
  • PHP
  • Python

Ajout de styles à la liste

Avec le balisage prêt, nous appliquons d’abord quelques styles de base à la liste non ordonnée:

.chart-skills position: relative; largeur: 350px; hauteur: 175px; 

Ensuite, nous allons donner à chacun un ::après et un ::avant pseudo-élément, et leur style:

.chart-skills :: before, .chart-skills :: after position: absolue;  .chart-skills :: before content: "; width: hériter; hauteur: hériter; border: 45px solid rgba (211,211,211, .3); border-bottom: none; border-haut-gauche-rayon: 175px; border -top-right-radius: 175px; .chart-skills :: after contenu: 'Principales compétences'; gauche: 50%; bas: 10px; transformation: translateX (-50%); taille de police: 1.1rem; poids de police: gras; couleur: bleu cadet;

Faites attention aux styles pour le ::avant pseudo-élément. Cela nous donne notre demi-cercle.

Pseudo-éléments

Jusqu'à présent, les règles susmentionnées nous donnent ce résultat:

Ajout de styles aux éléments de la liste

Parlons maintenant du style des éléments de la liste.

Positionnement 

En ce qui concerne la position des éléments de la liste, nous procédons comme suit:

  • Placez-les juste sous leur parent et
  • donnez-leur des styles appropriés pour créer un demi-cercle inversé.

En outre, il convient de noter quelques éléments:

  • Les éléments de la liste sont parfaitement positionnés, nous pouvons donc définir leur z-index propriété.
  • Nous modifions la valeur par défaut transformer-origine valeur de la propriété (i.e. origine de la transformation: 50% 50%) de la liste des éléments. Plus précisément, nous définissons transformation d'origine: 50% 0. De cette manière, lorsque nous animons (pivotons) les éléments, leur coin supérieur central devient le centre de rotation..

Voici les styles CSS associés:

.charte-compétences li position: absolue; Top 100%; gauche: 0; largeur: hériter; hauteur: hériter; bordure: solide 45px; bordure supérieure: aucune; border-bottom-left-radius: 175px; border-bottom-right-radius: 175px; origine de la transformation: 50% 0;  .chart-skills li: nième enfant (1) z-index: 4; couleur de bordure: vert;  .chart-skills li: nième enfant (2) z-index: 3; couleur de bordure: brique réfractaire;  .chart-skills li: nième enfant (3) z-index: 2; couleur de bordure: bleu acier;  .chart-skills li: nième enfant (4) z-index: 1; couleur de bordure: orange; 

Regardez ce que nous avons construit jusqu'à présent dans la prochaine visualisation:

étendues et éléments de liste

Actuellement, le seul élément de liste visible est le vert (qui a z-index: 4;) les autres sont en dessous.

Animations

Avant de couvrir les étapes pour animer nos éléments de la liste, prenons note du pourcentage souhaité pour chaque élément (c.-à-d. Combien de beignet chacun couvrira). Considérons le tableau suivant:

La langue Pourcentage
CSS 12
HTML 32
PHP 34
Python 22

Ensuite, nous calculons combien de degrés nous devons animer (faire pivoter) chacun des éléments. Pour connaître le nombre exact de degrés pour chaque élément, nous multiplions son pourcentage par 180 ° (et non par 360 ° car nous utilisons un demi-cercle donut graphique):

La langue Pourcentage
Nombre de degrés
CSS 12 12/100 * 180 = 21,6
HTML 32
32/100 * 180 = 57,6
PHP 34 34/100 * 180 = 61,2
Python 22 22/100 * 180 = 39,6

À ce stade, nous sommes prêts à configurer les animations. Tout d’abord, nous définissons des styles d’animation partagés entre tous les éléments, en ajoutant des règles à .graphique-compétences li:

 animation-fill-mode: en avant; animation-duration: .4s; animation-timing-function: linéaire; 

Ensuite, nous définissons les styles d'animation uniques:

.chartes graphiques li: nième enfant (1) z-index: 4; couleur de bordure: vert; nom-animation: rotation-un;  .chart-skills li: nième enfant (2) z-index: 3; couleur de bordure: brique réfractaire; nom-animation: rotation-deux; animation-delay: .4s;  .chart-skills li: nième enfant (3) z-index: 2; couleur de bordure: bleu acier; nom-animation: rotation-trois; animation-delay: .8s;  .chart-skills li: nième enfant (4) z-index: 1; couleur de bordure: orange; nom-animation: rotation-quatre; délai d'animation: 1.2s; 

Notez que nous ajoutons un délai à tous les éléments sauf le premier. De cette façon, nous créons de belles animations séquentielles. Par exemple, lorsque l'animation du premier élément est terminée, le deuxième élément apparaît, etc.. 

L'étape suivante consiste à spécifier les animations réelles:

@ images clés rotation-une 100% transformation: rotation (21.6deg); / ** * 12% => 21.6deg * / @ images clés rotation-deux 0% transformation: rotation (21.6deg);  100% transformer: rotate (79.2deg); / ** * 32% => 57.6deg * 57.6 + 21.6 => 79.2deg * / @ images-clés rotation-trois 0% transformation: rotation (79.2deg);  100% transformer: rotation (140.4deg); / ** * 34% => 61.2deg * 61.2 + 79.2 => 140.4deg * / @ images-clés rotation-quatre 0% transformation: rotation (140,4deg);  100% transformer: faire pivoter (180deg); / ** * 22% => 39.6deg * 140.4 + 39.6 => 180deg * /

Avant d'aller plus loin, nous verrons brièvement comment fonctionnent les animations:

Le premier élément va de transformer: aucun à transformer: faire pivoter (21.6deg).

Le deuxième élément va de transformer: faire pivoter (21.6deg)  (à partir de la position finale du premier élément) à transformer: faire pivoter (79.2deg) (57.6deg + 21.6deg). 

Le troisième élément va de transformer: faire pivoter (79.2deg)  (à partir de la position finale du deuxième élément) à transformer: faire pivoter (140.4deg) (61.2deg + 79.2deg).

Le quatrième élément va de transformer: faire pivoter (140.4deg)  (à partir de la position finale du troisième élément) à transformer: faire pivoter (180deg) (140.4deg + 39.6deg).

Cacher!

Dernier point mais non le moindre, pour masquer la moitié inférieure du graphique, nous devons ajouter les règles suivantes:

.chart-skills / * règles existantes… * / overflow: caché;  .chart-skills li / * règles existantes… * / transform-style: preserve-3d; visibilité face arrière: masquée; 

le débordement caché La valeur de la propriété garantit que seul le premier demi-cercle (celui créé avec le ::avant pseudo-élément) est visible. N'hésitez pas à supprimer cette propriété si vous souhaitez tester la position initiale des éléments de la liste. 

le transformer-style: preserve-3d et visibilité face arrière: masquée Les propriétés empêchent les effets de scintillement pouvant survenir dans différents navigateurs du fait des animations. Si le problème persiste dans votre navigateur, vous pouvez également essayer ces solutions..

Le graphique est presque prêt! Il ne reste plus qu'à styler les étiquettes des graphiques, ce que nous ferons dans la section suivante..

Voici la démo CodePen montrant l’apparence actuelle de notre graphique:

Ajout de styles aux étiquettes

Dans cette section, nous appelons les étiquettes de graphique.

Positionnement

En ce qui concerne leur position, nous faisons ce qui suit:

  • Donne leur position: absolue et utiliser le Haut et la gauche propriétés pour définir la position souhaitée.
  • Utilisez des valeurs négatives pour les faire pivoter. Bien sûr, ce ne sont pas des valeurs aléatoires. En fait, ceux-ci sont extraits de la dernière image de leur élément parent. Par exemple, la dernière image du deuxième élément de la liste comprend transformer: faire pivoter (79.2deg), et ainsi son étiquette associée aura transformer: faire pivoter (-79.2deg).

Voici les styles CSS correspondants:

.cartographie compétences position: absolue; taille de police: .85rem;  .chart-skills li: nième enfant (1) span top: 5px; à gauche: 10px; transformer: faire pivoter (-21,6 degrés);  .chart-skills li: nième enfant (2) span top: 20px; à gauche: 10px; transformer: faire pivoter (-79,2deg);  .chart-skills li: enfant-nième (3) span top: 18px; à gauche: 10px; transformer: faire pivoter (-140,4 degrés);  .chart-skills li: nième enfant (4) span top: 10px; à gauche: 10px; transformer: faire pivoter (-180deg); 

Animations

Maintenant que nous avons positionné les étiquettes, il est temps de les animer. Deux choses méritent d'être mentionnées ici:

  • Par défaut, toutes les étiquettes sont masquées et deviennent visibles lorsque leur élément parent est animé.. 
  • De la même manière que les éléments parents, nous utilisons le délai d'animation propriété pour créer des animations séquentielles. De plus, nous ajoutons le visibilité face arrière: masquée valeur de propriété pour s'assurer qu'il n'y a pas d'effets de scintillement dus aux animations.

Les règles CSS relatives à l'animation des étiquettes de graphique sont présentées ci-dessous:

.compétences graphique - visibilité arrière: caché; animation: fondu en avant .4s linéaire;  .chart-skills li: nième enfant (2) span animation-delay: .4s;  .chart-skills li: nth-child (3) span animation-delay: .8s;  .chart-skills li: nth-child (4) span délai-animation: 1.2s;  @keyframes fade-in 0%, 90% opacity: 0;  100% opacité: 1; 

Voici le tableau final:

Support du navigateur et problèmes

En général, la démo fonctionne bien dans tous les navigateurs. Je veux juste discuter de deux petites questions qui sont liées à la rayon de la frontière propriété.

Premièrement, si nous donnions des couleurs différentes à nos articles, le graphique pourrait ressembler à ceci: 

Remarquez par exemple les coins supérieur et inférieur du troisième élément. Il y a deux lignes rouges qui proviennent de la couleur de la bordure du quatrième élément. Nous pouvons voir ces lignes car le quatrième élément a une couleur de bordure plus sombre que le troisième. Bien que ce soit un petit problème, il est bon de le savoir pour choisir les couleurs appropriées pour vos propres graphiques..

Deuxièmement, dans Safari, le graphique apparaît comme suit:

Regardez les petites lacunes apparaissant dans les deuxième et troisième éléments. Si vous savez quelque chose à ce sujet, faites-le nous savoir dans les commentaires ci-dessous.!

Conclusion

Dans ce didacticiel, nous avons créé un graphique en anneau en demi-cercle avec du CSS pur. De nouveau, comme mentionné dans l'introduction, il existe des solutions potentiellement plus puissantes (par exemple, HTML5 Canvas et SVG) pour créer ce genre de choses. Cependant, si vous voulez construire quelque chose de simple et léger, et relever un défi, CSS est la voie à suivre.!