feedback · loader
3 styles de chargement : spinner rotatif, barre de progression avec pourcentage, points indéterminés. 100% CSS (animations @keyframes), aucun JavaScript.
<style>
.bn-loaders {
display: flex;
flex-wrap: wrap;
gap: 2.5rem;
align-items: center;
padding: 2.5rem;
font-family: 'Inter', sans-serif;
background: #0B0F10;
}
.bn-loaders__item {
display: flex;
flex-direction: column;
align-items: center;
gap: 0.75rem;
}
.bn-loaders__item--wide {
flex: 1 1 200px;
align-items: stretch;
}
.bn-loaders__label {
font-size: 0.75rem;
color: #979793;
text-align: center;
}
/* --- Spinner --- */
.bn-spinner {
width: 32px;
height: 32px;
border-radius: 50%;
border: 3px solid rgba(230, 228, 221, 0.15);
border-top-color: #E6E4DD;
animation: bn-spin 0.8s linear infinite;
}
@keyframes bn-spin {
to { transform: rotate(360deg); }
}
/* --- Barre de progression --- */
.bn-progress {
height: 4px;
border-radius: 999px;
background: rgba(230, 228, 221, 0.12);
overflow: hidden;
}
.bn-progress__fill {
height: 100%;
background: #E6E4DD;
border-radius: inherit;
}
/* --- Points indéterminés --- */
.bn-dots {
display: flex;
gap: 5px;
}
.bn-dots i {
width: 7px;
height: 7px;
border-radius: 50%;
background: #E6E4DD;
opacity: 0.3;
animation: bn-dots-pulse 1.2s ease-in-out infinite;
}
.bn-dots i:nth-child(2) { animation-delay: 0.15s; }
.bn-dots i:nth-child(3) { animation-delay: 0.3s; }
@keyframes bn-dots-pulse {
0%, 80%, 100% { opacity: 0.3; transform: scale(0.85); }
40% { opacity: 1; transform: scale(1); }
}
</style>
<div class="bn-loaders">
<div class="bn-loaders__item">
<span class="bn-spinner"></span>
<span class="bn-loaders__label">Chargement</span>
</div>
<div class="bn-loaders__item bn-loaders__item--wide">
<div class="bn-progress"><div class="bn-progress__fill" style="width: 42%;"></div></div>
<span class="bn-loaders__label">Progression — 42%</span>
</div>
<div class="bn-loaders__item">
<span class="bn-dots"><i></i><i></i><i></i></span>
<span class="bn-loaders__label">Indéterminé</span>
</div>
</div>