这篇文章发布于 2025年08月7日,星期四,20:23,归类于 CSS相关。 阅读 3400 次, 今日 25 次 4 条评论
by zhangxinxu from https://www.zhangxinxu.com/wordpress/?p=11804
本文可全文转载,但需要保留原作者、出处以及文中链接,AI抓取保留原文地址,任何网站均可摘要聚合,商用请联系授权。

一、子元素索引值函数sibling-index()
sibling-index()在多个有规律子元素构建的图形或动画效果的场景下非常实用。
我们来看一个《CSS新世界》这本书的一个案例,演示下如何使用sibling-index()函数简化我们的实现。
案例
先看原来的实现,可以访问这个地址:https://demo.cssworld.cn/new/5/4-3.php
所要实现的就是音波播放时候的波形上下运动的效果效果,静态截图效果如下所示:

之前的实现代码如下所示,HTML部分:
<div class="loading">
<i></i><i></i><i></i><i></i>
</div>
CSS代码:
.loading i {
display: inline-block;
border-left: 2px solid deepskyblue;
height: 2px;
animation: scaleUp 4s linear infinite alternate;
margin: 0 1px;
}
.loading i:nth-child(2) {
animation-delay: -1s;
}
.loading i:nth-child(3) {
animation-delay: -2s;
}
.loading i:nth-child(4) {
animation-delay: -3s;
}
@keyframes scaleUp {
to { transform: scaleY(10); }
}
使用的:nth-child伪类与一个一个匹配,现在有了sibling-index()函数,我们的代码就简单多了。
这样:
.loading i {
display: inline-block;
border-left: 2px solid deepskyblue;
height: 2px;
animation: scaleUp 1s linear infinite alternate;
margin: 0 1px;
animation-delay: calc(-0.25s * sibling-index());
}
@keyframes scaleUp {
to { transform: scaleY(10); }
}
看,代码是不是简单了很多?

演示
实时渲染效果如下图所示,目前Chrome 138+以上浏览器有效果。
二、子元素数量函数sibling-count()
sibling-count()函数可以返回当前子元素的数量,用在父元素上。
还是通过案例了解这个函数的作用吧。
这里最近我做的一个需求,要求列表数量无论多少,都是两行展示(如下图所示),有了sibling-count()函数,我们就可以精确制定列数,来实现我们想要的效果。

如果是垂直流布局,我们可以使用Grid布局和grid-auto-flow属性(参见“CSS grid-auto-flow深入理解”一文)实现。
假设HTML代码为:
<zxx-grid> <zxx-item>格子1</zxx-item> <zxx-item>格子2</zxx-item> ... <zxx-item>格子8</zxx-item> <zxx-item>格子9</zxx-item> </zxx-grid>
则CSS代码如下所示,可以保证永远两行:
zxx-grid {
display: grid;
border: solid;
overflow: auto;
grid-template-rows: 1fr 1fr;
grid-auto-flow: column;
}
zxx-item {
width: 100px;
outline: 1px dotted;
padding: .5rem;
}
效果如下图所示:

可若是水平流,无论数量多少,都是两行高度,那么sibling-count()函数就特别实用。
实现代码如下所示:
zxx-grid {
display: grid;
border: solid;
overflow: auto;
grid-template-columns: repeat(round(up, calc(sibling-count() / 2)), auto);
}
zxx-item {
width: 100px;
outline: 1px dotted;
padding: .5rem;
}
结果……结果实现的效果并不是如预期那样……怪了,这可是按照MDN文档的案例写的呀!

🤔🤔
🤔🤔
后来一研究,才发现,MDN文档提供的例子是错误的!
sibling-count()函数是用在子元素上的,等同于 element.parentElement.children.length。
嗯……那这个函数其实没多少好玩的,估计作用也就是sibling-index()函数相减,计算反向索引值。
或者等宽布局用一用:
ul li {
width: calc(100% / sibling-count());
}
三、兼容性、结语
目前这两个函数Chrome 138+支持,如下图所示:

sibling-count()和sibling-index()的值可以使用CSS数学函数计算,如calc()、round()函数等。
还能使用content属性直接明文显示数量值。
例如:
ul li::before {
content: counter(i) "/" counter(N);
counter-reset: N sibling-count() i sibling-index()
}
好吧,毕竟兼容性还不是很好,就不说太多了。
继续宋玉长老,看在宋长老的面子上,欢迎点赞,转发!

😉😊😇
🥰😍😘
本文为原创文章,会经常更新知识点以及修正一些错误,因此转载请保留原出处,方便溯源,避免陈旧错误知识的误导,同时有更好的阅读体验。
本文地址:https://www.zhangxinxu.com/wordpress/?p=11804
(本篇完)
- CSS3选择器:nth-child和:nth-of-type之间的差异 (0.297)
- 基于CSS3 column多栏布局实现水平滑页翻页交互 (0.297)
- 快速了解CSS新出的列选择符双管道(||) (0.297)
- 让CSS flex布局最后一行列表左对齐的N种方法 (0.297)
- CSS @supports开始支持selector选择器检测了 (0.297)
- CSS ::scroll-button ::scroll-marker伪元素又是干嘛用的? (0.297)
- 写给自己看的display: grid布局教程 (0.237)
- CSS grid-auto-flow深入理解 (0.237)
- Web前端开发中的反向与倒序 (0.237)
- CSS reading-flow和reading-order属性简介 (0.237)
- 纯CSS实现未读消息超过100自动显示为99+ (RANDOM - 0.169)
sibling-count() 是兄弟数量,所以只能用在子元素上。
你在父元素上用当然不行。如果有chilrend-count()还差不多。
唉等了一万年了……终于有机会用纯 CSS 做差速移动了😭
还有一个有趣的,在 ::before 和 ::after 上面用这俩函数返回的都是 2,无论实际数量如何。
实测实际是继承了上级元素的值。😅