CSS 当缺少 HTML 元素时通过 :after / :before 添加内容的选择器

CSS Selector for adding content through :after / :before when HTML element is missing

我想用 CSS :before 选择器添加内容,以防未排序的 HTML 列表没有任何列表项。我不能使用 :empty,因为 ul 和 /ul 之间可能有白色 space(空格、换行符、制表符等)。

由于:blank 在大多数浏览器中还没有实现,我需要另一个解决方案。

这是一个例子:

// CSS
ul > li::before { content: 'abc'; }   /* how to negate this? */

// 'abc' should not show up
<ul>
  <li>xxx</li>
  <li>xxx</li>
</ul>

// 'abc' should show up
<ul>
</ul>

上面的 CSS 当未排序列表有子项时显示 'abc'。当未排序列表有 no 个子项时,我想显示 'abc'。所以我正在寻找 CSS 行的否定。

恐怕如果没有 :blank pseudo-class 的功能,这是不可能的。1

在您的方案中只有两个可能的地方可以插入 ::before pseudo-element:ulli。由于您只想在存在 no li 元素时插入生成的内容,因此您只剩下 ul.

虽然::before::after分别插入元素的后代元素前后,you can't target them relative to those descendant elements with a sibling combinator和pseudo-element目前不支持结构pseudo-class是的。也就是说,换句话说,你不能说 "prevent ul::before from generating content in the presence of one or more li elements",也不能将 :only-child pseudo-class 应用到 ul::before.

在可以使用:empty的情况下,就这么简单

ul:empty::before { content: 'abc'; }

但是由于您给出的原因不能使用 :empty,如果您真的无法阻止生成空格(例如,如果内容来自 WYSIWYG 编辑器或可能导致的其他一些转换在剩余的空格中)你必须添加一个 class 到任何没有子元素的 ul 元素。


1 最近对 selectors-4 的修订提出了 ,但这同样是新的,需要实施者的合作。