假设您有一堆要显示的图片,目标是在浏览器窗口上无缝显示它们,没有任何间隙。只是因为您认为这样做很酷。它们的大小各不相同。您不在乎它们是否被调整大小,但它们应该保持其纵横比。 像这样

理想情况下,我们希望保持标记的简洁,例如
<section id="photos">
<img src="images/cat-1.jpg" alt="Cute cat">
<img src="images/cat-2.jpg" alt="Serious cat">
...
</section>
在没有任何 CSS 的情况下,图片会排成一行,因为它们本质上是内联块

但这并不是我们想要的。您可能会直接想到一些 JavaScript 解决方案。可能是超级酷的 Masonry 项目。JavaScript 选项的问题在于它依赖于 window.resize 事件,而这个事件(至少对我来说)总是让页面感觉迟钝(即使您很时髦并且做了防抖动处理)。
我们可以使用纯 CSS 来实现我们想要的效果。我们需要的是用于放置图片的垂直列。这样,图片就会相互叠加,高度问题就不复存在了。
我们可以将相同数量的图片包装在浮动 div 中,但这很难保持平衡。诀窍在于使用 **Masonry CSS**,其中垂直列是通过 CSS3 属性 column-count
创建的。是的,就是那个可以自动将文本设置为窄列的东西。
因此,只要具有多个列的父元素与浏览器窗口一样宽(默认情况下),并且 column-gap
为 0,我们就可以轻松实现。通过将图片的宽度设置为 100%,它们将占用一列的全部宽度。
以下是 CSS 代码
#photos {
/* Prevent vertical gaps */
line-height: 0;
-webkit-column-count: 5;
-webkit-column-gap: 0px;
-moz-column-count: 5;
-moz-column-gap: 0px;
column-count: 5;
column-gap: 0px;
}
#photos img {
/* Just in case there are inline attributes */
width: 100% !important;
height: auto !important;
}
但是当浏览器窗口变窄时会发生什么?5 列对于非常大的浏览器窗口可能很好,但对于较小的浏览器窗口来说可能太多了(5 张图片并排可能变得太窄)。我们可以通过使用媒体查询来测试浏览器宽度并相应地调整列数来轻松解决此问题。
@media (max-width: 1200px) {
#photos {
-moz-column-count: 4;
-webkit-column-count: 4;
column-count: 4;
}
}
@media (max-width: 1000px) {
#photos {
-moz-column-count: 3;
-webkit-column-count: 3;
column-count: 3;
}
}
@media (max-width: 800px) {
#photos {
-moz-column-count: 2;
-webkit-column-count: 2;
column-count: 2;
}
}
@media (max-width: 400px) {
#photos {
-moz-column-count: 1;
-webkit-column-count: 1;
column-count: 1;
}
}
太棒了!
演示
查看 CodePen 上的 无缝响应式照片网格,由 CSS-Tricks (@css-tricks) 创建。
我认为这种技术很酷的一点是,因为它完全是 CSS,所以一切都非常流畅快捷。您可以随意调整浏览器大小,并观察内容快速调整大小和移动。
那,你知道。
就浏览器支持而言,它相当不错,除了 IE,它只在 10+ 版本中工作。否则:Firefox 3.6+、Opera 11.1+、Safari 4+、Chrome 10+。甚至可能更早一些版本。
您可能只会跳过回退,因为无论如何它并不是那么糟糕,只是有一些空白。或者您可以使用 Modernizr/YepNope 组合(Modernizr 可以测试 csscolumns
)来加载 jQuery Masonry 并看看您能用它做些什么。或者您可以测试它并编写自己的 JS 代码,该代码计算图片数量并将它们分成相等组,然后用浮动 div 将它们包装起来。无论您喜欢什么。
超级可爱的猫!
完全正确。它们来自 LoremPixel。对于演示,我们使用 jQuery 随机抓取了不同尺寸的照片
function getRandomSize(min, max) {
return Math.round(Math.random() * (max - min) + min);
}
for (var i = 0; i < 25; i++) {
var width = getRandomSize(200, 400);
var height = getRandomSize(200, 400);
$('#photos').append('<img src="//www.lorempixel.com/'+width+'/'+height+'/cats" alt="pretty kitty">');
}
非常酷。:)
嗯… 有没有办法修复底部?

