Magic Gateways Animation using HTML, CSS and PrefixFree


This Magic Gateways Animation is developed using HTML, CSS, and PrefixFree. PrefixFree allows only for unprefixed CSS properties.


You can see the full code of this animation. And there is a video tutorial also.

HTML Code

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Magic Gateways Animation - DevXmart</title>
    <link
      href="https://fonts.googleapis.com/css?family=Petit+Formal+Script&display=swap"
      rel="stylesheet"
    />
    <link rel="stylesheet" href="./style.css" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/prefixfree/1.0.7/prefixfree.min.js"></script>
  </head>
  <body>
    <style>
      .unit:nth-child(5n + 1) {
        --i: 0;
      }
      .unit:nth-child(n + 1) {
        --j: 0;
      }
      .unit:nth-child(5n + 2) {
        --i: 1;
      }
      .unit:nth-child(n + 6) {
        --j: 1;
      }
      .unit:nth-child(5n + 3) {
        --i: 2;
      }
      .unit:nth-child(n + 11) {
        --j: 2;
      }
      .unit:nth-child(5n + 4) {
        --i: 3;
      }
      .unit:nth-child(n + 16) {
        --j: 3;
      }
      .unit:nth-child(5n + 5) {
        --i: 4;
      }
      .unit:nth-child(n + 21) {
        --j: 4;
      }
      .side:nth-child(1) {
        --idx: 0;
      }
      .side:nth-child(2) {
        --idx: 1;
      }
      .side:nth-child(3) {
        --idx: 2;
      }
    </style>
    <div class="a3d" style="--n: 5">
      <div
        class="unit anim"
        style="--tr: 7.15s; --to: 1.36s; --dt: -2.33s; --cx: 0.84"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 6.66s; --to: 1.13s; --dt: -2.53s; --cx: 0.93"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 7.72s; --to: 1.32s; --dt: -0.82s; --cx: 0.29"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 6.39s; --to: 1.4s; --dt: -0.97s; --cx: 0.83"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 5.12s; --to: 1.46s; --dt: -2.66s; --cx: 0.99"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 5.85s; --to: 1.44s; --dt: -1.62s; --cx: 1"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 6.68s; --to: 1.95s; --dt: -0.99s; --cx: 0.94"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 6.79s; --to: 1.37s; --dt: -4.26s; --cx: 0.71"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 7.62s; --to: 1.43s; --dt: -3.16s; --cx: 0.4"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 7.83s; --to: 1.45s; --dt: -2.45s; --cx: 0.25"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 7.28s; --to: 1.21s; --dt: -3.44s; --cx: 0.4"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 7.2s; --to: 1.84s; --dt: -6.49s; --cx: 0.99"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div
        class="unit anim"
        style="--tr: 7.4s; --to: 1.75s; --dt: -1.15s; --cx: 0.8"
      >
        <div class="cube shdw">
          <div class="half"></div>
          <div class="half"></div>
        </div>
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
      <div class="unit">
        <div class="gate shdw">
          <div class="inner later">
            <div class="side"></div>
            <div class="side"></div>
            <div class="side"></div>
          </div>
          <div class="front"></div>
          <div class="outer later"></div>
        </div>
      </div>
    </div>
  </body>
</html>


CSS Code


.front::before, .front::after, .half::before, .half::after, .cube::after {
  transform: rotate3d(var(--vi), var(--vj), 0, calc(var(--s)*.5turn)) translatez(var(--z, 1em));
}

.front::before, .front::after, .later .side, .later::before, .later::after, .later, .half::before, .half::after, .cube::after {
  --int: Max(0, calc(var(--sum) - .5));
  --mod: calc(var(--sum) - var(--int));
  --abs: Max(calc(.5 - var(--mod)), calc(var(--mod) - .5));
  --k: calc(1 - 2*var(--abs));
  color: hsl(200, var(--sat, 75%), calc(63% - var(--k, -.1)*50%));
  background: currentcolor;
}

@property --d {
  syntax: "";
  initial-value: 0px;
  inherits: true;
}
@property --p {
  syntax: "";
  initial-value: 0;
  inherits: true;
}
@property --int {
  syntax: "";
  initial-value: 0;
  inherits: true;
}
@property --f {
  syntax: "";
  initial-value: 0;
  inherits: true;
}
body, div {
  display: grid;
}

body {
  overflow: hidden;
  margin: 0;
  height: 100vh;
  background: #319eea;
}
body:before, body:after {
  --o: calc(var(--s)*-100%);
  position: absolute;
  z-index: -1;
  top: calc(var(--s)*100%);
  left: calc(var(--s)*100%);
  padding: 0 0.5em;
  transform: translate(var(--o), var(--o));
  opacity: 0.05;
  color: #fff;
  font: italic 900 4vmin/2 petit formal script;
  white-space: nowrap;
  text-align: center;
}
body:after {
  content: "DevXmart";
}
body:before {
  content: "DevXmart";
}

