<div class="mickey" role="img" aria-label="Black-and-white head of Mickey Mouse">
  <div class="mickey__ear-right"></div>
  <div class="mickey__ear-left"></div>
  <div class="mickey__head"></div>
  <div class="mickey__mouth-back-right"></div>
  <div class="mickey__mouth-back-left"></div>
  <div class="mickey__lip"></div>
  <div class="mickey__mouth-bottom"></div>
  <div class="mickey__mouth-top"></div>
  <div class="mickey__tongue"></div>
  <div class="mickey__eye-back-right"></div>
  <div class="mickey__eye-back-left"></div>
  <div class="mickey__dimple-right"></div>
  <div class="mickey__dimple-left"></div>
  <div class="mickey__eye-front-right"></div>
  <div class="mickey__eye-front-left"></div>
  <div class="mickey__nose-back"></div>
  <div class="mickey__nose-middle"></div>
  <div class="mickey__nose-front"></div>
</div>
* {
  border: 0;
  box-sizing: border-box;
  margin: 0;
  padding: 0;
}
:root {
  --hue: 223;
  --bg: hsl(var(--hue),10%,50%);
  --fg: hsl(var(--hue),10%,10%);
  --trans-dur: 0.3s;
  font-size: calc(32px + (48 - 32) * (100vw - 320px) / (2560 - 320));
}
body {
  background-color: var(--bg);
  color: var(--fg);
  display: flex;
  font: 1em/1.5 sans-serif;
  height: 100vh;
}
.mickey {
  --x: 0;
  --x-abs: 0;
  --y: 0;
  --y-abs: 0;
  margin: auto;
  position: relative;
  width: 7.85em;
  height: 6.85em;
}
.mickey div {
  position: absolute;
}
.mickey__ear-right,
.mickey__ear-left,
.mickey__head {
  background-color: #000;
}
.mickey__ear-right,
.mickey__ear-left {
  border-radius: 50%;
  top: 0.175em;
  width: 3em;
  height: 2.55em;
}
.mickey__ear-right {
  left: -0.1em;
  transform: translate(calc(var(--x) * -0.35em),calc(var(--y) * -0.35em)) rotate(-45deg);
}
.mickey__ear-left {
  right: -0.1em;
  transform: translate(calc(var(--x) * -0.35em),calc(var(--y) * -0.35em)) rotate(45deg);
}
.mickey__head {
  border-radius: 50% 50% 50% 50% / 2.5em 2.5em 2.15em 2.15em;
  top: 1.55em;
  left: calc(50% - 2.525em);
  width: 5.05em;
  height: 4.65em;
  transform: translate(calc(var(--x) * -0.25em),calc(var(--y) * -0.25em));
}
.mickey__eye-back-right,
.mickey__eye-back-left,
.mickey__mouth-back-right,
.mickey__mouth-back-left,
.mickey__mouth-top,
.mickey__lip,
.mickey__nose-back,
.mickey__nose-middle {
  background-color: #fff;
}
.mickey__eye-back-right,
.mickey__eye-back-left {
  top: 1.85em;
  width: 1.9em;
  height: 3em;
  transform: translate(calc(var(--x) * -0.22em),calc(var(--y) * -0.22em));
}
.mickey__eye-back-right {
  border-radius: 50% 50% 0 60% / 40% 50% 0 60%;
  left: 2.2em;
}
.mickey__eye-back-left {
  border-radius: 50% 50% 60% 0 / 50% 40% 60% 0;
  right: 2.2em;
}
.mickey__eye-front-right,
.mickey__eye-front-left {
  background-color: #000;
  border-radius: 50%;
  top: 2.95em;
  width: 0.55em;
  height: 1.35em;
  transform: translate(calc(var(--x) * 0.07em),calc(var(--y) * 0.07em));
}
.mickey__eye-front-right {
  left: 3.2em;
}
.mickey__eye-front-left {
  right: 3.2em;
}
.mickey__mouth-back-right,
.mickey__mouth-back-left {
  border-radius: 50%;
  box-shadow: 0 0 0 0.05em #000;
  top: 4.35em;
  width: 2.8em;
  height: 1.5em;
}
.mickey__mouth-back-right {
  left: 1.15em;
  transform: translate(calc(var(--x) * -0.08em),calc(var(--y) * 0.1em)) scale(calc(1 + var(--x-abs) * 0.13),1) rotate(55deg);
}
.mickey__mouth-back-left {
  right: 1.15em;
  transform: translate(calc(var(--x) * -0.08em),calc(var(--y) * 0.1em)) scale(calc(1 + var(--x-abs) * 0.13),1) rotate(-55deg);
}
.mickey__mouth-top,
.mickey__mouth-bottom {
  border-radius: 0 0 50% 50% / 0 0 100% 100%;
  transform: translate(calc(var(--x) * 0.1em),calc(var(--y) * 0.1em));
}
.mickey__mouth-top {
  box-shadow: 0 0.1em 0 #000;
  clip-path: polygon(0 0.3em,100% 0.3em,100% 100%,0 100%);
  top: 4em;
  left: 1.9em;
  width: 4.05em;
  height: 1.7em;
}
.mickey__mouth-bottom {
  background-color: #000;
  border-radius: 0 0 50% 50% / 0 0 100% 100%;
  clip-path: polygon(0 1.1em,100% 1.1em,100% 100%,0 100%);
  top: 3.25em;
  left: 2em;
  width: 3.85em;
  height: 3.3em;
}
.mickey__lip {
  border-radius: 0 0 50% 50% / 0 0 100% 100%;
  box-shadow: 0 -0.05em 0 #000 inset;
  clip-path: polygon(0 0.8em,100% 0.8em,100% 100%,0 100%);
  top: 5.05em;
  left: 2.4em;
  width: 3.05em;
  height: 1.8em;
  transform: translate(calc(var(--x) * 0.12em),calc(var(--y) * 0.12em));
}
.mickey__tongue {
  border-radius: 0 0 100% 100% / 0 0 100% 100%;
  overflow: hidden;
  top: 5.9em;
  left: 3.225em;
  width: 1.4em;
  height: 0.56em;
  transform: translate(calc(var(--x) * 0.11em),calc(var(--y) * 0.11em));
}
.mickey__tongue:before,
.mickey__tongue:after {
  background-color: #fff;
  border-radius: 50% 50% 0 0;
  content: "";
  display: block;
  position: absolute;
  width: 0.875em;
  height: inherit;
}
.mickey__tongue:after {
  right: 0;
}
.mickey__dimple-right,
.mickey__dimple-left {
  border-radius: 50%;
  box-shadow: 0 0.05em 0 #000 inset;
  top: 4.25em;
  width: 0.3em;
  height: 0.2em;
}
.mickey__dimple-right {
  left: 1.775em;
  transform: translate(calc(var(--x) * 0.1em),calc(var(--y) * 0.1em)) rotate(-30deg);
}
.mickey__dimple-left {
  right: 1.775em;
  transform: translate(calc(var(--x) * 0.1em),calc(var(--y) * 0.1em)) rotate(30deg);
}
.mickey__nose-back {
  border-radius: 50%;
  top: 4.15em;
  left: 2.925em;
  width: 2em;
  height: 0.9em;
  transform: translate(calc(var(--x) * 0.4em),calc(var(--y) * 0.4em));
}
.mickey__nose-middle {
  border-radius: 50% 50% 50% 50% / 0.32em 0.32em 0.68em 0.68em;
  box-shadow: 0 0.05em 0 #000 inset;
  top: 4.05em;
  left: 3.065em;
  width: 1.72em;
  height: 1em;
  transform: translate(calc(var(--x) * 0.4em),calc(var(--y) * 0.4em));
}
.mickey__nose-front {
  background-color: #000;
  border-radius: 50%;
  top: 4.32em;
  left: 3.4em;
  width: 1.1em;
  height: 0.7em;
  transform: translate(calc(var(--x) * 0.7em),calc(var(--y) * 0.7em));
}
window.addEventListener("DOMContentLoaded",() => {
  const mm = new MickeyMouse(".mickey");
});

