- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个由一系列标签和字段组成的流体设计表单,我希望它们一个接一个地流动,并在必要时折叠起来以支持窗口的宽度。 (标签和输入必须作为一个单元流动,一行末尾没有悬挂标签,其输入在下一行。)但是当它们换行时,我希望字段以整齐的方式排列。有什么方法可以用 HTML 和 CSS 做到这一点吗? (不幸的是,我必须支持没有 CSS3 列的旧浏览器 [如果它们在这里能提供帮助的话]。)
我已经尝试了几种方法,例如给标签(好吧,它们中的跨度)固定长度 (您需要单击代码段中的“全屏”按钮,这样代码段窗口的宽度是'不固定):
.wrapped-fields label {
display: inline-block;
}
.wrapped-fields label > span {
display: inline-block;
width: 8em;
white-space: nowrap;
}
<form class="wrapped-fields">
<label>
<span>Short:</span>
<input type="text" size="5">
</label>
<label>
<span>Long label for field:</span>
<input type="text" size="5">
</label>
<label>
<span>Medium label:</span>
<input type="text" size="5">
</label>
<label>
<span>Short:</span>
<input type="text" size="5">
</label>
<label>
<span>Long label for field:</span>
<input type="text" size="5">
</label>
<label>
<span>Medium label:</span>
<input type="text" size="5">
</label>
</form>
...但由于以下几个原因,这并不令人满意:
它要求我为标签跨度设置固定大小,但这些标签的名称可以来自配置,因此我不想在运行时测量每个标签并调整固定大小到最大。
当它们与每列中最长的标签堆叠在一起时看起来还不错:
...但是可怕当他们不是时,例如:
...或者:
理想情况下,每个“列”都将采用其中最长的标签或字段的大小(尽管目前所有字段的大小都相同),相应地,标签+字段对包装。
只有 HTML/CSS 的解决方案失败了,有没有简单的 JavaScript 解决方案? (如果没有,我会写一个复杂的;如果需要的话,我不会要求人们编写大量代码。)
如果相关:
我正在使用 Bootstrap,所以如果网格系统有帮助(我运气不好),我们可以使用它
如果我们需要 JavaScript 解决方案,我会使用 jQuery
最佳答案
要使用 JavaScript 执行此操作,您需要首先确定应该有多少列。如果您在知道列数之前尝试设置宽度,您可能最终会把输入推到最后并搞砸了。
我计算列数的方法是将它们全部排成一行。对于每种可能性,我将最大列宽(和其他额外空间)相加并检查总数是否大于可用空间。如果总数更大,那么我减去一列再试,从而保证最大列数。
最后,当我有了解决方案时,我将每个 span
的 style.width
设置为该列的最大宽度,以便所有 label
每列的大小相同。
一个问题是,如果第一列比其他列窄得多,则该列中除第一个元素外的所有元素都可能无法正确换行。为了解决这个问题,我从可用空间中减去一行中元素的总宽度,然后将每行中最后一个 label
的 margin-right
设置为数字(为了安全起见,减去 4 个像素)。
下面是一个工作示例。继续全屏并调整大小;我有一个 resize
事件处理程序,所以它应该可以工作。
jQuery(function($) {
var availableWidth;
var $elements = $('.wrapped-fields span');
var widths = [];
$elements.each(function setWidth() {
widths.push($(this).width());
});
var inputWidth = $elements.first().parent().width() - widths[0];
function getMaxWidth(size, column) {
var max = 0;
var row = 0;
var length = widths.length;
var index = column + (size * row);
while (index < length) {
width = widths[index];
if (width > max) {
max = width;
}
row++;
index = column + (size * row);
}
return max;
}
function tryGroup(n) {
// Start with inline-block space
var total = 4 * (n - 1);
var maxWidths = [];
var w;
var i = 0;
for (; i < n; i++) {
w = getMaxWidth(n, i);
total += w + inputWidth;
maxWidths.push(w);
}
if (total < availableWidth) {
return [maxWidths, total];
}
}
function alignColumns() {
// Set the global available width
availableWidth = $('.wrapped-fields').width();
var i = widths.length;
var result;
for (; i > 0; i--) {
result = tryGroup(i);
if (result) {
break;
}
}
if (!result) {
console.log('Error: not enough space');
return;
}
var maxWidths = result[0];
var total = result[1];
var size = maxWidths.length;
var afterSpace = availableWidth - total - 4;
$elements.each(function setWidths(index, el) {
var width = maxWidths[index % size];
var parent = el.parentElement;
el.style.width = width + 'px';
if (index % size === size - 1) {
parent.style.marginRight = afterSpace + 'px';
} else {
parent.style.marginRight = '';
}
});
}
alignColumns();
$(window).resize(alignColumns);
});
.wrapped-fields label {
display: inline-block;
}
.wrapped-fields label>span {
display: inline-block;
width: auto;
white-space: nowrap;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>
<form class="wrapped-fields">
<label>
<span>Short:</span>
<input type="text" size="5">
</label>
<label>
<span>Long label for field:</span>
<input type="text" size="5">
</label>
<label>
<span>Medium label:</span>
<input type="text" size="5">
</label>
<label>
<span>Tiny:</span>
<input type="text" size="5">
</label>
<label>
<span>Longer label for field:</span>
<input type="text" size="5">
</label>
<label>
<span>Medium long label:</span>
<input type="text" size="5">
</label>
</form>
关于javascript - 带有可包装的标签+字段单元的表单,但在包装时可以很好地排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38744027/
在有些场景下,我们需要对我们的varchar类型的字段做修改,而修改的结果为两个字段的拼接或者一个字段+字符串的拼接。 如下所示,我们希望将xx_role表中的name修改为name+id。
SELECT incMonth as Month, SUM( IF(item_type IN('typ1', 'typ2') AND incMonth = Month, 1, 0 ) )AS
我最近读到 volatile 字段是线程安全的,因为 When we use volatile keyword with a variable, all the threads read its va
我在一些模型中添加了一个 UUID 字段,然后使用 South 进行了迁移。我创建的任何新对象都正确填充了 UUID 字段。但是,我所有旧数据的 UUID 字段为空。 有没有办法为现有数据填充 UUI
刚刚将我的网站从 mysql_ 更新为 mysqli,并破坏了之前正常运行的查询。 我试图从旋转中提取 id,因为它每次都会增加 1,但我不断获取玩家 id,有人可以告诉我我做错了什么吗?我尝试了将
我在 Mac OS X 上使用带有 Sequel Pro 的 MySQL。我想将一个表中的一个字段(即名为“GAME_DY”的列)复制到另一个名为“DAY_ID”的表的空字段中。两个表都是同一数据库的
问题: 是否有可能有一个字段被 JPA 保留但被序列化跳过? 可以实现相反的效果(JPA 跳过字段而序列化则不会),如果使用此功能,那么相反的操作肯定会很有用。 类似这样的事情: @Entity cl
假设我有一个名为“dp”的表 Year | Month | Payment| Payer_ID | Payment_Recipient | 2008/2009 | July
我将尝试通过我的 Raspberry Pi 接入点保证一些 QoS。 开始之前,我先动手:我阅读了有关 tcp、udp 和 ip header 的内容。在IP header description我看
如果你能弄清楚如何重命名这个问题,我愿意接受建议。 在 Dart 语言中,可以编写一个带有 final 字段的类。这些是只能设置的字段构造函数前 body 跑。这可以在声明中(通常用于类中的静态常量)
你怎么样? 我有两个带有两个字段的日期选择器 我希望当用户选择 (From) 时,第二个字段 (TO) 将是 next day 。比如 booking.com 例如:当用户选择From 01-01-2
我想我已经看到了这个问题的一些答案,这些答案可能与我需要的相差不远,但我对 mysql 的了解还不够确定,所以我会根据我的具体情况提出问题。 我有一个包含多个表的数据库,为此,如果“image”表上的
我在 mySQL 数据库中有 2 个表: customers ============ customer_id (1, 2 ) customer_name (john, mark) orders ==
我正在开发一个员工目标 Web 应用程序。 领导/经理在与团队成员讨论后为他们设定目标。这是一年/半年/季度,具体取决于组织遵循的评估周期。 现在的问题是添加基于时间段的字段或存档上一季度/年度数据的
我正在寻找允许内容编辑器从媒体库中选择多个文件的东西,这些文件将在渲染中列出。他们还需要能够上传文件和搜索。它必须在页面编辑器(版本 8 中称为体验编辑器)中工作。 到目前为止我所考虑的: 一堆文件字
现在,我有以下由 original.df %.% group_by(Category) %.% tally() %.% arrange(desc(n)) 创建的 data.frame。 DF 5),
我想知道是否有一些步骤/解决方案可以处理错误消息并将它们放入 Pentaho 工具中的某个字符串或字段中?例如,如果连接到数据库时发生某些错误,则将该消息从登录到字符串/字段。 最佳答案 我们在作业的
如何制作像短信应用程序一样的“收件人”字段?例如,右侧有一个“+”按钮,当添加某人时,名称将突出显示并可单击,如圆角矩形等。有没有内置的框架? 最佳答案 不,但请参阅 Three20 的 TTMess
是否可以获取记录的元素或字段的列表 通过类型信息类似于类的已发布属性的列表吗? 谢谢 ! 最佳答案 取决于您的delphi版本,如果您使用的是delphi 2010或更高版本,则可以使用“新rtti”
我正在构建一个 SQLite 数据库来保存我的房地产经纪人的列表。我已经能够使用外键来识别每个代理的列表,但我想在每个代理的记录中创建一个列表;从代理商和列表之间的一对一关系转变为一对多关系。 看这里
我是一名优秀的程序员,十分优秀!