如何在没有表格的情况下设置样式并对齐

时间:2009-02-26 17:27:16

标签: html css forms html-table

我已经习惯使用<table>s来完美地对齐我的表单字段。这就是我通常写我的表格的方式:

<table border="0">
   <tr>
     <td><label for="f_name">First name:</label></td>
     <td><input type='text' id='f_name' name='f_name' /></td>
     <td class='error'><?=form_error('f_name');?></td>
   </tr>
</table>

我知道这是不好的做法,我希望使用CSS,<label>s<div>s或更简洁的方法。然而,事实是,<table>s对表格非常有效。一切都完全正确,间距是完美的,所有错误都在彼此之下,等等。

我最近尝试将<dt><dd>标记用于表单,但最终我还是回到了表格,因为它们看起来好多了。

如何在不使用<table>的情况下获得这种对齐的表格布局?

11 个答案:

答案 0 :(得分:26)

这可能得不到很多支持,但这是我的两分钱:

在某些情况下,表格更容易用于布局;例如三列或表格(虽然这里有一些很好的建议,可以做一个纯粹的CSS表单布局,所以不要忽略它们。)

Processes and methodologies can make good servants but are poor masters.
   - Mark Dowd, John McDonald & Justin Schuh 
     in "The Art of Software Security Assessment"

我认为这句话非常强烈地适用于这种情况。如果您的表格布局适合您,不会导致可访问性问题而且不会中断 - 那么请不要修复它。

短语如:“你应该”,“必须”,“永远” - 让我害怕,因为一个尺寸不适合所有人!带着一粒盐的狂热者。

答案 1 :(得分:16)

是的,使用标签和CSS:

<label class='FBLabel' for="FName">First Name</label>
<input value="something" name="FName" type="text" class='FBInput'>
<br>

的CSS:

.FBLabel, .FBInput {
    display:block;
    width:150px;
    float:left;
    margin-bottom:10px;
}

请参阅:http://www.alistapart.com/articles/prettyaccessibleforms

答案 2 :(得分:10)

如果您不使用表格,则需要预先知道标签的宽度。对于多语言网站(i18n)来说,这通常是一个问题。

使用表格,它们可以拉伸以适合不同尺寸的标签。仅靠CSS无法以良好的支持方式做到这一点。

答案 3 :(得分:5)

为什么你不想使用表?听起来他们现在正在为你工作。您是否担心可访问性问题?仅仅因为它是一个表并不意味着可访问性会受到影响。

我想提醒你除了纯洁之外别无他法地创造一个解决问题的新解决方案。即使您担心语义,究竟什么样的语义描述了一种形式?

答案 4 :(得分:5)

我大部分时间都使用以下方法,它允许我完全按照我喜欢的方式设置所有对齐方式。正如您所看到的,它为CSS和JS提供了大量的钩子。

<form id="login-form" action="#" method="post">
    <fieldset>
        <label id="for-email" for="email">
            <span class="label-title">Email Address <em class="required">*</em></span>
            <input id="email" name="email" type="text" class="text-input" />
        </label>

        <label id="for-password" for="password">
            <span class="label-title">Password <em class="required">*</em></span>
            <input id="password" name="password" type="password" class="text-input" />
        </label>
    </fieldset>

    <ul class="form-buttons">
        <li><input type="submit" value="Log In" /></li>
    </ul>
</form><!-- /#login-form -->

答案 5 :(得分:3)

如果没有桌子,有很多方法可以做到这一点。一旦你获得基本格式,它就像桌子一样容易使用,它只是最初的游戏,这可能是一个痛苦。所以,只要看看那些已经为你完成全部工作的人:

我上周还记录了the method I've settled on(一个片段):

<form action="/signup" method="post">
<fieldset>
<legend>Basic Information</legend>
<ol>
<li><label for="name">Name <span class="error">*</span>
    </label><input type="text" id="name" name="name" size="30" /></li>
<li><label for="dob">Date of Birth <span class="error">*</span></label>
    <div class="inputWrapper">
    <input type="text" id="dob" name="dob" size="10" />
    <span class="note">YYYY-MM-DD</span></div></li>
