【问题标题】:automatic `clear: both` after set of floated items在一组浮动项目之后自动“清除:两者”
【发布时间】:2015-03-08 02:06:05
【问题描述】:

我有一个带有自定义元素的 CMS,其中一些元素应该相互浮动。我的想法是使用 CSS3 在它们的末尾自动插入一个clear: both,而不添加一个额外的 div class="clear"。

我尽量清楚:两者都可以解决:https://stackoverflow.com/a/6681806/2481955

并使用+ CSS 选择器选择最后一个浮动元素。

http://jsfiddle.net/xt3uhuxn/9/(根据不同情况更新)

.float {
    float: left;
}
.float + .float::after {

    visibility: hidden;
    display: block;
    font-size: 0;
    content: " ";
    clear: both;
    height: 0;
    }

但是您可以看到 ::after-Content 被插入到 div 中,而不是在 div 之后。我可以做些什么来归档我的目标(如果没有 mor 浮动元素,则停止浮动)

编辑: 我找到了一种方法:http://jsfiddle.net/xt3uhuxn/11/ 问题是,这是不行的还是我可以为孔位这样做,并且只为每个浮动的元素设置:clear: none;?

【问题讨论】:

    标签: html css css-float


    【解决方案1】:

    假设这些 DIV 位于包装器内,并且您要清除的元素是最后一个,您也可以这样做http://jsfiddle.net/wmce6grc/6/

    HTML

    <div class="list">
       <div class="float">1</div>
       <div class="float">2</div>
       <div>anything other</div>
    </div>
    

    CSS

    .float {
        float: left;
    }
    .list div:last-child {
        clear: both;
    }
    

    【讨论】:

    • 我不知道包装器的名称/类
    【解决方案2】:

    这里有一个小技巧,将 after 元素设置为全宽,以便将其他所有内容推到下一行。

    CSS

    .float {
    float: left;
    
    }
    .float::after {
    content: "";
    display:block;
    float:left;
    clear: both;
    width:100vw;
    }
    

    【讨论】:

    • 这不起作用。当我只选择最后一个元素时也不会
    【解决方案3】:

    ::after 伪元素inserts a box inside the element you're selecting,不在元素之后,即子元素,而不是兄弟元素。子元素永远无法清除其浮动父元素; only a following sibling of either the float itself, or any of the float's parents depending on your layout, can introduce clearance.

    如果您只想在任意数量的连续浮动后对下一个非浮动元素应用清除,请使用:not(.float)

    .float {
        float: left;
    }
    .float + :not(.float) {
        clear: both;
    }
    

    如果浮动是其父元素的最后一个或唯一的子元素,则需要在父元素之后为该元素提供间隙。这意味着您将需要能够以某种方式选择父级。例如:

    .float {
        float: left;
    }
    .float + :not(.float),
    .float-parent + div {
        clear: both;
    }
    <div class="float-parent">
      <div class="float">1</div>
      <div class="float">2</div>
      <div>clear inside parent</div>
    </div>
    <div class="float-parent">
      <div class="float">1</div>
      <div class="float">2</div>
    </div>
    <div>
      <div>clear outside parent</div>
    </div>

    【讨论】:

    • 如果浮动元素是其父元素中的最后一个元素怎么办?
    • 哦,你做了一个编辑,我试过这个,但它不是我想要的。我稍后会尝试为更多特殊情况更新小提琴。
    • @nbar: 然后你可以向父级的下一个兄弟应用清除,或者如果父级需要扩展以包含浮动,则在父级上设置overflow: hidden
    • @nbar:没问题。请务必在编辑时包含您提到的案例。
    • 更新了小提琴:jsfiddle.net/xt3uhuxn/2 您的解决方案适用于案例 2
    【解决方案4】:

    这是一个清除任何不是.float的div的解决方案

    JSFiddle

    HTML:

    CASE 1
    <div>
        <div class="float">1</div>
        <div class="float">2</div>
    </div>
    <div>
        <div>anything other</div>
    </div>
    CASE 2
    <div>
        <div class="float">1</div>
        <div class="float">2</div>
        <div>anything other</div>
    </div>
    

    CSS:

    .float {
        float: left;
    }
    div:not(.float) {
        clear: both;
    }
    

    如果您想将 div 清除限制为某个父元素,只需使选择器更具体。比如:

    #containingDiv div:not(.float) {
        clear: both;
    }
    

    【讨论】:

    • 嗯,这是一个有趣的方法。这样做的“问题”是,不仅有浮动元素的 .float 类。
    • 我认为你不会知道其他浮动元素上的类?
    • 我知道其他课程。我可以完全控制所有 CMS。出于您的想法,我创建了:jsfiddle.net/xt3uhuxn/11 这似乎可行,问题是,它是好的还是不行?
    • 在您提出的案例中,这与我的解决方案基本相同。但是是的,应该可以工作=)。
    猜你喜欢
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-27
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多