【发布时间】:2015-06-18 12:55:14
【问题描述】:
我试图生成一个使用 :before 和 :after 伪元素的屏幕,但我想知道这样的功能是否真的可行。
我有一个包装器 div,它包装在输入周围(允许在此包装器上使用 pseudo elements)。
类似:
+-----------------------------------+
| +-------------------------------+ |
| | | | <-- wrapper div
| +-------------------------------+ <-- input element
+-----------------------------------+
但是,我希望在 div 之后放置一个伪元素。
+-----------------------------------++-------+
| +-------------------------------+ | |¯¯¯| |
| | | | / |
| +-------------------------------+ | ! |<--pseudo element
+-----------------------------------++-------+
我希望能够悬停这个伪元素,并让另一个伪元素出现。
.wrap {
position: relative;
height: 30px;
width: 200px;
display: inline-block;
}
.wrap input {
position: absolute;
top: 0;
left: 0;
height: 100%;
width: 100%;
}
.wrap:after {
content: "?";
position: absolute;
top: 0;
left: 100%;
height: 30px;
width: 30px;
font-size: 30px;
text-align: center;
}
.wrap:before {
content: "";
position: absolute;
top: 100%;
left: 0;
height: 60px;
width: 100%;
background: tomato;
opacity:0.2;
}
<div class="wrap">
<input placeholder="input element" type="text" />
</div>
从上面的 sn-p 设计中,当我只悬停 :after 元素而不是 wrap div 本身时,有没有办法使 :before 元素改变其不透明度(注意:html 无法更改,所以为什么要问这个问题)?
我尝试使用类似的东西:
.wrap:not(input):hover:before{
将输入的宽度更改为90%后,但这并没有什么不同
【问题讨论】:
-
一个有趣的例子,让伪元素算作简单的选择器,所以可以做类似
.wrap:has(::after:hover)::before的事情。但是唉…… -
@BoltClock
::after:hover在选择器级别 4 中有效吗?如果我没记错的话,伪元素不能有伪类...... -
@Hashem Qolami:它处于第 4 级。它取决于伪元素和伪类——有些组合是可能的,而另一些则不是。请参阅dev.w3.org/csswg/selectors-4/#pseudo-elements,它说“伪元素是无特征的,因此不能被任何其他选择器匹配。它们也不影响结构伪类的解释,这些伪类仅基于真实元素进行评估。其他伪-classes 可以匹配伪元素,除非另有说明。"
-
我能做到的最接近的方法是将父元素的
pointer-events设置为none,然后将:before重置为initial。然后您可以在父级上使用:hover:after,它会在:before伪元素悬停时触发。这种情况下的缺点是,要使input可用,您还需要重置它的pointer-events,这意味着它也会触发父级的:hover。你愿意使用额外的标记吗? -
@Raptor:如果 OP 在其原始问题中使用 :before 和 :after 之类的伪元素,您通常可以假设他们对支持 IE7 不感兴趣,除非他们另有说明。
标签: css hover pseudo-element