2012-12-04 46 views
4

编辑解决方案已被发现!检测间隔网格

这是关于它的blog post,这里是Github repo

我正在创建由多个大小的框组成的网格,这些大小设置为高度和宽度 - 但会动态生成,因此每次页面加载时都会有不同的网格。

我的问题 - 我试过使用砌体,但它卷起留下的空白,也试过同位素。我目前正在浮动导致布局中断的左侧元素。

它是如何建成 - 我计算的屏幕尺寸,并确定从1到6的页面最好的列数,然后根据该列宽我算一个“块”这个块本质上是完美的网格。然后我遍历我的元素,并给他们1x1,1x2,2x2尺寸。

The Green spaces are blank areas - black are specifically sized based on their priority

仅供参考这里是另一个随机生成的网格 enter image description here

我的问题 - 是否有检测缺少空间的好办法 - 目前我在把我的红色和黑色的盒子另一个我的“块”网格,这是绿色的,让我看看我缺少空间。我已经阅读过关于背包装箱问题以及装箱问题 - 而且我很难理解其中的任何一种。

我试过了 - 我试图计算,因为我放置块来确定最佳尺寸,但这仍然会导致奇怪的行为。我也尝试使用砌体和同位素。

我很好,有一个衣衫褴褛的底部边缘,但实际的网格不能包含任何间隙。

注意 - 网格由潜在的无限数量的元素组成 - 我一直在考虑是否要从底部区域获取元素并将其复制到缺失的区域中,以避免“转移“元素 - 我只需要知道如何找到缺失的空间。

任何帮助或指向正确的方向将是伟大的!

这里是一个jsfiddle

这里是JS的基本代码...

(function() { 
    GRID = function(el, sel) { 
     var self = this, 
      ran, ranSize, h, w; 

     self.options = { 
      el: $(el), 
      sel: $(sel), 
      cols: 1, 
      block: { 
       height: 0, 
       width: 0 
      }, 
      matrix: { 
       w: [], 
       h: [], 
       t: [], 
       l: [] 
      }, 
      row: { 
       height: 0, 
       width: 0 
      }, 
      col: { 
       height: 0, 
       width: 0 
      } 
     }; 

/* 
     * Size array 
     */ 
     self.sizes = []; 
     self.sizes[0] = [2, 2]; 
     self.sizes[1] = [1, 2]; 
     self.sizes[2] = [1, 1]; 



     self.setup = function() { 

/* 
      * Setup all options 
      */ 
      // block size 
      self.options.block.height = (window.innerWidth/self.cols())/1.5; 
      self.options.block.width = (window.innerWidth/self.cols()); 

      // row 
      self.options.row.width = window.innerWidth; 


      for (var i = 0; i < 60; i++) { 
       $(".grid").append('<div class="box"></div>'); 
      } 

      self.size_boxes(); 


     } 
     self.size_boxes = function() { 

      if (self.cols() == 1) { 
       self.options.sel.height(self.options.block.height); 
       self.options.sel.width(self.options.block.width); 
      } 
      else { 
       self.options.sel.each(function() { 

        $this = $(this); 

        ran = Math.floor(Math.random() * self.sizes.length); 
        ranSize = self.sizes[ran]; 

        if ($this.hasClass('promoted')) { 
         ran = 0; 
        } 
        if ($this.hasClass('post')) { 
         ran = 2; 
        } 
        h = self.options.block.height * self.sizes[ran][6]; 
        w = self.options.block.width * self.sizes[ran][0]; 

        // box sizes 
        $this.height(h); 
        $this.width(w); 
       }); 
      } 
      $(".grid .box").height(self.options.block.height); 
      $(".grid .box").width(self.options.block.width); 
     } 
     self.cols = function() { 
/* 
      * Determine cols 
      */ 
      var w = Math.floor(window.innerWidth); 
      var cols = 0; 

      if (w < 480) { 
       cols = 1; 
      } 
      else if (w > 480 && w < 780) { 
       cols = 2; 
      } 
      else if (w > 780 && w < 1080) { 
       cols = 3; 
      } 
      else if (w > 1080 && w < 1320) { 
       cols = 4; 
      } 
      else if (w > 1320 && w < 1680) { 
       cols = 5 
      } 
      else { 
       cols = 6; 
      } 
      return cols; 
     } 
     self.resize = function() { 
      $(".grid").height(window.innerHeight); 
      self.options.block.height = (window.innerWidth/self.cols())/1.5; 
      self.options.block.width = (window.innerWidth/self.cols()); 

      self.options.row.width = window.innerWidth; 

      self.size_boxes(); 
     } 

     self.setup(); 
     return self; 

    }; 
})(); 
var _GRID = new GRID('.gallery', '.box');​ 
+0

嗨,老兄,我试图采取裂缝在这一点,但我完全被你的问题感到困惑......“把红色和黑色的盒子在块的另一格”真把我也,我不能告诉如果你是统一分配尺寸(1x1,1x2,2x2),或者如果每个块都有不同的尺寸,但也许这只是我的头:) – inorganik

+0

哈哈 - 所以我有两个div绝对定位。 1个网格是完美的框或“块”,这些块的尺寸是根据列数和屏幕宽度计算的。这是绿色的网格(主要是为了看看空白处在哪里)。现在,另一个网格就是我的生活元素。这些被告知占据1×1,1×2和2×2的“块”的空间,因此1块宽,2块高。你在图像中看到的图像是黑色和红色的大小的元素,绿色是显示空间尺寸的基础块... –

+0

你想要创建这样的东西:http://stackexchange.com/sites – inorganik

回答

1

我会跟踪你的“完美网格”的布尔值的内存矩阵。该矩阵存储空格是否被填充。无论您何时放置其中一个箱子,都可以计算哪些方块被占用并更新矩阵。

+0

这是超级接近我一直在想这样做,我会遭到削减他们的思维行...会是像矩阵[0] = [真,真,真,假],martrix [1] = [真,假,假,假]?假设这是一个4列的网格 –

+0

这是一个棘手的问题!您是否也需要逻辑来根据float的性质计算矩阵布尔值:left? – chrisgonzalez

+0

是的,但是你不必将它们想成行。根据你的矩阵格式,你可以像矩阵[行] [列] =真,或矩阵[列] [行] =假一个一个地设置它们。 – JoshNaro

0

如果你放在每栏,只需将申报单中列。举例来说,如果你已经确定,应该有4列:

<div> 
    <div>Column 1, Div 1</div> 
    <div>Column 1, Div 2</div> 
    <div>Column 1, Div 3</div> 
    <div>Column 1, Div 4</div> 
</div> 
<div> 
    <div>Column 2, Div 1</div> 
    <div>Column 2, Div 2</div> 
    <div>Column 2, Div 3</div> 
    <div>Column 2, Div 4</div> 
</div> 
<div> 
    <div>Column 3, Div 1</div> 
    <div>Column 3, Div 2</div> 
    <div>Column 3, Div 3</div> 
    <div>Column 3, Div 4</div> 
</div> 
<div> 
    <div>Column 4, Div 1</div> 
    <div>Column 4, Div 2</div> 
    <div>Column 4, Div 3</div> 
    <div>Column 4, Div 4</div> 
</div> 

当然,如果在各列的div的高度相等,这只会工作。

+0

潜在的是 - 问题在于它们的高度和宽度有所不同。这可能意味着一列可能包含4个元素,而另一列可能包含5个尝试填充该区域的元素。 –