Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建具有动态扩展列数以适应屏幕大小的html表_Javascript_Jquery_Html - Fatal编程技术网

Javascript 创建具有动态扩展列数以适应屏幕大小的html表

Javascript 创建具有动态扩展列数以适应屏幕大小的html表,javascript,jquery,html,Javascript,Jquery,Html,我有一个很长的数据列表(例如,状态及其缩写),我想在HTML表中显示。我不希望在2 x 50表格中显示数据,而是希望它在更大的屏幕上更紧凑(因此用户不需要上下滚动,但仍然不需要水平滚动) 因此,这将动态增长: State | Ab ------------------- Alabama | AL Alaska | AK Arizona | AZ Arkansas | AR California | CA Colorado | CO Connec

我有一个很长的数据列表(例如,状态及其缩写),我想在HTML表中显示。我不希望在2 x 50表格中显示数据,而是希望它在更大的屏幕上更紧凑(因此用户不需要上下滚动,但仍然不需要水平滚动)

因此,这将动态增长:

State | Ab ------------------- Alabama | AL Alaska | AK Arizona | AZ Arkansas | AR California | CA Colorado | CO Connecticut | CT 州| Ab ------------------- 阿拉巴马州 阿拉斯加州 亚利桑那州 阿肯色州 加利福尼亚州 科罗拉多公司 康涅狄格州 致:

州| Ab |州| Ab| -------------------------------------- 加利福尼亚州阿拉巴马州| 阿拉斯加|阿克|科罗拉多|公司| 亚利桑那州康涅狄格州亚利桑那州康涅狄格州| 阿肯色州| 或者这个:

State | Ab | State | Ab | State | Ab | --------------------------------------------------------- Alabama | AL | Arkansas | AR | Colorado | CO | Alaska | AK | California | CA | Connecticut | CT | Arizona | AZ | 州| Ab |州| Ab |州| Ab| --------------------------------------------------------- 阿拉巴马州阿肯色州阿肯色州科罗拉多州| 阿拉斯加|阿克萨|加利福尼亚|加利福尼亚|康涅狄格州|康涅狄格州|| 亚利桑那州| 等等

取决于屏幕宽度


我使用jQuery在Rail 3应用程序中执行此操作,因此我更喜欢jQuery解决方案,但对任何想法都持开放态度。

找不到现成的解决方案,但此功能应该可以做到这一点

/*
This function will create a table with fixed `COL_WIDTH' (default=150 px) 
that uses as many columns as can be fit into the HTML element with id `table_id'.

A one-dimensional array of values to fill the table with should be passed in as 
`data'.
*/
function fillScreenWithData(table_id, data, COL_WIDTH){
    if (!COL_WIDTH) COL_WIDTH = 150;

    TABLE = $(table_id);
    alert(TABLE);
    TABLE_STRING = "<table>"
    var doc_width = TABLE.width();
    var num_cols = Math.floor(doc_width / COL_WIDTH);
    var num_rows = Math.ceil(data.length / num_cols); 

    for (var i = 0; i < num_rows; i++){
        TABLE_STRING += "<tr>";
        for (var j = 0; j < num_cols; j++){
            TABLE_STRING += "<td>";
            index = i + j*num_rows;
            if (index < data.length) {
                TABLE_STRING += data[index];
            }
            TABLE_STRING += "</td>"
        }
        TABLE_STRING += "</tr>"
    }
    TABLE_STRING += "</table>"
    TABLE.html(TABLE_STRING);
}

// probably fetch this JSON array of data with an AJAX request
var data = ["Alabama", 
        "Alaska",
        "Arkansas",
        "California",
        "Colorado",
        "Connecticut",
        "Extra Item",
        ]

// run the function on page load
$(function(){fillScreenWithData("#table", data)});
/*
此函数将创建具有固定“COL_WIDTH”(默认值为150 px)的表格
使用id为“table_id”的HTML元素中尽可能多的列。
要填充表的一维值数组应作为
`数据'。
*/
函数fillScreenWithData(表id、数据、列宽度){
如果(!COL_WIDTH)COL_WIDTH=150;
TABLE=$(TABLE_id);
警报(表);
表_STRING=“”
var doc_width=TABLE.width();
var num\u cols=数学地板(文档宽度/列宽度);
var num_rows=Math.ceil(data.length/num_cols);
对于(变量i=0;i
这是一个无表解决方案的演示。它当前仅设置为在页面加载时排列列,并且需要一些小的添加来调整大小处理

演示:

它基于我使用的json数组,数组如下所示:

   [{"state":"AK","name":"Alaska"}........]
html可以被发送到页面而不需要解析json,在获取状态列表的长度方面需要细微的差异

HTML:

JS:

$(函数(){
/*将json解析为html*/
var html=[];
$.each(状态,函数(){
push(stateContainer(this.name,this.state));
});    
html.push(“”);
$('#state_list').html(html.join('')
/*结束将json解析为html*/
var listW=160,/*列宽,包括边距,由css设置*/
contW=$('#state_wrap').width();
var num_cols=数学地板(续/列表)
/*创建标题*/
var topHtml=[];
对于(i=0;i
根据浏览器要求和列标题对您的重要性,css3具有可以设置的列宽css属性。(-webkit和-moz前缀当前是必需的。)

相同类型的问题已经得到了回答,因此在NNNN用户给出的答案中,您需要再添加一列:)为什么不希望使用表来表示数据?
   [{"state":"AK","name":"Alaska"}........]
<div id="state_wrap">
    <div id="state_header"></div>
    <div id="state_list"></div>   
</div>
.state{  width:150px;  border:1px solid grey; border-top:none}
.st_name{ width: 120px;float:left}
.st_ab{ width:30px; margin-left: 120px;}
#state_header .state{
    font-weight:bold;
    color:blue;
    margin-right:10px;
    width: 150px;
    float:left;
}
.column{ width: 152px; float:left;margin-right:10px;}
$(function() {
    /* parse json to html*/
    var html = [];    
    $.each(states, function() {
        html.push(stateContainer(this.name, this.state));
    });    
    html.push('<div style="clear:both"></div>');    
    $('#state_list').html(html.join(''))
     /* END parse json to html*/

    var listW = 160, /* column width, including margin, set by css*/
        contW = $('#state_wrap').width();
    var num_cols = Math.floor(contW / listW)
    /* create headings*/
    var topHtml = [];
    for (i = 0; i < num_cols; i++) {
        topHtml.push(stateContainer('State', 'Abr'))
    }

    $('#state_header').html(topHtml.join(''));
    /*END create headings, START: create columns*/
    var start = 0,
        end = 0;
    var state_per_col = Math.floor(states.length / num_cols);
    var $states = $('#state_list .state')
    for (i = 0; i < num_cols; i++) {
        start = end;
        end = start + state_per_col + 1;
        $states.slice(start, end).wrapAll('<div class="column"></div>')
    }
});

function stateContainer(name, abr) {
    return '<div class="state"><div class="st_name">' + name + '</div><div class="st_ab">' + abr + '</div></div>';
}