• Contenu
  • Bas de page
logo ouidoulogo ouidoulogo ouidoulogo ouidou
  • Qui sommes-nous ?
  • Offres
    • 💻 Applications métier
    • 🤝 Collaboration des équipes
    • 🛡️ Sécurisation et optimisation du système d’information
    • 🔗 Transformation numérique
  • Expertises
    • 🖥️ Développement logiciel
    • ♾️ DevSecOps
    • ⚙️ Intégration de logiciels et négoce de licences
      • Atlassian : Jira, Confluence, Bitbucket…
      • Plateforme monday.com
      • GitLab
      • SonarQube
    • 📚​ Logiciel de CRM et de gestion
    • 🎨 UX/UI design
    • 🌐 Accessibilité Numérique
    • 🗂️​ Démarches simplifiées
    • 📝 Formations Atlassian
  • Références
  • Carrières
    • 🧐 Pourquoi rejoindre Ouidou ?
    • ✍🏻 Nous rejoindre
    • 👨‍💻 Rencontrer nos collaborateurs
    • 🚀 Grandir chez Ouidou
  • RSE
  • Ressources
    • 🗞️ Actualités
    • 🔍 Articles techniques
    • 📖 Livres blancs
    • 🎙️ Interviews Clients
Nous contacter
✕
Le SVG, pour quoi faire ?
Le SVG, pour quoi faire ?
23 novembre 2011
Vagrant et la virtualisation pour faciliter le développement
Vagrant et la virtualisation pour faciliter le développement
27 février 2013
Ressources > Articles techniques > Création d’une barre de chargement avec CSS

Création d’une barre de chargement avec CSS

Écrit par Victor D.

Bonjour à tous, aujourd’hui je vais vous présenter une petite astuce pour mettre en place une barre de chargement avec un tooltip qui affichera de façon élégante où elle en est, le tout avec quelques lignes de CSS.

J’expliquerai en détails les différentes règles CSS que j’ai utilisées, ce tuto est donc plutôt réservé aux débutants ou aux curieux. Si vous êtes déjà impatient de découvrir cette barre de chargement, voyez un aperçu sur codepen.

Partie DOM

Dans un premier temps, mettons en place notre HTML. On va essayer de rester simple, un conteneur pour la barre en elle-même et à l’intérieur une seconde barre qui nous indiquera le taux de complétion du chargement.

  <div class="bar">
    <div class="percentage has-tip"  style="width: 50%" data-perc="50%">
    </div>
  </div>

Les attributs HTML, nous servirons à contrôler l’élément avec JavaScript pour la démonstration mais aussi à donner le pourcentage de chargement à la bulle qui suit l’élément coloré.

Les classes .bar et .percentage, nous aiderons à sélectionner ces éléments et la classe .has-tip permettra de mettre en place l’info-bulle.

Dans l’idéal, avec un framework JS front de type Angular ou Ember, nous pourrions mettre en place un binding sur les 2 attributs (en n’oubliant pas de leur passer une chaîne et pas un entier).

Partie CSS

Passons maintenant à la partie la plus intéressante, les CSS. J’ai fait en sorte de définir chacune des tailles avec l’unité em dans un souci de flexibilité (vous n’aurez donc qu’à changer le font-size de l’élément pour agrandir ou réduire sa taille).

Le conteneur

Dans un premier temps, nous définissons un conteneur, dont la largeur devra être définie afin de laisser la possibilité au contenu d’être dimensionné en pourcentage.

Cet élément devra disposer d’une position: relative; afin de placer ses enfants en absolute.

Pour l’exemple, je souhaitais avoir une bordure intérieure, qui passe sous le contenu, plutôt que d’utiliser des astuces de bordures + marge négative, je préfère utiliser une box-shadow (avec une valeur de spread à 1px qui définira l’épaisseur de la bordure).

  .bar {
    /* font-size: 10px */
    width: 30em
    height: 1em
    border-radius: 0.5em
    position: relative
    background: #f2f2f2
    box-shadow: inset 0 0 0 1px rgba(0,0,0,0.1)
  }

Le contenu

Rien de bien sorcier pour la barre de complétion, nous lui appliquons une couleur bien visible, une hauteur égale à son conteneur et une position: relative puisque d’autres éléments arriveront plus tard en absolute.

Notez que j’ai utilisé des border-radius identiques pour ces 2 éléments, cela nous permettra de ne pas avoir à mettre un overflow:hidden sur le conteneur, qui nous gênerait par la suite.

  .bar .percentage {
    position: relative
    font-size: 1em
    background: tomato
    height: 1em
    border-radius: 0.5em
  }

L’infobulle

Pour l’infobulle, je voudrais ne pas créer de nouveaux éléments HTML, pour cela, nous utilisons les pseudo-éléments CSS (:before et :after).

Dans l’exemple sur codepen (que vous retrouverez en fin d’article) j’ai pris le parti pris d’utiliser une classe spécifique pour l’info bulle : has-tip. Cela vous permettrait de l’utiliser dans d’autre situation pour remplacer un plugin Javascript de tooltip par exemple.

Pour les 2 pseudo-éléments, nous mettons un content pour qu’ils soient générés dans le DOM, un positionnement absolu par rapport à la barre de défilement et une opacité nulle pour ne l’afficher qu’en cas de besoin.

  .has-tip:before,
  .has-tip:after {
    content: "";
    position: absolute;
    opacity: 0;
  }

Flèche vers le haut (ou comment faire un triangle avec CSS)

