首页 web前端 css教程 带有Flexbox的自适应照片布局

带有Flexbox的自适应照片布局

Apr 16, 2025 am 09:51 AM

使用Flexbox实现自适应照片布局,轻量级且高效!本文介绍一种轻量级方法,利用Flexbox创建水平瀑布流式照片布局,无需JavaScript,即可实现任意尺寸照片的无缝排列。

Adaptive Photo Layout with Flexbox

这种方案不仅轻量级,而且非常简单。我们只需要一个无序图像列表和17行CSS代码,核心在于Flexbox和object-fit属性。

为什么选择这种方法?

我有两个爱好:用照片记录生活,以及探索CSS属性(新旧皆可)的有趣组合方式。

几周前,我参加了XOXO活动,拍摄了大量照片,最终筛选出39张精美的照片。为了更好地管理自己的内容,过去几年我一直想创建一个简单的照片博客,但始终无法实现我理想中的布局:一个简单的瀑布流布局,照片在保持其纵横比的同时填充行(想想iOS上的照片应用、Google相册、Flickr……)。

我做了一些研究,看看是否有任何轻量级的、非JavaScript的选项,但找不到任何符合我需求的方案。在等待航班延误期间,我开始尝试一些代码,并限制自己尽可能保持代码简洁(因为这正是我认为的乐趣所在)。

基本HTML结构

由于我基本上是创建一个图像列表,所以我选择了一个无序列表:

登录后复制
    <li>Adaptive Photo Layout with Flexbox <li>Adaptive Photo Layout with Flexbox <!-- ... more images ... -->

Flexbox的妙用

然后是一系列灵光乍现的时刻:

    <li>Flexbox非常适合通过根据单元格内容确定单元格宽度来填充行。 <li>这意味着所有图像(横向或纵向)都需要具有相同的高度。 <li>我可以使用object-fit: cover;来确保图像填充单元格。

理论上,这听起来像是一个可靠的方案,它让我得到了一个我90%满意的结果。

ul {
  display: flex;
  flex-wrap: wrap;
}

li {
  height: 40vh;
  flex-grow: 1;
}

img {
  max-height: 100%;
  min-width: 100%;
  object-fit: cover;
  vertical-align: bottom;
}
登录后复制

注意: 40vh 对于桌面浏览器来说似乎是最佳的初始方法,它以合理的大小显示两行完整的照片,并暗示下面还有更多照片。这也允许每行显示更多照片,从而显著改善纵横比。

处理最后一行伸展问题

我遇到的唯一问题是Flexbox 非常想填充所有行,它对最后一行照片的纵横比做了一些奇怪的事情。这可能是我对这个布局最不喜欢的一点,但我不得不在列表的末尾添加一个空的<li>元素。

<!-- ... more images ... -->
登录后复制
<li>

结合以下CSS代码:

li:last-child {
  flex-grow: 10;
}
登录后复制

注意: 这里使用“10”并没有什么科学依据。在我的所有测试中,这都提供了最佳结果。

演示(此处应插入演示链接或代码片段)

视口优化

在不同的视口方向下工作时,需要考虑一些因素。

竖屏

如果你的视口高度大于宽度,这种方法会限制每行的照片数量,从而影响其纵横比。要解决这个问题,你可以使用简单的媒体查询使照片行变矮:

@media (max-aspect-ratio: 1/1) {
  li {
    height: 30vh;
  }
}
登录后复制

较短的屏幕

为了适应横向的小型设备,增加照片的高度有助于尽可能大显示照片:

@media (max-height: 480px) {
  li {
    height: 80vh;
  }
}
登录后复制

较小的屏幕 竖屏

大多数手机不够宽,无法让Flexbox在不缩小照片的情况下正常工作,所以我选择不尝试每行容纳多张照片。尽管如此,在这里设置最大高度仍然值得,这样你至少可以瞥见列表中的下一张照片。

@media (max-aspect-ratio: 1/1) and (max-width: 480px) {
  ul {
    flex-direction: column; /* 改为列方向 */
  }

  li {
    height: auto;
    width: 100%;
  }

  img {
    width: 100%;
    max-height: 75vh;
    min-width: 0;
  }
}
登录后复制

总结

这种方法并没有完全尊重照片的纵横比(但已经很接近了),并且偶尔会导致一些奇怪的结果,但我绝对喜欢它的简洁性和灵活性。想要让你的画廊水平滚动而不是垂直滚动?只需进行一些调整即可实现。画廊中有1000张照片还是只有一张?看起来都很好。不确定纵横比?Flexbox是你的最佳选择。如果你还没有查看演示,请再看一遍,并告诉我你的想法!

额外提示

根据这些照片的大小,这样的页面可能会很快增长到几兆字节。在我的博客中,我添加了loading="lazy"来解决这个问题。使用该属性后,图像只会在您滚动时接近它们时才加载。目前它只在Chrome中受支持,但您可以自己编写一个更广泛支持的技术。

以上是带有Flexbox的自适应照片布局的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌
威尔R.E.P.O.有交叉游戏吗?
1 个月前 By 尊渡假赌尊渡假赌尊渡假赌

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

使用GraphQL缓存 使用GraphQL缓存 Mar 19, 2025 am 09:36 AM

如果您最近开始使用GraphQL或审查了其优点和缺点,那么您毫无疑问听到了诸如“ GraphQl不支持缓存”或

使用Redwood.js和Fauna构建以太坊应用 使用Redwood.js和Fauna构建以太坊应用 Mar 28, 2025 am 09:18 AM

随着最近比特币价格超过20k美元的攀升,最近打破了3万美元,我认为值得深入研究创建以太坊

用高架创建自己的野蛮人 用高架创建自己的野蛮人 Mar 18, 2025 am 11:23 AM

无论您是开发人员的哪个阶段,我们完成的任务(无论大小)都会对我们的个人和专业成长产生巨大影响。

VUE 3 VUE 3 Apr 02, 2025 pm 06:32 PM

它的出局!恭喜Vue团队完成了完成,我知道这是一项巨大的努力,而且很长时间。所有新文档也是如此。

您可以从浏览器获得有效的CSS属性值吗? 您可以从浏览器获得有效的CSS属性值吗? Apr 02, 2025 pm 06:17 PM

我有人写了这个非常合法的问题。 Lea只是在博客上介绍了如何从浏览器中获得有效的CSS属性。那样的是这样。

在CI/CD上有点 在CI/CD上有点 Apr 02, 2025 pm 06:21 PM

我说的“网站”比“移动应用程序”更合适,但我喜欢Max Lynch的框架:

带有粘性定位的堆叠卡和一点点的杂物 带有粘性定位的堆叠卡和一点点的杂物 Apr 03, 2025 am 10:30 AM

前几天,我发现了科里·金尼文(Corey Ginnivan)网站上的这一点,当您滚动时,彼此之间的卡片堆放集。

比较浏览器的响应式设计 比较浏览器的响应式设计 Apr 02, 2025 pm 06:25 PM

这些桌面应用程序中有许多目标是同时在不同的维度上显示您的网站。因此,例如,您可以写作

See all articles