我有一个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>
在这种情况下,需要显示整个.listContainer
。
但如果:empty
为空,是否可以使用CSS .list
选择器隐藏整个容器,如下所示:
<div class="listContainer">
<header>Title</header>
<ul class="list">
</ul>
</div>
现在我正在使用:empty
选择器隐藏ul
,但需要隐藏整个.listContainer
。
.list:empty { display: none; }
我知道可以使用JavaScript,但在这种情况下我需要单独使用CSS,但我不确定这是否可行。
答案 0 :(得分: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>
使用以下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;
}
遗憾的是,这确实需要一些丑陋的黑客来定位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;
}