CSS索引和数量匹配函数sibling-index sibling-count简介

这篇文章发布于 2025年08月7日,星期四,20:23,归类于 CSS相关。 阅读 88 次, 今日 86 次 没有评论

 

索引数量匹配封面图

一、子元素索引值函数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-count()sibling-index()的值可以使用CSS数学函数计算,如calc()round()函数等。

还能使用content属性直接明文显示数量值。

例如:

ul li::before {
  content: counter(i) "/" counter(N);
  counter-reset: N sibling-count() i sibling-index() 
}

好吧,毕竟兼容性还不是很好,就不说太多了。

继续宋玉长老,看在宋长老的面子上,欢迎点赞,转发!

宋玉

😉😊😇
🥰😍😘

(本篇完)

分享到:


发表评论(目前没有评论)