div {
  --vi: 0;
  --vj: calc(1 - var(--vi));
  transform-style: preserve-3d;
}

div, ::before, ::after {
  grid-area: 1/1;
}

.side, ::before, ::after {
  --not-s: calc(1 - var(--s));
  --sgn-s: calc(2*var(--s) - 1);
  backface-visibility: hidden;
}

.side:nth-child(1), ::before {
  --s: 0 ;
}

.side:nth-child(3), ::after {
  --s: 1 ;
}

.a3d {
  grid-gap: 9em;
  grid-template: 6em/repeat(var(--n), 6em);
  place-self: center;
  transform: rotatex(-35deg) rotatey(45deg);
}

.unit {
  --f: .5;
  --m: calc(.5*(var(--n) - 1));
  grid-area: 1/calc(var(--i) + 1);
  transform: translatez(calc((var(--j) - var(--m))*15em)) rotatey(calc(var(--p, 0)*1turn));
}

.anim {
  animation: p var(--tr) cubic-bezier(var(--cx), calc(-1*var(--cx)), calc(1 - var(--cx)), calc(1 + var(--cx))) var(--dt) infinite alternate, osc var(--to) ease-in-out infinite alternate;
}

@keyframes p {
  0%, 25% {
    --p: 0 ;
  }
  75%, 100% {
    --p: .5 ;
  }
}
@keyframes osc {
  0%, 35% {
    --d: -3em ;
  }
  65%, 100% {
    --d: 3em ;
  }
}
.shdw::before {
  transform: translatey(3.75em) rotatex(90deg);
  background: radial-gradient(rgba(0, 0, 0, 0.5), transparent);
  filter: blur(9px);
  content: "";
}

.cube {
  --vi: 1;
  --sat: 62%;
  place-self: center;
  width: 2em;
  height: 2em;
  transform: translatez(var(--d));
}
.cube::after {
  --s: .5;
  content: "";
}

.half {
  --dir: 0;
  transform: rotatey(calc(var(--dir)*90deg));
}
.half:nth-child(2) {
  --dir: 1 ;
}
.half::before, .half::after {
  --sum: calc(var(--p) + .5*var(--s) + .25*var(--dir) + 1);
  content: "";
}

.gate {
  animation: f calc(.5*var(--to)) ease-in-out infinite alternate;
}
.gate::before {
  align-self: center;
  height: 1.5em;
}

@keyframes f {
  0%, 35% {
    --f: .35 ;
  }
  100% {
    --f: .75 ;
  }
}
.later {
  --lat-w: 6em;
  --sgn-e: calc(2*var(--e) - 1);
  grid-auto-flow: column;
  justify-content: center;
  place-self: center;
  width: var(--lat-w);
  height: 1.5em;
  transform: translatey(calc(-.5*var(--sgn-e)*var(--lat-w))) rotatex(90deg);
}
.later .side, .later::before, .later::after {
  --sum: calc(var(--p) + .25 + .5*(var(--e) - var(--sgn-e)*var(--s)) + 1);
  grid-area: initial;
  width: inherit;
  transform-origin: calc(var(--not-s)*100%);
  transform: rotatey(calc(var(--sgn-s)*var(--sgn-e)*90deg));
}

.outer {
  --e: 1;
  grid-gap: 6em;
}
.outer::before, .outer::after {
  content: "";
}

.front::before, .front::after {
  --z: 0.75em;
  --sum: calc(var(--p) + var(--s)*.5 + 1);
  border: solid calc(.5*(1 - var(--f))*6em) currentcolor;
  background: transparent;
  content: "";
}

.inner {
  --e: 0;
  --lat-w: calc(var(--f)*6em) ;
}

.side {
  --sum: calc(var(--p) + .25 + .5*var(--s) + 1);
}
.anim .side:nth-child(2) {
  overflow: hidden;
}
.anim .side:nth-child(2)::after {
  place-self: center;
  width: 2em;
  height: 2em;
  transform: translatey(var(--d));
  background: radial-gradient(#000, transparent);
  filter: blur(9px);
  content: "";
}
.anim .side::before {
  margin: 3px 0;
  background: linear-gradient(45deg, hotpink 15%, gainsboro, gold 85%);
  animation: glow calc(.5*var(--to)) ease-out infinite alternate;
  content: "";
}

@keyframes glow {
  0%, 35% {
    opacity: 0;
  }
  70%, 100% {
    --f: .75 ;
  }
}


Video Tutorial

Previous Post Next Post

Contact Form