SCSS practice
A Pen by Vashon Gonzales on CodePen.
SCSS practice
A Pen by Vashon Gonzales on CodePen.
<link rel="stylesheet" href="https://i.icomoon.io/public/temp/0b1ac9bc57/PartnerIcons/style.css"> | |
<div class="orbit"> | |
<ul class="orbit-wrap"> | |
<li class="orbit-center"> | |
<i class="orbit-center__icon fa fa-code"></i> | |
</li> | |
<li> | |
<ul class="ring-0"> | |
<li><i class="icon-plaid"></i> | |
<li><i class="orbit-icon fa fa-git"></i></li> | |
<span class="icon-CU2"> | |
<li><i class="orbit-icon fa fa-meetup"></i></li> | |
<li><i class="orbit-icon fa fa-codepen"></i></li> | |
</ul> | |
</li> | |
<li> | |
<ul class="ring-1"> | |
<li><i class="orbit-icon fa fa-podcast"></i></li> | |
<li><i class="orbit-icon fa fa-css3"></i></li> | |
<li><i class="orbit-icon fa fa-html5"></i></li> | |
</ul> | |
</li> | |
<li> | |
<ul class="ring-2"> | |
<li><i class="orbit-icon fa fa-windows"></i></li> | |
<li><i class="orbit-icon fa fa-safari"></i></li> | |
<li><i class="orbit-icon fa fa-edge"></i></li> | |
<li><i class="orbit-icon fa fa-linux"></i></li> | |
<li><i class="orbit-icon fa fa-apple"></i></li> | |
<li><i class="orbit-icon fa fa-chrome"></i></li> | |
<li><i class="orbit-icon fa fa-android"></i></li> | |
<li><i class="orbit-icon fa fa-firefox"></i></li> | |
</ul> | |
</li> | |
<li> | |
<ul class="ring-3"> | |
<li><i class="orbit-icon fa fa-coffee"></i></li> | |
<li><i class="orbit-icon fa fa-terminal"></i></li> | |
<li><i class="orbit-icon fa fa-heart-o"></i></li> | |
</ul> | |
</li> | |
</ul> | |
</div> |
$orbitItemSize: 1.6em; | |
$map: (ring-0: 4, ring-1: 3, ring-2: 8, ring-3: 3); | |
$lastRing: 3; | |
.orbit { | |
float: left; | |
width: 100%; | |
min-width: 100vw; | |
min-height: 100vh; | |
} | |
.orbit-icon { | |
width: $orbitItemSize; | |
height: $orbitItemSize; | |
line-height: $orbitItemSize; | |
font-size: 1.2em; | |
border-radius: 50%; | |
background: #ccc; | |
color: #fff; | |
text-align: center; | |
display: block; | |
} | |
.orbit-wrap { | |
height: 40em; | |
list-style: none; | |
font-size: 1.3em; | |
> li { | |
position: absolute; | |
left: 50%; | |
top: 50%; | |
transform: translate(-50%, -50%); | |
&:hover { | |
ul { | |
border-width: 2px; | |
border-color: #fff; | |
} | |
~ li ul { | |
border-color: rgba(255, 255, 255, 0.2); | |
li { | |
opacity: 0.4; | |
} | |
} | |
} | |
} | |
} | |
ul[class^=ring] { | |
@extend %ring; | |
transition: all 300ms ease-in-out; | |
li { | |
@extend %orbiting-object; | |
transition: all 300ms ease-in-out; | |
} | |
} | |
@mixin orbit-item($numItems, $numRing) { | |
@for $s from 1 through $numItems { | |
// Spread items over the ring | |
$deg: 380deg / $numItems; | |
.ring-#{$numRing} > *:nth-of-type(#{$s}) { | |
transform: rotate($s * $deg) translate(12.5em - ($numRing * 2.5)) rotate(-$s * $deg); | |
} | |
} | |
} | |
// Render rings | |
@for $i from 0 through $lastRing { | |
.ring-#{$i} { | |
// decrease each ring in size | |
width: 25em - ($i * 5); | |
height: 25em - ($i * 5); | |
animation: clockwiseRotate 35s - ($i * 5) linear infinite; | |
i { | |
animation: counterClockwiseRotate 35s - ($i * 5) linear infinite; | |
} | |
} | |
@include orbit-item(map-get($map, ring-#{$i}), $i); | |
} | |
%ring { | |
border: solid 1px rgba(33, 150, 243, 0.8); | |
position: relative; | |
padding: 0; | |
border-radius: 50%; | |
list-style: none; | |
box-sizing: content-box; | |
} | |
%orbiting-object { | |
display: block; | |
position: absolute; | |
top: 50%; | |
left: 50%; | |
width: $orbitItemSize; | |
height: $orbitItemSize; | |
margin: -$orbitItemSize / 2; | |
} | |
/* | |
center; | |
*/ | |
.orbit-center { | |
z-index: 5; | |
font-size: 2em; | |
width: 1.8em; | |
height: 1.8em; | |
line-height: 1.8em; | |
text-align: center; | |
background: hotpink; | |
border-radius: 50%; | |
&:hover .orbit-center__icon { | |
transform: rotateZ(0deg); | |
} | |
} | |
.orbit-center__icon { | |
transform: rotateZ(-360deg); | |
transition: all 300ms ease-in-out; | |
} | |
.orbit-wrap > li.orbit-center:hover ~ li > ul { | |
width: 0; | |
height: 0; | |
* { | |
transform: translate(0, 0); | |
} | |
} | |
/* | |
animations | |
*/ | |
@keyframes clockwiseRotate { | |
from { | |
transform: rotate(0deg) | |
} | |
to { | |
transform: rotate(360deg) | |
} | |
} | |
@keyframes counterClockwiseRotate { | |
0% { | |
transform: rotate(0deg); | |
} | |
100% { | |
transform: rotate(-360deg); | |
} | |
} | |
/* | |
icons | |
*/ | |
$icons : ( | |
('heart-o', #b71c1c, white), | |
('coffee', #4CAF50, #CDDC39), | |
('safari', white, darkslateblue), | |
('firefox', #1565c0, #ff8f00), | |
('chrome', #fbc02d, #ef6c00), | |
('edge', #03a9f4, white), | |
('android', snow, limegreen), | |
('apple', #444, white), | |
('linux', white, #222), | |
('windows', white, #03a9f4), | |
('terminal', #222, #fff), | |
('html5', white, #e65100), | |
('css3', white, #2196f3), | |
('git', #222, white), | |
('free-code-camp', green, white), | |
('meetup', red, white), | |
('podcast', red, white), | |
('codepen', #333, white) | |
); | |
@each $icon in $icons { | |
.fa-#{nth($icon, 1)} { | |
background: nth($icon, 2); | |
color: nth($icon, 3); | |
} | |
} | |
.icon-plaid { | |
z-index: 5; | |
font-size: 2em; | |
width: 1.8em; | |
height: 1.8em; | |
line-height: 1.8em; | |
text-align: center; | |
background: white; | |
border-radius: 50%; | |
margin-top: 10; | |
} | |
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css" rel="stylesheet" /> |