当前位置:首页 > 科技  > 软件

使用 CSS Columns 布局来实现自动分组布局

来源: 责编: 时间:2023-10-30 17:24:51 615观看
导读最近在项目中碰到这样一个布局,有一个列表,先按照 4 * 2 的正常顺序排列,当超过 8 个后,会横向重新开始 4 * 2 的布局,有点像一个个独立的分组,然后水平排列,如下图中序号是 dom 序列,所以其实这这样的一个顺序。很多同学可能

qdF28资讯网——每日最新资讯28at.com

最近在项目中碰到这样一个布局,有一个列表,先按照 4 * 2 的正常顺序排列,当超过 8 个后,会横向重新开始 4 * 2 的布局,有点像一个个独立的分组,然后水平排列,如下qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

图中序号是 dom 序列,所以其实这这样的一个顺序。qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

很多同学可能会想到给子元素分组(通过 JS将原数组拆分组合成一个二维数组),每 8 个套一层容器,然后水平排列就行了qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

是不是有点麻烦呢?qdF28资讯网——每日最新资讯28at.com

其实,无需单独嵌套容器也能实现类似分组的效果,这就需要借助本文要介绍的 column 布局了,一起看看吧~qdF28资讯网——每日最新资讯28at.com

一、简单介绍一下 columns

平时接触较多的都是flex或者grid,但还有一个columns布局往往被忽视了。qdF28资讯网——每日最新资讯28at.com

https://developer.mozilla.org/zh-CN/docs/Web/CSS/columnsqdF28资讯网——每日最新资讯28at.com

columns布局,又称“多列”布局(或者“分栏”布局),这是一个使用场景比较有限,但是几乎无法被替代的一种布局。qdF28资讯网——每日最新资讯28at.com

使用非常简单,直接看一个例子,假设有这样一段文本qdF28资讯网——每日最新资讯28at.com

p{  width: 500px;}
<p>欢迎关注前端侦探,这里有一些有趣的、你可能不知道的HTML、CSS、JS小技巧技巧,比如这篇文章,如何使用 CSS columns 布局来实现自动分组布局,一起看看吧</p>

默认是这样的。qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

下面我们将段文本分成3列。qdF28资讯网——每日最新资讯28at.com

p{  columns: 3;}

看,自动就分成了3列。qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

并且阅读顺序是从左到右,从下到下,直到整列阅读完成,非常类似以前的报刊读物阅读习惯。qdF28资讯网——每日最新资讯28at.com

除了指定列数,还可以根据指定宽度自动去计算列数,比如:qdF28资讯网——每日最新资讯28at.com

p{  columns: 100px;}

效果如下:qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

这个表示按照最小100px去分段,看最多可以分成多少列,并不是说每列就一定是 100,应该是大于等于 100,直到剩余空间可以再放下一列。qdF28资讯网——每日最新资讯28at.com

那为啥设置的是100,总宽度是500,却只分成了4列?原因是有「默认列间距」,如果去除这个间距。qdF28资讯网——每日最新资讯28at.com

p{  column-gap: 0px;}

这样就刚好被分成了5列。qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

看不清楚?加个分割线试试。qdF28资讯网——每日最新资讯28at.com

p{	column-rule: 1px solid red;}

是不是刚好分成了 5 列?(注意,这里的分割线是不占空间的)。qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

简单了解columns多列布局后,下面来看另外的用途。qdF28资讯网——每日最新资讯28at.com

二、columns 实现横向分组布局

可能你已经发现了,上面的文本分列布局和我们文章开头所需要的效果非常类似,都是一列一列的,因此我们可以尝试用columns布局来实现这样的效果。qdF28资讯网——每日最新资讯28at.com

假设html是这样的。qdF28资讯网——每日最新资讯28at.com

<div class="wrap">  <div class="list">    <div class="item">1</div>    <div class="item">2</div>    <div class="item">3</div>    <div class="item">4</div>    <div class="item">5</div>    <div class="item">6</div>    <div class="item">7</div>    <div class="item">8</div>    <div class="item">9</div>    <div class="item">10</div>    <div class="item">11</div>    <div class="item">12</div>    <div class="item">13</div>    <div class="item">14</div>  </div></div>

这里多了一层wrap是用来做滚动容器的,简单修饰一下。qdF28资讯网——每日最新资讯28at.com

