我有一个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 来完成,但我不确定这是否可行。
我能提供的最好的办法(请记住,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)
不幸的是,这确实需要一些丑陋的黑客来定位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)