【问题标题】:Best practice for form layout in html -- table or flow?html中表单布局的最佳实践——表格还是流?
【发布时间】:2017-01-27 17:23:30
【问题描述】:

在 html 中布局表单的最佳做法是什么?特别是您有一组带有标签的字段和可能的错误指示符。我能做的最好的就是使用表格,但这在面向 css 的布局设计中效果不佳。例如:

<table>
  <tr>
    <td>Name:</td>
    <td><input type="text" /></td>
    <td style="display: none" id="NameError">*</td>
  </tr>
  <tr>
    <td>Phone:</td>
    <td><input type="text" /></td>
    <td style="display: none" id="PhoneError">*</td>
  </tr>
  <tr>
    <td>Birthday:</td>
    <td><input type="text" /></td>
    <td style="display: none" id="BirthdayError">*</td>
  </tr>
</table>

这似乎不是很 CSS,但我不确定如何使用面向 css 的布局来使其正常工作。

什么是最佳实践?

【问题讨论】:

  • @WTP - 严格来说,
    是一个定义列表(项目及其定义的列表),所以不是特别合适,IMO - 但是,我已经看到它们以这种方式使用。
  • 什么是“最佳实践”和什么是“实用”有时是不同的东西。表格(而非页面)布局相对于 CSS 的优势在于多点。 1) 桌子是自古以来的基石技术。每个浏览器都知道如何呈现它们,并以相同的方式呈现它们,它们不会很快消失,也不会被“修改”并在未来产生意外行为。
  • 而且 2) 表格布局实际上比 div 和 span 的等效 CSS 样式简单得多。列宽是(或可以保留)自动处理宽度的大小以动态匹配内容,使垂直和水平对齐变得微不足道。尽管具有 Balrog 的所有特性,表格仍然可以响应现代 css 样式,例如 min-width 和 max-width 来控制宽度/溢出。

标签: html css html-table


【解决方案1】:

我不了解你们,但我不会在表单布局中使用太多标记。

这是一个简单登录表单的标记(没有布局标记,即 div、表格等)

<form method="post">
    <label>Username</label>
    <input type="text" name="username" />

    <label>Password</label>
    <input type="password" name="password" />

    <input type="submit" name="Log In" />
</form>

这是表单的 CSS

label,input{float:left}
label,input[type="submit"]{clear:left}

这是结果

令人惊奇的是:

  • 缺少标记
  • 缺少 CSS
  • 灵活性

如果您查看 css,label 元素正在向左清除(并向左浮动)。这意味着标签将与它的同伴inputs 一起浮动,但是每个label 将是一个新行。

这使得添加额外输入变得非常容易。甚至输入后的验证消息

以这个表格为例

<form method="post">
    <label>Name</label>
    <input type="text" name="username" />

    <label>Password</label>
    <input type="password" name="password" />

    <label><abbr title="Date of Birth">D.O.B.</abbr></label>
    <input type="text" name="dob_day" />
    <input type="text" name="dob_month" />
    <input type="text" name="dob_year" />

    <input type="submit" name="Log In" />
</form>

有了这个 CSS

label,input{float:left}
label,input[type="submit"]{clear:left}
input[name^="dob_"]{width:44px;margin:2px}
label{width:70px}

我们得到

真的就是这么简单:)

使用这个概念,您可以创造大量的可能性,而且您再也不用使用表格进行布局了!

