Der schüchterne Button (HTML, CSS und Javascript)

von Eric-Oliver Mächler | Juni 3, 2026 | Allgemein | 0 Kommentare

Schlagwörter: CSS - HTML - Javascript

Wenn ihr mal eure Webseiten-Besucher ein wenig ärgern wollt, dann habe ich jetzt was Geniales für euch.

Stellt euch vor, ihr habt ein Formular oder einen Button auf eurer Webseite. Wenn ihr nun mit dem Mauszeiger in die Nähe dieses Buttons kommt, dann verschiebt sich der Button und immer wenn ihr in seine Nähe kommt, passiert das Gleiche. Erst wenn ihr den Button in die Ecke drängt, könnt ihr ihn anklicken.

Genau das bauen wir heute.

Video

HTML

<button id="shy-button"><a href="https://example.com" target="_blank" rel="noopener noreferrer">Klick mich!</a></button>

CSS

:root {
  --bg: #1a1a2e;
  --buttonBG: #e94560;
  --buttonBGHover: #ff6b6b;
}
* {
  margin: 0;
  padding: 0;
  box-sizing: border-box;
}

body {
  width: 100vw;
  height: 100vh;
  overflow: hidden;
  background: var(--bg);
  display: flex;
  justify-content: center;
  align-items: center;
}

#shy-button {
  padding: 16px 32px;
  font-size: 18px;
  font-family: system-ui, sans-serif;
  background: var(--buttonBG);
  color: white;
  border: none;
  border-radius: 8px;
  cursor: pointer;
  transition: background 0.2s;
  user-select: none;
  position: absolute;
}

#shy-button:hover {
  background: var(--buttonBGHover);
}

#shy-button a {
  color: inherit;
  text-decoration: none;
}

Javascript

const button = document.getElementById("shy-button");

// Wie nah die Maus ran darf, bevor der Button flieht (in Pixel)
const fleeDistance = 120;
// Wie schnell der Button zurückgleitet (0.01 = langsam, 0.1 = schnell)
const speed = 0.08;

// Startposition: Mitte des Bildschirms
let targetX = window.innerWidth / 2;
let targetY = window.innerHeight / 2;
let currentX = targetX;
let currentY = targetY;

// Button mittig ausrichten per CSS
button.style.left = `${currentX}px`;
button.style.top = `${currentY}px`;
button.style.transform = "translate(-50%, -50%)";

// Wird ständig aufgerufen, solange die Maus bewegt wird
document.addEventListener("mousemove", (e) => {
  // Zentrum des Buttons berechnen
  const buttonCenterX = currentX;
  const buttonCenterY = currentY;

  // Abstand zwischen Button und Mauszeiger (Pythagoras)
  const dx = buttonCenterX - e.clientX;
  const dy = buttonCenterY - e.clientY;
  const distance = Math.sqrt(dx * dx + dy * dy);

  // Wenn Maus zu nah kommt...
  if (distance < fleeDistance) {
    // ...Winkel berechnen, in dem die Maus steht...
    const angle = Math.atan2(dy, dx);
    // ...und den Button in die GEGENÜBERLIEGENDE Richtung stoßen
    targetX = buttonCenterX + Math.cos(angle) * fleeDistance * 1.5;
    targetY = buttonCenterY + Math.sin(angle) * fleeDistance * 1.5;

    // Verhindern, dass der Button außerhalb des Bildschirms landet
    const padding = 80;
    targetX = Math.max(padding, Math.min(window.innerWidth - padding, targetX));
    targetY = Math.max(padding, Math.min(window.innerHeight - padding, targetY));
  }
});

// Animationsschleife: fließend von aktueller Position zur Zielposition bewegen
function animate() {
  // Linear interpolation (Lerp): current += (target - current) * speed
  currentX += (targetX - currentX) * speed;
  currentY += (targetY - currentY) * speed;

  // Position aktualisieren
  button.style.left = `${currentX}px`;
  button.style.top = `${currentY}px`;

  // Nächsten Frame anfragen (für flüssige Animation)
  requestAnimationFrame(animate);
}

// Animation starten
animate();

0 Kommentare

Kommentar Schreiben

Du kannst auf Fediverse-Profile verlinken, indem du fl:@benutzername in deinem Kommentar eingibst.

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert