2015-12-02 54 views
1

我有一個div容器,其具有一個主圖像和任選的多個較小的圖片:http://jsfiddle.net/h5kc8ybm/CSS:校準子元素,如「填充柱」

的多個更小的圖像是動態生成的,所以可以只是其中1個或10個。在我的JFiddle中,您可以看到,圖像只顯示在一行中。

我想實現的是,有「由colomns」填補了:

  1. 在上面第一張圖片旁邊的主圖像(如本例中所示)低於
  2. 第2圖像(未右的話,像在實施例)第一圖像的
  3. 第三圖像右(上)低於第三圖像
  4. 第四圖像

...等等。

只用CSS就可以做到這一點嗎?

更新

爲了避免誤解:所有較小的圖像應位於主圖像的右側。但是這些小圖像應該以兩行顯示,從第一行填充到第二行。

主要的div元素永遠不會改變它的高度,但只會改變它的寬度。

enter image description here

HTML

<div class="tnwrapper"> 
    <div class="tn"> 
      <img src="http://placehold.it/96x96" alt="" class="thumbnail"> 
    </div> 

    <div class="tn"> 
      <img src="http://placehold.it/96x96" alt="" class="thumbnail child"> 
    </div> 

    <div class="tn"> 
      <img src="http://placehold.it/96x96" alt="" class="thumbnail child"> 
    </div> 
</div> 

LESS

.tnwrapper { 
    background-color: #f5f5f5; 
    padding: 5px 5px 5px 9px; 
    border-radius: 4px; 
    display: inline-block; 
    .tn { 
     display: inline-block; 
     vertical-align:top; 
     position: relative; 
     margin-right: 5px; 
     .thumbnail { 
      display: block; 
      padding: 4px; 
      margin-bottom: 20px; 
      line-height: 1.42857143; 
      background-color: #fff; 
      border: 1px solid #ddd; 
      border-radius: 4px; 
     } 
     .thumbnail.child { 
      width: 40px; 
     } 
    } 
} 
+0

看看的CSS'columns'財產,或者'顯示:flex' – Pete

+0

這肯定需要從我可以在HTML結構的變化看到。 –

+0

