为啥不透明度声明的顺序在这个两阶段淡入中很重要?

Posted

技术标签:

【中文标题】为啥不透明度声明的顺序在这个两阶段淡入中很重要?【英文标题】:Why is the order of opacity declaration important in this two-phase fade-in?为什么不透明度声明的顺序在这个两阶段淡入中很重要? 【发布时间】:2015-10-29 12:20:00 【问题描述】:

我写了一个两阶段的淡入淡出按钮。我注意到声明不透明度状态的顺序很重要。

此 CSS 有效:

.item .btn-remove 
  transition: opacity 0.5s ease-in-out;
  opacity: 0;


.item:hover .btn-remove 
  opacity: .25;


.item .btn-remove:hover 
  /* works here */
  opacity: 1;

与不工作的版本相比:

.item .btn-remove 
  transition: opacity 0.5s ease-in-out;
  opacity: 0;


.item .btn-remove:hover 
  opacity: 1;


.item:hover .btn-remove 
  opacity: .25;

我可以看到声明的顺序是有道理的,但不明白为什么这会有所作为,因为规则不冲突(就我目前对 CSS 的理解而言)。

请查看我的fiddle 示例。

【问题讨论】:

【参考方案1】:

匹配:hover 的元素的所有祖先也将匹配:hover。尽管:hover 是一个 CSS 选择器,但这是在 html 规范中指定的,而不是选择器。来自section 4.14.2 of W3C HTML5:

:hover 伪类被定义为匹配一个元素,“而用户指定一个带有指针设备的元素”。仅出于定义:hover 伪类的目的,HTML 用户代理必须将一个元素视为用户指定的元素,如果它是:

用户使用指点设备指示的元素。

具有用户使用定点设备指示的后代的元素。

因此,即使.btn-remove 本身与:hover 匹配(即当.btn-remove 是被指定的元素时),.item:hover .btn-remove 规则也适用。换句话说,这两个 CSS 规则实际上确实相互重叠,从而产生了冲突。

【讨论】:

...它们具有相同的特异性。但是,我可以通过另一个属性(比如说背景颜色)看到这一点,但不透明度(至少对于 Chrome 44)它可以按预期工作,无论顺序如何。很奇怪。

以上是关于为啥不透明度声明的顺序在这个两阶段淡入中很重要?的主要内容,如果未能解决你的问题,请参考以下文章

为啥顺序在这个链式分配中很重要?

为啥 SOAP 参数的顺序在 PHP SOAP 中很重要,以及如何解决它?

为啥媒体查询的顺序在 CSS 中很重要?

为啥媒体查询的顺序在 CSS 中很重要?

为啥修饰符顺序在 SwiftUI 中很重要? [复制]

为啥替代品的顺序在正则表达式中很重要?