代码之家  ›  专栏  ›  技术社区  ›  Tom Ritter

浮动潜水服从/不服从垂直对齐

css
  •  6
  • Tom Ritter  · 技术社区  · 16 年前

    在垂直对齐的表单元格中:底部,我有一个或两个div。每个div都向右浮动。
    据说,div不应该与底部对齐,但它们确实对齐了(我不明白,但这很好)。
    然而,当我在单元格中有两个浮动div时,它们会与同一条顶线对齐。
    我希望第一个较小的div一直位于底部。另一种可接受的解决方案是将其设置为表格单元格的全高。

    这很难解释,所以这是代码:

    <style type="text/css"> 
    table {
       border-collapse: collapse;
    }
    td {
       border:1px solid black;
       vertical-align:bottom;
    }
    .h {
       float:right;
       background: #FFFFCC;
    }
    .ha {
       float:right;
       background: #FFCCFF;
    }
    </style> 
    
    <table> 
      <tr> 
        <td> 
          <div class="ha">@</div> 
          <div class="h">Title Text<br />Line 2</div> 
        </td> 
        <td> 
          <div class="ha">@</div> 
          <div class="h">Title Text<br />Line 2<br />Line 3</div> 
        </td> 
        <td> 
          <div class="h">Title Text<br />Line 2</div> 
        </td> 
        <td> 
          <div class="h">Title Text<br />Line 2</div> 
        </td> 
        <td> 
          <div class="h">Title Text<br />Line 2</div> 
        </td> 
      </tr> 
      <tr> 
        <td> 
          <div class="d">123456789</div> 
        </td> 
        <td> 
          <div class="d">123456789</div> 
        </td> 
        <td> 
          <div class="d">123456789</div> 
        </td> 
        <td> 
          <div class="d">123456789</div> 
        </td> 
        <td> 
          <div class="d">123456789</div> 
        </td> 
      </tr> 
    </table> 
    

    问题如下:

    1. 为什么@符号与黄色div位于同一水平?
    2. 假设垂直对齐不适用于块元素(如浮动的div)1。但确实如此!
    3. 我如何使@site位于底部或使其与表格单元格齐高?

    我正在测试IE7和FF2。目标支持为IE6/7、FF2/3。

    澄清: 目标是在表格单元格的底部有红色@, 下一个 黄色的盒子。在任一div上使用clear都会将它们放在不同的行上。 此外,单元格可以有可变的文本行,因此, 线高度 不会有帮助的。

    5 回复  |  直到 16 年前
        1
  •  8
  •   David Alpert    16 年前

    我发现这篇文章在理解和排除垂直对齐问题方面非常有用:

    Understanding vertical-align, or "How (Not) To Vertically Center Content"

        2
  •  2
  •   Tom Ritter    16 年前

    我从来没有回答过前两个问题,所以请随时在下面给出答案。但我 解决最后一个问题,即如何使其工作。

    我在表单元格内的两个div中添加了一个包含div,如下所示:

    <table>
      <tr>
        <td>
          <div class="t">
            <div class="h">Title Text<br />Line 2</div>
            <div class="ha">@</div>
          </div>
        </td>
    

    然后我使用了以下CSS

    <style type="text/css">
    table {
      border-collapse: collapse;
    }
    td {
      border:1px solid black;
      vertical-align:bottom;
    }
    .t {
      position: relative;
      width:150px;
    }
    .h {
      background: #FFFFCC;
      width:135px;
      margin-right:15px;
      text-align:right;
    }
    .ha {
      background: #FFCCFF;
      width:15px;
      height:18px;
      position:absolute;
      right:0px;
      bottom:0px;
    }
    </style>
    

    这一切的关键是 一个div相对于它的绝对位置 父母亲 父级必须声明为position:relative

        3
  •  0
  •   PhiLho    16 年前

    添加 clear: both 第二个元素。如果你想@位于黄色框下方,请将其放在HTML代码的最后。

        4
  •  0
  •   Matthew Rapati    16 年前

    如果你不想让两个div都在同一条线上,那么就不要把它们都浮起来。 如果你在标记中的文本下方加上@,然后将浮点数设置为“清除”,它就会把它放在文本下方。

        5
  •  0
  •   nymacro    16 年前

    http://www.w3.org/TR/CSS2/visudet.html#line-height

    此属性影响由内联级别元素生成的方框在行框内的垂直定位。以下值仅对父内联级元素或父块级元素有意义,如果该元素生成匿名内联框;如果没有这样的父母,它们就没有效果。

    CSS中的垂直对齐属性总是令人困惑,因为在大多数情况下,它不会做你期望它做的事情。这是因为它与valign不同,valign在许多HTML 4标签中是允许的。

    有关更多信息,您可以查看:

    http://www.ibloomstudios.com/articles/vertical-align_misuse/ http://www.ibloomstudios.com/articles/applied_css_vertical-align/

    David Alpert发布的链接在这件事上非常有用。