【问题标题】:CSS element child vs child with text nodeCSS 元素子元素与带有文本节点的子元素
【发布时间】:2018-01-14 12:17:25
【问题描述】:

我有一个元素有一个子元素和另一个元素具有相同的子元素,但也有一个文本节点:

<p><strong>This should be heading</strong></p>
...
<p>There is a sentence that has <strong>strong text</strong> inside it.</p>

我无法以任何方式修改 DOM 结构,包括没有 JavaScript。我所能做的就是编辑 CSS,但我想设置内联 strong 的样式,而不是唯一的孩子 strong

我认为这可能有效:

p strong:only-child
{
    color: red;
}

但是,both items turn red

有没有办法只使用 CSS 来定位没有文本节点兄弟的子节点?

我不认为可以做到,但我想我会问一下,以防有某种聪明的解决方法。

【问题讨论】:

  • 这不能用选择器来完成。也就是说,你想把哪个strong 变红? strong 两个元素都是内联的,只是碰巧其中一个被非空白文本包围。
  • 我更新了我的示例代码,因为空格不是一个因素。目标是使虚假标题(周围没有文字的强烈)变为红色,而句子中的强烈保持黑色。
  • 我认为这对于 css 是不可能的,因为在这两种情况下你都有一个内部强大的 p。如果您无法更改 html,我认为您需要一些 javascript。
  • 内嵌文本本身不被视为节点。因此这是不可能的。但是,您可以根据标签在整个文档中的位置(彼此相关等)设置标签的样式
  • 我发现只有一种方法可以在纯 CSS 中区分这些情况——检查 p:first-letter 是否在 p strong 中。但似乎这种方法只能用于背景样式:jsfiddle.net/SjBAx

标签: css css-selectors


【解决方案1】:

根据我的理解,我认为应该是这样的

p:first-child
{
    color: red;
}

JSFiddle

【讨论】:

  • 好主意。不幸的是,这个简化的示例排除了其他 p 元素,这些元素会阻止它在我的实际案例中工作。但是,我可能不得不以某种方式使用nth-child() 做类似的事情。
  • 这假定p:first-child 将始终包含虚假标题。不确定它是否成立,尤其是在“只有一个元素子元素的元素与同时具有文本和元素子元素的元素”的上下文中。
  • 希望它是总是第一个孩子;p
【解决方案2】:

以下代码无法正常工作。

p strong:only-child{
    color: red;
}

当你有这样的代码时:

<p><strong>This should be heading</strong></p>
...
<p>There is a sentence that has <strong>strong text</strong> inside it.</p>

在每种情况下,'strong' 元素都是其父元素 - 'p' 的唯一子元素。因此,这里的两个“强”元素都将匹配。 这就是为什么你的两个项目都变成了红色。

要仅更改第一段的颜色,您可以编写(正如之前有人提到的那样):

p:first-child{
    color:red;
  }

或其等价物,即:

p:nth-child(1){
}

我知道这里不适用的最佳情况是 通过添加 'class="red"' 来更改 html 代码,如下例所示:

版本 1:

HTML

<p><strong class="red">This should be a heading</strong></p>
<p>This is a sentence with <strong>strong text</strong> in it.</p>

CSS

.red{
  color:red;
}

版本 2:

<p class="red"><strong>This should be a heading</strong></p>
<p>This is a sentence with <strong>strong text</strong> in it.</p>

CSS

.red{
  color:red;
}

【讨论】:

  • 您不是在回答一个五年前的问题并部分复制最高票数的答案吗?此外,您还包括问题中明确不允许的版本 2。
  • 不是真的,我添加了额外的内容。通过解释 ':only-child' 选择器的用法,我阐明了为什么第一种方法不能正常工作。此外,我还添加了简单的 HTML 和 CSS 代码,供那些考虑如何以更好的方式重写此代码而不是两次使用“强”元素的人使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 2018-05-20
  • 1970-01-01
相关资源
最近更新 更多