提问人:Dom 提问时间:6/23/2023 最后编辑:Rory McCrossanDom 更新时间:6/23/2023 访问量:55
在节点边距单击时返回节点
Return node on node margin click
问:
有这个代码,每个 P 标签用边距分隔:
document.addEventListener("click", function(e) {
console.log(e.target);
});
* {
box-sizing: border-box;
}
div {
height: 100px;
border: 1px solid blue;
}
p {
margin: 20px;
border: 1px solid red;
}
<div>
<p>
Lorem
</p>
<p>
Lorem 2
</p>
</div>
当我捕获 P 标签之间的点击事件时,返回的节点是 DIV。点击P标签边距时如何返回P标签?我不被允许将边距更改为填充,这将是一个简单的解决方案。
答:
6赞
David Thomas
6/23/2023
#1
您可以利用伪元素,例如(在下面的示例中),以负插图定位:::before
document.addEventListener("click", function(e) {
console.log(e.target);
});
* {
box-sizing: border-box;
}
div {
height: 100px;
border: 1px solid blue;
}
p {
margin: 20px;
border: 1px solid red;
isolation: isolate;
position: relative;
}
p::before {
background-color: transparent;
content: '';
inset: -10px;
position: absolute;
z-index: -1;
}
<div>
<p>
Lorem
</p>
<p>
Lorem 2
</p>
</div>
两个元素之间仍然有一个(小的)间隙,但这可以通过扩展伪元素来调整。::before
评论
0赞
Hao Wu
6/23/2023
我只是在考虑使用一些带有负边距等的伪元素恶作剧。这要好得多!
2赞
Hao Wu
6/23/2023
副作用是阻塞了交互元素(无法选择文本等),但可以通过 或 等解决。::before
z-index
translateZ
0赞
David Thomas
6/23/2023
@Hao:我简直不敢相信我忘了添加它(当我开始写答案时,我就想过,但我分心了,当我回来时,我显然忘记了它)。傻傻的我。
评论
margin
padding
margin
不被视为元素的一部分,因此在与元素交互时不会触发任何事件。您可以在此演示中看到相同的问题,即 直到您越过元素的边框/内容而不是填充物时才会触发:jsfiddle.net/su4ewqkg。要执行所需的操作,需要更改 HTML 和/或 CSS。:hover
p