現(xiàn)代CSS 實現(xiàn)照片畫廊布局

我們經(jīng)常會遇到不同布局的照片墻展示圖片,下面來使用純CSS 實現(xiàn)照片墻集乔。

響應式布局Responsive Layout

首先我們設想畫廊在大屏上面的顯示效果是這樣的:


大屏顯示效果

在較小的屏幕上(例如< 50 em),應該有以下效果:


較小屏幕顯示效果

這個標簽簡單寫成
<div>
   <a href="path-to-the-image"> 
    <figure> 
      <img src="path-to-the-image" alt=""> 
    </figure> 
  </a>
 <!-- other anchors here ... --></div>

正如你可能已經(jīng)知道的,我們可以利用不同的布局方法來產(chǎn)生期望的結(jié)果去件。此前我測試了兩種不同的方法,讓我們記下我們的初始需求(見上面的圖片):

  • 我想要在中等屏幕上和較小屏幕(例如<50em)上實現(xiàn)兩列布局扰路,在大屏幕(例如:50em 及以上)上實現(xiàn)4列布局
  • 相鄰列之間的距離一直為8px

用 inline-block

我將會用display: inline-block 方法去構(gòu)建我們的照片墻尤溜。參照下面的CSS:

div {
  font-size: 0;
}
a {
    font-size: 16px; 
    display: inline-block;
    margin-bottom: 8px;
    width: calc(50% - 4px);
    margin-right: 8px;
}
a:nth-of-type(2n) {
    margin-right: 0;
}
@media screen and (min-width: 50em) {
    a {
      width: calc(25% - 6px);
    }
    a:nth-of-type(2n) {
      margin-right: 8px;
    }
    a:nth-of-type(4n) {
      margin-right: 0;
    }
}

解釋一下上面的代碼:
默認情況下,inline-block元素之間有一個空格。一個解決這個問題的方法是父元素的字體大小設置為0汗唱。這意味著我們要重置所有子元素的字體大小(在我們的例子中沒有必要)宫莱。
在小屏幕上,我們的2列布局相鄰列的間距為8px哩罪。
這個列的寬度計算如下:

  • 每一行列與列之間的空隙總和 =1 * 8 px = > 8 px授霸。得到的值為8px,而不是16 px,因為我刪除了每行第二列在小屏幕上的右邊距巡验。
  • 每一列的寬度=calc(50% - 4 px)。這個4 px通過該計算可得:每一行總共的列間隙/每一行列數(shù)(8 px / 2 = > 4 px)碘耳。
    兩列圖片寬度示意

    在大屏幕中設計4列布局显设,依然保持列間距為8px,因此辛辨,列寬的計算如下:
  • 每一行列與列之間的空隙總和 = 3 * 8 px = > 24 px捕捂。得到的值為24px,而不是32 px,因為我刪除了每行第四列在小屏幕上的右邊距。
  • 每一列的寬度= calc(25% - 6 px)斗搞。這個6 px通過該計算可得:每一行總共的列間隙/每一行列數(shù)(24 px / 4= > 6 px)绞蹦。
    四列圖片寬度示意

    codepen for display: inline-block method

用Flexbox

上面的解決方案工作很好,但也有一些缺點。為了演示這個缺點,我們假設每個圖像都包含一個標題榜旦。
更新后的代碼如下:

<div>
    <a href="path-to-the-image">
      <figure>
        <img src="path-to-the-image" alt="">
      <figcaption>Some text here</figcaption>
      </figure>
    </a>
    <!-- other anchors here ... -->
</div>

更新后的布局在大屏展示效果如下:

帶有標題的圖片展示

顯而易見幽七,結(jié)果不盡人意,因為柵格項目有不同的高度。我們用CSS3中的flexbox可以修復這個問題,它是一種現(xiàn)代CSS設計方法,它將使我們能夠解決許多常見的布局問題(如默認inline-block元素)之間的差距溅呢。為了展示這個方法,我只需要更新父元素的CSS(flex容器):

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

