2016-06-03 7 views
0

상자가 컨테이너 밖으로 튀어 나와 갤러리 뒤를 따라야하지만 자바 스크립트 그리드 갤러리를 구현하려고합니다. 전체 그리드 컨테이너 주위에 다른 DIV를 래핑하거나 clearfixes를 추가했지만 성공하지는 못했습니다.자바 스크립트 그리드 갤러리 항목 이후에 구역 나누기 만들기

enter image description here

JSFiddle : 이 https://jsfiddle.net/ssdfjoLp/ (그러나 몰라 제대로 그리드 레이아웃을 렌더링하지 않는 이유)

자바 스크립트 :

function renderGrid(){ 
var blocks = document.getElementById("grid_container").children; 
var pad = 0, cols = 3, newleft, newtop; 
for(var i = 1; i < blocks.length; i++){ 
if (i % cols == 0) { 
newtop = (blocks[i-cols].offsetTop + blocks[i-cols].offsetHeight) + pad; 
blocks[i].style.top = newtop+"px"; 
} else { 
if(blocks[i-cols]){ 
newtop = (blocks[i-cols].offsetTop + blocks[i-cols].offsetHeight) + pad; 
blocks[i].style.top = newtop+"px"; 
} 
newleft = (blocks[i-1].offsetLeft + blocks[i-1].offsetWidth) + pad; 
blocks[i].style.left = newleft+"px";  
} 
} 
} 
window.addEventListener("load", renderGrid, false); 
window.addEventListener("resize", renderGrid, false); 

CSS :

#grid_container{ 
position:relative; 
width:100%; 
margin:0px auto; 
height: auto; 
} 
.grid-item{ 
position:absolute; 
width: 33.33333%; 
border: #000 1px solid; 
} 
.grid-item:nth-child(2n+0) { 
background: #FFDC64; 
} 
.grid-item:nth-child(2n+1) { 
background: #FEC910; 
} 
#grid_container .grid-item > div{ 
padding: 20px; 
font-size: 27px; 
color:#D9A800; 
} 

HTML :

<div id="grid_container_holder"> 
<div id="grid_container"> 
    <div class="grid-item" style="height:140px;"> <div>1</div> </div> 
    <div class="grid-item" style="height:200px;"> <div>2</div> </div> 
    <div class="grid-item" style="height:120px;"> <div>3</div> </div> 
    <div class="grid-item" style="height:180px;"> <div>4</div> </div> 
    <div class="grid-item" style="height:150px;"> <div>5</div> </div> 
    <div class="grid-item" style="height:110px;"> <div>6</div> </div> 
    <div class="grid-item" style="height:180px;"> <div>7</div> </div> 
    <div class="grid-item" style="height:170px;"> <div>8</div> </div> 
    <div class="grid-item" style="height:150px;"> <div>9</div> </div> 
    <div class="grid-item" style="height:180px;"> <div>10</div> </div> 
    <div class="grid-item" style="height:150px;"> <div>11</div> </div> 
    <div class="grid-item" style="height:160px;"> <div>12</div> </div> 
    <div class="grid-item" style="height:140px;"> <div>13</div> </div> 
    <div class="grid-item" style="height:140px;"> <div>14</div> </div> 
    <div class="grid-item" style="height:220px;"> <div>15</div> </div> 
</div><!--grid--> 
</div><!--grid holder--> 
<div>Section to come after gallery items</div> 
+0

{위치 : 절대} – NTL

답변

1

실제로 작동합니다. 그것을 체크 아웃 : https://jsfiddle.net/ssdfjoLp/1/

두 문제 :

  1. 당신은
  2. jsfiddle는 기본적으로 자바 스크립트 온로드를 실행 jsfiddle하는 jQuery를 추가해야합니다. 어느 window.addEventListener("load", renderGrid, false); 제거하거나 석공 술 후 렌더링 바닥 글을 얻을 수 addEventListener

없이 renderGrid()을 사용하여 얻을, 당신은 수동으로 가장 낮은 그리드 항목의 최대 높이를 기반으로 컨테이너의 높이를 설정해야합니다. 당신은 그것을 세부적으로 조정해야하지만이 작품 : 텍스트 때문에 당신의 `.grid 항목의 보이지 않는 https://jsfiddle.net/ssdfjoLp/3/

function renderGrid(){ 
    var blocks = document.getElementById("grid_container").children; 
    var pad = 0, cols = 3, newleft, newtop; 

    var max_height = 0; 

    for(var i = 1; i < blocks.length; i++){ 
     if (i % cols == 0) { 
      newtop = (blocks[i-cols].offsetTop + blocks[i-cols].offsetHeight) + pad; 

      // Get maximum height plus item height 
      max_height = Math.max(max_height, newtop + blocks[i-cols].offsetHeight) 

      blocks[i].style.top = newtop+"px"; 
     } else { 
      if(blocks[i-cols]){ 
       newtop = (blocks[i-cols].offsetTop + blocks[i-cols].offsetHeight) + pad; 
       blocks[i].style.top = newtop+"px"; 
      } 
      newleft = (blocks[i-1].offsetLeft + blocks[i-1].offsetWidth) + pad; 
      blocks[i].style.left = newleft+"px"; 
     } 
    } 

    // Set the height of grid_container 
    $('#grid_container').css('height', max_height) 
} 
window.addEventListener("load", renderGrid, false); 
window.addEventListener("resize", renderGrid, false); 

var totalheight = $('#grid_container').height(); 
$('#heightholder').html('container height: '+totalheight+'px'); 
+0

덕분에'재산, 나는 jsfiddle의 기능을 업데이트 한 . 그러나 이제는 문제를 명확하게 보여 주며 바닥 글은 눈금으로 숨겨집니다. – rainerbrunotte

+0

는 바닥 글을 아래로 이동하기위한 대답을 업데이트했습니다. 만약 당신이'position : absolute'을 사용한다면, 그 요소는 다른 요소들에 영향을 미치지 않을 것입니다. 따라서 절대가 아닌 컨테이너의 높이를 설정하고 다른 요소를 아래로 이동해야합니다. –

+0

안녕하세요, 갤러리에서 4 개 미만의 항목이있을 때 높이 보정이 작동하지 않는다는 것을 다시 눈치 챘습니까? 이 문제를 조정하는 방법에 대한 아이디어가 있습니까? 각 열 (각 열의 모든 마지막 자식 div에서 offsetHeight 및 offsetTop을 가져옴)을 사용하여 각 열의 높이를 구해서 시도했지만 갤러리에 단 하나의 항목 만 있으면 작동하지 않습니다. 그것은 나를 미치게합니다. 여기를 참조하십시오 http://stackoverflow.com/questions/38834843/javascript-element-offsetheight-returns-returns-0-in-for-loop – rainerbrunotte

관련 문제