So erhalten/berechnen Sie den Offset eines Seitenelements mit JavaScript

So erhalten/berechnen Sie den Offset eines Seitenelements mit JavaScript

Frage

Durch Klicken auf ein Steuerelement wird eine schwebende Ebene unter dem Steuerelement angezeigt. Die übliche Vorgehensweise besteht darin, den Versatzwert des Steuerelements abzurufen, die Werte oben, links und anderer CSS-Eigenschaften der schwebenden Ebene zu berechnen und sie zuzuweisen.

Schauen wir uns dann an, wie man den Offsetwert des Steuerelements erhält.

Reine JS-Implementierung

Das erste, was mir in den Sinn kommt, ist ein Stück JS wie dieses.


Code kopieren
Der Code lautet wie folgt:

document.getElementById("divFloat").style.top=document.getElementById("Button").offsetLeft+25;

Wenn Sie feststellen, dass Sie Werteinheiten hinzufügen müssen, ändern Sie es wie folgt:

Ich habe es noch einmal mit IETester und FireFox getestet und es funktioniert einwandfrei in IE6+. Wie zuvor wurde die reine JS-Methode, die ich geschrieben habe, von FireFox gnadenlos verachtet und der erhaltene Wert war falsch.

Ich habe online nachgeschaut und herausgefunden, dass es folgendermaßen geschrieben werden müsste: durch eine Schleife Schicht für Schicht berechnen und schließlich den genauen Offsetwert erhalten.


Code kopieren
Der Code lautet wie folgt:

Funktion getOffsetLeft(o)
{
var links=0;
var offsetParent = o;
während (offsetParent != null und offsetParent != Dokument.Body)
{
links += offsetParent.offsetLeft;
offsetParent = offsetParent.offsetParent;
}</p> <p>Zurück nach links;
}

jQuery-Implementierung

Als ich die damit verbundenen Probleme genauer untersuchte, stellte ich fest, dass jQuery bereits eine Funktion zur Implementierung dieser Funktion enthält: offset(), die mit verschiedenen Browsern sehr kompatibel ist.


Code kopieren
Der Code lautet wie folgt:

$("#Button").offset().links

Nach dem Herunterladen des Quellcodes stellte ich fest, dass jQuery wie folgt implementiert ist


Code kopieren
Der Code lautet wie folgt:

jQuery.fn.extend({
Position: Funktion() {
wenn ( !diese[0] ) {
gibt null zurück;
}
var elem = diese[0],
// *echten* OffsetParent abrufen
offsetParent = diese.offsetParent(),
// Korrekte Offsets erhalten
Offset = dieser.Offset(),
parentOffset = /^body|html$/i.test(offsetParent[0].nodeName) ? { oben: 0, links: 0 } : offsetParent.offset();
//Elementränder subtrahieren
// Hinweis: Wenn ein Element einen Rand hat: automatisch den OffsetLeft und den RandLeft
// sind in Safari gleich, wodurch offset.left fälschlicherweise 0 ist
offset.top -= parseFloat( jQuery.curCSS(elem, "marginTop", true) ) || 0;
offset.left -= parseFloat( jQuery.curCSS(elem, "marginLeft", true) ) || 0;
// OffsetParent-Grenzen hinzufügen
parentOffset.top += parseFloat( jQuery.curCSS(offsetParent[0], "borderTopWidth", true) ) || 0;
parentOffset.left += parseFloat( jQuery.curCSS(offsetParent[0], "borderLeftWidth", true) ) || 0;
// Subtrahieren Sie die beiden Offsets
zurückkehren {
oben: offset.top - parentOffset.top,
links: offset.left - übergeordneterOffset.left
};
},
offsetParent: Funktion() {
gib dies zurück.map(function() {
var offsetParent = this.offsetParent || Dokument.body;
während (offsetParent und (!/^body|html$/i.test(offsetParent.nodeName) und jQuery.css(offsetParent, "position") === "static")) {
offsetParent = offsetParent.offsetParent;
}
gibt offsetParent zurück;
});
}
});

Die Berechnungsmethode ist ähnlich, allerdings gibt es einen Hinweis:

Die Funktion offset() bezieht Randwerte nicht in ihre Berechnungen ein (Rahmenwerte jedoch schon).

<<:  Detaillierte Erklärung der HTML-Programmier-Tags und der Dokumentstruktur

>>:  Einfaches Docker Swarm-Tutorial

Artikel empfehlen

Online- und Offlineinstallation von Docker und allgemeine Befehlsvorgänge

1. Testumgebung Name Version centos 7.6 Docker 18...

So invertieren Sie die Implementierung einer Bézierkurve in CSS

Schauen wir uns zunächst einen CSS-Karussell-Anim...

Detaillierter Installationsprozess der MySQL 8.0 Windows-ZIP-Paketversion

Der Installationsprozess von MySQL 8.0 Windows Zi...

Detaillierte Erklärung der Mencached-Cache-Konfiguration basierend auf Nginx

Einführung Memcached ist ein verteiltes Caching-S...

Beispiel für eine HTTPS-Konfigurationsmethode für den Nginx-Server

Linux: Linux-Version 3.10.0-123.9.3.el7.x86_64 Ng...

Lassen Sie IE6, IE7, IE8 CSS3-abgerundete Ecken und Schattenstile unterstützen

Ich möchte eine Seite mit CSS3-abgerundeten Ecken...

Mybatis-Statistiken zur Ausführungszeit jeder SQL-Anweisung

Hintergrund In letzter Zeit werde ich in Intervie...

Zwei einfache Beispiele für Menünavigationsleisten

Menüleiste Beispiel 1: Code kopieren Der Code lau...

Implementierung des CSS-Ladeeffekts Pac-Man

emmm, der Name ist nur eine zufällige Vermutung 2...