黑魔法-伪类匹配列表数目实现微信群头像CSS布局的技巧

一、不同列表数量不同布局

这是群里有人问的一个问题,可能其他人也有类似需求,因此拿出来给大家分享分享。

聊天软件中的群头像,或者一些书籍的分组,往往采用复合头像作为一个大的头像。

复合头像

可以看到,头像数目不同,布局也跟着不同。

常规操作

一般大家会实现类似下面的方法实现布局效果:

<ul class="box" data-number="1"></ul>
<ul class="box" data-number="2"></ul>
<ul class="box" data-number="3"></ul>
…
.box[data-number="1"] li {}
.box[data-number="2"] li {}
.box[data-number="3"] li {}

是个不错的方法,可以很好地满足我们的开发需求,唯一的不足就是当子头像数量变化时候,需要同时修改data-number的属性值,开发成本微微麻烦了点。

实际上,还有更巧妙的实现方法,就是借助伪类,自动判断我们列表项的个数,从而实现我们想要的布局。

二、你可能不知道的伪类实现技巧

在这个方法中,你不需要在父元素上设置当前列表的个数,因此,HTML看起来平平无奇:

<ul class="box">
  <li></li>
  <li></li>
  <li></li>
  …
</ul>

关键就在于CSS,我们可以借助伪类判断当前列表个数,示意如下:

li:only-child { /* 1个 */ }
li:first-child:nth-last-child(2) { /* 2个 */ }
li:first-child:nth-last-child(3) { /* 3个 */ }
…

在CSS中,伪类是可以级联使用的,于是,如果列表可以匹配:first-child:nth-last-child(2)则表示当前<li>元素即是第1个子元素,又是从后往前第2个子元素,因此,我们就能判断当前总共两个<li>子元素,我们就能精准实现我们想要的布局了,只需要配合相邻兄弟选择符加号+以及兄弟选择符弯弯~即可,例如:

/* 3个li项目的第1个列表项 */
li:first-child:nth-last-child(3) {}
/* 3个li项目的第1个列表项的后一个,也就是第2项的样式 */
li:first-child:nth-last-child(3) + li {}
/* 3个li项目的第一个列表项后面两个列表项,也就是第2项和第3项的样式 */
li:first-child:nth-last-child(3) ~ li {}

眼见为实,您可以狠狠地点击这里:纯CSS自动识别不同列表个数不同布局demo

例如如果就2个<li>

<ul>
  <li></li>
  <li></li>
</ul>

则效果如下图:

2个小头像时候的布局

如果3个<li>

<ul>
  <li></li>
  <li></li>
  <li></li>
</ul>

则布局效果如下图:

3个小头像时候的布局

完整9个布局效果如下MP4视频(不动请点击):

 

三、延伸与拓展:文字多字号自动变小

和上面类似的原理,我们可以实现文字内容多,字号自动变小的效果,不过我们需要把所有的字符使用一个标签包裹起来,剩下的事情就全部交给CSS好了。

您可以狠狠地点击这里:文字的font-size大小根据个数不同自动变化demo

可以看到,当文字数量不同的时候,字号大小也跟着变化,如下GIF截图示意:

文字个数多字号自动变小示意

核心CSS如下:

.box span {
    font-size: 40px;    
}
.box span:first-child:nth-last-child(n+13),
.box span:first-child:nth-last-child(n+13) ~ span {
    font-size: 30px;    
}
.box span:first-child:nth-last-child(n+17),
.box span:first-child:nth-last-child(n+17) ~ span {
    font-size: 20px;    
}
.box span:first-child:nth-last-child(n+25),
.box span:first-child:nth-last-child(n+25) ~ span {
    font-size: 14px;    
}

表示字符个数大于13个,大于17个以及大于25个时候样式。

另外,配合“蝉原则”,我们还能实现列表更加随机的样式效果(表格的斑马线属于规律控制,其实可以使用复合伪类实现随机)。这个以后有机会再展开。

抛砖引玉,本文的这种技巧非常适合HTML无法修改的场合,虽然有些极客,但关键时候说不定就是神操作了。

本方法IE9+都支持,放心使用。

