<canvas id="c"></canvas>
* {
  margin: 0;
  background-color: #222;
}

#c {
  width: 620px;
  height: 620px;
  display: block;
  margin: 0 auto;
  margin: calc(50vh - 310px) auto;
}
var c = document.getElementById("c");
var ctx = c.getContext("2d");

var cw = c.width = 620,
  cx = cw / 2;
var ch = c.height = 620,
  cy = ch / 2;

var rad = Math.PI / 180;
var angle = rad * 360 / 6;
var offset = 0; // offset angle

var R = 30;
var inner = (Math.sqrt(3) / 2) * R;
var d = R + Math.sin(Math.PI / 6) * R;

var colors = ["#C8C8A9", "#83AF9B", "#76BCAD", "#FE4365", "#FC9D9A", "#F9CDAD", ];

if (typeof ctx.ellipse === 'function') {
ctx.shadowBlur = 5;
ctx.shadowOffsetX = 2;
ctx.shadowOffsetY = 2;
ctx.shadowColor = "#333";
}
var points = [];
var L = 1,
  change = false; //layer to animate

function hexagon(r, c) {
  ctx.fillStyle = c.color;
  var offset = c.offset;
  ctx.beginPath();
  for (var i = 0; i < 6; i++) {
    ctx.lineTo(c.x + r * Math.cos(offset + angle * i), c.y + r * Math.sin(offset + angle * i));
  }
  ctx.closePath();
  ctx.fill();
}

function layer(num) {
  var r = inner * (2 * (num - 1));

  var o = [];

  o[0] = {}
  o[0].n = 0
  o[0].x = cx + r * Math.cos(30 * rad);
  o[0].y = cy + r * Math.sin(30 * rad);
  o[0].color = colors[num - 1];
  o[0].offset = 0;
  o[0].layer = num;

  for (var i = 1; i <= 6; i++) {

    var n = o.length;

    var olast = {}
    olast.n = n + num - 2
    olast.x = cx + r * Math.cos((60 * i + 30) * rad);
    olast.y = cy + r * Math.sin((60 * i + 30) * rad);
    olast.color = colors[num - 1];
    olast.offset = 0;
    olast.layer = num;

    for (var l = 0; l < num - 2; l++) {

      o[n + l] = {}
      o[n + l].n = n + l
      o[n + l].x = o[n - 1].x - (l + 1) * (o[n - 1].x - olast.x) / (num - 1);
      o[n + l].y = o[n - 1].y - (l + 1) * (o[n - 1].y - olast.y) / (num - 1);
      o[n + l].color = colors[num - 1];
      o[n + l].offset = 0;
      o[n + l].layer = num;

    }

    if (i < 6) {
      o[n + num - 2] = olast;
    }

  }

  points = points.concat(o)
}

function Draw() {
  for (var i = 1; i <= 6; i++) {
    layer(i, colors[i])
  }
  for (var i = 0; i < points.length; i++) {

    hexagon(R + 15, points[i]);
  }
}

Draw();

function Update() {

  ctx.clearRect(0, 0, cw, ch)
  for (var i = 0; i < points.length; i++) {

    if (points[i].layer == L && points[i].offset < Math.PI / 3) {
      points[i].offset += .05;
    } else if (points[i].layer == L && points[i].offset >= Math.PI / 3) {
      points[i].offset = 0;
      change = true;
    }
    hexagon(R + 15, points[i]);
    ctx.globalCompositeOperation = "difference";
  }
  if (change) {
    if (L < 6) {
      L++;
    } else {
      L = 1
    }
    change = false;
  }

  requestId = window.requestAnimationFrame(Update)
}

requestId = window.requestAnimationFrame(Update)

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://codepen.io/enxaneta/pen/VLqXYo.js