【问题标题】:Why does 'clear:left' also clears right?为什么'clear:left'也会清除right?
【发布时间】:2009-07-28 04:13:42
【问题描述】:

我一直在努力让 CSS 浮动工作(在我的脑海中)。

请注意以下示例:

<style type="text/css">
    div.container {
        width:500px;
    }
    div.left {
        float:left;
        clear:left;
    }
    div.right {
        float:right;
    }
</style>
<div class="container">
    <div class="left">leftdata 1</div>
    <div class="left">leftdata 2</div>
    <div class="right">rightdata 1</div>
    <div class="right">rightdata 2</div>
    <div class="right">rightdata 3</div>
    <div class="right">rightdata 4</div>
</div>

这将给出以下输出:

+-------------------------------------------------- ------------------+ |左数据 1 | |左数据 2 右数据 1 右数据 2 右数据 3 右数据 4 | | | +-------------------------------------------------- ------------------+

但是我期待这个:

+-------------------------------------------------- ------------------+ |左数据 1 右数据 1 右数据 2 右数据 3 右数据 4 | |左数据 2 | | | +-------------------------------------------------- ------------------+

为什么清楚:左;也清零了吧?


我的目标:

我只想添加一个 clear:right;到标有 class: right 的 DIV。这应该会产生以下结果:

<style type="text/css">
    div.left {float:left;clear:left;}
    div.right {float:right;clear:right;}
</style>
+-------------------------------------------------- ------------------+ |左数据 1 右数据 1 | |左数据 2 右数据 2 | |右数据 3 | |右数据 4 | +-------------------------------------------------- ------------------+

【问题讨论】:

    标签: html css css-float


    【解决方案1】:

    在您的第一个示例中,rightdata-div 放置在左侧的下方,因为它们稍后会出现在文档中。将它们放在首位,您就会得到预期的结果。

    或者您可以尝试以下方式:

    <style type="text/css">
      div.left {
        float: left;
      }
    
      div.right {
        float: right;
    
      }
      div.container {
        width:500px;
        overflow: auto; /* to make sure .container expands vertically */
      }
    

    <div class="container">
      <div class="left">
        <div>leftdata 1</div>
        <div>leftdata 2</div>
      </div>
      <div class="right">
        <div>rightdata 1</div>
        <div>rightdata 2</div>
        <div>rightdata 3</div>
        <div>rightdata 4</div>
      </div>
    </div>
    

    【讨论】:

    • 将它们放在首位不会产生预期的结果。我认为你指的是交替放置“左”/“右”div,只清除“右”div。这将产生预期的结果,但是这将要求页面具有等量的“左”/“右”DIV
    • 对原始示例代码的唯一更改是将 div.right 元素放在 DOM 中的 div.left 元素之前。因此, clear:left 实际上并不 clear:right...
    【解决方案2】:

    在 CSS 中,出于某些愚蠢的原因,放置浮动 div 的顺序很重要。如果您将

    放在第一个(而不是把左边的放在第一个),那么不会是右边那个额外的换行符。

    另一件事:我认为任何人都不应该永远使用css的clear命令。为什么?因为它可能会受到其他周围浮动元素的影响。换句话说,clear:both 不仅为当前元素中的浮动元素清除空间,它还为页面上的每个浮动元素清除空间。

    更好的解决方案是使用overflow:auto;

    这里有一些代码可以满足你的要求:

    
    <style type="text/css">
        div.container {
            width:500px;
            overflow:auto;
        }
        div.left {
            float:left;
        }
        div.right {
            float:right;
        }
    </style>
    <div class="container">
        <div class="right">rightdata 1</div>
        <div class="left">leftdata 1</div>
        <br>
        <div class="right">rightdata 2</div>
        <div class="left">leftdata 2</div>
        <br>
        <div class="right">rightdata 3</div>
        <br>
        <div class="right">rightdata 4</div>
    </div>
    

    编辑:实际上,请注意,在这种情况下,clear 和 overflow:auto 都不是生成leftdata/rightdata div 的配置所必需的,但是如果你想要容器div,它们是必需的展开到 div 的高度。如果没有 clear 或 overflow:auto,div 的高度将不会扩展以适应它包含的浮动 div 的高度。

    【讨论】:

    • 我只是想补充一点,john misoskian 的技术(让内部 div 元素与您想要左右浮动的元素分开)是正确的方法 - 尽管正如我上面提到的,我不同意他使用 clear:both; .使用上面的代码,您无法在中间可靠地添加文本(非浮动文本)。
    【解决方案3】:
    <style type="text/css">
        div.left {float:left;}
        div.right {float:right;}
        br.clear{clear:both;}
    </style>
    
    <div class="container">
        <div class="left">
             <div> data 1 </div>
             <div> data 2 </div>
             <div> data 3 </div>
        </div>
        <div class="right">
             <div> right data 1 </div>
             <div> right data 2 </div>
             <div> right data 3 </div>
        </div>
        <br class="clear" />
    </div>
    

    【讨论】:

    • 这是解决问题的实用方法,是的...但是为什么'clear:left'也清除了权利? :)
    • 为什么要清除 br?为什么不用容器上的溢出方法来保存标记:quirksmode.org/css/clearing.html
    • 因为,需要跨浏览器支持。并使用清除 br。
    • 永远永远不要使用
      ... 这是一种混乱、可怕的做法,因为它只会在您尝试重新设计网站时导致问题.使用 css 清除,例如 min-height:10px 和 :after 方法
    • @cottsak 我在一年前写了这条评论。从那时起,我仍然同意我的声明,尽管我会将其更改为 overflow:hidden 而不是 :after。但是,IRT 我之前的评论,height: 10px 方法适用于 IE,:after 方法适用于所有其他浏览器。因此,如果您同时使用两者,您就可以兼容 x 浏览器。
    【解决方案4】:

    我认为你最好的选择是:

    +--------------------------------------------------------------------+
    |+------------+                                       +-------------+|
    || leftdata 1 |                                       | rightdata 1 ||
    || leftdata 2 |                                       | rightdata 2 ||
    |+------------+                                       | rightdata 3 ||
    |                                                     | rightdata 4 ||
    |                                                     +-------------+|
    +--------------------------------------------------------------------+
    

    编辑:就像 john misoskian 发布的代码 ^^

    【讨论】:

    • 虽然 HTML 是我的母语,但我还是宁愿有这样的概念和视觉答案! +1。然而,问题并不是真正解决问题,而是更多:为什么 'clear:left' 也会清除右?
    【解决方案5】:

    回答你的问题,

    clear:left
    

    正在向左清理。如果你有一个 float:left,clear:left 会清除它。我同意其他人的观点,仅 float:left 和 float:right 并不能真正为您提供列格式。

    【讨论】:

      猜你喜欢
      • 2016-11-08
      • 2021-02-05
      • 2022-01-05
      • 1970-01-01
      • 2021-12-09
      • 1970-01-01
      • 2019-06-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多