: 父元素的空选择器

Nic*_*ske 5 css

我有一个div带有标题元素和一个ul在其中加载li项目的元素:

<div class="listContainer">
    <header>Title</header>
    <ul class="list">
        <li>Test Element</li>
        <li>Test Element</li>
        <li>Test Element</li>
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

在这种情况下,整体.listContainer需要可见。

但是是否可以使用 CSS 选择器隐藏整个容器:empty(如果.list为空),如下所示:

<div class="listContainer">
    <header>Title</header>
    <ul class="list">
    </ul>
</div>
Run Code Online (Sandbox Code Playgroud)

现在我正在使用:empty选择器来隐藏ul,但整个.listContainer需要隐藏。

.list:empty { display: none; }
Run Code Online (Sandbox Code Playgroud)

我知道用 JavaScript 是可以的,但在这种情况下我需要单独用 CSS 来完成,但我不确定这是否可行。

Dav*_*mas 3

我能提供的最好的办法(请记住,CSS 没有父级选择器),是将 HTML 重新组织为以下内容:

<div class="listContainer">
    <ul class="list"></ul>
    <header>Title</header>
</div>
<div class="listContainer">
    <ul class="list">
        <li>Non-empty</li>
    </ul>
    <header>Title</header>
</div>
Run Code Online (Sandbox Code Playgroud)

并使用以下 CSS:

.listContainer {
    position: relative;
    border: 2px solid #000;
}

.listContainer header {
    position: absolute;
    top: 0;
    left: 0;
    right: 0;
}

.listContainer .list {
    margin-top: 2em;
}

.list:empty,
.list:empty + header {
    display: none;
    height: 0;
    margin: 0;
    overflow: hidden;
}
Run Code Online (Sandbox Code Playgroud)

JS 小提琴演示

不幸的是,这确实需要一些丑陋的黑客来定位header元素,并且不能精确隐藏.listContainer(因为,同样,基于子元素这是不可能的),但它确实满足您的要求。

使用与上面相同的 HTML,但使用 Flex-box 模型(截至目前,截至目前,在 Webkit 中实现)来重新排序元素的显示,从而避免丑陋position: absolute

.listContainer {
    border: 1px solid #000;
    display: -webkit-flex;
    -webkit-flex-direction: column;
    -webkit-flex-wrap: nowrap;
}

.listContainer header {
    display: -webkit-flex-block;
    -webkit-order: 1;
    -webkit-flex: 1 1 auto;
}

.listContainer .list {
    display: -webkit-flex-block;
    -webkit-flex-direction: column;
    -webkit-order: 2;
    -webkit-flex: 1 1 auto;
}

.listContainer .list:empty,
.listContainer .list:empty + header {
    width: 0;
    height: 0;
    margin: 0;
    padding: 0;
    overflow: hidden;
    display: none;
}
Run Code Online (Sandbox Code Playgroud)

JS 小提琴演示