Ran*_*lue 199 javascript css jquery
我的代码是:
p {
position: relative;
background-color: blue;
}
p:before {
content: '';
position: absolute;
left:100%;
width: 10px;
height: 100%;
background-color: red;
}
Run Code Online (Sandbox Code Playgroud)
请看这个小提琴:http://jsfiddle.net/ZWw3Z/5/
我想仅在伪元素(红色位)上触发click事件.也就是说,我不希望在蓝色位上触发click事件.
Bol*_*ock 208
这是不可能的; 伪元素根本不是DOM的一部分,所以你不能直接将任何事件绑定到它们,你只能绑定到它们的父元素.
如果你必须只在红色区域上有一个点击处理程序,你必须创建一个子元素,比如a span,将它放在开始<p>标记之后,应用样式p span代替p:before,然后绑定到它.
Lin*_*äck 126
实际上,这是可能的.您可以检查单击的位置是否在元素之外,因为只有在单击::before或::after单击时才会发生这种情况.
此示例仅检查右侧的元素,但这应该适用于您的情况.
span = document.querySelector('span');
span.addEventListener('click', function (e) {
if (e.offsetX > span.offsetWidth) {
span.className = 'c2';
} else {
span.className = 'c1';
}
});Run Code Online (Sandbox Code Playgroud)
div { margin: 20px; }
span:after { content: 'AFTER'; position: absolute; }
span.c1 { background: yellow; }
span.c2:after { background: yellow; }Run Code Online (Sandbox Code Playgroud)
<div><span>ELEMENT</span></div>Run Code Online (Sandbox Code Playgroud)
Fas*_*oeu 67
在现代浏览器上,您可以尝试使用pointer-events css属性(但这会导致无法检测父节点上的鼠标事件):
p {
position: relative;
background-color: blue;
color:#ffffff;
padding:0px 10px;
pointer-events:none;
}
p::before {
content: attr(data-before);
margin-left:-10px;
margin-right:10px;
position: relative;
background-color: red;
padding:0px 10px;
pointer-events:auto;
}
Run Code Online (Sandbox Code Playgroud)
当事件目标是你的"p"元素时,你知道它是你的"p:before".
如果仍需要检测主p上的鼠标事件,可以考虑修改HTML结构的可能性.您可以添加span标记和以下样式:
p span {
background:#393;
padding:0px 10px;
pointer-events:auto;
}
Run Code Online (Sandbox Code Playgroud)
事件目标现在既是"span"又是"p:before"元素.
没有jquery的例子:http://jsfiddle.net/2nsptvcu/
jquery示例:http://jsfiddle.net/0vygmnnb/
以下是支持指针事件的浏览器列表:http://caniuse.com/#feat=pointer-events
我的答案适用于想要点击页面的确定区域的任何人.这对我来说非常有用:以后
感谢这篇文章,我意识到(使用jQuery)我可以使用e.pageY而e.pageX不是担心e.offsetY/X和e.clientY/X浏览器之间的问题.
通过我的试验和错误,我开始在jQuery事件对象中使用clientX和clientY鼠标坐标.这些坐标给出了鼠标相对于浏览器视口左上角的X和Y偏移量.当我阅读Karl Swedberg和Jonathan Chaffer的jQuery 1.4参考指南时,我看到他们经常提到pageX和pageY坐标.检查更新的jQuery文档后,我看到这些是jQuery标准化的坐标; 并且,我看到他们给了我相对于整个文档(不仅仅是视图端口)鼠标的X和Y偏移量.
我喜欢这个event.pageY想法,因为它总是相同的,因为它与文档相关.我可以将它与my比较:在使用offset()的父元素之后,它还返回其相对于文档的X和Y.
因此,我可以在整个页面上提出一系列永不改变的"可点击"区域.
或者如果对于codepen太懒,这里是JS:
*我只关心我的例子中的Y值.
var box = $('.box');
// clickable range - never changes
var max = box.offset().top + box.outerHeight();
var min = max - 30; // 30 is the height of the :after
var checkRange = function(y) {
return (y >= min && y <= max);
}
box.click(function(e){
if ( checkRange(e.pageY) ) {
// do click action
box.toggleClass('toggle');
}
});
Run Code Online (Sandbox Code Playgroud)
这对我有用:
$('#element').click(function (e) {
if (e.offsetX > e.target.offsetLeft) {
// click on element
}
else{
// click on ::before element
}
});
Run Code Online (Sandbox Code Playgroud)
最短的代码示例:
<p><span>Some text</span></p>
Run Code Online (Sandbox Code Playgroud)
p {
position: relative;
pointer-events: none;
}
p::before {
content: "";
position: absolute;
pointer-events: auto;
}
p span {
display: contents;
pointer-events: auto;
}
Run Code Online (Sandbox Code Playgroud)
const all_p = Array.from(document.querySelectorAll('p'));
for (let p of all_p) {
p.addEventListener("click", listener, false);
};
Run Code Online (Sandbox Code Playgroud)
pointer-events控制事件检测,从目标中删除接收事件,但继续从伪元素接收使得可以单击::before,并且::after您将始终知道您在伪元素上单击的内容,但是如果您仍然需要单击,则将所有内容放入在嵌套元素中(span在示例中),但因为我们不想应用任何额外的样式,所以成为非常方便的解决方案,并且大多数浏览器display: contents;都支持它。正如原帖中已经提到的,也得到了广泛支持。pointer-events: none;
JavaScript 部分还使用了广泛支持的Array.from和for...of,但是它们不一定在代码中使用。
简短答案:
我做的。我为外面的所有小人们写了一个动态使用的函数...
长答案:
...还是做到了。
我花了一些时间来做,因为psuedo元素实际上不在页面上。尽管上述某些答案在某些情况下有效,但它们都不能同时发挥作用,并且不能在元素的大小和位置都超出预期的情况下起作用(例如,绝对位置的元素覆盖父元素的一部分)。我的不是。
用法:
//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;
});
Run Code Online (Sandbox Code Playgroud)
怎么运行的:
它获取父元素的高度,宽度,顶部和左侧位置(基于远离窗口边缘的位置),并获取父元素的高度,宽度,顶部和左侧位置(基于父容器的边缘) ),然后比较这些值以确定psuedo元素在屏幕上的位置。
然后比较鼠标的位置。只要鼠标在新创建的变量范围内,它就会返回true。
注意:
使父元素相对定位是明智的。如果您有一个绝对定位的psuedo元素,则此函数仅在基于父对象的尺寸进行定位时才起作用(因此,父对象必须是相对的...也许是粘性的或固定的也可以工作。...我不知道)。
码:
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
};
}
Run Code Online (Sandbox Code Playgroud)
支持:
我不知道....看起来像是愚蠢的,有时喜欢将auto作为计算值返回。如果在CSS中设置了尺寸,则它在所有浏览器中都能正常工作。所以...在psuedo元素上设置高度和宽度,并只在顶部和左侧移动它们。我建议您在无法解决的问题上使用它。像动画之类的。Chrome可以正常运作。
| 归档时间: |
|
| 查看次数: |
208010 次 |
| 最近记录: |