【发布时间】:2016-09-21 23:58:38
【问题描述】:
我正在努力寻找能做两件事的 CSS,改变所有子元素的颜色,并将其作为过渡。我创建了以下JSFiddle 的简单测试用例:
<div class="parent">Level 1
<div>Level 2
<div class="child">Level 3 (!important means this should become red on hover)
</div>
</div>
</div>
我正在尝试使用 CSS 将文本转换为不同的颜色。这是我正在使用的框架:
.parent {
transition: all 2s ease-out;
}
.parent:hover {
color: red !important;
}
.child {
color: blue;
}
我想在父级指定一个规则,该规则将导致所有子级更改颜色。我知道不鼓励使用 !important,但这似乎是使用它的有效案例,因为此规则将该部分标记为“错误”并且应该覆盖其他规则。
这是我为使其工作所做的工作,但它要求我对所有设置颜色的子元素都有规则。在这个简单的例子中这很好,但在实际系统中会出现问题,因为我们可能不知道改变颜色的所有规则。
div {
font-size: 3rem;
text-indent: 1rem;
}
.child {
color: blue;
}
.parent,
.parent .child {
transition: all 3s;
}
.parent:hover,
.parent:hover .child {
color: red !important;
}
<div class="parent">
Level 1
<div>
Level 2
<div class="child">
Level 3 (!important means this should become red on hover)
</div>
</div>
</div>
是否可以在不知道所有必须指定的类的情况下将所有子元素转换为新颜色?我尝试使用.parent * 选择器,但每一级嵌套都会增加过渡期,如fiddle
更新
我对正在发生的事情有了更好的了解。 @Hunter 解决了不必要的 !important 规则。所以,真正的问题是,transition-duration 属性似乎对孩子来说是附加的,看看当不再将鼠标悬停在文本上时移除红色需要多慢,理想情况下每个嵌套元素的颜色应该同时转换.
div {
padding-left: 1rem;
}
.a-child { color: blue; }
.parent * {
transition: color 2s;
}
.parent:hover * {
color: red;
}
<div class="parent">
<div>
Level 1
<div>
Level 2
<div>
Level 3
<div>
Level 4
<div class="a-child">
Level 5
</div>
</div>
</div>
</div>
</div>
</div>
【问题讨论】:
-
所以当有人将鼠标悬停在父元素上时,您希望所有三个级别都改变颜色?
-
我认为过渡没有实际延迟。但是您在蓝色元素上看到的延迟可能是由于它从蓝色过渡到红色。 通过中间颜色。 它可能比 CSS 问题更直观。但是找不到参考资料。
-
@AnkithAmtange 使用
*选择器时,第二个文本位(第一个 div)在 out 转换时运行时间是原来的两倍。 -
如果我错了,请纠正我。但是选择器要么匹配,要么不匹配。它们不应导致过渡延迟。您所指的应该是游戏中的
transition-timing-function。ease-out -
@AnkithAmtange 我认为发生的事情是嵌套元素都匹配 CSS 规则,但是每个匹配规则的转换持续时间是相加的。因此,我们看到 Level2 的颜色变化比 level1 需要更长的时间(特别是在返回黑色时)
标签: html css css-transitions