.wrap{  display: flex;  width: 400px;  overflow: auto;  outline: 1px dashed #9747FF;}.item{  display: inline-flex;  width: 80px;  margin: 10px;  aspect-ratio: 1/1;  background: #FFE8A3;  color: #333;  font-size: 30px;  border-radius: 10px;  align-items: center;  justify-content: center;}

效果如下,很正常的一个布局。qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

现在,我们希望纵向高度是固定的,然后横向滚动,先加一个高度试试。qdF28资讯网——每日最新资讯28at.com

.list{  height: 200px;}

这样就变成了纵向滚动的布局了。qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

那么,如何让它横向分栏并且滚动呢?其实非常简单,只需要添加一行。qdF28资讯网——每日最新资讯28at.com

.list{  height: 200px;  column-width: 400px;}

设置分栏宽度为滚动容器宽度之后,就自动将整个列表分成多组了,相当于每个滚动屏幕作为一组,从左到右排列,由于空间不足,所以可以横向滚动。qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

是不是非常神奇?仅需一个属性就实现了纵向滚动到横向滚动的切换。qdF28资讯网——每日最新资讯28at.com

三、借助 scroll-snap 实现轮播效果

通常碰到这种横向滚动的效果,你可能会想到一个swiper组件,也就是那种一屏一屏切换的效果,没错,我们这里也可以借助scroll-snap轻易实现。qdF28资讯网——每日最新资讯28at.com

关于scroll-snap,网上教程非常多,MDN 官网也有非常清晰的 demo,如果不熟悉的可以先去了解一下:https://developer.mozilla.org/zh-CN/docs/Web/CSS/scroll-snap-type。qdF28资讯网——每日最新资讯28at.com

这里就不详细介绍了。qdF28资讯网——每日最新资讯28at.com

回到这里,由于整个列表下面只有一层子元素,好像并没有办法区分每一屏的临界点。其实不然,可以想一下,这里每一屏有 8 个元素,也就是第1、9、17...个分别是每一屏的第一个元素,是不是可以以这些元素为标识(吸附对象)呢?qdF28资讯网——每日最新资讯28at.com

首先要在滚动容器下定义一下。qdF28资讯网——每日最新资讯28at.com

.wrap{  scroll-snap-type: x mandatory;}

然后给第1、9、17...个元素添加吸附对象,这里可以用nth-child选择器。qdF28资讯网——每日最新资讯28at.com

.item:nth-child(8n+1){  scroll-snap-align: start;}

效果如下(为了区分,把每一屏的第一个元素背景做了高亮)。qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

还可以多添加点元素,多切几屏看看效果:qdF28资讯网——每日最新资讯28at.com

qdF28资讯网——每日最新资讯28at.com

完整代码可以参考:qdF28资讯网——每日最新资讯28at.com

  • CSS columns (juejin.cn)[1]
  • CSS column (codepen.io)[2]

四、CSS 实现的优势和总结

相对于传统的 JS实现来说,有哪些好处呢?qdF28资讯网——每日最新资讯28at.com

  • 少了一层嵌套容器,业务逻辑会根据干净。
  • 自适应强,可以根据需求选择固定列数或者固定宽度,JS往往只能根据数量去分组。
  • 不会报错,想想看,JS中的数组经常会出现xxx.slice is not function这样的错误,轻则警告,总则整个页面白屏。
  • 布局足够灵活,想横向滚动就横向滚动,想纵向滚动就纵向滚动,而JS方式往往还需要改变数组形态。

有这么多好处还不赶紧用起来?下面再来回顾一下columns布局。qdF28资讯网——每日最新资讯28at.com

  • columns布局,又称“多列”布局(或者“分栏”布局),可以将默认的文本流轻易分成多栏,非常类似以前的报刊读物排版。
  • column可以通过宽度(column-width)去自动分割,或者通过指定数量(column-count)将布局分成多少栏。
  • column-gap可以设置分栏之间的空隙,默认是有间隔的。
  • column-rule可以设置分隔线,这种分割线是不占据空间的。
  • columns布局使用场景比较有限,但是几乎无法被替代。

多想象一下,其实可以有更多的使用场景,虽然本来并不是做这个事情的。qdF28资讯网——每日最新资讯28at.com

[1]CSS columns (juejin.cn): https://code.juejin.cn/pen/7293927297596260379。qdF28资讯网——每日最新资讯28at.com

[2]CSS column (codepen.io): https://codepen.io/xboxyan/pen/RwvPLEM。qdF28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-15891-0.html使用 CSS Columns 布局来实现自动分组布局

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Java中未正确关闭文件、数据库连接或网络连接,造成资源泄漏

下一篇: 你知道吗?Django QuerySet 的这些实用技巧,你一定要会!

标签:
  • 热门焦点
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 小米降噪蓝牙耳机Necklace分享:听一首歌 读懂一个故事

    在今天下午的小米Civi 2新品发布会上,小米还带来了一款新的降噪蓝牙耳机Necklace,我们也在发布结束的第一时间给大家带来这款耳机的简单分享。现在大家能见到最多的蓝牙耳机
  • 一文掌握 Golang 模糊测试(Fuzz Testing)

    模糊测试(Fuzz Testing)模糊测试(Fuzz Testing)是通过向目标系统提供非预期的输入并监视异常结果来发现软件漏洞的方法。可以用来发现应用程序、操作系统和网络协议等中的漏洞或
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • iQOO Neo8 Pro评测:旗舰双芯加持 最强性能游戏旗舰

    【Techweb评测】去年10月,iQOO推出了一款Neo7手机,该机搭载了联发科天玑9000+,配备独显芯片Pro+,带来了同价位段最佳的游戏体验,一经上市便受到了诸多用
  • OPPO K11搭载高性能石墨散热系统:旗舰同款 性能凉爽释放

    日前OPPO官方宣布,将于7月25日14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖点就是将配备索尼
  • SN570 NVMe SSD固态硬盘 价格与性能兼具

    SN570 NVMe SSD固态硬盘是西部数据发布的最新一代WD Blue系列的固态硬盘,不仅闪存技术更为精进,性能也得到了进一步的跃升。WD Blue SN570 NVMe SSD的包装外
Top