出處

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: CSS的counter计数器是一种非常有用的技巧,用于在网页中实现自动计数和编号的功能。通过使用计数器,我们可以方便地对网页元素进行编号,比如列表、章节标题等。 首先,我们需要定义一个计数器。可以使用counter-reset属性来定义计数器并初始化它的值。例如,如果我们想要创建一个从1开始的计数器,可以这样写: ``` body { counter-reset: counterName 1; } ``` 这里的counterName是我们给计数器起的名字,可以自定义。1表示计数器的初始值。 接下来,我们可以在需要计数的元素中使用counter-increment属性来递增计数器的值。例如,如果我们想要在每个列表项前显示它的编号,可以这样写: ``` ul li:before { counter-increment: counterName; content: counter(counterName) ". "; } ``` 这里的counter-increment用于递增计数器的值,content用于显示计数器的值。我们使用了counter()函数来获取计数器的值,并在后面加上了一些文字(比如点号和空格)来实现编号的显示效果。 我们还可以根据需要在不同的元素中使用不同的计数器。只需要给不同的计数器起不同的名字,并在对应的元素中使用相应的计数器名字即可。 总的来说,CSS的counter计数器是一种非常灵活和强大的技巧,可以用于各种需要进行自动计数和编号的场景。通过定义计数器、递增计数器和使用counter()函数来获取计数器的值,我们可以轻松地实现网页元素的编号效果。 ### 回答2: 计数器(counter)是CSS中的一个功能强大的特性,可以用于在HTML文档中创建计数器,然后在样式规则中使用这些计数器来生成序号或标记。以下是使用计数器(counter)的一些技巧: 1. 创建一个计数器: 使用 `counter-reset` 属性可以创建一个计数器,并可以为其设定一个初始值。例如,可以创建一个以1为初始值的计数器: ```css .container { counter-reset: my-counter 1; } ``` 2. 更新计数器的值: 使用 `counter-increment` 属性可以更新计数器的值。可以在选择器中的任何位置使用这个属性。例如,每当 `li` 元素出现时,可以将计数器的值增加1: ```css li { counter-increment: my-counter; } ``` 3. 在内容中引用计数器的值: 使用 `content` 属性可以在样式规则中引用计数器的值,并将其插入到生成的内容中。可以使用计数器的名称作为 `content` 的值。例如,将计数器的值作为新的内容插入到列表项前面: ```css li::before { content: counter(my-counter) ". "; } ``` 4. 在不同的元素中使用多个计数器: 可以在同一个文档中使用多个不同的计数器,并为它们设定不同的初始值。这样可以为不同的元素生成不同的序号或标记。例如,可以为不同的标题元素创建不同的计数器: ```css h1 { counter-reset: h1-counter 1; } h2 { counter-reset: h2-counter 1; } ``` 5. 控制计数器的显示方式: 使用 `counter()` 函数可以对计数器的显示方式进行自定义。可以指定计数器的名称,以及任何显示格式。例如,可以将计数器的值格式化为罗马数字: ```css .container::after { content: counter(my-counter, upper-roman); } ``` 总结而言,计数器(counter)是CSS中一项非常实用的黑魔法技巧。通过创建、更新和引用计数器的值,可以在样式规则中生成序号或标记,并且可以通过自定义显示格式来控制计数器的外观。 ### 回答3: CSS中的计数器(counter)是一种非常强大的工具,可以用来计数、标记和显示元素的编号或序号。它可以通过一些技巧实现各种有趣的效果。 首先,使用counter-reset属性来定义计数器并将其重置为指定的起始值。例如,可以使用"counter-reset: section 0;"来将名为"section"的计数器重置为0。 然后,可以通过counter-increment属性来递增计数器的值。例如,使用"counter-increment: section;"来递增名为"section"的计数器的值。 接下来,在需要显示计数器的地方,可以使用content属性来显示计数器的值。例如,使用"content: counter(section);"来在伪元素的内容中显示名为"section"的计数器的值。 可以进一步利用计数器,实现复杂的效果。例如,可以使用:before伪元素和content属性来在每个元素前面显示计数器的值,从而实现自动标号的效果。例如,使用"content: counter(section) '. ';"来在每个元素前面显示名为"section"的计数器的值,并跟随一个点号。 此外,还可以使用counter()函数获取和修改计数器的当前值。例如,可以使用"counter(section)"来获取名为"section"的计数器的当前值,并将其用作其他属性的值。 总的来说,计数器是CSS中非常强大且灵活的工具,可以用来实现各种复杂的效果。熟练掌握计数器的使用技巧,可以让我们的CSS代码更加精细和有趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值