JSFiddle - React, Tailwind, and code Playground

by joshmoto

HTML

<div id="fib" style="width:calc(1px + 1px);">
  <div class="fib-0">
    <div class="fib-1" style="width: calc(1px * var(--scale)); height: calc(1px * var(--scale)); top: 100%; right: 0px;"></div>
  </div>
</div>

SCSS

/* :root {
  --scale: 4;
} */

#fib {
  position: absolute;
  left: 50%;
  top: 50%;
  transform: scale(1);

  *:hover {
    background: red;
  }

  div {
    box-sizing: border-box;
    position: absolute;
    z-index: -1;
    background: #fff;

    &::before {
      content: '';
      display: block;
      position: absolute;
      top: 0px;
      left: 0px;
      right: 0px;
      bottom: 0px;
      border: 1px solid black;
    }

    &.fib-0 {
      &::before {
        display: none;
      }
    }

  }

}

JavaScript

let rand_color = function(index) {
  var colorR = Math.floor((Math.random() * 256));
  var colorG = Math.floor((Math.random() * 256));
  var colorB = Math.floor((Math.random() * 256));
  return "rgb(" + colorR + "," + colorG + "," + colorB + ")";
}

let $fib = $('#fib');

var i;
var o = 0;
var fib = []; // Initialize array!
var levels = 10;
var scale = 4;

document.documentElement.style.setProperty('--scale', scale);

fib[0] = 0;
fib[1] = 1;

for (i = 2; i <= levels; i++) {

  o++;

  fib[i] = fib[i - 2] + fib[i - 1];

  $fib.find('.fib-' + (i - 1)).html('<div class="fib-' + i + '" style="width:' + (fib[i] * scale) + 'px; height:' + (fib[i] * scale) + 'px; background: ' + rand_color() + ';"></div>');

  //console.log(o);

  switch (o) {
    case 1:
      $fib.css({
        width: 'calc(' + (fib[i - 2] * scale) + 'px + ' + (fib[i - 1] * scale) + 'px)',
        height: 'calc(' + (fib[i - 2] * scale) + 'px)'
      }).find('.fib-' + (i)).css({
        right: '100%',
        bottom: 0,
      });
      break;
    case 2:
      $fib.css({
        height: 'calc(' + (fib[i - 2] * scale) + 'px + ' + (fib[i - 1] * scale) + 'px)',
        width: 'calc(' + (fib[i - 2] * scale) + 'px)'
      }).find('.fib-' + (i)).css({
        bottom: '100%',
        left: 0
      });
      break;
    case 3:
      $fib.css({
        width: 'calc(' + (fib[i - 2] * scale) + 'px + ' + (fib[i - 1] * scale) + 'px)',
        height: 'calc(' + (fib[i - 2] * scale) + 'px)'
      }).find('.fib-' + (i)).css({
        left: '100%',
        top: 0
      });
      break;
    case 4:
      $fib.css({
        height: 'calc(' + (fib[i - 2] * scale) + 'px + ' + (fib[i - 1] * scale) + 'px)',
        width: 'calc(' + (fib[i - 2] * scale) + 'px)'
      }).find('.fib-' + (i)).css({
        top: '100%',
        right: 0
      });
      o = 0;
      break;
  }

}

$fib.on('mouseenter mouseleave', '[class*="fib-"]', function(e) {

  console.log(e.target.className);

 ...