【讨论】:

    【解决方案2】:

    使用实际的 &lt;label&gt; 元素作为字段标签,这对可用性也有好处,并使用 CSS 适当地设置它们的样式。

    例如,

    <label for="name">Name</label> <input type="text" name="name">

    然后在您的 CSS 中,您可以为 LABEL 元素设置样式,例如 display:block 和您想要的宽度,以及适当的 clear 值。

    对于复选框/单选输入,输入本身应位于 &lt;label&gt; 元素内 - 这意味着标签本身应可单击以选择该输入,例如:

    <label for="mycheckbox"> <input type="checkbox" name="mycheckbox"> Tick me if you dare</label>

    【讨论】:

    • 你能说得更具体一点吗?我不想在标签上设置明确的宽度,我希望控件占用它们需要的空间,然后让标签占用其余空间,就像它们在上面的表格布局中所做的那样.例如:jsfiddle.net/roger_davis/7h3bC 看起来像地狱。
    【解决方案3】:

    可以说表格是表格数据,所以表格是可以接受的。正如大卫所说,他们的主要问题是你想使用正确的标签标签。

    不过,在您的示例中,我不确定您从使用 CSS 表格中获得了什么。

    【讨论】:

    • devil 的拥护者说,通过使用表格而不是 CSS,他在将相同的标记部署到多个网站方面获得了更“稳健”的布局,这些网站可能每个网站都有自己不同的首选宽度“列”。如果您想要相同类型的健壮的非表格布局,使用 div 和浮动往往需要您指定指定的宽度......我总是发现自己调整 CSS 以匹配每个特定站点,而不仅仅是一般的“一刀切”可悲的解决方案...
    • 哈哈...哎呀。我的意思是“不确定在表格上使用 CSS 会获得什么”。至少在给出的示例中,我会说表格是最有意义的。
    【解决方案4】:

    最佳实践 = 切勿使用表格进行布局。

    您可以尝试 CSS 框架,例如蓝图我们的 960 网格系统。

    【讨论】:

    • ... 除非您正在显示表格数据,在这种情况下,使用 作为结构化选项总是合适的。尽管您应该避免使用
      标签来修改布局,但按照预期的方式使用 HTML 标签并没有错。在
      中呈现表格数据不会违反结构和样式的分离;您是在告诉消费者,“这是结构化的表格数据!”
    • 是的。我同意。这就是为什么我说布局;-)就总体布局而言。
    • 我们意见一致——我只是在扩展您的答案,而不是不同意。
    【解决方案5】:

    “最佳实践”是使用表格来完成它的用途 (represent data),并使用 div、span 或其他元素的组合来设置输入表单的样式。

    【讨论】:

    • 你能提供一个这样做的样本吗?我试图避免为此使用表格,但这里的所有聪明人似乎都无法提出一个相当强大的可行解决方案。作为第二个数据点,我查看的几乎所有大型网站都采用表格或固定宽度列的方法,这两种方法都不理想。
    • @Roger:这是一个使用 div 表单的好例子:secure.blippy.com/signup
    • @Brad Christie:您的示例使用固定宽度的列。
    【解决方案6】:

    在此处发布我对您的后续问题的回答,因为它可能会作为重复而被关闭。

    我不确定浏览器对此的支持有多好,在 FF4 中测试:http://jsfiddle.net/shanethehat/7h3bC/11/

    <div id="tableForm">
        <div class="tableRow">
            <div class="tableCell">
                <label for="mycheckbox">  Tick me if you dare</label>
            </div>
            <div class="tableCell">
                <input type="checkbox" name="mycheckbox" id="mycheckbox">
            </div>
        </div>
        <div class="tableRow">
            <div class="tableCell">
                <label for="mytext">  Give me some text test test</label>
            </div>
            <div class="tableCell">
                <input type="text" name="mytext" id="mytext">
            </div>
        </div>
    </div>
    
    
    div#tableForm {
     display:table;   
    }
    div.tableRow {
      display:table-row;  
    }
    div.tableCell {
        display:table-cell;   
        width:inherit;
    }
    

    是的,我知道,我刚刚使用 div 创建了一个表格。但关键是这很容易访问并且在语义上是正确的。

    编辑:在 IE7 中惨遭失败,其中固定宽度是唯一的方法,但 8 和 9 似乎没问题。

    Edit2: 切换标签/字段并设置右对齐:http://jsfiddle.net/shanethehat/7h3bC/12/。在这一点上,标记变得有点沉重。 :first-child 可以替代使用 left 类,但代价是 IE8。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-09
      • 1970-01-01
      • 2014-06-21
      • 1970-01-01
      相关资源
      最近更新 更多