如何使用 CSS columns 布局来实现自动分组布局?

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

image.png

图中序号是 dom 序列,所以其实这这样的一个顺序

image.png

很多同学可能会想到给子元素分组(通过 JS将原数组拆分组合成一个二维数组),每 8 个套一层容器,然后水平排列就行了

image.png

是不是有点麻烦呢?

其实,无需单独嵌套容器也能实现类似分组的效果,这就需要借助本文要介绍的 column 布局了,一起看看吧~

一、简单介绍一下 columns

平时接触较多的都是flex或者grid,但还有一个columns布局往往被忽视了。

https://developer.mozilla.org/zh-CN/docs/Web/CSS/columns

columns布局,又称“多列”布局(或者“分栏”布局),这是一个使用场景比较有限,但是几乎无法被替代的一种布局。

使用非常简单,直接看一个例子,假设有这样一段文本

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

默认是这样的

image.png

下面我们将段文本分成3列

p{
  columns: 3;
}

看,自动就分成了3列

image.png

并且阅读顺序是从左到右,从上到下,直到整列阅读完成,非常类似以前的报刊读物阅读习惯。

除了指定列数,还可以根据指定宽度自动去计算列数,比如

p{
  columns: 100px;
}

效果如下

image.png

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

那为啥设置的是100,总宽度是500,却只分成了4列?原因是有默认列间距,如果去除这个间距

p{
  column-gap: 0px;
}

这样就刚好被分成了5

image.png

看不清楚?加个分割线试试

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

是不是刚好分成了 5 列?(注意,这里的分割线是不占空间的)

image.png

简单了解columns多列布局后,下面来看另外的用途

二、columns 实现横向分组布局

可能你已经发现了,上面的文本分列布局和我们文章开头所需要的效果非常类似,都是一列一列的,因此我们可以尝试用columns布局来实现这样的效果

假设html是这样的

<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是用来做滚动容器的,简单修饰一下

.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;
}

效果如下,很正常的一个布局

image.png

现在,我们希望纵向高度是固定的,然后横向滚动,先加一个高度试试

.list{
  height: 200px;
}

这样就变成了纵向滚动的布局了

Kapture 2023-10-25 at 23.27.57.gif

那么,如何让它横向分栏并且滚动呢?其实非常简单,只需要添加一行

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

设置分栏宽度为滚动容器宽度之后,就自动将整个列表分成多组了,相当于每个滚动屏幕作为一组,从左到右排列,由于空间不足,所以可以横向滚动

Kapture 2023-10-25 at 23.34.40.gif

是不是非常神奇?仅需一个属性就实现了纵向滚动到横向滚动的切换

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

通常碰到这种横向滚动的效果,你可能会想到一个swiper组件,也就是那种一屏一屏切换的效果,没错,我们这里也可以借助scroll-snap轻易实现。

关于 scroll-snap,网上教程非常多,MDN 官网也有非常清晰的 demo,如果不熟悉的可以先去了解一下: https://developer.mozilla.org/zh-CN/docs/Web/CSS/scroll-snap-...

这里就不详细介绍了。

回到这里,由于整个列表下面只有一层子元素,好像并没有办法区分每一屏的临界点。其实不然,可以想一下,这里每一屏有 8 个元素,也就是第1917...个分别是每一屏的第一个元素,是不是可以以这些元素为标识(吸附对象)呢?

首先要在滚动容器下定义一下

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

然后给第1917...个元素添加吸附对象,这里可以用nth-child选择器

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

效果如下(为了区分,把每一屏的第一个元素背景做了高亮)

Kapture 2023-10-25 at 23.53.49.gif

还可以多添加点元素,多切几屏看看效果

Kapture 2023-10-25 at 23.59.05.gif

完整代码可以参考:

  • CSS column (codepen.io)')点击预览

四、CSS 实现的优势和总结

相对于传统的 JS实现来说,有哪些好处呢?

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

有这么多好处还不赶紧用起来?下面再来回顾一下columns布局

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

多想象一下,其实可以有更多的使用场景,虽然本来并不是做这个事情的。

相关内容拓展:(技术前沿)

近 10 年间,甚至连传统企业都开始大面积数字化时,我们发现开发内部工具的过程中,大量的页面、场景、组件等在不断重复,这种重复造轮子的工作,浪费工程师的大量时间。

