简短回答:
我做到了。我为所有小伙伴编写了一个动态使用的函数...
工作示例,可在页面上显示
工作示例,记录到控制台
详细回答:
...还是做到了。
花了我一些时间才做到这一点,因为伪元素实际上不在页面上。虽然上面的一些答案在某些情况下有效,但它们都无法同时具有动态性并在元素大小和位置意外的情况下(例如绝对定位的元素覆盖父元素的一部分)起作用。我的函数可以。
用法:
$("div").click(function() {
psuedoClick(this);
psuedoClick(this).before;
psuedoClick(this).after;
});
工作原理:
它获取父元素的高度、宽度、顶部和左侧位置(基于窗口边缘的位置),并获取父容器的高度、宽度、顶部和左侧位置(基于父容器的边缘),然后比较这些值以确定伪元素在屏幕上的位置。
然后它比较鼠标的位置。只要鼠标在新创建的变量范围内,它就返回true。
注意:
最好将父元素设置为相对定位。如果你有一个绝对定位的伪元素,只有当它根据父元素的尺寸定位时,此函数才能正常工作(所以父元素必须是相对的......也许粘性或固定的也可以......我不知道)。
代码:
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
};
}
支持:
我不知道......看起来IE有时会将auto作为计算值返回,似乎很愚蠢。如果在CSS中设置尺寸,则在所有浏览器中都可以正常工作。因此...在伪元素上设置高度和宽度,并仅使用top和left移动它们。我建议在你可以接受它无法正常工作的东西上使用它,比如动画之类的。Chrome像往常一样工作。
$('p').before().click(function...)
。 - Mladen B.