<div id="root"></div>
body {
    background: #222;
}

.blinky {
  color: #FF0000;
  background: #FF0000;
  height: 0vh;
  width: 0vw;
  position:absolute;

}

.pinky {
  color: #febafe;
  background: #febafe;
  height: 0vh;
  width: 0vw;
  position:absolute;
}

.inky {
  color: #2dfffe;
  background: #2dfffe;
  height: 0vh;
  width: 0vw;
  position:absolute;

}

.clyde {
  color: #feb75b;
  background: #feb75b;
  height: 0vh;
  width: 0vw;
  position:absolute;
}


.frozen {
  box-shadow: 0 0 0 1em #202ffb,
  0 3em 0 1em #202ffb,
  0 6em 0 1em #202ffb,
  0 9em 0 1em #202ffb,
  0 12em 0 1em #202ffb,
  0 15em 0 1em #202ffb,
  0 18em 0 1em #202ffb,
  0 21em 0 1em #202ffb,
  0 24em 0 1em #202ffb,

  3em -9em 0 1em #202ffb,
  3em -6em 0 1em #202ffb,
  3em -3em 0 1em #202ffb,
  3em 0 0 1em #202ffb,
  3em 3em 0 1em #202ffb,
  3em 6em 0 1em #202ffb,
  3em 9em 0 1em #202ffb,
  3em 12em 0 1em #202ffb,
  3em 15em 0 1em #ffbbaf,
  3em 18em 0 1em #202ffb,
  3em 21em 0 1em #202ffb,

  6em -12em 0 1em #202ffb,
  6em -9em 0 1em #202ffb,
  6em -6em 0 1em #202ffb,
  6em -3em 0 1em #202ffb,
  6em 0 0 1em #202ffb,
  6em 3em 0 1em #202ffb,
  6em 6em 0 1em #202ffb,
  6em 9em 0 1em #202ffb,
  6em 12em 0 1em #ffbbaf,
  6em 15em 0 1em #202ffb,
  6em 18em 0 1em #202ffb,

  9em -15em 0 1em #202ffb,
  9em -12em 0 1em #202ffb,
  9em -9em 0 1em #202ffb,
  9em -6em 0 1em #202ffb,
  9em -3em 0 1em #202ffb,
  9em 0 0 1em #202ffb,
  9em 3em 0 1em #202ffb,
  9em 6em 0 1em #202ffb,
  9em 9em 0 1em #202ffb,
  9em 12em 0 1em #ffbbaf,
  9em 15em 0 1em #202ffb,
  9em 18em 0 1em #202ffb,
  9em 21em 0 1em #202ffb,

  12em -15em 0 1em #202ffb,
  12em -12em 0 1em #202ffb,
  12em -9em 0 1em #202ffb,
  12em -6em 0 1em #202ffb,
  12em -3em 0 1em #ffbbaf,
  12em 0 0 1em #ffbbaf,
  12em 3em 0 1em #202ffb,
  12em 6em 0 1em #202ffb,
  12em 9em 0 1em #202ffb,
  12em 12em 0 1em #202ffb,
  12em 15em 0 1em #ffbbaf,
  12em 18em 0 1em #202ffb,
  12em 21em 0 1em #202ffb,
  12em 24em 0 1em #202ffb,

  15em -18em 0 1em #202ffb,
  15em -15em 0 1em #202ffb,
  15em -12em 0 1em #202ffb,
  15em -9em 0 1em #202ffb,
  15em -6em 0 1em #202ffb,
  15em -3em 0 1em #ffbbaf,
  15em 0 0 1em #ffbbaf,
  15em 3em 0 1em #202ffb,
  15em 6em 0 1em #202ffb,
  15em 9em 0 1em #202ffb,
  15em 12em 0 1em #202ffb,
  15em 15em 0 1em #ffbbaf,
  15em 18em 0 1em #202ffb,
  15em 21em 0 1em #202ffb,
  15em 24em 0 1em #202ffb,

  18em -18em 0 1em #202ffb,
  18em -15em 0 1em #202ffb,
  18em -12em 0 1em #202ffb,
  18em -9em 0 1em #202ffb,
  18em -6em 0 1em #202ffb,
  18em -3em 0 1em #202ffb,
  18em 0 0 1em #202ffb,
  18em 3em 0 1em #202ffb,
  18em 6em 0 1em #202ffb,
  18em 9em 0 1em #202ffb,
  18em 12em 0 1em #ffbbaf,
  18em 15em 0 1em #202ffb,
  18em 18em 0 1em #202ffb,

  21em -18em 0 1em #202ffb,
  21em -15em 0 1em #202ffb,
  21em -12em 0 1em #202ffb,
  21em -9em 0 1em #202ffb,
  21em -6em 0 1em #202ffb,
  21em -3em 0 1em #202ffb,
  21em 0 0 1em #202ffb,
  21em 3em 0 1em #202ffb,
  21em 6em 0 1em #202ffb,
  21em 9em 0 1em #202ffb,
  21em 12em 0 1em #ffbbaf,
  21em 15em 0 1em #202ffb,
  21em 18em 0 1em #202ffb,

  24em -18em 0 1em #202ffb,
  24em -15em 0 1em #202ffb,
  24em -12em 0 1em #202ffb,
  24em -9em 0 1em #202ffb,
  24em -6em 0 1em #202ffb,
  24em -3em 0 1em #ffbbaf,
  24em 0 0 1em #ffbbaf,
  24em 3em 0 1em #202ffb,
  24em 6em 0 1em #202ffb,
  24em 9em 0 1em #202ffb,
  24em 12em 0 1em #202ffb,
  24em 15em 0 1em #ffbbaf,
  24em 18em 0 1em #202ffb,
  24em 21em 0 1em #202ffb,
  24em 24em 0 1em #202ffb,

  27em -15em 0 1em #202ffb,
  27em -12em 0 1em #202ffb,
  27em -9em 0 1em #202ffb,
  27em -6em 0 1em #202ffb,
  27em -3em 0 1em #ffbbaf,
  27em 0 0 1em #ffbbaf,
  27em 3em 0 1em #202ffb,
  27em 6em 0 1em #202ffb,
  27em 9em 0 1em #202ffb,
  27em 12em 0 1em #202ffb,
  27em 15em 0 1em #ffbbaf,
  27em 18em 0 1em #202ffb,
  27em 21em 0 1em #202ffb,
  27em 24em 0 1em #202ffb,

  30em -15em 0 1em #202ffb,
  30em -12em 0 1em #202ffb,
  30em -9em 0 1em #202ffb,
  30em -6em 0 1em #202ffb,
  30em -3em 0 1em #202ffb,
  30em 0 0 1em #202ffb,
  30em 3em 0 1em #202ffb,
  30em 6em 0 1em #202ffb,
  30em 9em 0 1em #202ffb,
  30em 12em 0 1em #ffbbaf,
  30em 15em 0 1em #202ffb,
  30em 18em 0 1em #202ffb,
  30em 21em 0 1em #202ffb,

  33em -12em 0 1em #202ffb,
  33em -9em 0 1em #202ffb,
  33em -6em 0 1em #202ffb,
  33em -3em 0 1em #202ffb,
  33em 0 0 1em #202ffb,
  33em 3em 0 1em #202ffb,
  33em 6em 0 1em #202ffb,
  33em 9em 0 1em #202ffb,
  33em 12em 0 1em #ffbbaf,
  33em 15em 0 1em #202ffb,
  33em 18em 0 1em #202ffb,

  36em -9em 0 1em #202ffb,
  36em -6em 0 1em #202ffb,
  36em -3em 0 1em #202ffb,
  36em 0 0 1em #202ffb,
  36em 3em 0 1em #202ffb,
  36em 6em 0 1em #202ffb,
  36em 9em 0 1em #202ffb,
  36em 12em 0 1em #202ffb,
  36em 15em 0 1em #ffbbaf,
  36em 18em 0 1em #202ffb,
  36em 21em 0 1em #202ffb,

  39em 0 0 1em #202ffb,
  39em 3em 0 1em #202ffb,
  39em 6em 0 1em #202ffb,
  39em 9em 0 1em #202ffb,
  39em 12em 0 1em #202ffb,
  39em 15em 0 1em #202ffb,
  39em 18em 0 1em #202ffb,
  39em 21em 0 1em #202ffb,
  39em 24em 0 1em #202ffb;

  background: #202ffb;
  width: 1em;
  height: 1em;
}



