搜尋
首頁web前端css教學帶有Flexbox的自適應照片佈局

使用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
@rules具有多少特異性,例如@keyframes和@media?@rules具有多少特異性,例如@keyframes和@media?Apr 18, 2025 am 11:34 AM

前幾天我得到了這個問題。我的第一個想法是:奇怪的問題!特異性是關於選擇者的,而在符號不是選擇器,那麼...無關緊要?

您可以嵌套@Media和@support查詢嗎?您可以嵌套@Media和@support查詢嗎?Apr 18, 2025 am 11:32 AM

是的,您可以,而且它並不重要。不需要CSS預處理器。它在常規CSS中起作用。

快速吞噬緩存破壞快速吞噬緩存破壞Apr 18, 2025 am 11:23 AM

您應該肯定會在CSS和JavaScript(以及圖像和字體以及其他內容)等資產上設置遙遠的高速緩存標頭。告訴瀏覽器

尋找可以監視CSS質量和復雜性的堆棧尋找可以監視CSS質量和復雜性的堆棧Apr 18, 2025 am 11:22 AM

許多開發人員寫瞭如何維護CSS代碼庫的文章,但並沒有很多關於如何測量該代碼庫質量的文章。當然,我們有

數據學家用於建議不執行值的值數據學家用於建議不執行值的值Apr 18, 2025 am 11:08 AM

您是否曾經有一種需要接受簡短而任意的文本的表格?喜歡名字或其他。那完全是用的。有很多

蘇黎世的最初會議蘇黎世的最初會議Apr 18, 2025 am 11:03 AM

我很高興能前往瑞士蘇黎世參加前界(Love the Name and URL!)。我以前從未去過瑞士,所以我很興奮

使用CloudFlare工人建立全棧無服務器應用程序使用CloudFlare工人建立全棧無服務器應用程序Apr 18, 2025 am 10:58 AM

我在軟件開發方面最喜歡的發展之一是無服務器的出現。作為一個傾向於陷入細節的開發人員

在NUXT應用程序中創建動態路由在NUXT應用程序中創建動態路由Apr 18, 2025 am 10:53 AM

在這篇文章中,我們將使用我構建和部署的電子商務商店演示來進行Netlify,以展示如何為傳入數據製作動態路線。這是一個公平的

See all articles

熱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 無盡。

熱工具

MantisBT

MantisBT

Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

Atom編輯器mac版下載

Atom編輯器mac版下載

最受歡迎的的開源編輯器

SublimeText3 Mac版

SublimeText3 Mac版

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