针对这类问题,低代码把某些重复出现的场景、流程,具象化成一个个组件、api、数据库接口,避免了重复造轮子。极大的提高了程序员的生产效率。

介绍一款程序员都应该知道的软件 JNPF 快速开发平台,基于 Java/.Net 双技术引擎,专注于低代码,采用业内领先的 SpringBoot 微服务架构、支持 SpringCloud 模式,完善了平台的扩增基础,满足了系统快速开发、灵活拓展、无缝集成和高性能应用等综合能力;采用前后端分离模式,前端和后端的开发人员可分工合作负责不同板块,省事又便捷。

免费体验官网:www.jnpfsoft.com/?csdn

最后,如果觉得还不错,对你有帮助的话,欢迎点赞、收藏、转发❤❤❤

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/203217.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

循环神经网络RNN

1. 背景 RNN(Recurrent Neural Networks) CNN利用输入中的空间几何结构信息&#xff1b;RNN利用输入数据的序列化特性。 2. SimpleRNN单元 传统多层感知机网络假设所有的输入数据之间相互独立&#xff0c;但这对于序列化数据是不成立的。RNN单元用隐藏状态或记忆引入这种依赖…

人工智能原理复习--知识表示(二)

文章目录 上一篇产生式表示法推理方式 结构化表示语义网络语义网络表示知识的方法和步骤应用题目 框架表示法下一篇 上一篇 人工智能原理复习–知识表示&#xff08;一&#xff09; 产生式表示法 把推理和行为的过程用产生式规则表示&#xff0c;所以又称基于规则的系统。 产…

两台电脑如何快速传输几百G文件,这款文件传输软件真快

当我们需要传输数百GB的文件时&#xff0c;使用传统工具对于大型文件传输来说往往效率低下。这些方法可能需要数小时&#xff0c;甚至数天才能完成传输。然而&#xff0c;现代生活和工作中&#xff0c;我们经常需要以更快速、更高效的方式传输大文件&#xff0c;无论是因为工作…

聚观早报 |亚马逊AWS发布新AI芯片;拼多多Q3营收增长94%

【聚观365】11月30日消息 亚马逊AWS发布新AI芯片 拼多多Q3营收增长94% Redmi K70全新国风配色揭晓 英伟达扩大自动驾驶中国团队 华为nova 12参数细节曝光 亚马逊AWS发布新AI芯片 在美国时间周二举办的Reinvent大会上&#xff0c;亚马逊旗下的云计算部门AWS发布了新的人工…

Flutter App混淆加固、保护与优化原理

​ 引言 在移动应用程序开发中&#xff0c;保护应用程序的代码和数据安全至关重要。本文将探讨如何对Flutter应用程序进行混淆、优化和保护&#xff0c;以提高应用程序的安全性和隐私。 一、混淆原理 混淆是一种代码保护技术&#xff0c;通过修改源代码或编译后的代码&#…

2.Ansible的copy模块,我最常用的模块

1. 简述 先从我自身的情况来说&#xff0c;我不是运维人员&#xff0c;并且对linux操作也不是特别熟悉&#xff0c;所以工作中我使用ansible基本就是在平常的自动化部署中&#xff0c;而使用最多的模块就是copy模块。我使用copy模块也主要是来替换生产环境的配置文件。所以&am…

无醇啤酒行业分析:预计2028年将达到106亿美元

按照国际惯用的标准划分&#xff0c;通常将酒精度3.5%-4%的称为普通啤酒&#xff0c;将酒精度大于0.5%、小于2.5%的称为低醇啤酒&#xff0c;而酒精度小于0.5%便称为无醇啤酒。酒精给人带来的兴奋感&#xff0c;与体育比赛的紧张刺激相辅相成&#xff0c;啤酒也成为了许多球迷们…

OBC、DCDC自动化测试解决方案!