Pour indiquer que l’info-bulle est bien relative (visuellement) à la barre de complétion, nous allons créer avec :before une flèche allant de l’info bulle vers la barre (vers le haut dans notre cas). Pour cela, nous allons jouer avec une astuce des bordures qui nous permet de créer un triangle en 2 lignes de CSS. Nous définissons 4 bordures de même taille, type solid, et de couleur transparente sauf celle du bas afin de créer un triangle vers le haut (n’hésitez pas à tester cette technique si elle ne vous est pas familière, c’est très pratique). La transition permettra de rendre plus fluide une quelconque animation de l’élément.

 .has-tip:before {
    bottom: -10px;
    right: -5px;
    border: 5px solid;
    border-color: transparent transparent tomato transparent;
    transition: opacity 0.1s;
  }

Dans l’infobulle, il y a surtout “bulle”

Maintenant la partie fonctionnelle de la bulle, nous allons afficher la valeur actuelle de la barre de chargement.

On commence par récupérer la valeur définie dans l’attribut data-perc de notre barre de complétion avec content: attr, je lui applique un padding, un border-radius, des couleurs pour que ce soit plus élégant, et des transitions pour une probable animation.

J’ai décidé de placer l’élément avec transform afin de pouvoir jouer avec cette propriété pendant une animation. Le translateX sert surtout à être sûr que la bulle sera alignée en son centre avec la flèche et le bord droit de la barre de chargement.

.has-tip:after {
     content: attr(data-perc);
     bottom: 0;
     right: 0;
     white-space:nowrap;
     padding: 0.6em 1em;
     border-radius: 2em;
     line-height: 1;
     color: #fff;
     background: tomato;
     transform: translateX(50%) translateY(100%);
     transition: transform 0.2s,opacity 0.1s;
}

Maintenant, on affiche tout ça

J’ai décidé pour l’exemple d’afficher l’infobulle au :hover de l’élément mais aussi lorsque ce dernier a une classe .active (afin de gérer facilement une animation plus complète avec JavaScript).

Nous commençons par afficher la flèche en modifiant son opacité. Nous faisons pareil avec la bulle dans le bloc suivant, et cette fois-ci, nous modifions la position de 10px (qui est la taille de notre flèche, rappelez-vous), nous obtiendrons de cette manière un effet léger de défilement de la bulle lorsque nous survolerons la barre.

.has-tip:hover:before,
.has-tip.active:before {
  opacity: 1; 
} 

.has-tip:hover:after,
.has-tip.active:after { 
  opacity: 1; 
  transform: translateX(50%) translateY(100%) translateY(10px); 
}

Maintenant que nous avons vu en détails la construction de cette barre de chargement, voici le résultat que vous devriez obtenir :

See the Pen CSS loading bar by Victor Darras (@victordarras) on CodePen.

Je ne m’attarderai pas sur le JavaScript, il n’est pas très intéressant et ne sert qu’à l’animation.

N’hésitez pas à déformer, hacker ou adapter cet élément visuel, je serais curieux de voir ce que chacun pourra en faire. N’oubliez pas que vous pouvez me poser des questions en bas de page et partager cet article s’il vous a plu.

À bientôt !

À lire aussi

Fresque numérique miniature image
16 avril 2025

Fresque du Numérique

Lire la suite

intelligence artificielle Ouicommit miniature image
17 mars 2025

Ouicommit – L’intelligence artificielle en entreprise, on y est ! 

Lire la suite

Image miniature Hackathon Women in Tech
13 mars 2025

Hackathon Women in Tech :  un engagement pour une tech plus inclusive 

Lire la suite

image miniature les nouveautés Atlassian
26 février 2025

Les nouveautés Atlassian en 2025

Lire la suite

Articles associés

Fresque numérique miniature image
16 avril 2025

Fresque du Numérique


Lire la suite
intelligence artificielle Ouicommit miniature image
17 mars 2025

Ouicommit – L’intelligence artificielle en entreprise, on y est ! 


Lire la suite
Image miniature Hackathon Women in Tech
13 mars 2025

Hackathon Women in Tech :  un engagement pour une tech plus inclusive 


Lire la suite

À propos

  • Qui sommes-nous ?
  • Références
  • RSE
  • Ressources

Offres

  • Applications métier
  • Collaboration des équipes
  • Sécurisation et optimisation du système d’information
  • Transformation numérique

Expertises

  • Développement logiciel
  • DevSecOps
  • Intégration de logiciels et négoce de licences
  • Logiciel de CRM et de gestion
  • UX/UI design
  • Accessibilité Numérique
  • Démarches simplifiées
  • Formations Atlassian

Carrières

  • Pourquoi rejoindre Ouidou ?
  • Nous rejoindre
  • Rencontrer nos collaborateurs
  • Grandir chez Ouidou

SIEGE SOCIAL
70-74 boulevard Garibaldi, 75015 Paris

Ouidou Nord
165 Avenue de Bretagne, 59000 Lille

Ouidou Rhône-Alpes
4 place Amédée Bonnet, 69002 Lyon

Ouidou Grand-Ouest
2 rue Crucy, 44000 Nantes

Ouidou Grand-Est
7 cour des Cigarières, 67000 Strasbourg

  • Linkedin Ouidou
  • GitHub Ouidou
  • Youtube Ouidou
© 2024 Ouidou | Tous droits réservés | Plan du site | Mentions légales | Déclaration d'accessibilité
    Nous contacter