Kurze Antwort:
Ich hab es gemacht. Ich habe eine Funktion für den dynamischen Gebrauch für all die kleinen Leute da draußen geschrieben ...
Arbeitsbeispiel, das auf der Seite angezeigt wird
Arbeitsbeispiel Protokollierung an der Konsole
Lange Antwort:
... hat es immer noch getan.
Ich habe eine Weile dafür gebraucht, da ein Pseudo-Element nicht wirklich auf der Seite ist. Während einige der obigen Antworten in EINIGEN Szenarien funktionieren, sind ALLE nicht dynamisch und funktionieren in einem Szenario, in dem ein Element sowohl in Größe als auch in Position unerwartet ist (z. B. absolut positionierte Elemente, die einen Teil des übergeordneten Elements überlagern). Meins nicht.
Verwendung:
//some element selector and a click event...plain js works here too
$("div").click(function() {
//returns an object {before: true/false, after: true/false}
psuedoClick(this);
//returns true/false
psuedoClick(this).before;
//returns true/false
psuedoClick(this).after;
});
Wie es funktioniert:
Es erfasst die Positionen Höhe, Breite, oben und links (basierend auf der Position vom Rand des Fensters entfernt) des übergeordneten Elements und erfasst die Positionen Höhe, Breite, oben und links (basierend auf der Kante des übergeordneten Containers) ) und vergleicht diese Werte, um festzustellen, wo sich das Pseudo-Element auf dem Bildschirm befindet.
Anschließend wird verglichen, wo sich die Maus befindet. Solange sich die Maus im neu erstellten Variablenbereich befindet, wird true zurückgegeben.
Hinweis:
Es ist ratsam, das übergeordnete Element RELATIV zu positionieren. Wenn Sie ein absolut positioniertes Pseudo-Element haben, funktioniert diese Funktion nur, wenn es basierend auf den Abmessungen des Elternteils positioniert ist (also muss das Elternteil relativ sein ... vielleicht würde auch klebrig oder fest funktionieren ... ich weiß nicht).
Code:
function psuedoClick(parentElem) {
var beforeClicked,
afterClicked;
var parentLeft = parseInt(parentElem.getBoundingClientRect().left, 10),
parentTop = parseInt(parentElem.getBoundingClientRect().top, 10);
var parentWidth = parseInt(window.getComputedStyle(parentElem).width, 10),
parentHeight = parseInt(window.getComputedStyle(parentElem).height, 10);
var before = window.getComputedStyle(parentElem, ':before');
var beforeStart = parentLeft + (parseInt(before.getPropertyValue("left"), 10)),
beforeEnd = beforeStart + parseInt(before.width, 10);
var beforeYStart = parentTop + (parseInt(before.getPropertyValue("top"), 10)),
beforeYEnd = beforeYStart + parseInt(before.height, 10);
var after = window.getComputedStyle(parentElem, ':after');
var afterStart = parentLeft + (parseInt(after.getPropertyValue("left"), 10)),
afterEnd = afterStart + parseInt(after.width, 10);
var afterYStart = parentTop + (parseInt(after.getPropertyValue("top"), 10)),
afterYEnd = afterYStart + parseInt(after.height, 10);
var mouseX = event.clientX,
mouseY = event.clientY;
beforeClicked = (mouseX >= beforeStart && mouseX <= beforeEnd && mouseY >= beforeYStart && mouseY <= beforeYEnd ? true : false);
afterClicked = (mouseX >= afterStart && mouseX <= afterEnd && mouseY >= afterYStart && mouseY <= afterYEnd ? true : false);
return {
"before" : beforeClicked,
"after" : afterClicked
};
}
Unterstützung:
Ich weiß nicht ... es sieht so aus, als wäre es dumm und gibt manchmal gerne Auto als berechneten Wert zurück. Es scheint in allen Browsern gut zu funktionieren, wenn die Abmessungen in CSS festgelegt sind. Also ... stellen Sie Ihre Höhe und Breite auf Ihre Pseudo-Elemente ein und verschieben Sie sie nur nach oben und links. Ich empfehle es für Dinge zu verwenden, bei denen Sie damit einverstanden sind, dass es nicht funktioniert. Wie eine Animation oder so. Chrome funktioniert ... wie gewohnt.