首頁 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脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1659
14
CakePHP 教程
1416
52
Laravel 教程
1310
25
PHP教程
1258
29
C# 教程
1233
24
Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

我們如何創建一個在SVG中生成格子呢模式的靜態站點 我們如何創建一個在SVG中生成格子呢模式的靜態站點 Apr 09, 2025 am 11:29 AM

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tar​​tanify.com上,我們收集了5,000多個格子呢

如何在WordPress主題中構建VUE組件 如何在WordPress主題中構建VUE組件 Apr 11, 2025 am 11:03 AM

內聯式模板指令使我們能夠將豐富的VUE組件構建為對現有WordPress標記的逐步增強。

php是A-OK用於模板 php是A-OK用於模板 Apr 11, 2025 am 11:04 AM

PHP模板通常會因促進Subpar代碼而變得不良說唱,但這並不是這樣的情況。讓我們看一下PHP項目如何執行基本的

編程SASS創建可訪問的顏色組合 編程SASS創建可訪問的顏色組合 Apr 09, 2025 am 11:30 AM

我們一直在尋求使網絡更容易訪問。顏色對比只是數學,因此Sass可以幫助涵蓋設計師可能錯過的邊緣案例。

See all articles