2013-08-25 91 views
0

我有一個響應式圖像庫佈局,根據用戶的屏幕寬度,每行顯示3,2或1個圖像。這裏要說的是將決定多少圖像每行顯示CSS的一部分:在jquery響應式佈局下顯示當前div div下方的隱藏div

@media only screen and (max-width : 480px) { 
/* Smartphones: 1 image per row */ 
.box { 
    width: 100%; 
    padding-bottom: 100%; 
} 
} 
@media only screen and (max-width : 650px) and (min-width : 481px) { 
/* Tablets: 2 images per row */ 
.box { 
    width: 50%; 
    padding-bottom: 50%; 
} 
} 
@media only screen and (min-width : 651px) { 
/* large screens: 3 images per row */ 
.box { 
    width: 33.3%; 
    padding-bottom: 33.3%; 
} 
} 

每個「.box的」分區,有應顯示的當前行下面的另一個(最初是隱藏的)DIV圖片點擊一個按鈕。這個隱藏的div的寬度總是100%,所以它會填充一個完整的行。

上顯示每行3個圖像的桌面瀏覽器,它看起來像這樣

<div class="box"> 
     <div class="boxInner"> 
      <img src="../img/img1.jpg"> 
      <div class="infoBox"> 
       <button class="detailLink" name="det1">Show Details</button> 
      </div> 
     </div> 
    </div> 
    <div class="box"> 
     <div class="boxInner"> 
      <img src="../img/img2.jpg"> 
      <div class="infoBox"> 
       <button class="detailLink" name="det2">Show Details</button> 
      </div> 
     </div> 
    </div> 
    <div class="box"> 
     <div class="boxInner"> 
      <img src="../img/im3.jpg"> 
      <div class="infoBox"> 
       <button class="detailLink" name="det3">Show Details</button> 
      </div> 
     </div> 
    </div> 
    <div class="detailWrapper" id="det1"> 
     <div class="detail">Details for img1</div> 
    </div> 
    <div class="detailWrapper" id="det2"> 
     <div class="detail">Details for img2</div> 
    </div> 
    <div class="detailWrapper" id="det3"> 
     <div class="detail">Details for img3</div> 
    </div> 

這是將切換的div細節腳本:

<script> 
    $(".detailLink").click(function() { 
     var id = $(this).attr("name"); 
     $("#"+id).slideToggle("slow"); 
    }); 
</script> 

它看起來現在這個樣子如果單擊im1按鈕:

http://postimg.org/image/b2tfnpwgn/

但是,如果我調整瀏覽器窗口的大小,以便每行僅顯示一個或兩個圖像,顯然第一個和第二個圖像的最初隱藏的div將不會顯示在第一行的下方,但會在第二行的下方顯示。

我不知道如何重寫這段代碼,所以無論是每行顯示1,2或3張圖像,它都會在實際圖像下面的行中始終顯示最初隱藏的div。我可以創建三個單獨的頁面,並根據屏幕寬度將瀏覽器重定向到它們,但這似乎有點多餘,必須有更好的解決方案。

我在Stackoverflow的第一個問題 - 希望我做對了。

+0

你就不能移動'.detailWrapper'的'.box的內'? –

+0

雖然.box的寬度根據每行顯示的圖像數量而變化,但.detailwrapper總是100%寬 - 因此在上面的示例中,.detailwrapper的寬度爲3個圖像。如果我嘗試將它移動到.box中,我似乎無法以全角寬度顯示當前行下方的.detailwrapper。 – theremin

+0

我明白了,我正在爲您解決問題,我是否可以假設每行圖像都有一個容器元素?當每行有2個圖像時會發生什麼?你只用1張圖片就能得到下一行嗎? –

回答

1

你需要一個JavaScript的解決方案,以rearrage你的元素,每當窗口大小:

Demo fiddle

$(document).ready(function()) { 
    var $boxes = $('.box'); 

    $(window).resize(function() { 
     //Get the css width of our elements to determine the media query breakpoint we're in 
     var boxesWidth = $('.box').width()/$(window).width() * 100; 

     if (boxesWidth > 50) { //One box per row 
      $boxes.each(function() { 
       var $detail = $('#' + $(this).find('.detailLink').attr('name')); 
       //Move the detail after each box 
       $(this).after($detail); 
      }); 
     } else if (boxesWidth > 34) {//Two box per row 
      $boxes.filter(':odd').each(function() { 
       var index = $boxes.index($(this)); 
       var $details = $('.detailWrapper').slice(index - 1, index + 1); 
       //Move details after the last box in row 
       $(this).after($details); 

      }); 
     } else {//Three box per row 
      //Find the last boxes in row 
      $boxes.filter(function (i) { 
       return (i + 1) % 3 == 0; 
      }).each(function() { 
       var index = $boxes.index($(this)); 
       var $details = $('.detailWrapper').slice(index - 2, index + 1); 
       //Move details after the last box in row 
       $(this).after($details); 
      }); 
     } 
    }); 
    //Trigger resize event on page load 
    $(window).resize(); 
}); 
+0

太棒了!根據您對我的問題的初步評論,我開始擺弄一種類似的方法,但直到您發佈解決方案才能完成。像預期的那樣工作,謝謝! – theremin

+0

這個解決方案有一個問題。它適用於每行3或1張圖像,但不適用於2張圖像。在你的jsfiddle中,使瀏覽器窗口變窄,以便只顯示兩個圖像相鄰。當detailwrapper div可見時,您會看到第三張和第六張圖片將自己排成一排。 – theremin

+0

@theremin我看到,由於某種原因,我雖然這是預期的行爲,但現在你提到它我似乎並不正確,我已經更新了我的答案,以解決它 –