我甚至不知道如何准确地表达这个问题,所以让我试着把它放在一些代码中:
假设我有一个div元素,我想给它做动画,所以我给它两个样式:
#myElement {
width: 100px;
height: 100px;
background: red;
}
#myElement:hover {
width: 150px;
height: 150px;
background: green;
transition: 1s;
}
<div id="myElement"></div>
为什么我将transition
属性应用于哪个样式很重要?
如果我把它应用到默认样式,一切都正常工作,过渡工作的方式,当它改变状态从默认到悬停,反之亦然。但是当我将它应用到:hover
时,它只能从默认到悬停,但不是另一种方式,它只是立即跳回来。
为什么会发生这种情况,转换属性的语义是什么?(语义在这里是正确的术语吗?)
如果是:"每当从这个状态改变到另一个状态时,应用转换。"为什么当只应用于默认时,从悬停到默认也会发生转换?
并且它不能是"无论何时将从另一个状态更改为,应用转换。"
那是什么呢?
是否存在某种遗传?
我找到了大量关于如何应用转换,语法等的资源,但我找不到任何解释这种行为的地方。
编辑:我想我太专注于过渡属性,没有研究"继承"的伪类。如果我把过渡设置为默认状态:hover会继承它。此外,我不知何故认为它只会在:悬停状态一旦过渡完成,这是错误的。这里有一个不同的场景,如果有人仍然感到困惑,没有"继承":https://jsfiddle.net/xu6Lsexr/1/
谢谢你为我澄清这一点!
但是当我将它应用到
:hover
时,它只能从默认到悬停,但不是另一种方式,它只是立即跳回来。为什么会发生这种情况,转换属性的语义是什么?
这与任何"转换属性的语义"无关。
无论你为#myElement:hover
定义的样式是什么,当元素处于悬停状态时,只应用,而无论你为#myElement
定义的样式是什么,都将在状态、元素的"正常"状态和悬停状态中应用。
因此,如果你将transition
与选择器#myElement
放入第一条规则中,该元素在两种状态下都具有该属性,而如果你将其放入第二条规则中,它只在悬停状态下具有该属性。
一个简单的例子,告诉你这与transition
属性本身无关:
#foo {
font-size: 20px;
}
#foo:hover {
background-color: red;
border: 1px solid;
}
#bar {
background-color: red;
font-size: 20px;
}
#bar:hover {
border: 1px solid;
}
现在,#foo
只有在鼠标悬停时才会有红色背景色,而#bar
在两种状态下都有红色背景色,transition
或任何其他属性也是如此。
没有:hover
选择器的规则意味着"不管它是否是:hover
"。它的意思不是"不是:hover
",而是:not(:hover)
。这就是为什么转换是双向的。
当应用于:hover
时,没有为非悬停状态定义过渡,因此一旦元素停止匹配:hover
,就不会发生过渡动画。没有使用悬停状态的过渡,因为在应该发生过渡的时候,元素已经停止匹配:hover
。