我希望评论有 Markdown… 哦好吧。:/
Chris做得很好。几天前我在论坛上发布了如何创建这种网格布局。感谢您创建了关于它的教程 :)
很棒的文章!网络上确实流行着“Masonry”趋势,尤其是对于图片画廊。但这是一个纯 CSS 解决方案。
干得好!谢谢!
这很酷,但我认为,在大多数情况下,您希望图片从左到右加载,而不是从上到下以列的形式加载… 我想您可以对图片进行排序,以便它们以这种方式加载,但这似乎工作量很大,除非它是一个静态列表。
1|2|3|4
5|6|7|8
对比
1|3|5|7
2|4|6|8
可能有一种 jQuery 方法可以正确排列照片
1|2|3|4
5|6|7|8
如果有人能做到,那么您就可以获得另一颗黄色星星!
非常棒的文章,谢谢您的建议。对于投资组合网站来说,这是一个有趣的想法。
-Matt
太可惜了,CSS 列不支持“column-min-width”和“column-max-width”。那将“轻松实现”,无需媒体查询。
不错的文章。非常棒的想法。这肯定会启发我下一个图片墙。
不过必须纠正一下兼容性问题。至少在我的 Firefox 3.6.18 中它不起作用。图片按浏览器窗口的 100% 缩放。似乎没有使用列。
我稍后会调查。
感谢您的文章
Sascha
酷 Chris,感谢您发布了这个教程。几天前我和一些开发人员讨论了这种确切的格式,他们希望最大限度地减少任何 jQuery 等用于他们正在转换为 CMS 的设计,所以如果我们仍然需要使用这种方法,我肯定会向他们展示这种全 CSS 技术。
PHP 中的 'rand(200, 400)' 是做什么的?它似乎不是高度,而是图片链接的一部分。
原始代码
打印出这个
rand(200,400) 在 200 和 400 之间生成一个随机数并将其打印(输出)到 URL 的高度部分。
它是 URL 的一部分。该服务(placedog)从 URL 中获取参数并返回具有给定尺寸的狗的图片。
很棒的东西!
嘿 Chris!我想知道为什么你不再使用
rel="(CSS, HTML, PHP 等)"
我只是懒惰,我已经修复了这些问题。
谢谢!不过,这样的话,例如,在代码框之前加上“PHP:”以及在“代码框”中再次编写 PHP 就不需要了。我建议再次使用
rel
,因为我认为那样您就不必在代码框之前加上“PHP:”或“以下是 CSS 代码:”。另外,如果上面的评论听起来很粗鲁,请不要介意,我提前道歉 =)
嗨 Chris,不错的文章,非常棒的技术。
如果我没记错的话,您的媒体查询中有一个小错误。—
#people
不应该是#photos
吗?是的,应该是 :-) 我花了太多时间调试下载中的所有内容。
是的…… 已修复,谢谢
哇,这太直截了当且有用。干杯。
酷。作为 WordPress 的插件,那将会是多么棒啊:所有已发布图片的概述,链接到其帖子…… ;o)
如何看待一个 WordPress 模板,它会像这样以全屏方式发布缩略图,作为博客文章的快捷方式?而一个框会固定在一个位置作为徽标?
这实际上是一个很棒的想法。我可以看到这会非常有用,尤其是对于投资组合类型的 WordPress 网站。当鼠标悬停在图像上时,可以显示一些文本来简要描述帖子。这样可以做很多事情。
我同意 Darryl。我关于这一点的主要想法是,这是一个方便的地方,可以混合像素消息(通过手机),以及其他照片、设计、图形和帖子。我会看看我能做些什么来制作一个。不确定如何让函数循环,但要保持一个框固定在原位。
好主意…… 让我的齿轮转起来了!
你的解决方案在 IE7 中非常接近…… 非常棒的教程!谢谢。
真的不错!
很酷。
我一直在我的一家生活方式网站上使用这种技术
http://iliketheweekend.com/
需要注意的是,在 img 样式中,如果你添加任何定位,比如 relative 或其他,Safari 会出现一个奇怪的错误,会导致 CSS3 列布局失效。
棒极了!靠纯 CSS 的力量,满屏的小猫。今天真是美好的一天!;-) 好样的。
对于非 CSS 回退,另一个想法是在 img 标签上使用属性“align=”absmiddle””。这会水平对齐图像中心。
不错的纯 CSS 解决方案。
不错。这是有用的 CSS。
很棒!我必须尝试一下,比我过去使用的那个(不是你做的)好多了(而且更干净)。谢谢!
非常非常酷!
嘿,Chris!
这对“砌体”风格来说是一个绝妙的用途!看到你使用我的 column-count 技术来实现它,这大概是我能希望得到的关于它是个好主意最棒的确认了。
干杯,谢谢!
附注:+1 支持“把它做成 WordPress 插件”的想法。
很棒的文章,必须喜欢里面的捉鬼敢死队引用。
巧妙。很高兴看到 CSS 技术被用来解决不总是显而易见的问题。
我非常喜欢保持 HTML 标记超级简单,而 CSS3 允许我们做一些很棒的事情,而不会弄乱标记。
继续努力!
哇!我真的很喜欢这个网站。你们都提供了一些很好的信息。我也很喜欢你使用小猫的方式。我是一个Tucson 网站设计师,所以这一切对我来说都非常有用。继续努力。我会定期查看,以获得更多技巧和提示。谢谢。
这是一个非常好的解决方案,解决了一个老问题。非常有用。
除了 CSS3,你不能把它们留成 inline-block 并使用 vertical-align top 吗?你还可以通过将 font-size 设置为 0 来消除它们之间的空白?
我不想一直说这个问题,但下载文件中仍然有错误,section id=’people’ 而不是 section id=’photos’。
很棒的教程!我一直在寻找这个很久了!而且还是纯 CSS!
有 placedog.com? 太棒了!
嘿,Chris,我喜欢这个想法。
我正在尝试在我的网站上实现这个技术的版本,但我认为我在 Webkit 处理列的方式上遇到了一些问题?
我在高分辨率下有 6 张图片/6 列,在低分辨率下有 6 张图片/3 列。它在 Firefox 中按预期执行,但在 Chrome 或 Safari 中不行。当你回到更高的分辨率时,它仍然是 3 列?
如果有人能快速看一下,将不胜感激 - http://jsfiddle.net/Pa7mU/2/
谢谢
我也有同样的情况。这是 Webkit 的问题,它通常以不同的方式处理 CSS3 东西。我正在尝试找到一个解决方案,使其看起来更好,但收效甚微…… 你解决这个问题了吗?
就我所见,如果你声明了 line-height,也会出现一些错误,而没有它运行得很好。大致如此。
@Janos - 我基本上放弃了尝试使用纯 CSS 查找此问题的修复方法,最终使用了 jQuery Masonry。
真是一项很棒的技术,谢谢!
但是,你最后的 PHP 代码中有一点吸引了我
if ($i % 2 == 1) {
当然,你可以省略“== 1”,因为 PHP 将 1 视为真,将 0 视为假。这可能看起来很琐碎,但我认为它更优雅一些
很棒的东西!
不过,我在添加一些标题时遇到了一些麻烦,我想知道是否有人可以帮忙。
这是测试页面:http://souchi.com/pages/celebrity3 正如你所见,最终出现在最长列底部的文本不会停留在该列底部。它想要换行到下一列的顶部。
我的 html 如下所示
我的 CSS 如下所示
有人知道如何让标题与图片保持一致吗?谢谢。
顺便说一句,嘿,Chris!你可以使用
column-width
并完全删除媒体查询…… 这是一个演示:http://jsfiddle.net/tovic/nX9NT/1/embedded/result%2Chtml%2Ccss/嘿,Chris,感谢你天才般简单的代码,不过我在 iPhone 上花了几个小时才让它工作;我终于发现,head 必须包含 meta name=”viewport” content=”width=device-width,initial-scale=1.0″,否则手机会认为它的分辨率在 800px 和 1000px 之间(3 列,2 张图片宽)。你的代码在 http://iphonetester.com/ 上运行良好,我可以重新调整我的笔记本电脑 Chrome 屏幕大小,并观察它缩小得很好,但在 iPhone 上却坏了…… 所以我认为你应该在你的下载中添加这个非常重要的 viewport 行 :)
一个问题,你能让图片横向加载,而不是纵向加载吗?在五列屏幕上,我希望故事从左到右,向下穿过行……
将列间距从 0 更改为更大的值(1px、2px)会损失什么?我喜欢这种效果,但希望可以选项在图片之间加一点间距。我在 Firefox 中尝试了 1px 间距,看起来不错。这会影响移动设备/响应式设计吗?谢谢!
看看我现在正在完成的这个网站
http://www.moopio.com/pictures.php?id=439441916098422&page=1
使用 Bootstrap + Masonry + 无限滚动插件
问候!
很棒的技术。placedog.com 似乎已经过期,被投机者收购,所以演示中的狗图片没有显示。也许该是彻底换成猫的时候了?
现在已经用所有猫修复了,谢谢!
像往常一样,访问您的网站时,我对一个简单的 CSS 属性的功能印象深刻。您真的很棒,我爱您的网站!!感谢您分享如此有趣的信息和技巧!