html { overflow: hidden; } .assembly { animation: rot-global 3s linear infinite; } .assembly, .assembly *, .assembly:before, .assembly :before, .assembly :after { box-sizing: border-box; position: absolute; top: 50%; left: 50%; border-radius: 50%; } .assembly:before { z-index: -1; border: solid .125em; margin: -8em; width: 16em; height: 16em; opacity: .001; animation: inherit; animation-name: fade-global; content: ''; } .circle { background: black; } .circle:nth-child(1) { transform: rotate(0deg) translateY(6.9282em); animation: rot-circles1 3s linear infinite; } .circle:nth-child(1) .dot:first-child { animation-name: dot-pos-a1; } .circle:nth-child(1) .dot:last-child { animation-name: dot-pos-a2; } @keyframes rot-circles1 { 0%, 33.334% { transform: rotate(0deg) translateY(6.9282em); } 66.666%, 100% { transform: rotate(0deg) translateY(6.9282em) rotate(180deg); } 66.667% { transform: rotate(90deg) translateY(4.0em); } 100% { transform: rotate(90deg) translateY(4.0em) rotate(180deg); } } .circle:nth-child(2) { transform: rotate(120deg) translateY(6.9282em); animation: rot-circles2 3s linear infinite; } .circle:nth-child(2) .dot:first-child { animation-name: dot-pos-a1; } .circle:nth-child(2) .dot:last-child { animation-name: dot-pos-a2; } @keyframes rot-circles2 { 0%, 33.334% { transform: rotate(120deg) translateY(6.9282em); } 66.666%, 100% { transform: rotate(120deg) translateY(6.9282em) rotate(180deg); } 66.667% { transform: rotate(-90deg) translateY(4.0em); } 100% { transform: rotate(-90deg) translateY(4.0em) rotate(180deg); } } .circle:nth-child(3) { transform: rotate(240deg) translateY(6.9282em); animation: rot-circles3 3s linear infinite; } .circle:nth-child(3) .dot:first-child { animation-name: dot-pos-b1; } .circle:nth-child(3) .dot:last-child { animation-name: dot-pos-b2; } @keyframes rot-circles3 { 0%, 33.334% { transform: rotate(240deg) translateY(6.9282em); } 66.666%, 100% { transform: rotate(240deg) translateY(6.9282em) rotate(180deg); } 66.667% { transform: none; } 100% { transform: rotate(180deg); } } .circle:before, .circle:after { z-index: -1; border: solid .125em; opacity: .001; animation: inherit; content: ''; } .circle:before { margin: -4em; width: 8em; height: 8em; animation-name: fade-2; } .circle:after { margin: -6.9282em; width: 13.85641em; height: 13.85641em; animation-name: fade-3; } .circle:last-child:after { margin: -8em; width: 16em; height: 16em; } .dot { margin: -1em; width: 2em; height: 2em; box-shadow: 0 0 .125em; background: inherit; animation: inherit; } .dot:first-child { transform: translate(4em); } .dot:last-child { transform: translate(-4em); } @keyframes rot-global { 0%, 33.334%, 100% { transform: rotate(0deg); } 33.333% { transform: rotate(60deg); } } @keyframes dot-pos-a1 { 0%, 66.666% { transform: translate(4em); } 66.667%, 100% { transform: translate(6.9282em); } } @keyframes dot-pos-a2 { 0%, 66.666% { transform: translate(-4em); } 66.667%, 100% { transform: translate(-6.9282em); } } @keyframes dot-pos-b1 { 0%, 66.666% { transform: translate(4em); } 66.667%, 100% { transform: translate(8em); } } @keyframes dot-pos-b2 { 0%, 66.666% { transform: translate(-4em); } 66.667%, 100% { transform: translate(-8em); } } @keyframes fade-global { 0%, 33.334%, 100% { opacity: .001; } 16.667% { opacity: .999; } } @keyframes fade-2 { 0%, 33.334%, 66.667%, 100% { opacity: .001; } 50% { opacity: .999; } } @keyframes fade-3 { 0%, 66.666%, 100% { opacity: .001; } 83.333% { opacity: .999; } }