根据相邻兄弟选择器的定义,以下代码应该有效。但事实并非如此。我似乎没有发现任何错误。
<!DOCTYPE html>
<html>
<head>
<style>
#p2+h4{
color:red;
}
</style>
</head>
<body>
<p>
<p id="p2">This is the sibling of the selected para</p>
<p>
<h4>this should not be colored</h4>
</p>
<h4>this should be colored</h4>
</p>
</body>
</html>
答案 0 :(得分:5)
H4
<{1}} 。你应该使用一个更松散的兄弟选择器#p2
(一般兄弟组合器):
~
#p2 ~ h4
F元素立即前面有E元素E + F
前面有E元素的F元素但正如许多其他人在评论中建议的那样(在答案中无效),您的HTML无效。你不能只嵌套不应该嵌套的元素。浏览器重新格式化符合the specification。段落元素只能包含短语内容。
属于短语类别的元素包括
E ~ F
,<abbr>
,<audio>
,<b>
,<bdo>
,<br>
,<button>
,<canvas>
,<cite>
,<code>
,<command>
,<datalist>
,<dfn>
,<em>
,<embed>
,{ {1}},<i>
,<iframe>
,<img>
,<input>
,<kbd>
,<keygen>
,<label>
,{{1 }},<mark>
,<math>
,<meter>
,<noscript>
,<object>
,<output>
,<progress>
,<q>
,<ruby>
,<samp>
,<script>
,<select>
,<small>
,<span>
,<strong>
,<sub>
,{ {1}},<sup>
,<svg>
,<textarea>
和纯文字(不仅包含空格字符)。其他一些元素属于此类别,但仅在满足特定条件时才会生效:
<time>
,如果它只包含措辞内容<var>
,如果它是元素的后代<video>
,如果它只包含措辞内容<wbr>
,如果它只包含措辞内容<a>
,如果存在itemprop属性<area>
,如果它只包含措辞内容<del>
,如果存在itemprop属性
根据浏览器重新格式化的HTML,两个标题都会变成彩色,因为它们都成为<ins>
段的兄弟,并且都在同一段落之前。
答案 1 :(得分:0)
您的HTML无效。允许的p
元素内容为phrasing content。附加的css邻近兄弟选择器选择遵循以下规则:
标识为相邻的兄弟选择器具有以下语法:E1 + E2,其中 E2是选择器的主题。选择器匹配E1和E2 在文档树中共享同一个父级,E1紧接在之前 E2,忽略非元素节点(如文本节点和注释)。
#p2
的示例元素中的不会立即位于h4
之前。你可以修复你的html并使用一般的兄弟选择器:
#p2 ~ h4 {
color: red;
}
&#13;
<div>
<p id="p2">This is the sibling of the selected para</p>
<div>
<h4>this should not be colored</h4>
</div>
<h4>this should be colored</h4>
</div>
&#13;
这将起作用,因为一般兄弟选择器根据以下规则选择:
以下兄弟组合器由&#34; tilde&#34; (U + 007E,〜) 分隔两个简单选择器序列的字符。该 由两个序列表示的元素共享同一个父元素 文档树和第一个序列表示的元素 先于(不一定是立即)由...表示的元素 第二个。
此处标识为#p2
的元素与html中的第二个元素h4
共享相同的父级,但不与第一个元素共享。
另请查看Difference between the selectors div + p (plus) and div ~ p (tilde)
<强>参考文献:强>
答案 2 :(得分:0)
因为p2
并非与任何h4
这样可行
<p>stuff</p>
<h4>stuff</h4>
但这不会
<p>stuff</p>
<anyothertag>
<h4>stuff</h4>
</anyothertag>
答案 3 :(得分:0)
您的HTML无效。 <p>
个元素不能包含其他<p>
元素,也不能包含标题元素。如果您检查页面中的代码,浏览器会对其进行更正并将其生成为:
<p></p>
<p id="p2">This is the sibling of the selected para</p>
<p></p>
<h4>this should not be colored</h4>
<p></p>
<h4>this should be colored</h4>
<p></p>
这就是为什么你的CSS失败,因为#p2+h4
寻找<h4>
作为ID为p2的元素的直接兄弟。您可以使用#p2~h4
或#p2+p+h4
来选择标题。但请注意,#p2~h4
也会选择第二个标题。
答案 4 :(得分:0)
这不起作用,因为浏览器无论如何都不接受嵌套的p标签。用div替换所有的p标签会使它工作,但是这样做也不是因为你正在寻找id为p2的任何元素,并且紧接着是h4类型的元素。只有当你输入p + h4这样的通用时,你才会解决每个以p元素开头的h4。以下是如何使其全部工作:
<!DOCTYPE html>
<html>
<head>
<style>
#p2 + div + h4{
color:red;
}
</style>
</head>
<body>
<div>
<div id="p2">This is the sibling of the selected para</div>
<div>
<h4>this should not be colored</h4>
</div>
<h4>this should be colored</h4>
</div>
</body>
</html>