<li><label for="gender">Gender <span class="error">*</span></label>
    <select id="gender" name="gender">
    <option value=""></option>
    <option value="female">Female</option>
    <option value="male">Male</option>
    </select></li>
</ol>
</fieldset>
</form>

CSS:

fieldset { 
    margin: 0 0 20px 0; } 

fieldset legend { 
    font-weight: bold; 
    font-size: 16px; 
    padding: 0 0 10px 0; 
    color: #214062; } 

fieldset label { 
    width: 170px; 
    float: left; 
    margin-right:10px; 
    vertical-align: top; } 

fieldset ol { 
    list-style:none; 
    margin: 0;
    padding: 0;} 

fieldset ol li { 
    float:left; 
    width:100%; 
    padding-bottom:7px; 
    padding-left: 0; 
    margin-left: 0; } 

fieldset ol li input, 
fieldset ol li select, 
fieldset ol li textarea { 
    margin-bottom: 5px; } 

form fieldset div.inputWrapper { 
    margin-left: 180px; } 

.note { 
    font-size: 0.9em; color: #666; }

.error{ 
    color: #d00; }

答案 6 :(得分:2)

真的取决于你和谁说话。纯粹主义者说使用CSS因为表元素不适合布局。但对我来说,如果它有效,为什么要改变呢?我现在使用CSS进行布局,但我仍然有很多遗留代码我没有也不会改变。

答案 7 :(得分:2)

这里的大多数非基于表格的答案都依赖于预先确定的固定宽度,这可能是国际化的痛苦,或者您无法确定标签所需宽度的任何其他情况。

但CSS有display: table这个原因:

<强> HTML

<div class="form-fields">
  <div class="form-field">
    <label class="form-field-label" for="firstNameInput">First Name</label>
    <div class="form-field-control"><input type="text" id="firstNameInput"></div>
    <div class="form-field-comment">Required</div>
  </div>
  <div class="form-field">
    <label class="form-field-label" for="lastNameInput">Last Name</label>
    <div class="form-field-control"><input type="text" id="lastNameInput"></div>
    <div class="form-field-comment">Required</div>
  </div>
</div>

<强> CSS

.form-fields {
  display: table;
}

.form-field {
  display: table-row;
}

.form-field-label,
.form-field-control,
.form-field-comment {
  display: table-cell;
  padding: 3px 10px;
}

简单。

答案 8 :(得分:0)

我过去曾经相当有效地使用过它:

<强> HTML:

<fieldset>
  <p>
    <label for="myTextBox">Name</label>
    <span class="field"><input type="text" name="myTextBox" id="myTextBox" /></span>
    <span class="error">This a message place</span>
  </p>
</fieldset>

<强> CSS:

<style type="text/css">
fieldset label, fieldset .field, fieldset .error { display: -moz-inline-box; display: inline-block; zoom: 1; vertical-align: top; }
fieldset p { margin: .5em 0; }
fieldset label { width: 10em;  text-align: right; line-height: 1.1; }
fieldset .field { width: 20em; }
</style>

唯一真正陷入困境的是Firefox 2优雅地降级。 (参见-moz-inline-box这有点黑客,但也不算太糟糕)

答案 9 :(得分:0)

对此没有任何一刀切的选择。您使用的表格示例可以改进,但是:

<table>
  <tbody>
    <tr>
      <th scope="row"><label for="f_name">First name:</label></th>
      <td>
        <input type='text' id='f_name' name='f_name' />
        <?php form_error('f_name'); ?>
      </td>
    </tr>
    <!-- ... -->
  </tbody>
</table>

对错误部分不太确定;我认为把它放在输入旁边比用一个单独的列更有意义。

答案 10 :(得分:0)

我也遇到了这个问题,但是在左边有一个菜单的cocidil(也有浮动:左边)。

因此。我的解决方案是: HTML

<div class="new">
   <form>
     <label class="newlabel">Name</label>
     <input type="text" name="myTextBox" id="myTextBox" />
   </form>
</div>

CSS

.new {
    display:block;
}
.newlabel {
    min-width: 200px;
    float: left;
}

我认为,它也适用于表单类,但实际上我在'new'类中有更多表单。