【问题标题】:getComputedStyle('background-color') returns transparent, does not inherit ancestor's [duplicate]getComputedStyle('background-color') 返回透明,不继承祖先的 [重复]
【发布时间】:2023-03-21 11:25:02
【问题描述】:

getComputedStyle 应该返回最终计算的 CSS 属性值。但是对于背景颜色,所有浏览器都返回 transparent(或 rgba(x,x,x,0)),而不是计算从祖先那里继承的值。

该方法唯一有效的情况是元素具有直接指定的背景颜色(即使通过其类,但不是通过父级的定义)。但这使得 getComputedStyle 无用,它应该考虑所有祖先的定义。

该方法适用于其他事物,如小提琴中所示的颜色。

如何在 JS 中获取元素的有效背景颜色,而不是每个元素都告诉我它是透明的?

let para = document.querySelector('p');
let compStyles = window.getComputedStyle(para);
para.textContent = 'Incorrect background-color: ' + compStyles.getPropertyValue('background-color') + ', but font color is correct: ' + compStyles.getPropertyValue('color');
/* no colors are specified for p */
p {
  width: 400px;
  margin: 0 auto;
  padding: 20px;
  line-height: 2;
  font-size: 2rem;
  font-family: sans-serif;
  text-align: center;
}

/* this is the important part, only color gets inherited, not background-color */
div {
  background-color: purple;
  color: lightblue;
}
<!-- Original example taken from MDN: https://developer.mozilla.org/en-US/docs/Web/API/Window/getComputedStyle -->

<div>
  <p>Hello</p>
</div>

如果有帮助,X 问题是如何计算用户脚本中页面中每个元素的字体颜色和背景之间的颜色亮度差异;) 那 getComputedStyle 不起作用使它不可行恕我直言。但这个问题本身应该很有趣。

【问题讨论】:

  • 如果你查看 DOM 检查器,它还会显示计算的样式是 rgba(0,0,0,0
  • 答案很简单:背景不是继承的。颜色是继承的
  • @barmar 我在 Firefox 中看不到,p 标签上只显示颜色。

标签: javascript css background-color getcomputedstyle


【解决方案1】:

这是因为 background-color 属性不被子元素继承(与 color 属性不同)。

您可以阅读更多内容:https://developer.mozilla.org/en-US/docs/Web/CSS/inheritance

【讨论】:

  • 谢谢,遗憾的是该页面并未全部列出,仅以边框为例。你知道完整的非继承属性列表吗?
  • 我不知道有没有完整的列表,但是你可以在MDN上查看一个属性,看看它是否被继承。例如:developer.mozilla.org/en-US/docs/Web/CSS/background-color(浏览器兼容性上表)
【解决方案2】:

这是正确的结果,因为没有继承背景颜色。来自MDN

初始值 transparent
适用于所有元素。它也适用于 ::first-letter::first-line
继承
媒体视觉
计算值计算颜色
动画类型颜色
规范顺序由形式语法定义的唯一非歧义顺序

【讨论】:

    【解决方案3】:

    捎带其他答案。这是一个使用继承的 css 的工作示例。

    /* no colors are specified for p */
    p {
      width: 400px;
      margin: 0 auto;
      padding: 20px;
      line-height: 2;
      font-size: 2rem;
      font-family: sans-serif;
      text-align: center;
      background-color: inherit;  /* I added this */
    }
    
    /* this is the important part, only color gets inherited, not background-color */
    div {
      background-color: purple;
      color: lightblue;
    }
    

    https://jsfiddle.net/meq6x5ay/

    【讨论】:

    • 谢谢,继承的好主意,它可以帮助我遍历页面的节点树,而无需关心(取消)嵌套。不幸的是,它不是默认设置,但我想对于所有定位,单个 bgcolor 甚至都无法确定。
    猜你喜欢
    • 2012-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-04-28
    • 2012-03-01
    • 2021-06-23
    • 1970-01-01
    • 2022-12-26
    • 1970-01-01
    相关资源
    最近更新 更多