稀土掘金技术社区 2024年12月27日
CSS砌体布局:颠覆你认知的最疯狂的CSS最强布局,一行代码解决布局问题!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文深入探讨了使用CSS的`columns`属性实现瀑布流布局的强大功能。文章指出,传统的flex或grid布局在处理瀑布流时较为繁琐,需要大量的媒体查询和JavaScript辅助。而`columns`属性仅需一行代码即可实现响应式瀑布流,它不仅能根据列数划分,还能根据元素尺寸自动调整,并且可以结合像素宽度和列数进行灵活配置。文章通过代码示例详细对比了grid、flex和columns三种布局方式,突显了columns在实现瀑布流布局上的简洁高效。同时,文章也指出了`columns`属性的局限性,如元素从上往下排序以及在大型列表中的性能问题,并给出了相应的解决方案建议。

🤩 `columns`属性是实现瀑布流布局的利器:相较于传统的flex和grid布局,`columns`属性仅需一行代码即可实现瀑布流布局,极大简化了代码复杂度。

📐 响应式布局:`columns`属性不仅可以指定列数,还能根据元素尺寸自动进行响应式布局,无需编写大量的@media媒体查询,只需设置一个像素宽度,系统会自动根据宽度划分列,并填充空白。

✨ 灵活配置:`columns`属性支持像素宽度和列数的组合配置,例如`columns: 300px 3;`,可以在保持响应式布局的同时,强制按照指定的列数进行划分。

⚠️ 局限性与注意事项:`columns`属性的排序是从上往下,不适用于动态加载图片且需要按加载顺序排列的场景;同时在大型列表中使用`columns`会影响性能,需采用分页或延迟加载等方式优化。

原创 Embrace 2024-12-27 08:31 重庆

点击关注公众号,“技术干货” 及时达!

前言

我敢说,这是整个掘金社区绝无仅有的讲解!关注我,将带你一步步颠覆你认识中的css

先叠个保护壳:作者才大二能力有限,以下的东西都是自己琢磨的,各位大佬如果发现有不认同的地方,请大家轻点喷?

正式讲解

事情起因是这样的,大家在刷抖音,小红书等短视频平台、发现他们的布局是这样的「瀑布流布局」

知道是瀑布流后,怎么做呢?我们第一反应是flex,grid?是的这是大部分人的固态思维

我认为这极为麻烦,因为你甚至还需要用到大量的@meida,javascript来解决细节问题,代码极其冗杂。

全文的大前提:不考虑图片顺序。

但是砌体布局使用columns后仅仅一行代码就能完成上述的功能!!?,这你还不学起来?

我查阅了许多博客,发现大多数对于使用column仅仅也就是介绍了多列布局,但是!!!!它的作用不仅仅如此,至少在这种不考虑顺序的瀑布流布局下,我认为它是最强的。

砌体布局原理就是使用column将元素分为不同的列,然后元素会自动填充空白的部分。但这还不是最特别的,列不是仅仅基于数量,而是可以根据每件物品的尺寸,自动进行响应式!!amazing!

Grid

这里代码我准备了很多图片,他们拥有不同的比例和尺寸

我们先来看grid布局怎么做的。

.layout-container {      display: grid;      grid-template-columns: repeat(3, 1fr);    }

缺点很明显,这种方法会将图片强制分为三列,但是中间会出现许多剩余部分,这极为丑陋,你需要通过其他方法来解决这些,这里就不深入说了,毕竟这不是重点。

Flex

ok,让我们来看看flex怎么做

img {      width: 100%;      margin-bottom: 1em;    }
.layout-container { display: flex; /* 允许换行,但是图像扭曲了 */ flex-wrap: wrap; }

我们可以发现图片占满了整个屏幕

修复方法

img {      width: 100%;      margin-bottom: 1em;      /* 只需要添加对象修复覆盖即可 */      max-width: 300px;      object-fit: cover;    }
.layout-container { display: flex; flex-wrap: wrap; }

修复后。间隔消失,并且整齐排列,但是发现很多图片缺了一块(比如第一行第三列),这不是我们要的效果,我们要的是保留图片的原比例,

砌体布局:columns-visibility!

重头戏来了,砌体布局!

我们只需要要一行代码便能完美解决这个问题

column-count

    img {      width: 100%;      margin-bottom: 1em;    }
.layout-container { column-count: 3; }

是的你没看错,我们仅仅用了这一行代码,便解决了这个问题。column-count: 3:把图片分为三列,在保持图片比例的情况下,又能填充空白部分。

但是细节的大佬就发现了,它不是响应式的,那不炸了吗。

我们用@media就能解决了,你以为我会用吗??那岂不是不又要写一堆@media来适配,这违背了我写这篇文章的目的,告诉你,不需要!!!?一行代码搞定!

我们先看@media怎么实现?

    @media screen and (max-width: 600px) {      .layout-container {        column-count: 2;      }    }

可以发现的确解决了响应式的问题。

Now?!睁开你们的眼睛?,一行代码写完。

.layout-container {      columns: 300px;    }

columns: 300px 将列设置为300像素,系统按300像素划分列,自动进行响应式布局,如果下一张图片给它剩的位置不够,那么就会自动到下一行去,并且剩余的空间将会自动被填满。

Perfect!?这种布局方式简直太爽了。??

嗯哼?,又有大佬发现了?,将浏览器最大化后,图片就会按照300像素划分列,从而一行铺满。

如果我们既想要响应式效果又想要指定行列呢??(既要又要?哪有这么好的事情)

其实有的?,也是一行代码,诸君且看我如何操作。

.layout-container {       columns: 300px 3;    } 

columns: 300px 3是简写,表示在按照300像素的基础上,强行按照3列划分。

吼吼吼,发现变成三列了!我们也发现,它依然是响应式的!!amazing!!?


缺点

有缺点吗,当然有

因为它是从上往下排序,如果我们需要一些动态加载图片的业务,那么新加入的图片将不会加入页面的最低端,不符合我们的业务需求。如果你的网站不需要考虑图片顺序,我个人认为这种方法是完美的。

注意,当你在包含太多元素的列表中使用 columns-visibility 时,它会导致布局和渲染计算不断进行,这会使网站卡顿,性能不佳。通常,对于大型列表,程序员不会使用 container-visibility,最流行的两个选项是分页或使用延迟加载。

兼容性

关于columns-visibility的兼容性不用担心,此功能已非常完善,适用于多种设备和浏览器版本。自2017 年 3 月起,该功能已在各种浏览器中可用。

它并非新特性,只是很少人这么用而已

这里我就给大家展示我文中提到的两个属性的兼容性了?。

column-count


columns



总结

感谢大家的观看,如果对您有帮助的话,请在评论区随便说两句吧,这对作者非常重要。已经提交到git仓库,欢迎大家来点starCSS-Master,CSS-tips: css黑科技

点击关注公众号,“技术干货” 及时达!

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

CSS 瀑布流布局 columns 响应式布局 前端开发
相关文章