Respuesta corta:
Lo hice. Escribí una función para uso dinámico para todas las personas pequeñas ...
Ejemplo de trabajo que se muestra en la página
Ejemplo de trabajo de inicio de sesión en la consola
Respuesta larga:
... Todavía lo hice.
Me tomó un tiempo hacerlo, ya que un elemento psuedo no está realmente en la página. Si bien algunas de las respuestas anteriores funcionan en ALGUNOS escenarios, TODOS no pueden ser dinámicos y funcionan en un escenario en el que un elemento tiene un tamaño y una posición inesperados (como elementos de posición absoluta que se superponen a una parte del elemento principal). La mía no.
Uso:
//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;
});
Cómo funciona:
Toma las posiciones de alto, ancho, superior e izquierda (según la posición alejada del borde de la ventana) del elemento principal y toma las posiciones de alto, ancho, superior e izquierda (según el borde del contenedor principal) ) y compara esos valores para determinar dónde está el elemento psuedo en la pantalla.
Luego compara dónde está el mouse. Mientras el mouse esté en el rango de variables recién creado, devuelve verdadero.
Nota:
Es aconsejable colocar el elemento padre en una posición RELATIVA. Si tiene un elemento psuedo posicionado de forma absoluta, esta función solo funcionará si se posiciona en función de las dimensiones del padre (por lo que el padre tiene que ser relativo ... tal vez pegajoso o fijo también funcionaría ...
Código:
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
};
}
Apoyo:
No sé ... parece que es tonto y a veces le gusta devolver auto como un valor calculado. Parece funcionar bien en todos los navegadores si las dimensiones se establecen en CSS. Entonces ... establezca su altura y ancho en sus elementos psuedo y solo muévalos con la parte superior e izquierda. Recomiendo usarlo en cosas en las que está de acuerdo con que no funcione. Como una animación o algo así. Chrome funciona ... como siempre.