【问题标题】:How can I get grid row/col position given an item index如何在给定项目索引的情况下获取网格行/列位置
【发布时间】:2013-03-19 21:10:02
【问题描述】:

如果我有一个宽度为 1000 像素的容器,其中填充了所有宽度为 200 像素的项目。如何计算瓷砖的行/列位置?

更详细的解释:

我知道的唯一变量是容器的宽度(上例中为 1200 像素)、项目的宽度(上例中为 200 像素)和项目索引(从 1 开始)。

仅给出上述信息,我如何通过使用 javascript 输入其索引来计算单元格的行和列。

例如给定每行的最大项目值 6 (可以很容易地从项目宽度和容器宽度计算出来),我需要能够计算出项目编号 7 是在第 2 行第 1 列

容器和项目的宽度可能并不总是完全可整除,因此该等式必须考虑每行末尾所需的任何额外空白,并自然地将项目包装到下一行,就像它们在 html 浮动布局中一样。

提前致谢

编辑:

通过执行以下操作,我已经设法非常准确地获得了该行:

var itemsperrow = Math.floor(containerwidth/ itemwidth);
var column = Math.ceil(itemindex / itemsperrow )

这是从 1 而不是 0 开始的项目索引;

【问题讨论】:

  • 您使用的是什么 HTML 和 CSS?
  • 能否请您提供您尝试过的内容以及它如何/为什么不起作用?
  • @DavidThomas HTML/CSS 在很大程度上与这个问题无关,它纯粹是我正在寻找的数学。我只需要了解如何通过索引计算项目的行/列。如果有帮助,所有项目都是固定宽度(200px)和(显示:内联块)。容器宽度会改变,但我现在总是会在执行行/列计算之前该容器的宽度是多少。
  • @JamesMontagne 我尝试了几个粗略的公式,但没有一个是正确的。数学对我来说是一个真正的弱点。我已经设法使用以下公式 Math.ceil(index / columnstotal) 获得该行,columnstotal 的计算方式如下:Math.floor(containerwidth/ itemwidth)。虽然我还没有用大量的项目对此进行测试。
  • items index' 是什么意思?如果您不知道框的高度,则不能定义 6 之后的单元格。

标签: javascript math grid


【解决方案1】:
  1. 通过取(行宽)/(元素宽度)的底数来确定一行中有多少元素。
  2. 除以每行元素给出的索引号(您刚刚算出)。这将为您提供行位置。
  3. 接下来通过从步骤 1 中获取剩余部分来找到列位置(您可以使用模数)。将余数乘以每行的元素数。那将是它所在的列。

示例:每行 3 个元素,第 4 个元素: floor(4/3) = 1(第 1 行) 余数 = (4%3)=1(列位置)

注意您从哪个索引开始(无论是 0 还是 1)。此示例从 1 开始。如果您想从 0 开始,则通过减去 1(索引号)将其移入。

【讨论】:

  • 完美!谢谢你。我似乎非常接近,但这已经成功了:)
  • 应该是example: 3 elements per row, 4th element: ceil(4/3) = 1 (row 1) remainder = (4%3)=1 (column position)第一步使用floor,第二步使用ceil。
  • 对我来说,我想说这个例子不是那么容易理解,JavaScript 中的问题,所以这个例子也应该是,使用变量和语句,而不是一行文字描述。
【解决方案2】:

这样的?

var cells = document.querySelectorAll('.container').children(),
    container_width = 1200,
    cell_width = 200,
    total_cols = container_width/cell_width,

    calculateCoords = function (index) {
        return coords {
            col: index%total_cols,
            row: Math.ceil(index/total_cols)
        };
    };

//EXAMPLE USAGE FOR CELL INDEX = 3;
var index_3_coords = calculateCoords(3);
console.log(index_3_coords); //{ col: 3, row: 1 }

【讨论】:

  • 感谢代码示例。这完美地做到了。不幸的是,user829323 比你早了几分钟,我已经给了他答案。我希望你不要介意。干杯!
  • 我会注意到这里使用的 ceil 可以正常工作,我必须在接受的 ceil 答案的第二步更改地板,以使该地板正常工作。这是更正确的答案。
猜你喜欢
  • 2021-08-17
  • 2023-03-21
  • 2021-01-11
  • 1970-01-01
  • 2016-01-25
  • 1970-01-01
  • 2011-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多