:父元素的空选择器

时间:2013-05-09 20:38:54

标签: css css3

我有一个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,但我不确定这是否可行。

1 个答案:

答案 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;
}

JS Fiddle demo

遗憾的是,这确实需要一些丑陋的黑客来定位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;
}

JS Fiddle demo