.ghost {

  position:absolute;
  color: inherit;
  background: inherit;
  width: 1em;
  height: 1em;
  overflow-y: hidden;
  overflow-x: hidden;

  box-shadow: 0 0 0 1em,
  0 3em 0 1em,
  0 6em 0 1em,
  0 9em 0 1em,
  0 12em 0 1em,
  0 15em 0 1em,
  0 18em 0 1em,
  0 21em 0 1em,
  0 24em 0 1em,
  3em -9em 0 1em,
  3em -6em 0 1em #cccccc,
  3em -3em 0 1em #1B1BDF,
  3em 0 0 1em #1B1BDF,
  3em 3em 0 1em,
  3em 6em 0 1em,
  3em 9em 0 1em,
  3em 12em 0 1em,
  3em 15em 0 1em,
  3em 18em 0 1em,
  3em 21em 0 1em,
  6em -12em 0 1em,
  6em -9em 0 1em #cccccc,
  6em -6em 0 1em #cccccc,
  6em -3em 0 1em #1B1BDF,
  6em 0 0 1em #1B1BDF,
  6em 3em 0 1em #cccccc,
  6em 6em 0 1em,
  6em 9em 0 1em,
  6em 12em 0 1em,
  6em 15em 0 1em,
  6em 18em 0 1em,
  9em -15em 0 1em,
  9em -12em 0 1em,
  9em -9em 0 1em #cccccc,
  9em -6em 0 1em #cccccc,
  9em -3em 0 1em #cccccc,
  9em 0 0 1em #cccccc,
  9em 3em 0 1em #cccccc,
  9em 6em 0 1em,
  9em 9em 0 1em,
  9em 12em 0 1em,
  9em 15em 0 1em,
  9em 18em 0 1em,
  9em 21em 0 1em,
  12em -15em 0 1em,
  12em -12em 0 1em,
  12em -9em 0 1em,
  12em -6em 0 1em #cccccc,
  12em -3em 0 1em #cccccc,
  12em 0 0 1em #cccccc,
  12em 3em 0 1em,
  12em 6em 0 1em,
  12em 9em 0 1em,
  12em 12em 0 1em,
  12em 15em 0 1em,
  12em 18em 0 1em,
  12em 21em 0 1em,
  12em 24em 0 1em,
  15em -18em 0 1em,
  15em -15em 0 1em,
  15em -12em 0 1em,
  15em -9em 0 1em,
  15em -6em 0 1em,
  15em -3em 0 1em,
  15em 0 0 1em,
  15em 3em 0 1em,
  15em 6em 0 1em,
  15em 9em 0 1em,
  15em 12em 0 1em,
  15em 15em 0 1em,
  15em 18em 0 1em,
  15em 21em 0 1em,
  15em 24em 0 1em,
  18em -18em 0 1em,
  18em -15em 0 1em,
  18em -12em 0 1em,
  18em -9em 0 1em,
  18em -6em 0 1em,
  18em -3em 0 1em,
  18em 0 0 1em,
  18em 3em 0 1em,
  18em 6em 0 1em,
  18em 9em 0 1em,
  18em 12em 0 1em,
  18em 15em 0 1em,
  18em 18em 0 1em,
  21em -18em 0 1em,
  21em -15em 0 1em,
  21em -12em 0 1em,
  21em -9em 0 1em,
  21em -6em 0 1em #cccccc,
  21em -3em 0 1em #1B1BDF,
  21em 0 0 1em #1B1BDF,
  21em 3em 0 1em,
  21em 6em 0 1em,
  21em 9em 0 1em,
  21em 12em 0 1em,
  21em 15em 0 1em,
  21em 18em 0 1em,
  24em -18em 0 1em,
  24em -15em 0 1em,
  24em -12em 0 1em,
  24em -9em 0 1em #cccccc,
  24em -6em 0 1em #cccccc,
  24em -3em 0 1em #1B1BDF,
  24em 0 0 1em #1B1BDF,
  24em 3em 0 1em #cccccc,
  24em 6em 0 1em,
  24em 9em 0 1em,
  24em 12em 0 1em,
  24em 15em 0 1em,
  24em 18em 0 1em,
  24em 21em 0 1em,
  24em 24em 0 1em,
  27em -15em 0 1em,
  27em -12em 0 1em,
  27em -9em 0 1em #cccccc,
  27em -6em 0 1em #cccccc,
  27em -3em 0 1em #cccccc,
  27em 0 0 1em #cccccc,
  27em 3em 0 1em #cccccc,
  27em 6em 0 1em,
  27em 9em 0 1em,
  27em 12em 0 1em,
  27em 15em 0 1em,
  27em 18em 0 1em,
  27em 21em 0 1em,
  27em 24em 0 1em,
  30em -15em 0 1em,
  30em -12em 0 1em,
  30em -9em 0 1em,
  30em -6em 0 1em #cccccc,
  30em -3em 0 1em #cccccc,
  30em 0 0 1em #cccccc,
  30em 3em 0 1em,
  30em 6em 0 1em,
  30em 9em 0 1em,
  30em 12em 0 1em,
  30em 15em 0 1em,
  30em 18em 0 1em,
  30em 21em 0 1em,
  33em -12em 0 1em,
  33em -9em 0 1em,
  33em -6em 0 1em,
  33em -3em 0 1em,
  33em 0 0 1em,
  33em 3em 0 1em,
  33em 6em 0 1em,
  33em 9em 0 1em,
  33em 12em 0 1em,
  33em 15em 0 1em,
  33em 18em 0 1em,
  36em -9em 0 1em,
  36em -6em 0 1em,
  36em -3em 0 1em,
  36em 0 0 1em,
  36em 3em 0 1em,
  36em 6em 0 1em,
  36em 9em 0 1em,
  36em 12em 0 1em,
  36em 15em 0 1em,
  36em 18em 0 1em,
  36em 21em 0 1em,
  39em 0 0 1em,
  39em 3em 0 1em,
  39em 6em 0 1em,
  39em 9em 0 1em,
  39em 12em 0 1em,
  39em 15em 0 1em,
  39em 18em 0 1em,
  39em 21em 0 1em,
  39em 24em 0 1em;
}
const names = ["blinky", "pinky", "inky", "clyde"];

