【问题标题】:Css Cascade breaking for guruCss Cascade打破大师
【发布时间】:2013-06-20 21:23:05
【问题描述】:

我需要一些帮助来解决一个明显的级联问题...不太明显

我必须用另一个相同重量的样式(这里是 012)覆盖一些 css 子样式,而不在 css 表中移动它的订单定义...

这是 Jsfiddle 中的一个明显示例: Go to JSfiddle

所以风格必须:

  • 不要添加第三个选择器(只修改给定的两个)
  • 保持样式定义中的顺序(红前绿)
  • 保持两个选择器相同,如果更改绿色选择器,a 选择器必须相同。
  • 真正的 HTML 比所提供的更复杂(a 不只是在 div 子级中)

例如,如果.green div a 变为:

.green > * a

那么红色选择器必须是:

.red > * a

第二个链接必须是完全相同的选择器(颜色名称除外)

编辑:为什么我必须这样做:

在我的网站中,您可以自定义您的主题(颜色)。但是当您查看另一个用户配置文件时,您会在他自己的颜色主题中看到他的配置文件,但在您的主题中。所以绿色主题可以嵌入到红色主题中......有超过 10 个主题,所以我无法设置每个组合的样式(绿色 > 红色、红色 > 绿色、蓝色 > 红色等......)

【问题讨论】:

  • 我必须问一个显而易见的问题,为什么要这样做???
  • 我也想知道...
  • 也许 JavaScript/jQuery 解决方案是要走的路。由于某种原因,样式表必须以某种方式进行,并且事情的顺序与正常的级联行为相反。 JS 解决方案可能会为您提供更稳定的解决方案,而不是 CSS 选择器的尖端卷积。
  • 这听起来更像是一个谜而不是一个问题。我看到的是你说一切都必须保持不变但产生不同的结果,据我所知,这不会发生..
  • 在我的网站中,您可以自定义您的主题(颜色)。但是当您查看另一个用户配置文件时,您会在他自己的颜色主题中看到他的配置文件,但在您的主题中。所以绿色主题可以嵌入到红色主题中...有超过 10 个主题,所以我无法设置每个组合的样式

标签: css


【解决方案1】:

所以你必须将两个规则修改成完全相同,是吗?您需要做的就是查看 HTML 并弄清楚如何选择锚点,以便它们更具体。在您的示例中,您可以看到 HTML 中的 .red.green 与他们想要设置样式的锚点相距一个 div,因此只需将它们都更改为严格设置一个仅 div 的锚点。现在,.red 不会碰.green 的锚点,因为它距离divs 有两个:

.green > div > a { color:green;}
.red > div > a { color:red;}

这是您示例的 jsFiddle:http://jsfiddle.net/rgthree/54nUG/5/


更新了 OP 的编辑

您可以尝试的一件事是拥有一致的主题约定(这可以是单独的属性或前缀)。拿这个 CSS:

.theme-green a,
[class*="theme-"] .theme-green a {color:green;}
.theme-red a,
[class*="theme-"] .theme-red a {color:red;}

假设所有主题都以theme- 开头,我们可以使用上面的内容来覆盖样式。在这里,第 3 行覆盖第 1 行(像往常一样),但新的第 2 行覆盖第 3 行,这就是您想要的(红色主题中的绿色主题)。当然,缺点是你的 CSS 代码增加了一倍。

这是新的 jsFiddle:http://jsfiddle.net/54nUG/10/

【讨论】:

  • 是的,但提供的 HTML 仅作为示例。真正的更复杂,我们不知道嵌套的完整深度...
  • @CtrlX 我的意思是,我可以继续为你解决你的难题,但是如果你不断改变你的要求,那有什么结束呢? :)
  • 我没有改变它,但我不能把整个页面的整个HTML,我已经简化了问题,我只是在这里给你精确
  • @CtrlX 在您的新示例中,您可以像 jsfiddle.net/rgthree/54nUG/8 一样执行 .green > div:not([class]) a {...}.red > div:not([class]) a {...}
  • 这是封闭的答案,但只有在 '.green' 和 'a' 之间没有元素具有样式时才有效,女巫是不可能的:(
【解决方案2】:

.green div a { color:green!important;}

【讨论】:

  • 你真的应该只使用!important进行调试。 CSS 的重点在于它是级联的,而使用这种技术可以打破这一点。
  • 样式的内容要一致,所以如果在绿色上加上!important,就得把它变成红色
【解决方案3】:

您可以添加更具体的选择器:

.red div.green div a { color:green;}
.red div a { color:red;}

【讨论】:

  • @CtrlX 关于这个答案,这是关于 CSS 特异性的好读物:coding.smashingmagazine.com/2007/07/27/…
  • 选择器必须相同。如果你把它变成绿色,它就不起作用
  • 老兄,你需要重新考虑这个样式表设计。
  • 是的,这就是我在这里的原因(我已经澄清了“我为什么这样做”)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 2021-07-10
  • 1970-01-01
  • 2012-09-02
相关资源
最近更新 更多