听起来你可能正在寻找
.text-body > :nth-last-child(1 of p, ul, h1, h2, h3, h4, h5)
来自Selectors 4(最初指定为:nth-last-match())。这将潜在匹配列表限制为仅这些元素类型,并选择它们在父元素中的最后一次出现,.text-body。插图:
<div class="text-body">
<h1></h1>
<p></p>
<ul></ul>
<h2></h2>
<p></p>
<span></span>
</div>
在此示例中,有六个孩子,其中五个是p, ul, h1, h2, h3, h4, h5 中的任何一个。这五个元素中的最后一个元素是紧接在span 之前的p,因此它与上面的选择器匹配。 h1 将匹配等价的:nth-child() 表达式,而span 将永远不会匹配给定选择器列表的任何此类表达式——事实上,span 本身可以表示为:not(p, ul, h1, h2, h3, h4, h5)。
虽然 :nth-child()、:nth-last-child() 和 :not() 都在 Selectors 3 中引入,但 selector-list 参数对 Selectors 4 来说是新的。但目前还没有人实现它,也不知道什么时候会实现。不幸的是,没有使用当前可用的等效项,因为它 基本上 与 this question 相同,除了不是类选择器,您正在寻找与 pool 个选项。在这两种情况下,您都在处理元素子集的某个子集的第 n 次出现。
您最好的办法是使用 JavaScript,例如,在页面加载时将类添加到这些元素类型中的最后一个实例。像这样的原生 DOM/Selectors API:
var types = document.querySelectorAll('.text-body > p, .text-body > ul, .text-body > h1, .text-body > h2, .text-body > h3, .text-body > h4, .text-body > h5');
types[types.length - 1].className += ' last';
...与下面的 jQuery 相比,这是相当可恶的:
$('.text-body').children('p, ul, h1, h2, h3, h4, h5').last().addClass('last');
注意
:nth-last-child(1 of p, ul, h1, h2, h3, h4, h5)
不等价于
:last-child:matches(p, ul, h1, h2, h3, h4, h5)
因为后者匹配其父元素的最后一个子元素当且仅当它是这些元素类型中的任何一种。换句话说,:last-child:matches(...) 是 Selectors 4 中的 p, ul... { &:last-child { ... } } 等价物(Harry 回答的第二部分)。