我正在尝试为给定的一组通用HTML元素标记边框(它们的CSS不在我的控制范围内),以便边框可见,并且在悬停时突出显示。我目前使用伪元素:before和:after来实现这一点,但是我在处理边距时遇到了问题。我需要使用CSS而不是JS来解决。期望的行为是仅在任何两个元素之间有单个线条,但由于边距,在段落“Some content”和标题“World”之间重复了边框。我能够将标记类应用于包装div或直接应用于类元素,如下面的片段所示,两者对我来说都可以。
有没有办法在不使用JS放置边框线的情况下“合并”两个边框,同时保留悬停高亮效果?
我尝试对所有元素使用:after,只对第一个元素使用:before,但在这种情况下,我要么失去了顶部边框的悬停效果,要么显示在错误的位置(与原始边框相同问题)。
更新:
我能够使用以下概念组合几乎可行的解决方案:
每个元素显示其:before边框
最后一个元素还显示其:after边框
悬停时,当前元素和其下一个兄弟的:before边框都会被激活
但是...即使它比原始版本更好用,“margin”区域也无法响应:hover,请问有什么解决方法?
更新后的代码:
.mark-borders:before,
.mark-borders:after
{
content: '';
position: absolute;
left: 0;
right: 0;
display: block;
height: 1px;
border-bottom: dashed 1px #ccc;
}
.mark-borders:hover:before,
.mark-borders:hover:after
{
border-bottom: solid 1px red;
z-index: 1;
}
<div class="mark-borders">
<h1>
Hello
</h1>
</div>
<div class="mark-borders">
<p>
Some content
</p>
</div>
<div class="mark-borders">
<h1>
World
</h1>
</div>
<br />
<hr />
<div class="mark-borders">
<h1>
Hello
</h1>
</div>
<p class="mark-borders">
Some content
</p>
<h1 class="mark-borders">
World
</h1>
我尝试对所有元素使用:after,只对第一个元素使用:before,但在这种情况下,我要么失去了顶部边框的悬停效果,要么显示在错误的位置(与原始边框相同问题)。
更新:
我能够使用以下概念组合几乎可行的解决方案:
每个元素显示其:before边框
最后一个元素还显示其:after边框
悬停时,当前元素和其下一个兄弟的:before边框都会被激活
但是...即使它比原始版本更好用,“margin”区域也无法响应:hover,请问有什么解决方法?
更新后的代码:
.mark-borders:before,
.mark-borders:last-child:after
{
content: '';
position: absolute;
left: 0;
right: 0;
display: block;
height: 1px;
border-bottom: dashed 1px #ccc;
}
.mark-borders:hover:before,
.mark-borders:hover:last-child:after,
.mark-borders:hover + *:before
{
border-bottom: solid 1px red;
z-index: 1;
}
<div>
<div class="mark-borders">
<h1>
Hello
</h1>
</div>
<div class="mark-borders">
<p>
Some content
</p>
</div>
<div class="mark-borders">
<h1>
World
</h1>
</div>
</div>
.mark-borders{overflow:hidden}
并相应地重新定位您的before和after即可。 - Ron.Basco