Nehmen wir an, Sie möchten die background-position eines Elements beim Überfahren mit der Maus verschieben, um dem Design etwas Pfiff zu verleihen. Sie haben ein Element wie dieses
<div class="module" id="module"></div>
Und Sie fügen ihm einen Hintergrund hinzu
.module {
background-image: url(big-image.jpg);
}
Sie können die background-position in JavaScript wie folgt anpassen
const el = document.querySelector("#module");
el.addEventListener("mousemove", (e) => {
el.style.backgroundPositionX = -e.offsetX + "px";
el.style.backgroundPositionY = -e.offsetY + "px";
});
Siehe den Pen Bewegen Sie einen Hintergrund mit der Maus von Chris Coyier (@chriscoyier) auf CodePen.
Oder Sie könnten stattdessen CSS-Custom-Properties in JavaScript aktualisieren
const el = document.querySelector("#module");
el.addEventListener("mousemove", (e) => {
el.style.setProperty('--x', -e.offsetX + "px");
el.style.setProperty('--y', -e.offsetY + "px");
});
.module {
--x: 0px;
--y: 0px;
background-image: url(large-image.jpg);
background-position: var(--x) var(--y);
}
Siehe den Pen Bewegen Sie einen Hintergrund mit der Maus von Chris Coyier (@chriscoyier) auf CodePen.
Hier ist ein Beispiel, das den Hintergrund direkt in JavaScript bewegt, aber mit einem Übergang versehen ist, sodass er zur neuen Position gleitet, anstatt beim ersten Betreten zu ruckeln.
Siehe den Pen Bewegliche Hintergrundanzeige von Chris Coyier (@chriscoyier) auf CodePen.
Oder Sie könnten stattdessen ein tatsächliches Element bewegen (anstelle der background-position). Dies würden Sie tun, wenn sich auf dem verschiebbaren Element eine Art Inhalt oder Interaktivität befindet. Hier ist ein Beispiel dafür, das wieder CSS-Custom-Properties setzt, aber dann das Element tatsächlich über eine CSS-translate() und eine calc() bewegt, um die Geschwindigkeit zu dämpfen.
Siehe den Pen Hotjar Moving Heatmap Ad von Chris Coyier (@chriscoyier) auf CodePen.
Ich bin sicher, es gibt noch viele andere Möglichkeiten, dies zu tun – eine bewegliche SVG-ViewBox, Skripte, die eine Canvas steuern, WebGL… wer weiß! Wenn Sie ausgefeiltere Wege haben, dies zu tun, verlinken Sie sie in den Kommentaren.
Wäre an einer mobilfreundlichen Lösung interessiert.
So etwas wie die Verwendung des Beschleunigungsmessers? http://www.albertosarullo.com/blog/javascript-accelerometer-demo-source
Ich hätte wohl eine Version machen sollen, die auch mit dem
touchmove-Event funktioniert. Forks willkommen!Ja, eine Touch-freundliche Lösung wäre wünschenswert. Die Verwendung des Beschleunigungsmessers scheint zu viel Ausprobieren zu erfordern, um es einem armen Benutzer aufzubürden, der nur tippen und ziehen möchte.
Wie wirkt sich das auf die Leistung aus? Würde das ein vernünftiges Debouncing erfordern?
Vielleicht? Ich hätte Bedenken, dass es mit einem Debounce ruckelig wird. Ich frage mich, ob es eine Möglichkeit gibt, die Werte nur innerhalb von
requestAnimationFrameoder so etwas zu aktualisieren. Auf meinem Computer sehe ich keine Verlangsamung, aber ich denke, allgemeiner guter Rat ist, dass DOM-Events, die sehr schnell ausgelöst werden (wiemousemove), eine Art Leistungsbehandlung haben sollten.Vor einigen Jahren habe ich gesehen, wie PC Gamer etwas Ähnliches gemacht hat. Ich habe beschlossen, nur CSS zu verwenden, um das Bild scheinbar bewegen zu lassen, und JS zu verwenden
als Bequemlichkeit, um ein Gitter von leeren Elementen zu erstellen, anstatt sie fest zu kodieren.
Ich habe die Ränder für das „scheinbare“ Hintergrundbild angepasst, aber der Pen hätte genauso gut dazu verwendet werden können, die background-position eines Hintergrundbildes anzupassen. Je mehr leere Elemente erstellt wurden, desto sanfter erschien die Animation.
Hallo Chris, ich wollte ein Bild-Zoom erstellen, wenn man mit der Maus über das Bild fährt und die gezoomte Version in einem separaten Div daneben angezeigt wird, so wie sie es auf E-Commerce-Websites haben. Wie kann ich das machen? Irgendwelche Vorschläge?
Das letzte Beispiel funktioniert nicht in Chrome unter Windows