Javascript 创建具有动态扩展列数以适应屏幕大小的html表
我有一个很长的数据列表(例如,状态及其缩写),我想在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| --------------------------------------------------------- 阿拉巴马州阿肯色州阿肯色州科罗拉多州| 阿拉斯加|阿克萨|加利福尼亚|加利福尼亚|康涅狄格州|康涅狄格州|| 亚利桑那州| 等等 取决于屏幕宽度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
我使用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>';
}