创建一个 html 表,其中包含动态扩展的列数以适应屏幕大小
Creating a html table with dynamically expanding number of columns to fit screen size
我有一长串数据(例如,国家及其缩写),我想在HTML表格中显示。 与其在 2 x 50 表中显示数据,我希望它对于更大的屏幕更紧凑(因此用户不必上下滚动太多,但仍然不必水平滚动)
因此,这将动态增长:
状态 |血型-------------------阿拉巴马州 |铝阿拉斯加 |AK亚利桑那州 |亚利桑那州阿肯色州 |阿加州 |加州科罗拉多州 |一氧化碳康涅狄格州 |电脑断层扫描
自:
状态 |Ab |状态 |Ab |--------------------------------------阿拉巴马州 |铝 |加州 |加拿大 |阿拉斯加 |AK |科罗拉多州 |一氧化碳 |亚利桑那州 |亚利桑那州 |康涅狄格州 |电脑检查 |阿肯色州 |增强现实 |
或者这个:
状态 |Ab |状态 |Ab |状态 |Ab |---------------------------------------------------------阿拉巴马州 |铝 |阿肯色州 |增强现实 |科罗拉多州 |一氧化碳 |阿拉斯加 |AK |加州 |加拿大 |康涅狄格州 |电脑检查 |亚利桑那州 |亚利桑那州 |
等。。。。
取决于屏幕宽度。
我正在使用jQuery在Rail 3应用程序中执行此操作,因此我更喜欢jQuery解决方案,但对任何想法都持开放态度。
下面是一个无表解决方案的演示。它目前仅设置为在页面加载时排列列,并且需要一些小的添加来处理大小。
演示:http://jsfiddle.net/DPRsj/
它基于我拥有的 json 数组,其数组如下所示:
[{"state":"AK","name":"Alaska"}........]
html 可以发送到页面而无需解析 json,需要获取状态列表长度的微小差异
.HTML:
<div id="state_wrap">
<div id="state_header"></div>
<div id="state_list"></div>
</div>
CSS:(非常基本)
.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;}
.JS:
$(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>';
}
找不到现成的解决方案,但这个函数应该可以解决问题!
/*
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)});
根据浏览器要求以及列标题对您的重要性,css3 具有您可以设置的列宽 css 属性。(当前需要 -webkit 和 -moz 前缀。
<!doctype html>
<html lang="en">
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- Bootstrap CSS -->
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.0.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
<title>Hello, world!</title>
</head>
<body>
<h1>Hello, world!</h1>
<table class="table">
<thead>
<tr>
<th scope="col">#</th>
<th scope="col">First</th>
<th scope="col">Last</th>
<th scope="col">Handle</th>
</tr>
</thead>
<tbody>
<tr>
<th scope="row">1</th>
<td>Mark</td>
<td>Otto</td>
<td>@mdo</td>
</tr>
<tr>
<th scope="row">2</th>
<td>Jacob</td>
<td>Thornton</td>
<td>@fat</td>
</tr>
<tr>
<th scope="row">3</th>
<td colspan="2">Larry the Bird</td>
<td>@twitter</td>
</tr>
</tbody>
</table>
为此使用引导程序。
相关文章:
- Node.js v6.2.0类扩展不是函数错误
- 扩展移相器按钮类不工作
- 在Chrome扩展程序中,是否可以截屏并在弹出窗口中显示屏幕
- 从chrome扩展打开的窗口捕获活动面板中的屏幕
- 创建一个 html 表,其中包含动态扩展的列数以适应屏幕大小
- 所有标签页Chrome扩展程序的屏幕截图
- 需要在Chrome扩展程序中制作部分屏幕截图
- 在 Ajax 将内容扩展到屏幕之外之后,如何找到页面高度
- 从Firefox扩展中获取DOM元素的绝对屏幕边界
- Chrome扩展程序 - 在新选项卡中打开捕获的屏幕截图
- 我可以创建一个Chrome扩展或Firefox插件来拍摄网页的屏幕截图吗
- Chrome -扩展选项屏幕不让我关注下一个领域
- 如何从画布中获取像素数据,其中包含由chrome扩展生成的屏幕截图
- 在页面显示到屏幕之前删除DOM元素(在Chrome扩展中)
- 如何使图像出现在屏幕的中心与谷歌Chrome扩展
- 将屏幕一侧的元素扩展到屏幕底部
- 使用屏幕Chrome扩展捕获音频
- 如何将我的背景图像扩展到整个屏幕
- Jira 日志工作屏幕扩展 - 单击日志工作时的自定义 JavaScript 代码
- 我如何在chrome扩展中使用javascript截取一些特定区域的屏幕截图