【问题标题】:Yet Another Divs vs Tables issue: Forms另一个 div 与表格的问题:表格
【发布时间】:2016-09-15 22:49:51
【问题描述】:

[Meta-note:] 我正在浏览问题页面,真的厌倦了“DIVS 与表格”“何时使用表格与 DIVS”“Divs 是否比表格更好”“表格与 CSS”以及所有的问题问同样的事情 OMG 人,但我想看看人们处理“为什么你应该放弃和使用表格”的规范示例的翻译的所有方式:

<table>
  <tr>
    <td> Name </td>
    <td> <input> </td>
  </tr>
  <tr>
    <td> Social Security Number </td>
    <td> <input> </td>
  </tr>
</table>

问题: 如何在没有表格的情况下最好地(语义上、简单地、稳健地、流畅地、便携地)实现上述内容。对于初学者,我猜一个幼稚的实现对第一列使用了固定的列宽,但这对于动态生成的内容可能会产生不确定的结果。在答案中包含您方法的优势/劣势会很好。

附:另一个我很想知道的是垂直居中,但在jakpsatweb.cz

编辑:sunlife 提出了一个很好的例子,说明为什么我没有仔细考虑问题。表格可以同时对齐多个列。问题仍然存在(我希望看到用于对齐/布局的不同 CSS 技术) - 尽管可以处理他的解决方案?更多涉及的例子绝对是首选。

【问题讨论】:

    标签: html css layout html-table


    【解决方案1】:

    我通常做的是:

    <form>
     <label for="param_1">Param 1</label>
     <input id="param_1" name="param_1"><br />
     <label for="param_2">Param 2</label>
     <input id="param_2" name="param_2"><br />
    </form>
    

    在 CSS 中:

    label,input { display: block; float: left; margin-bottom: 1ex; }
    input { width: 20em; }
    label { text-align: right; width: 15em; padding-right: 2em; }
    br { clear: left; }
    

    当然,您必须根据实际数据定义宽度:-)

    • 首先,给标签并输入display: block,这样就可以给它分配一个尺寸并排列起来。
    • 他们都得到float: left,因为 Explorer 做的事情有点不同
    • 很好地格式化标签
    • 破解br,以便在某处有一个clear: left,我记得将它放在标签上在某些浏览器上不起作用。

    另外,使用br,即使浏览器不支持 CSS,您也可以获得很好的格式:-)

    【讨论】:

    • 这确实是我最先想到的,它非常干净易懂。我希望有其他解决方案可以允许左列的动态列宽
    • 好吧,如果你想要动态列宽,你必须反过来做你的盒子,也就是说,所有的标签,所有的输入,在那里,你肯定会失去水平对齐: -)
    • 假设你使用 'white-space:nowrap' 并指定行高?你能侥幸逃脱吗?
    • 哦等等,是的,然后你失去了垂直流动性。嗯。
    • 禁止使用 br 标签。使用这种布局,您可以说 label { clear:left }
    【解决方案2】:

    诀窍是当表单变得比您的示例更复杂时,您会意识到表格启用了其他元素无法做到的“灵活网格”。

    例如如果“输入”比文本框更复杂怎么办?例如一堆单选按钮,每个按钮都有自己的标签:

    Color: [____Red___][v]
     Hood: [*] 
     Size: (_) Small
           (_) Medium
           (_) Large
           (*) X-Large
    

    如果您只需要简单的表单,CSS 就很棒,但只要您需要网格,事情就会变得有趣...

    如果你真的想这样做,我会查看The Man In Blue's Solution,它工作得很好而且很干净。

    【讨论】:

    • 您可以有效地使用字段集来执行此操作,或者使用 dd/dt/dd 组合。
    【解决方案3】:

    人们谈论表格让他们的表格以他们想要的方式显示,这是真的,只有当你想在列中显示你的表格并且愿意失去语义意义时。有了以下 HTML,就可以根据需要以多种布局显示此表单。

    顺便说一句 - 对 &lt;br /&gt; 说不

    <form>
     <fieldset>
      <legend>Personal Info</fieldset>
      <div>
       <label for="name">Name</label>
       <input id="name" name="name" />
      </div>
      <div>
       <label for="ssn">Social Security Number</label>
       <input id="ssn" name="ssn" />
      </div>
     </fieldset>
    </form>
    

    您可以清除&lt;divs&gt;或将它们设置为overflow: hidden以确保浮动被清除。

    来自上述 html 的选项:

    Name |==============|    SSN |==============|
    
    Name |==============|
    SSN |==============|
    
    Name     |==============|
    SSN      |==============|
    
        Name |==============|
         SSN |==============|
    
       Name: |==============|
        SSN: |==============|
    
    Name:
    |==============|
    SSN:
    |==============|
    

    只需几行 css 即可完成上述所有操作。

    当涉及到单选、复选框和提交按钮时,它会稍微复杂一些,但是可以使用 css 以您想要的方式显示干净的语义 HTML。

    【讨论】:

    • 如何通过 CSS 添加 ':'?
    • 并非所有地方都支持,但 :after 伪元素会做到这一点。这实际上非常适合语义 HTML,因为屏幕阅读器不必阅读它。
    • 对不起,更准确地说:label:after {content: ":"}
    • 明白了;我不知道您可以通过样式更改内容
    【解决方案4】:

    虽然其他建议可能更适合获得灵活的布局,但这个问题的字面答案是这样的:

    <form action="www.example.com">
        <div class="table">
            <div class="tbody">
              <div class="tr">
                <div class="td"> <label for="name">Name</label> </div>
                <div class="td"> <input id="name"> </div>
              </div>
              <div class="tr">
                <div class="td"> <label for="ssn">Social Security Number</label> </div>
                <div class="td"> <input id="ssn"> </div>
              </div>
            </div>
        </div>
    </form>
    

        <style type="text/css">
            div.table { display:table; border-spacing:2px; }
            div.tbody { display:table-row-group; }
            div.tr { display:table-row; }
            div.td { display:table-cell; vertical-align: middle; padding:1px; }
        </style>
    

    这适用于最新版本的 Firefox、Chrome、Opera 和 Safari。它也适用于 IE8 Beta 2(标准模式)。它不适用于 IE7 或更早版本,但“渐进增强”等等。

    【讨论】:

    • 可耻的 rowspan 和 colspan 不起作用(我刚刚在 Firefox 3.0.6 中尝试过)
    • 我同意这是解决方案,我只是不明白为什么有人会这样做。唯一的区别是您基本上使用类来链接您的 css 和 html 而不是 html 类型(即您在 css 中使用 class="table" 而不是 form.table{})。我目前开始重构 50k 行代码,我的大多数对话框表单(40+)使用表格来排列输入、标签和特殊控件;该表通常位于 div 内。我正在拼命地确定为什么我应该改用这种方法......但可惜我来得太短了。
    • @gunslingor - 你不会,至少不是那样。特别选择类名来演示布局原则,而在生产代码中,您应该使用描述内容而不是布局的类名。关键是有时您想要列和行的布局,但在语义上您没有表格数据。 CSS 表格提供了一种实现方式。此外,了解 CSS 表格,特别是匿名表格对象是如何生成的,可以为非常少的标记带来一些非常方便的布局效果。
    【解决方案5】:

    我在想这样的事情:

    <div style="text-align:right; float:left;">
        Name: <input /> <br />
        Social Security Number: <input /> <br />
    </div>
    

    如果右列是固定长度的,可以与可变文本长度对齐,但我想知道这种方法的缺点是什么?

    【讨论】:

      猜你喜欢
      • 2010-12-06
      • 2013-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多