【问题标题】:CSS Inherit for unknown Background Color is Actually Transparent未知背景颜色的 CSS 继承实际上是透明的
【发布时间】:2013-11-06 03:40:16
【问题描述】:

我正在使用 <ul><li> 元素创建一个类似于标签的功能,我注意到 CSS background-color: inherit 的这种意外行为。
有人会认为inherit 实际上并不是指transparent,而是child.background-color == parent.background-color(请原谅伪代码)。

我的代码很简单,但我有一个问题:我正在为可变条件开发。这意味着我永远无法知道我的代码将使用什么背景颜色,而且我不想介绍我自己的。

我准备了一个JSFiddle,其中背景是在页面加载时随机设置的,以模仿我的代码目的地的随机性。明显的问题是活动选项卡的背景颜色预设看起来很糟糕。所以,我把它改成了background-color: inherit。 (见JSFiddle 2

虽然这显然解决了背景问题,但下方元素 (cg_content) 的边框再次开始显示,因为 inherit 属性的作用类似于 transparent,而不是在设置背景时的作用-颜色。

问题是:有没有办法让它在不使用 Javascript 的情况下继承实际的背景颜色?
如果没有,您能否建议一种更好的方法来使这些标签看起来不错没有预设颜色?

P.S.:内容 <div> 不应是 <li> 元素的子元素,因为这些选项卡共享一些内容。
P.S.2:我不能再清楚了,我显然知道如何用 JS 做到这一点。我只是不想。

【问题讨论】:

  • 我的解决方案,如果您只需要一个不会与文本颜色冲突的非透明背景:在父子元素上,我使用了currentColorfilter 的组合:@987654337 @、contrastbrightness,有时还有grayscale。此技巧适用于浅色、深色甚至彩色主题的动态主题,无需明确指定任何颜色值。
  • 嗨@JoeDF,听起来很有趣!我认为它并没有直接回答这个问题,因为这个问题是关于未知环境的,但请随时发表您的评论作为答案,因为我认为它可能会帮助其他读者!

标签: html css tabs background-color


【解决方案1】:

设置background-color: inherit 确实会导致它采用父元素的背景颜色。

之所以采用transparent是因为父级(li)的背景色transparent(默认值)。

您的第二个 JSFiddle 中唯一具有背景颜色集的其他元素是 #unknown_background,它是锚的曾曾祖父。

div, ul, li { background-color: inherit; }添加到样式表的末尾,背景将一直向下继承,边框不会显示。

【讨论】:

  • 我还建议去掉 ul 的容器 div。删除它根本不会改变结果,您不必生成新的 css 规则和另一个具有 id 的元素。
  • 谢谢@Quentin。这确实是我的代码简化版本的解决方案。但在现实世界的示例中,我的代码可能是具有实际背景颜色的元素的曾曾孙的一部分,并且我对中间的元素没有 CSS 控制。有什么想法吗?
  • 在 CSS 中,没有办法让一个元素从任意其他元素(甚至祖先)获取其背景。您可以是特定的,也可以从父级继承。
  • 谢谢昆汀。我会拭目以待,看看是否有人想出如何让标签在没有预设颜色的情况下工作的想法。
  • 没有其他办法吗?如果我在某处有一个position: sticky 元素并希望它的背景位于一切之上怎么办?写background-color: inherit 30 层的深层嵌套元素? :-/
【解决方案2】:

按照@mavrosxristoforos 的建议发布此内容,赞!这不是一个答案,而是更多地添加到此处可用的信息中。希望这对那里的某些人有用。

如果您只需要一个不与文本颜色冲突但仍然非常明显的非透明背景:我的解决方案涉及使用currentColor 和过滤器的组合,例如invertcontrastbrightness 在父元素和子元素上。

此技巧适用于动态主题,例如浅色、深色甚至彩色主题,而无需为这些元素明确指定任何颜色值。这可以与一些现有的 CSS 主题一起使用,这些主题没有使用 CSS 变量定义的东西或缺少类以有条件地仅更改特定颜色。观察下面的演示。

var root = document.documentElement;
var themeDark = true;

updateTheme( themeDark );

$('.card').on('click', function(){
  themeDark = !themeDark; // switch the theme
  updateTheme(themeDark);
});

function updateTheme(useDarkTheme){
  if (useDarkTheme) {
      root.style.setProperty('--primary','#000');
      root.style.setProperty('--secondary','#333');
      root.style.setProperty('--ternary','#eee');
    } else {
      root.style.setProperty('--primary','#efefef');
      root.style.setProperty('--secondary','#ddd');
      root.style.setProperty('--ternary','#333');
    }
}
/* say you're using a bootstrap theme with some defined colors, 
 * but you want to customize some colors of some elements which
 * have colors defined without CSS variables that you could 
 * have used.
 */

body {
  font-family: sans-serif; font-size: 14px;
  color: var(--primary);
  background: var(--secondary);
  }

.card {
  border: 1px solid #666; border-radius: 6px;
  padding: 1em; margin: 1em;
  user-select: none; cursor: pointer;
  background: var(--ternary);
  }

.card h2 {
  font-size: 24px;
  color: var(--primary);
  }

.card-body {
  border-radius: 6px;
  background: currentColor;
  }

.card-body p { padding: 1em; }

.card-body, .card-body p { filter: invert(1) contrast(1.2) brightness(0.8); }
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<div class="card">
  <h2>Title</h2>
  <div class="card-body">
    <p><b>Click to toggle the theme.</b> Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</p>
  </div>
</div>

【讨论】:

  • 感谢乔的分享!自 2013 年最初发布此问题以来,CSS 已经走了很长一段路!
  • @mavrosxristoforos 太真实了!
猜你喜欢
  • 2012-06-26
  • 2014-05-17
  • 2013-02-05
  • 2017-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
相关资源
最近更新 更多