class MickeyMouse {
  constructor(el) {
    this.el = document.querySelector(el);

    this.init();
  }
  get isMobile() {
    return "ontouchstart" in document.documentElement;
  }
  get maxDistance() {
    const { innerWidth, innerHeight } = window;

    if (innerWidth > innerHeight) return innerWidth / 2;
    return innerHeight / 2;
  }
  init() {
    const moveEvent = this.isMobile ? "touchmove" : "mousemove";

    document.addEventListener(moveEvent,this.update.bind(this));

    if (this.isMobile) document.addEventListener("touchstart",this.update.bind(this));
  }
  update(e) {
    let eX = 0
    let eY = 0;

    if (this.isMobile) {
      const firstTouch = e.touches[0];
      eX = firstTouch.clientX;
      eY = firstTouch.clientY;  
    } else {
      eX = e.clientX;
      eY = e.clientY;
    }

    const x = Math.round(eX - window.innerWidth / 2);
    const y = Math.round(eY - window.innerHeight / 2);
    const max = this.maxDistance;
    const percentX = x / max;
    const percentY = y / max;

    this.el?.style.setProperty("--x",percentX);
    this.el?.style.setProperty("--x-abs",Math.abs(percentX));
    this.el?.style.setProperty("--y",percentY);
    this.el?.style.setProperty("--y-abs",Math.abs(percentY));
  }
}

External CSS

This Pen doesn't use any external CSS resources.

External JavaScript

This Pen doesn't use any external JavaScript resources.