schaf.dev/static/css/main.css
2026-03-29 20:46:18 +02:00

174 lines
3.9 KiB
CSS

:root {
--side-length: 30vw;
--side-length-neg: -30vw;
--side-length-half: calc(var(--side-length) / 2);
--side-length-half-neg: calc(var(--side-length-neg) / 2);
--colour-bg-main: #d4c3a3;
--colour-bg-secondary: #4a4a4a;
--colour-primary: #f6e8d4;
--colour-text-main: #fff;
--colour-cube-1: #dd4814;
--colour-cube-2: #0497aa;
}
@font-face {
font-family: "Montserrat";
src: url(../fonts/montserrat/Montserrat-Medium.otf) format("truetype");
}
html {
font-family: Montserrat, Verdana, Tahoma;
color: var(--colour-text-main);
background-color: var(--colour-bg-main);
font-size: 16px;
color: var(--colour-primary);
}
body {
margin: 0;
display: flex;
flex-direction: column;
height: 100vh;
}
header, footer {
padding: 0 3rem;
display: flex;
justify-content: center;
align-items: center;
background-color: var(--colour-bg-secondary);
height: 4rem;
}
header {
font-size: 2rem;
justify-content: flex-end;
}
footer {
height: 2.5rem;
}
main {
flex: 1;
display: flex;
justify-content: center;
align-items: center;
}
.wrap {
transition: opacity linear 3s;
perspective: 250vw;
perspective-origin: 500% 50vw;
width: var(--side-length);
height: var(--side-length);
}
.cube {
transform-style: preserve-3d;
width: var(--side-length);
height: var(--side-length);
animation: spin 50s infinite ease-in-out;
}
.wrap:hover {
opacity: 0.1;
}
.cube div {
position: absolute;
width: var(--side-length);
height: var(--side-length);
display: flex;
justify-content: center;
align-items: center;
}
.cube div div {
opacity: 0.8;
background-color: var(--colour-bg-secondary);
width: 90%;
height: 90%;
}
.cube div div:hover {
opacity: 0.2;
}
.front div, .back div {
animation: fb 50s infinite cubic-bezier(0.165, 0.84, 0.44, 1);
}
.left div, .right div {
animation: rl 50s infinite cubic-bezier(0.165, 0.84, 0.44, 1);
}
.top div, .bottom div {
animation: tb 50s infinite cubic-bezier(0.165, 0.84, 0.44, 1);
}
.back {
transform: translateZ(var(--side-length-half-neg)) rotateY(180deg);
}
.right {
transform: rotateY(-270deg) translateX(var(--side-length-half));
transform-origin: top right;
}
.left {
transform: rotateY(270deg) translateX(var(--side-length-half-neg));
transform-origin: center left;
}
.top {
transform: rotateX(-90deg) translateY(var(--side-length-half-neg));
transform-origin: top center;
}
.bottom {
transform: rotateX(90deg) translateY(var(--side-length-half));
transform-origin: bottom center;
}
.front {
transform: translateZ(var(--side-length-half));
}
.cube .front div {
opacity: 0.9;
transform: translateZ(var(--side-length-half));
background-color: #a39494;
}
.cube .bottom div {
background-color: #7d7d7d;
}
@keyframes spin {
0%, 10% { transform: rotateX(0deg) rotateY(0deg) rotateZ(0deg); }
11%, 20% { transform: rotateX(0deg) rotateY(0deg) rotateZ(180deg); }
21%, 35% { transform: rotateX(90deg) rotateY(0deg) rotateZ(180deg); }
36%, 50% { transform: rotateX(90deg) rotateY(90deg) rotateZ(180deg); }
51%, 65% { transform: rotateX(90deg) rotateY(90deg) rotateZ(360deg); }
66%, 80% { transform: rotateX(180deg) rotateY(90deg) rotateZ(360deg); }
81%, 99% { transform: rotateX(180deg) rotateY(360deg) rotateZ(360deg); }
100% { transform: rotateX(360deg) rotateY(360deg) rotateZ(360deg); }
}
@keyframes fb {
0%, 9% { border-radius: 0; }
10%, 11% { border-radius: 50% }
12%, 49% { border-radius: 0; }
50%, 51% { border-radius: 50%; }
52%, 64% { border-radius: 0; }
65%, 66% { border-radius: 50%; }
67%, 100% { border-radius: 0; }
}
@keyframes rl {
0%, 19% { border-radius: 0; }
20%, 21% { border-radius: 50%; }
22%, 98% { border-radius: 0; }
99%, 100% { border-radius: 50% }
}
@keyframes tb {
0%, 34% { border-radius: 0; }
35%, 36% { border-radius: 50%; }
37%, 79% { border-radius: 0; }
80%, 81% { border-radius: 50%; }
82%, 100% { border-radius: 0; }
}