OBC(车载充电机&#xff09;和DCDC&#xff08;直流-直流变换器&#xff09;是电动汽车的核心部件&#xff0c;DCDC和OBC的功能质量对于整车的性能和安全性至关重要。在OBC和DCDC&#xff0c;以及整车开发测试过程中&#xff0c;需要对OBC和DCDC进行功能和性能方面进行全面的测…

C陷阱与缺陷——第3章 语义陷阱

1. 指针和数组 C语言中只有一维数组&#xff0c;而且数组的大小必须在编译器就作为一个常数确定下来&#xff0c;然而在C语言中数组的元素可以是任何类型的对象&#xff0c;当然也可以是另外的一个数组&#xff0c;这样&#xff0c;要仿真出一个多维数组就不是难事。 对于一个…

被DDoS攻击了怎么办?为什么要选择高防ip?

在当今互联网高度发达的时代&#xff0c;许多企业都依赖于网络来开展业务、推广产品、提供服务。然而&#xff0c;网络攻击&#xff0c;尤其是分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;已经成为一种日益严重的威胁。面对这种攻击&#xff0c;如何保护您的业…

java后端自学总结

自学总结 MessageSource国际化接口总结 MessageSource国际化接口 今天第一次使用MessageSource接口,比较意外遇到了一些坑 messageSource是spring中的转换消息接口&#xff0c;提供了国际化信息的能力。MessageSource用于解析 消息&#xff0c;并支持消息的参数化和国际化。 S…

【python程序】把小于10的数值都变成1

【python程序】把小于10的数值都变成1 import numpy as np import xarray as xra xr.DataArray(np.arange(25).reshape(5, 5)) a[np.where(a < 10)] 1 print(a)

Linux 代码编辑器:vim

vim 编辑器的简介 vi / vim 都是多模式编辑器&#xff0c;不同的是 vim 是 vi 的升级版本&#xff0c;他不仅兼容 vi 的所有指令&#xff0c;而且还有一些新的特性在里面。比如语法高亮&#xff0c;可视化操作不仅可以在终端运行&#xff0c;也可以在 windows&#xff0c;mac …

图解ReentrantLock底层公平锁和非公平锁实现原理

原创/朱季谦 &#x1f4bb;在面试或者日常开发当中&#xff0c;经常会遇到公平锁和非公平锁的概念。 两者最大的区别如下&#x1f447; 1️⃣ 公平锁&#xff1a;N个线程去申请锁时&#xff0c;会按照先后顺序进入一个队列当中去排队&#xff0c;依次按照先后顺序获取锁。就像…

微信小程序踩坑记录

一、引言 作者在开发微信小程序《目的地到了》的过程中遇到过许多问题&#xff0c;这里讲讲一些技术和经验问题。 基本目录机构&#xff1a; 二、问题 1、定位使用 获取定位一定要在app.json里面申明&#xff0c;不然是没办法获取定位信息的 "requiredPrivateInfos"…

字符串相加

字符串相加 描述 : 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 题目 : LeetCode 415.字符串相加 : 415. 字符串相加 分析 : 从低到高逐位相加&#xff0c;如果当前位和超过 10&#xff0c;则向高位进一位。 解析 : c…

「幻醒蓝」可视化主题套件|融合天空的清澈与海洋的深邃

现如今&#xff0c;数据可视化已成为信息传递的重要手段之一。在这样一个信息爆炸的时代&#xff0c;向人们传达正确的信息显得尤为重要。为此&#xff0c;可视化主题套件应运而生&#xff0c;提供了一种多样化的、可视化的方式来展示数据。不同的主题套件能够适应不同的信息传…

基于JSP的网上购书系统的设计与实现

基于JSP的网上购书系统设计与实现 摘要&#xff1a; 随着如今互联网与计算机技术的高速发展&#xff0c;各种先进的技术为人们的生活带来了极大的方便&#xff0c;网络应用领域也一天天扩大。在虚拟网络中买卖交易商品&#xff0c;人们越来越来喜欢这种网上购物方式&#xff0…

一文彻底理解索引下推

了解索引下推吗&#xff1f;二级索引取出的数据是依次回表还是一次回表&#xff1f;索引下推是为了什么发明的&#xff1f;索引下推的流程是&#xff1f;正常使用二级索引的流程是&#xff1f; 看完这个文章你将知道上面的问题。 索引下推的概念 从MySQL5.6开始引入的一个特…

【MySQL源码】使用CLion 远程调试MySQL源码

目录 0 准备工作 1 IDE 2 下载MySQL源码 ​编辑 一 配置CLion 1 添加远程服务器 2 配置远程服务器环境 3 升级gdb版本 4 升级CMake版本 5 修改远程服务器文件上传的目录的对应关系 5 配置cmake 7 初始化MySQL 8 启动MySQL 作为DBA工作多年&#xff0c;如果还是停…