Chrome 继承时的转换行为

qnakjoqk  于 2023-09-28  发布在  Go
关注(0)|答案(1)|浏览(76)

今天,我发现了嵌套元素使用inherit关键字时转换的有趣行为。如果没有inherit,则立即触发所有嵌套元素上的转换。而继承时则是级联触发转换。(如评论中所述,该行为仅针对 chrome )
没有继承

const change = document.getElementById("change");
let toggler = true;
change.addEventListener("click", () => {
    toggler = !toggler;
    document.documentElement.style
    .setProperty('--color', toggler ? "black" : "red");
})
::root{
  --color: "black";
}

* {
  transition: color 1s;
  color: var(--color);
}

.test {
  color: inherit;
}
<div>
  Text level1
  <div>
    Text level2
    <div>
      Text level3
    </div>
  </div>
  <button id="change">
    ChangeColor
  </button>
</div>

关于Inherit

const change = document.getElementById("change");
let toggler = true;
change.addEventListener("click", () => {
toggler = !toggler;
    document.documentElement.style
    .setProperty('--color', toggler ? "black" : "red");
    
})
::root{
  --color: "black";
}

* {
  transition: color 1s;
  color: var(--color);
}

.test {
  color: inherit;
}
<div class="test">
  Text level1
  <div class="test">
    Text level2
    <div class="test">
      Text level3
    </div>
  </div>
  <button id="change">
    ChangeColor
  </button>
</div>

有没有办法在使用inherit时立即更改颜色?

dhxwm5r4

dhxwm5r41#

这是一个小技巧,但如果你需要一个解决方案并知道所有的继承源,它确实有效。
首先,在*规则中,禁用color属性的转换:

* {
  transition: all 1s, color 0s;
}

然后,去“源”的颜色变化,并添加

.some-source-of-color {
   transition: color 1s;
}

这是一个与问题类似的例子。

const change = document.getElementById("change");
let toggler = true;
change.addEventListener("click", () => {
  document.getElementById("root").classList.toggle("test");
});
.test {
  color: red;
  transition: color 1s;
}
* {
  transition: all 1s, color 0s;
}
/*
The problem would be present if we didn't have `, color 0s` above
*/
<div id="root">
  Text level1
  <div>
    Text level2
    <div>
      Text level3
    </div>
  </div>
  <button id="change">
    ChangeColor
  </button>
</div>

相关问题