2012-03-22 1 views
5

빈 포장 알고리즘을 제안하기 전에 요소 순서를 변경하고 원하는대로 배열 할 수 있다고 가정합니다. 주문 및 배열에 대한 제한 사항이 있음을 읽으면서주의하십시오.div 커닝 알고리즘

분명히 커닝 div와 같은 것은 없지만 생각할 수있는 가장 적절한 용어입니다. 기본적으로 페이지, div 및 imgs 요소가 고정 된 너비와 높이로 많은 요소가 있습니다. 그들은 순서대로 있어야하며 (연대순으로) 왼쪽에서 오른쪽, 위에서 아래로 표시되어야합니다. 공백을 가능한 한 균일하게 만드는 방식으로 요소를 "커닝"하고 싶습니다. 수평으로 구현하는 것은 쉬운 일이지만 수직 공백은 더 어렵습니다. 패킹 된 요소의 가장 바깥 쪽 가장자리 주위의 고르지 않은 초과 공백이 허용됩니다.

저는 정말 바보 같은 해결책으로 생각했습니다. 저는 1000px와 같은 것으로 포장 될 영역의 최대 너비를 설정할 수있었습니다. 그런 다음 1000 개의 인덱스가있는 배열을 유지하여 화면의 픽셀 열의 아래쪽을 추적 할 수 있습니다. 새 요소를 추가 할 때 간격을 약간 늘려야하는지 알 수 있습니다. 왼쪽 또는 오른쪽으로 조금씩 이동하면 위로 이동할 수 있습니다.

내가 말했듯이 그것은 정말 바보 같은 해결책입니다. 내가 사용할 수있는 알고리즘이 있습니까? 아니면 유사한 패킹 문제를 처리해야하는 알고리즘이 있습니까?

UPDATE : 주석 질문 당

. 요소는 임의의 폭과 높이를가집니다. 내 테스트 케이스는 placekitten.com의 이미지로 200 ~ 300 픽셀 범위의 무작위 너비와 높이를 가진 100 개의 이미지 태그를 생성하고 생성 된 순서대로 페이지에 이미지를 정렬하는 것입니다.

html 페이지를 만들고 아래 코드를 머리에 던져 내가 원하는 위치로 이동하십시오. (일반적인 코드 품질에 대한 의견을 말하지 말고 몇 가지 최적화가 있다는 것을 알고 있습니다. 실제로이 코드를 10 분 안에 데모로 함께 던졌습니다.) :

<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.4/jquery.min.js"></script> 
<script> 
var maxwidth = window.innerWidth - 80; 
    function justify(row, filled) 
    { 
     var remaining = maxwidth - filled + 30, 
      imgs = $('img',row), 
      margin = Math.floor((remaining/imgs.length)/2); 
     $(imgs).each(function(){ this.style.marginLeft=margin+"px";this.style.marginRight=margin+"px"}); 
    } 

    $(function() 
    { 
     var row = document.createElement('div'), 
      filled = 0; 
     document.body.appendChild(row); 
     for (var i = 0; i < 100; ++i) 
     { 
      var img = document.createElement('img'), 
       width = Math.floor(200 + Math.random() * 100), 
       height = Math.floor(200 + Math.random() * 100); 
      if ((filled + width) > maxwidth) 
      { 
       justify(row, filled); 
       row = document.createElement('div'); 
       filled = 0; 
       document.body.appendChild(row); 
      } 
      filled += width; 
      img.src = "http://placekitten.com/" + width + "/" + height; 
      row.appendChild(img); 
     } 
     justify(row,filled); 
    }) 
</script> 
<style> 
    img{position:relative; vertical-align:middle} 
</style> 
+0

jquery 플러그인을 사용하여 높이를 수정했거나 한 번에 'n'개의 많은 요소를 jQuery에서 높이로 가져온 다음 요소를 행의 처음부터 끝까지 표준화하고 행마다 반복하여 표준화 했습니까? 아니면 뭐 그런 거니? 너 뭐 해봤 니? – MyStream

+0

@MyStream 나는 수직 높이를 다루려고하지는 않았지만, 가로줄을 가로 지르는 요소를 정당화 할 수있다. 어려운 비트는 수직 간격입니다. 요소를 모두 같은 크기로 만들면이 문제의 요점을 완전히 무시할 수 있으며 페이지에서 재미 있지는 않습니다. – Endophage

+1

다양한 너비의 요소가 있습니까? 아니면 다양한 높이의 기둥과 더 비슷합니까? 지금과 같이 보이고 나중에 보길 원하는 모습의 스크린 샷을 통해 문제를 더 쉽게 이해할 수 있습니다. – AlexMA

답변

3

나는 유사한 문제에 사용 된 Masonry Plugin을 보았다.

ColumnizerjLayout과 같은 유사한 플러그인을 사용해보세요.

행운을 비네.

+0

건배! 벽돌은 꽤 굉장해 보이고, 분명히 소용돌이 치고 다시보고 할 것입니다. – Endophage

+0

메이슨 (Masonry)이 좋은 대답을했기 때문에이 대답을 받아 들였습니다. 그러나 다양한 내부 레이아웃을 가진 고정 된 높이와 너비의 템플릿을 만드는 해결책을 사용하기로 결정했습니다. 이렇게하면 더 깔끔하고 채워진 페이지를 만들 수 있습니다. 벽돌은 물건의 크기에 상당한 차이가있을 때 많은 큰 격차를 남겼습니다. – Endophage

관련 문제