【问题标题】:Clearing floating clears on an unrelated element清除浮动清除无关元素
【发布时间】:2015-11-24 03:37:43
【问题描述】:

我想我让代码说话:

.aside {
    float: right;
    width: 200px;
    background: red;
}

.main {
    margin-right: 220px;
}

.main ul li {
    border-bottom: 1px solid black;
}

.main ul li img {
    float: left;
}

/* clearfix */
.clearfix:before,
.clearfix:after {
	content: " ";
	display: table;
}
.clearfix:after {clear: both;}
.clearfix {*zoom: 1;}
<div class="aside">
    <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
    <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
    <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
    <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
</div>
<div class="main">
    <ul>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 1</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 2</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 3</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 4</div></li>
    </ul>
</div>

这是我遇到的问题:第一个列表条目清除到父-父 div 旁边,而不是 div 本身内部的内容。 (如果您看不到问题,只需缩小浏览器窗口的范围。)我真的无法解决这种情况。尝试了相对定位等。尝试通过手动清除浮动来修复它。但没有任何帮助。

在我看来,这是一种我从未见过的非常奇怪的行为。但我确信 CSS 负责人可以告诉我问题出在哪里以及如何解决它。

【问题讨论】:

  • 添加尝试将clear: none;添加到浮动图像。
  • 你可以添加一个草图或其他东西来显示所需的行为吗?
  • @Oriol 他在 sn-p 中完美展示了这一点。你还能期待什么?
  • @PraveenKumar sn-p 显示了不受欢迎的行为,但我不理解所需的行为。清除意味着防止一个元素与先前浮动的元素相邻。在“清除 div 本身内部的内容”中,我不知道哪个元素不应该与哪个元素相邻。
  • @Oriol 所需的结果应该类似于@PraveenKumar 的答案。但如果可能的话,不用overflow: hidden

标签: html css css-float floating clearfix


【解决方案1】:

修复它的正确方法是建立block formatting contexts (BFC)。

常见的建立方式有:

  • overflow 设置为除visible 之外的任何内容,例如hidden
  • 采用out of flow(浮动或绝对定位)
  • display 设置为inline-blocktable-celltable-caption

为了避免这些骇人听闻的方式,Display L3 引入了 display: flow-root,其行为类似于 block,但建立了一个 BFC。这将是完美的,但遗憾的是浏览器还不支持它。

然后,你可以在

中建立一个BFC
  • .main,例如

    .main {
      overflow: hidden; /* Establish BFC */
    }
    

    .aside {
      float: right;
      width: 200px;
      background: red;
    }
    .main {
      margin-right: 220px;
      overflow: hidden;
    }
    .main ul li {
      border-bottom: 1px solid black;
    }
    .main ul li img {
      float: left;
    }
    /* clearfix */
    .clearfix:before,
    .clearfix:after {
      content: " ";
      display: table;
    }
    .clearfix:after {clear: both;}
    .clearfix {*zoom: 1;}
    <div class="aside">
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
    </div>
    <div class="main">
      <ul>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 1</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 2</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 3</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 4</div></li>
      </ul>
    </div>
  • .main &gt; ul,例如

    .main > ul {
      display: inline-block;    /* Establish BFC */
      width: calc(100% - 40px); /* Full width (minus padding) */
      padding-left: 40px;
    }
    

    .aside {
      float: right;
      width: 200px;
      background: red;
    }
    .main {
      margin-right: 220px;
      overflow: hidden;
    }
    .main > ul {
      display: inline-block;    /* Establish BFC */
      width: calc(100% - 40px); /* Full width (minus padding) */
      padding-left: 40px;
    }
    .main ul li {
      border-bottom: 1px solid black;
    }
    .main ul li img {
      float: left;
    }
    /* clearfix */
    .clearfix:before,
    .clearfix:after {
      content: " ";
      display: table;
    }
    .clearfix:after {clear: both;}
    .clearfix {*zoom: 1;}
    <div class="aside">
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
    </div>
    <div class="main">
      <ul>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 1</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 2</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 3</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 4</div></li>
      </ul>
    </div>
  • .main &gt; ul &gt; li,例如

    .main > ul > li {
      float: left; /* Establish BFC */
      clear: left; /* Prevent adjacency */
    }
    

    .aside {
      float: right;
      width: 200px;
      background: red;
    }
    .main {
      margin-right: 220px;
      overflow: hidden;
    }
    .main ul li {
      border-bottom: 1px solid black;
      float: left;
      clear: left;
    }
    .main ul li img {
      float: left;
    }
    /* clearfix */
    .clearfix:before,
    .clearfix:after {
      content: " ";
      display: table;
    }
    .clearfix:after {clear: both;}
    .clearfix {*zoom: 1;}
    <div class="aside">
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
    </div>
    <div class="main">
      <ul>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 1</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 2</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 3</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 4</div></li>
      </ul>
    </div>
  • .main &gt; ul &gt; li &gt; .clearfix,例如(有重叠)

    .main > ul > li > .clearfix {
      position: absolute; /* Establish BFC */
    }
    

    .aside {
      float: right;
      width: 200px;
      background: red;
    }
    .main {
      margin-right: 220px;
      overflow: hidden;
    }
    .main ul li {
      border-bottom: 1px solid black;
    }
    .main > ul > li > .clearfix {
      position: absolute;
    }
    .main ul li img {
      float: left;
    }
    /* clearfix */
    .clearfix:before,
    .clearfix:after {
      content: " ";
      display: table;
    }
    .clearfix:after {clear: both;}
    .clearfix {*zoom: 1;}
    <div class="aside">
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
      <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
    </div>
    <div class="main">
      <ul>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 1</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 2</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 3</div></li>
        <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 4</div></li>
      </ul>
    </div>

【讨论】:

  • float: left; clear: left; 的方法成功了。惊人的 :-)。谢谢。
【解决方案2】:

这看起来像是您使用的 clearfix 类的问题。它试图从内部清除浮动元素。因此,如果这不清除并且仅清除本地浮动,则不会发生此问题:

.main ul li {overflow: hidden;}

上面的代码将在本地清除浮动。

.aside {
  float: right;
  width: 200px;
  background: red;
}

.main {
  margin-right: 220px;
}

.main ul li {
  border-bottom: 1px solid black;
}

.main ul li img {
  float: left;
}

.main ul li {overflow: hidden;}
<div class="aside">
  <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
  <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
  <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
  <p>This is a div aside with some very interesting notes and a text to give it some height.</p>
</div>
<div class="main">
  <ul>
    <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 1</div></li>
    <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 2</div></li>
    <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 3</div></li>
    <li><div class="clearfix"><img src="http://orig06.deviantart.net/7926/f/2013/172/c/7/free_grumpy_cat_icon_by_fiinie-d6a1ose.gif">item 4</div></li>
  </ul>
</div>

【讨论】:

  • 感谢您的回答 :-)。那么您认为这是一个干净的解决方案吗?我停止使用溢出:隐藏,因为它感觉有点hacky,但在这种情况下它会成功。
  • @TiMESPLiNTER 这是大家在无法使用 clearfix 时常用的解决方案。我不会说这是一个干净的解决方案或 hacky 解决方案。但是,是的,这是目前最好的解决方案。
猜你喜欢
  • 2012-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 2013-09-16
  • 2012-03-13
  • 2011-01-28
  • 1970-01-01
相关资源
最近更新 更多