const presets = {
  gentle: [120, 14]
};

const { StaggeredMotion, spring } = ReactMotion;

class App extends React.Component {
  state = { x: 250, y: 300, frozen: false };

  componentDidMount() {
    window.addEventListener("click", this.handleClick);
    window.addEventListener("mousemove", this.handleMouseMove);
    window.addEventListener("touchmove", this.handleTouchMove);
  }

  handleClick = () => {
    const frozen = !this.state.frozen;
    this.setState({ frozen });
  };

  handleMouseMove = ({ pageX: x, pageY: y }) => {
    this.setState({ x, y });
  };

  handleTouchMove = ({ touches }) => {
    this.handleMouseMove(touches[0]);
  };

  getStyles = prevStyles => {
    const endValue = prevStyles.map((style, i) => {
      return i === 0
        ? this.state
        : {
            x: spring(prevStyles[i - 1].x, presets.gentle),
            y: spring(prevStyles[i - 1].y, presets.gentle)
          };
    });

    return endValue;
  };

  render() {
    const ghostState = this.state.frozen ? "frozen" : "ghost";

    return (
      <StaggeredMotion
        defaultStyles={_.times(names.length, () => ({ x: 0, y: 0 }))}
        styles={this.getStyles}
      >

        {ghosts =>
          <div className="container">
            {ghosts.map(({ x, y }, index) => {
              return (
                <div
                  key={index}
                  className={names[index]}
                  style={{
                    WebkitTransform: `translate(${x - 25}px, ${y -
                      25}px) scale(.2)`,
                    transform: `translate(${x - 25}px, ${y - 25}px) scale(.2)`,
                    zIndex: names.length - index
                  }}
                >
                  <div
                    style={{ zIndex: names.length - index }}
                    className={ghostState}
                  />
                </div>
              );
            })}
          </div>}
      </StaggeredMotion>
    );
  }
}

ReactDOM.render(<App />, document.getElementById("root"));
View Compiled

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

  1. https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react.min.js
  2. https://cdnjs.cloudflare.com/ajax/libs/react/15.4.2/react-dom.min.js
  3. https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.17.4/lodash.min.js
  4. //npmcdn.com/react-motion/build/react-motion.js