我正在使用javascript构建一个fluid(html)网格。我喜欢使用装箱算法来订购网格项目。网格应按百分比或网格中给定的列数划分列。
我一直在寻找或创建一个算法,它可以“平均”划分列(如下面的例子)。由于许多浏览器处理这种不同的(亚像素渲染),我喜欢用JavaScript设置列宽我喜欢google chrome(38.0.2125.104)划分像素的方式。希望有人能帮助我或者告诉我这是怎么做到的Chrome如何做到这一点的示例:
宽度:100px-3列(33.333333333%)
33px 34px 33px|
宽度:100px-8列(12.5%)
13px | 12px | 13px | 12px | 13px | 12px | 13px | 12px
宽度:99px-4列(25%)
25px 25px 24px 25px
宽度:99px-8列(12.5%)
12px 13px 12px 13px 12px 12px 13px 12px
我已经找到了剩下的,但我甚至不知道这是不是一条路。我做了一些试验,试图重现上述情况,但毫无希望地失败了。

<div class="grid">
    <div class="item"></div>
    <div class="item"></div>
    <div class="item"></div>
</div>

var x = 3; //divisor (3 columns)
var y = 100; //number (100 px)
var rem = y % x; //remainder (modulo (or bitwise))

console.log(rem); //output: 1

一个简单的jsfiddle:http://jsfiddle.net/dgvc268n/。以确定我的问题是清楚的。我主要寻找算法方面的帮助(像chrome那样重新创建项的划分(width))以及get offsetwidth或类似实现的代码。

最佳答案

jsFiddle Demo width : 100px - 3 columns (33.333333333%)
jsFiddle Demo width : 99px - 4 columns (25%)
一种方法是采用一个列数组和一个父网格,然后遍历每一列和每一列中的每一项,根据父网格的宽度和每一列的剩余部分更改宽度。

function fluid(grid,columns){
 var colCount = columns.length;
 var gridWidth = grid.clientWidth;
 var colWidth = gridWidth / colCount;
 if( parseInt(colWidth,10) === colWidth ){
  for(var i = 0; i < colCount; i++){
   var col = columns[i];
   for(var n = 0; n < col.length; n++){
    col[n].style.width = colWidth + "px";
   }
  }
 }else{
  var remainder = gridWidth - parseInt(colWidth,10) * colCount;
  var added = 0;
  for(var i = 0; i < colCount; i++){
   var calcWidth;
   if( i > 0 && added < remainder ){
    added++;
    calcWidth = parseInt(colWidth,10)+1 + "px";
   }else{
    calcWidth = parseInt(colWidth,10) + "px";
   }
   var col = columns[i];
   for(var n = 0; n < col.length; n++){
    col[n].style.width = calcWidth;
   }
  }
 }
}

10-05 20:54