非常完美澡屡!如果我們現(xiàn)在預覽畫廊,我們會得到預期的結(jié)果(即所有列高相等)在所有屏幕。下面是大屏幕上看起來:

Flexbox 布局畫廊

CodePen demo using flexbox with improved captions


最后我需要解釋一點:Flexbox提供justify-content屬性用于沿著flex容器的當前行的主軸對齊flex項目咐旧。但是驶鹉,請注意,此屬性不能定義我們要構(gòu)建所需畫廊布局的值铣墨。例如,`space-between`值在這個布局中:

space-between

justify-content值為 space-around 結(jié)果將為:
space-around

在上面上個例子中室埋,最后兩個項目將會很尷尬的兩端分散展示。CSS 樣式是這樣的:

div {
  display: flex;
  flex-wrap: wrap;
  justify-content: space-between; /* or space-around */
} 

a {
  display: inline-block;
  margin-bottom: 8px;
  width: calc(50% - 4px);
}

@media screen and (min-width: 50em) {
  a {
    width: calc(25% - 6px);
  }
}

在這種情況下伊约,我沒有為flex項目分配margin-right屬性姚淆。這是因為,根據(jù)justify-content屬性的值屡律,瀏覽器負責在其容器中自適應分配flex項目腌逢。
CodePen demo using the justify-content property

https://www.sitepoint.com/using-modern-css-to-build-a-responsive-image-grid/
http://gridbyexample.com/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市超埋,隨后出現(xiàn)的幾起案子搏讶,更是在濱河造成了極大的恐慌,老刑警劉巖霍殴,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件媒惕,死亡現(xiàn)場離奇詭異,居然都是意外死亡来庭,警方通過查閱死者的電腦和手機妒蔚,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人面睛,你說我怎么就攤上這事絮蒿∽鸢幔” “怎么了叁鉴?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長佛寿。 經(jīng)常有香客問我幌墓,道長,這世上最難降的妖魔是什么冀泻? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任常侣,我火速辦了婚禮,結(jié)果婚禮上弹渔,老公的妹妹穿的比我還像新娘胳施。我一直安慰自己,他們只是感情好肢专,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布舞肆。 她就那樣靜靜地躺著,像睡著了一般博杖。 火紅的嫁衣襯著肌膚如雪椿胯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天剃根,我揣著相機與錄音哩盲,去河邊找鬼。 笑死狈醉,一個胖子當著我的面吹牛廉油,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苗傅,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼娱两,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了金吗?” 一聲冷哼從身側(cè)響起十兢,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎摇庙,沒想到半個月后旱物,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡卫袒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年宵呛,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片夕凝。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡宝穗,死狀恐怖户秤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情逮矛,我是刑警寧澤鸡号,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站须鼎,受9級特大地震影響鲸伴,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜晋控,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一汞窗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赡译,春花似錦仲吏、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至综看,卻和暖如春品腹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背红碑。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工舞吭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人析珊。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓羡鸥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親忠寻。 傳聞我的和親對象是個殘疾皇子惧浴,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 問答題47 /72 常見瀏覽器兼容性問題與解決方案? 參考答案 (1)瀏覽器兼容問題一:不同瀏覽器的標簽默認的外補...
    _Yfling閱讀 13,754評論 1 92
  • H5移動端知識點總結(jié) 閱讀目錄 移動開發(fā)基本知識點 calc基本用法 box-sizing的理解及使用 理解dis...
    Mx勇閱讀 4,509評論 0 26
  • 閱讀目錄移動開發(fā)基本知識點 calc基本用法box-sizing的理解及使用理解display:box的布局理解f...
    張憲宇閱讀 1,530評論 0 1
  • 移動開發(fā)基本知識點 一.使用rem作為單位 html { font-size: 100px; } @media(m...
    橫沖直撞666閱讀 3,475評論 0 6
  • 有好幾年 我沒有大聲的笑出來 有好幾年 我沒有看過月盈月缺 我一個人默默吃飯 我一個人匆匆走路 再沒有哼一首歌 甚...
    抽煙喝酒燙頭閱讀 178評論 0 1