CSS :only-child伪类的用法
:only-child 也是一个很给力的伪类,尤其在处理动态数据的时候,可以省去很多 JavaScript 逻辑代码。
我们先来看一下这个伪类的基本含义,:only-child,顾名思义,就是匹配没有任何兄弟元素的元素。
例如,:only-child 伪类可以匹配下面的 <p> 元素,因为其前后没有其他兄弟元素:
尤其需要指出的是,使用 :only-child 的场景是动态场景,也就是对于某个固定的小模块,根据场景的不同,里面可能是一个子元素,也可能是多个子元素,元素个数不同,布局方式就会不同,此时就是 :only-child 伪类大放异彩的时候。
例如,某个正在加载(loading)的模块里面可能只有一张加载图片,也可能仅有一段加载文字,也可能是加载图片和加载文字兼有,此时 :only-child 伪类非常好用。HTML示意代码如下:

图 1 :only-child伪类实现多种状态加载布局
我们先来看一下这个伪类的基本含义,:only-child,顾名思义,就是匹配没有任何兄弟元素的元素。
例如,:only-child 伪类可以匹配下面的 <p> 元素,因为其前后没有其他兄弟元素:
<div class="cs-confirm"> <!-- 可以匹配:only-child伪类 --> <p class="cs-confirm-p">确定删除该内容?</p> </div>另外,:only-child 伪类在匹配元素的时候会忽略其前后的文字内容。例如:
<button class="cs-button"> <!-- 可以匹配:only-child伪类 --> <i class="icon icon-delete"></i>删除 </button>虽然 .icon 元素后面有“删除”文字,但由于没有标签嵌套,是匿名文本,因此不影响 :only-child 伪类匹配 .icon 元素。
尤其需要指出的是,使用 :only-child 的场景是动态场景,也就是对于某个固定的小模块,根据场景的不同,里面可能是一个子元素,也可能是多个子元素,元素个数不同,布局方式就会不同,此时就是 :only-child 伪类大放异彩的时候。
例如,某个正在加载(loading)的模块里面可能只有一张加载图片,也可能仅有一段加载文字,也可能是加载图片和加载文字兼有,此时 :only-child 伪类非常好用。HTML示意代码如下:
<!-- 1. 只有加载图片 --> <div class="cs-loading"> <img src="./loading.png" class="cs-loading-img"> </div> <!-- 2. 只有加载文字 --> <div class="cs-loading"> <p class="cs-loading-p">正在加载中...</p> </div> <!-- 3. 加载图片和加载文字同时存在 --> <div class="cs-loading"> <img src="./loading.png" class="cs-loading-img"> <p class="cs-loading-p">正在加载中...</p> </div>我们无须在父元素上专门指定额外的类名来控制不同状态的样式,而直接活用 :only- child 伪类就可以让各种状态下的布局良好:
.cs-loading {
height: 150px;
position: relative;
text-align: center;
/* 与效果无关,截图示意用 */
border: 1px dotted;
}
/* 图片和文字同时存在时在中间留点间距 */
.cs-loading-img {
width: 32px; height: 32px;
margin-top: 45px;
vertical-align: bottom;
}
.cs-loading-p {
margin: .5em 0 0;
color: gray;
}
/* 当只有图片的时候居中绝对定位 */
.cs-loading-img:only-child {
position: absolute;
left: 0; right: 0; top: 0; bottom: 0;
margin: auto;
}
/* 当只有文字的时候行高近似垂直居中 */
.cs-loading-p:only-child {
margin: 0;
line-height: 150px;
}
可以得到下图所示的布局效果。
图 1 :only-child伪类实现多种状态加载布局
ICP备案:
公安联网备案: