<div class="container"> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> <div class="particle"></div> </div> <style> .container { --uib-size: 45px; --uib-color: black; --uib-speed: 1.75s; position: relative; height: var(--uib-size); width: var(--uib-size); animation: rotate calc(var(--uib-speed) * 4) linear infinite; } @keyframes rotate { 0% { transform: rotate(0deg); } 100% { transform: rotate(360deg); } } .particle { position: absolute; top: 0%; left: 0; display: flex; align-items: center; justify-content: center; height: 100%; width: 100%; &:nth-child(1) { --uib-delay: 0; transform: rotate(8deg); } &:nth-child(2) { --uib-delay: -0.4; transform: rotate(36deg); } &:nth-child(3) { --uib-delay: -0.9; transform: rotate(72deg); } &:nth-child(4) { --uib-delay: -0.5; transform: rotate(90deg); } &:nth-child(5) { --uib-delay: -0.3; transform: rotate(144deg); } &:nth-child(6) { --uib-delay: -0.2; transform: rotate(180deg); } &:nth-child(7) { --uib-delay: -0.6; transform: rotate(216deg); } &:nth-child(8) { --uib-delay: -0.7; transform: rotate(252deg); } &:nth-child(9) { --uib-delay: -0.1; transform: rotate(300deg); } &:nth-child(10) { --uib-delay: -0.8; transform: rotate(324deg); } &:nth-child(11) { --uib-delay: -1.2; transform: rotate(335deg); } &:nth-child(12) { --uib-delay: -0.5; transform: rotate(290deg); } &:nth-child(13) { --uib-delay: -0.2; transform: rotate(240deg); } } .particle::before { content: ''; position: absolute; height: 17.5%; width: 17.5%; border-radius: 50%; background-color: var(--uib-color); flex-shrink: 0; transition: background-color 0.3s ease; --uib-d: calc(var(--uib-delay) * var(--uib-speed)); animation: orbit var(--uib-speed) linear var(--uib-d) infinite; } @keyframes orbit { 0% { transform: translate(calc(var(--uib-size) * 0.5)) scale(0.73684); opacity: 0.65; } 5% { transform: translate(calc(var(--uib-size) * 0.4)) scale(0.684208); opacity: 0.58; } 10% { transform: translate(calc(var(--uib-size) * 0.3)) scale(0.631576); opacity: 0.51; } 15% { transform: translate(calc(var(--uib-size) * 0.2)) scale(0.578944); opacity: 0.44; } 20% { transform: translate(calc(var(--uib-size) * 0.1)) scale(0.526312); opacity: 0.37; } 25% { transform: translate(0%) scale(0.47368); opacity: 0.3; } 30% { transform: translate(calc(var(--uib-size) * -0.1)) scale(0.526312); opacity: 0.37; } 35% { transform: translate(calc(var(--uib-size) * -0.2)) scale(0.578944); opacity: 0.44; } 40% { transform: translate(calc(var(--uib-size) * -0.3)) scale(0.631576); opacity: 0.51; } 45% { transform: translate(calc(var(--uib-size) * -0.4)) scale(0.684208); opacity: 0.58; } 50% { transform: translate(calc(var(--uib-size) * -0.5)) scale(0.73684); opacity: 0.65; } 55% { transform: translate(calc(var(--uib-size) * -0.4)) scale(0.789472); opacity: 0.72; } 60% { transform: translate(calc(var(--uib-size) * -0.3)) scale(0.842104); opacity: 0.79; } 65% { transform: translate(calc(var(--uib-size) * -0.2)) scale(0.894736); opacity: 0.86; } 70% { transform: translate(calc(var(--uib-size) * -0.1)) scale(0.947368); opacity: 0.93; } 75% { transform: translate(0%) scale(1); opacity: 1; } 80% { transform: translate(calc(var(--uib-size) * 0.1)) scale(0.947368); opacity: 0.93; } 85% { transform: translate(calc(var(--uib-size) * 0.2)) scale(0.894736); opacity: 0.86; } 90% { transform: translate(calc(var(--uib-size) * 0.3)) scale(0.842104); opacity: 0.79; } 95% { transform: translate(calc(var(--uib-size) * 0.4)) scale(0.789472); opacity: 0.72; } 100% { transform: translate(calc(var(--uib-size) * 0.5)) scale(0.73684); opacity: 0.65; } } </style>