$cache[$key] = empty($arr) ? NULL : $arr; return $cache[$key]; } // 门户 获取需要在频道显示的栏目主题数据 function portal_channel_thread($fid) { global $forumlist; if (empty($fid)) return NULL; $orderby = array('tid' => 1); $page = 1; // 遍历所有在频道显示内容的栏目 $category_forumlist = channel_category($fid); $arrlist = array(); $forum_tids = array(); $tidlist = array(); if ($category_forumlist) { foreach ($category_forumlist as &$_forum) { // 频道显示数据 $arrlist['list'][$_forum['fid']] = array( 'fid' => $_forum['fid'], 'name' => $_forum['name'], 'rank' => $_forum['rank'], 'type' => $_forum['type'], 'url' => $_forum['url'], 'channel_new' => $_forum['channel_new'], ); $forum_thread = thread_tid__find(array('fid' => $_forum['fid']), $orderby, $page, $_forum['channel_new'], 'tid', array('tid')); // 最新信息按栏目分组 foreach ($forum_thread as $key => $_thread) { $forum_tids[$key] = $_thread; } unset($forum_thread); } $tidlist += $forum_tids; } unset($category_forumlist); // 获取属性对应的tid集合 list($flaglist, $flagtids) = flag_thread_by_fid($fid); empty($flagtids) || $tidlist += $flagtids; unset($flagtids); // 频道置顶 $stickylist = sticky_list_thread($fid); empty($stickylist) || $tidlist += $stickylist; // 在这之前合并所有二维数组 tid值为键/array('tid值' => tid值) $tidarr = arrlist_values($tidlist, 'tid'); // 在这之前使用$tidarr = array_merge($tidarr, $arr)前合并所有一维数组 tid/array(1,2,3) if (empty($tidarr)) { $arrlist['list'] = isset($arrlist['list']) ? array_multisort_key($arrlist['list'], 'rank', FALSE, 'fid') : array(); return $arrlist; } $tidarr = array_unique($tidarr); $pagesize = count($tidarr); // 遍历获取的所有tid主题 $threadlist = well_thread_find_asc($tidarr, $pagesize); // 遍历时为升序,翻转为降序 $threadlist = array_reverse($threadlist); foreach ($threadlist as &$_thread) { // 各栏目最新内容 isset($forum_tids[$_thread['tid']]) AND $arrlist['list'][$_thread['fid']]['news'][$_thread['tid']] = $_thread; // 全站置顶内容 isset($stickylist[$_thread['tid']]) AND $arrlist['sticky'][$_thread['tid']] = $_thread; // 首页属性主题 if (!empty($flaglist)) { foreach ($flaglist as $key => $val) { if (isset($val['tids']) && in_array($_thread['tid'], $val['tids'])) { $arrlist['flaglist'][$key][array_search($_thread['tid'], $val['tids'])] = $_thread; ksort($arrlist['flaglist'][$key]); $arrlist['flag'][$_thread['tid']] = $_thread; } } } } unset($threadlist); if (isset($arrlist['sticky'])) { $i = 0; foreach ($arrlist['sticky'] as &$val) { ++$i; $val['i'] = $i; } } if (isset($arrlist['flag'])) { $i = 0; foreach ($arrlist['flag'] as &$val) { ++$i; $val['i'] = $i; } } if (isset($arrlist['flaglist'])) { foreach ($arrlist['flaglist'] as &$val) { $i = 0; foreach ($val as &$v) { ++$i; $v['i'] = $i; } } } isset($arrlist['list']) AND $arrlist['list'] = array_multisort_key($arrlist['list'], 'rank', FALSE, 'fid'); return $arrlist; } ?>javascript - How can I get grid rowcol position given an item index - Stack Overflow
最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

javascript - How can I get grid rowcol position given an item index - Stack Overflow

programmeradmin0浏览0评论

If I have a container with a width of 1000px, filled with items all of which are 200px in width. How can I calculate that tiles row/column position?

To explain in more detail:

The only variables I will know is the width of the container (1200px in the above example) , the width of an item (200px above) and the items index (starting at 1).

Given only the above information, how can I calculate the row and column of a cell by inputting its index using javascript.

e.g. Given a maximum items per row value of 6 (which can easily be calculated from the item width and container width), I need to be able to calculate that item number 7 is at row 2, column 1.

The container and item width's might not always be divisible exactly so the equation will have to account for any extra whitespace requires at the end of each row and naturally wrap the items onto the next row as they would in an html float layout.

Thanks in advance

EDIT:

I have managed to get the row quite accurately by doing the following:

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

This is with the items index starting at 1 and not 0;

If I have a container with a width of 1000px, filled with items all of which are 200px in width. How can I calculate that tiles row/column position?

To explain in more detail:

The only variables I will know is the width of the container (1200px in the above example) , the width of an item (200px above) and the items index (starting at 1).

Given only the above information, how can I calculate the row and column of a cell by inputting its index using javascript.

e.g. Given a maximum items per row value of 6 (which can easily be calculated from the item width and container width), I need to be able to calculate that item number 7 is at row 2, column 1.

The container and item width's might not always be divisible exactly so the equation will have to account for any extra whitespace requires at the end of each row and naturally wrap the items onto the next row as they would in an html float layout.

Thanks in advance

EDIT:

I have managed to get the row quite accurately by doing the following:

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

This is with the items index starting at 1 and not 0;

Share Improve this question edited Mar 19, 2013 at 21:22 gordyr asked Mar 19, 2013 at 21:10 gordyrgordyr 6,27614 gold badges67 silver badges123 bronze badges 6
  • 1 And what HTML and CSS are you working with? – David Thomas Commented Mar 19, 2013 at 21:13
  • Can you please include what you have tried and how/why it didn't work? – James Montagne Commented Mar 19, 2013 at 21:14
  • @DavidThomas the HTML/CSS is largely irrelevant to this question and it is purely the math that I am looking for. I just need to understand how to calculate row/column for an item by its index. If it helps all items are fixed width (200px) and (display: inline-block). The container width will change but I will always now what the width of that container is in advance to performing the row/column calculation. – gordyr Commented Mar 19, 2013 at 21:17
  • @JamesMontagne I've tried several rough formulas, but none have been correct. Math is a real weak point for me. I have managed to get the row using the following formula Math.ceil(index / columnstotal) with columnstotal being calculated like so: Math.floor(containerwidth/ itemwidth). Though I haven't tested this with huge numbers of items yet. – gordyr Commented Mar 19, 2013 at 21:19
  • What does it mean items index' ? You can not define cells after 6 if you do not know height of boxes. – inser Commented Mar 19, 2013 at 21:20
 |  Show 1 more comment

2 Answers 2

Reset to default 11
  1. Find how many elements fit in one row by taking the floor of (row width)/(element width).
  2. Divide the index number given by the elements per row (which you just figured out). That will give you the row position.
  3. Next find the column position by taking the remainder portion from step 1 (you can use modulus). Multiply the remainder by the number of elements per row. That will be which column it is in.

example: 3 elements per row, 4th element: floor(4/3) = 1 (row 1) remainder = (4%3)=1 (column position)

Be careful of what index you are starting with (whether it's 0 or 1). This example starts at 1. If you want to start at 0 shift it over by subtracting 1 (the index number).

Something like this?

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 }
发布评论

评论列表(0)

  1. 暂无评论