[列示例](http://jsfiddle.net/h5kc8ybm/4/) – Pete

回答

4

我可以用下面的步驟來做到這一點:

  • 包裹較小的chi ldren在一個div並使其position:relative
  • 就連項目申請position:absolute和重新定位他們
  • 浮動他們離開

http://jsfiddle.net/0neukb08/

這種方法的缺點是,它硬編碼圖像的尺寸在「重新定位」步驟

此外,我選擇不使用彈性盒的原因是this issue隨着其寬度的增加(我也不喜歡最高的投票答案呃),但如果你事先知道容器的寬度,flexbox是一個不錯的選擇。

+0

爲什麼右邊有邊距? – user3142695

+0

找到指定了頁邊距的絕對定位元素,即使它們在文檔的流程中沒有考慮到位置是絕對的時候,它們的邊距也是如此。只需添加'.children .tn:nth-​​child(偶數){margin_right:0px; }'它將重置他們的利潤 –

0

你也許可以通過

旋轉做到這一點的容器-90deg,反映它:

.tnwrapper { 
    ... 
    transform: rotate(-90deg) scaleX(-1); 
} 

然後應用逆轉變爲縮略圖:

.tnwrapper .tn { 
    ... 
    transform: rotate(90deg) scaleX(-1); 
} 

的jsfiddle:http://jsfiddle.net/h5kc8ybm/1/

請注意,容器的高度限制現在是寬度,而不是高度(因爲它旋轉了-90度。

+0

我想你誤解了我。所有較小的圖像應位於主圖像的右側。但是這些小圖像應該以兩行顯示,從第一行填充到第二行 – user3142695

+0

哦,我明白了。將不得不想想另一種解決方案,然後^^' – AVAVT

0

CSS Flexbox的造型應該做的伎倆:

.tnwrapper { 
 
    display: flex; 
 
    flex-direction: column; 
 
    flex-wrap: wrap; 
 
    height: 200px; 
 
} 
 

 
.tn:first-child { 
 
    height: 192px; 
 
    width: 192px; 
 
}
<div class="tnwrapper"> 
 
    <div class="tn"> 
 
      <img src="http://placehold.it/96x96" alt="" class="thumbnail"> 
 
    </div> 
 

 
    <div class="tn"> 
 
      <img src="http://placehold.it/96x96" alt="" class="thumbnail child"> 
 
    </div> 
 

 
    <div class="tn"> 
 
      <img src="http://placehold.it/96x96" alt="" class="thumbnail child"> 
 
    </div> 
 
    
 
     <div class="tn"> 
 
      <img src="http://placehold.it/96x96" alt="" class="thumbnail child"> 
 
    </div> 
 
    
 
     <div class="tn"> 
 
      <img src="http://placehold.it/96x96" alt="" class="thumbnail child"> 
 
    </div> 
 
    
 
     <div class="tn"> 
 
      <img src="http://placehold.it/96x96" alt="" class="thumbnail child"> 
 
    </div> 
 
</div>

編輯:對不起,上面的代碼中並沒有完全回答這個問題畢竟。這段代碼將每個後續圖像按照從左到右,然後從上到下的順序排列,而不是從問題問的頂部到底部,然後從左到右排列。我認爲在第一張圖片上添加一個div是實現你想要的最簡潔的方法。

0

這是Flexbox的解決方案,因爲你說的main-divheight不會改變這應該工作http://jsfiddle.net/h5kc8ybm/13/

CSS

.tnwrapper { 
    background-color: #000; 
    padding: 5px 5px 5px 9px; 
    border-radius: 4px; 
    display: -webkit-flex; 
    display: flex; 
} 

.child-images { 
    display: -webkit-flex; 
    display: flex; 
    -webkit-flex-direction: column; 
    flex-direction: column; 
    -webkit-flex-wrap: wrap; 
    flex-wrap: wrap; 
    margin: 0 10px; 
    height: 170px; 
} 

.tnwrapper .tn .thumbnail { 
    padding: 4px; 
    margin: 10px; 
    line-height: 1.42857143; 
    background-color: #fff; 
    border: 1px solid #ddd; 
    border-radius: 4px; 
} 

.child-images .tn img { 
    width: 40px; 
} 
+0

jsfiddle不適合我在鉻上工作... – user3142695

0

我不太清楚縮略圖的順序,但我認爲你想爲這些列格式。

我的情況下將主圖像和縮略圖包裹在單獨的div中,然後flexbox可以完成剩下的工作。

.wrap { 
 
    display: flex; 
 
    margin: 1em auto; 
 
    height: 280px; 
 
} 
 
.hero { 
 
    padding: 10px; 
 
} 
 
.sidekicks { 
 
    flex: 1; 
 
    padding: 10px; 
 
    display: flex; 
 
    flex-direction: column; 
 
    flex-wrap: wrap; 
 
    align-content: flex-start; 
 
} 
 
.sidekicks .item { 
 
    width: 96px; 
 
    height: 96px; 
 
    margin: 10px; 
 
    background: lightblue; 
 
    line-height: 96px; 
 
    text-align: center; 
 
}
<div class="wrap"> 
 
    <div class="hero"> 
 
    <img src="http://lorempixel.com/image_output/city-h-c-240-250-5.jpg" alt="" /> 
 
    </div> 
 
    <div class="sidekicks"> 
 
    <div class="item">Item1</div> 
 
    <div class="item">Item2</div> 
 
    <div class="item">Item3</div> 
 
    <div class="item">Item4</div> 
 
    <div class="item">Item5</div> 
 
    <div class="item">Item6</div> 
 
    <div class="item">Item7</div> 
 
    <div class="item">Item8</div> 
 
    </div> 
 

 
</div>

Codepen Demo

+0

嗯,這是我能得到的最接近的,但不幸的是它引發了鉻和ff中的背景問題:http://jsfiddle.net/h5kc8ybm/8/ – Pete

+0

是的......這就是一個已知的錯誤。 –