设置float:left时将div扩展到最大宽度


115

我有这样的事情:

<div style="width:100px;float:left">menu</div>
<div style="float:left">content</div>

两个花车都是必需的。我希望内容div填充整个屏幕减去菜单的那些100px。如果我不使用浮点数,div会完全按照它的方式扩展。但是当设置了float时如何设置呢?如果我用……

style=width:100%

然后内容div会获取父级的大小,它是正文或我也尝试过的另一个div,因此,它当然不适合菜单的右侧,然后在下面显示。

Answers:


138

希望我正确理解了您,看看这个:http : //jsfiddle.net/EAEKc/

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>Content with Menu</title>
  <style>
    .content .left {
      float: left;
      width: 100px;
      background-color: green;
    }
    
    .content .right {
      margin-left: 100px;
      background-color: red;
    }
  </style>
</head>

<body>
  <div class="content">
    <div class="left">
      <p>Hi, Flo!</p>
    </div>
    <div class="right">
      <p>is</p>
      <p>this</p>
      <p>what</p>
      <p>you are looking for?</p>
    </div>
  </div>
</body>

</html>


5
问题指出“浮子都是必需的”。

8
是的,您说得对,我同意。但是我认为Flo只提到了这一点,因为他认为两者都是!需要获得所需的布局,因此是我的替代解决方案。
merkuro

@merkuro:好点。我同意,“。right”不需要浮动即可获得所需的效果。@Flo:您可以确认,内容div是否必须浮动?喜欢其他原因吗?

可能行得通,我会尝试一下,您使那个原因正确,并且浮动效果更好,但我认为它不会起作用
Flo

2
啊呀,我再次看到了将其更改为float的原因:IE7和Firefox可以正常运行,但是5.5和6在左div的右边缘处开始了边距,因此它具有236px(实际宽度为100)是一个示例)两个div之间的差距
Flo

100

我发现这样做的最交叉兼容的方法不是很明显。您需要从第二列中删除浮点数,然后对其应用overflow:hidden。尽管这似乎隐藏了div之外的任何内容,但实际上迫使div留在其父级之内。

使用您的代码,这是如何完成代码的示例:

<div style="width: 100px; float: left;">menu</div>
<div style="overflow: hidden;">content</div>

希望这对遇到此问题的任何人都是有用的,这是我在尝试使其适应其他分辨率之后,最适合我所建站点的方法。不幸的是,如果您还在div内容后加上右浮字,这将不起作用,如果有人知道通过IE良好的兼容性使其正常工作的好方法,我将非常高兴听到它。

新的更好的选择 display: flex;

现在,Flexbox模型已经得到了广泛的实现,我实际上建议您改用它,因为它可以使flex布局具有更大的适应性。这是一个类似于原始的简单两列:

<div style="display: flex;">
    <div style="width: 100px;">menu</div>
    <div style="flex: 1;">content</div>
</div>

这是一个三列,中间列的宽度灵活!

<div style="display: flex;">
    <div style="width: 100px;">menu</div>
    <div style="flex:1;">content</div>
    <div style="width: 100px;">sidebar</div>
</div>

经过进一步测试后,看来您无需使用“ position:relative”触发hasLayout即可在IE 6中正常工作,我不确定IE 5,但无论如何将其包含在内通常都不是问题,为了安全起见。
alanaktion 2012年

1
这个答案似乎不为人所理解,但是真的很高兴知道。即使div中有一个浮动元素,它也可以让您浮动。我是google“块格式设置上下文”。马上。
卡洛斯·吉尔

最好的方法是使用一个简单的2 cols表,而不是浪费时间添加大量CSS跨浏览器不兼容的技巧
Marco Demaio 2012年

@Marco我需要为此使用CSS,因为我的设计具有响应能力。不同的屏幕尺寸需要不同的布局,因此表格将无法工作。而且,这种方法似乎基本上可以在任何仍在使用的浏览器中使用。
alanaktion 2012年

1
@MarcoDemaio,我的意思是,在较小的固定列与主列一样大的屏幕尺寸上(例如在移动设备上),我希望这两列成为全角行,但无法完成除非我想使用JavaScript实际移动内容,否则不要使用表。
alanaktion 2012年

31

解决方案,而您的边缘没有固定大小

.content .right{
    overflow: auto; 
    background-color: red;
}

+1为Merkuro,但如果浮动尺寸更改,则固定边距将失败。如果您在右侧使用上述CSS,div则会随着左浮动尺寸的变化而很好地改变尺寸。这样有点灵活。在这里检查小提琴:http : //jsfiddle.net/9ZHBK/144/


2
@alanaktion我带走了不必要的汽车。区别在于溢出值。显然,overflow: hiddenoverflow auto导致相同的行为。我也认为人们欣赏小提琴。
威尔特

如果有人想知道为什么这样做,请参见:stackoverflow.com/a/1767270/2756409
TylerH 2015年

我认为这比merkuro的解决方案更好。
SkuraZZ

6

浮动的元素将从常规流布局中移出,并且块元素(例如DIV)不再跨越其父元素的宽度。在这种情况下,规则会更改。无需重新设计轮子,而是访问此站点以获取一些可能的解决方案来创建您要使用的两列布局:http : //www.maxdesign.com.au/presentation/page_layouts/

具体来说,是“液体两列布局”。

干杯!


4

如果有人感兴趣并且不喜欢“浮动”,这是HTML 5的更新解决方案。

在这种情况下,表格效果很好,因为您可以为表格和表格单元格设置固定宽度。

.content-container{
    display: table;
    width: 300px;
}

.content .right{
    display: table-cell;   
    background-color:green;
    width: 100px;
}

http://jsfiddle.net/EAEKc/596/ 来自@merkuro的原始源代码


最后,即使在技术上不使用float,也可以+1与右边固定宽度元素一起使用的东西。
Karthik T 2014年

+1完全是。经过多年的浮动,头寸和桌子争夺,这是正确的解决方案。公认的解决方案传播不安全的CSS。
horace

4

这种用法可以解决您的问题。

width: calc(100% - 100px);

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8" />
  <title>Content with Menu</title>
  <style>
    .content .left {
      float: left;
      width: 100px;
      background-color: green;
    }
    
    .content .right {
      float: left;
      width: calc(100% - 100px);
      background-color: red;
    }
  </style>
</head>

<body>
  <div class="content">
    <div class="left">
      <p>Hi, Flo!</p>
    </div>
    <div class="right">
      <p>is</p>
      <p>this</p>
      <p>what</p>
      <p>you are looking for?</p>
    </div>
  </div>
</body>

</html>


欢迎来到SO。您能补充一下它的工作原理吗?
yacc

3

根据merkuro的解决方案,如果您想最大化左侧的解决方案,则应使用:

<!DOCTYPE html>   
<html lang="en">     
    <head>              
        <meta "charset="UTF-8" />   
        <title>Content with Menu</title>                 
        <style>
            .content .left {
                margin-right: 100px;
                background-color: green;
            }
            .content .right {
                float: right;
                width: 100px;
                background-color: red;
            }
        </style>              
    </head>
    <body>        
        <div class="content">
            <div class="right">  
                <p>is</p>
                <p>this</p>
                <p>what</p>
                <p>you are looking for?</p>
            </div>
            <div class="left">
                <p>Hi, Flo!</p>
            </div>
        </div>
    </body>
</html>

尚未在IE上进行测试,因此在IE上看起来可能坏了。


1

可接受的答案可能有用,但是我不喜欢重叠边距的想法。在HTML5中,您可以使用display: flex;。这是一个干净的解决方案。只需为一个元素和flex-grow: 1;动态元素设置宽度。merkuros小提琴的编辑版本:https://jsfiddle.net/EAEKc/1499/


0

嗨,有一种简单的方法,在正确的元素上有溢出隐藏方法。

    .content .left {
        float:left;
        width:100px;
        background-color:green;
      }
      .content .right {
        overflow: hidden;
        background-color:red;
      }
<!DOCTYPE html>   
<html lang="en">     
    <head>      
           
        <title>Content Menu</title>         
          
    </head>
    <body>    
    <div class="content">
      <div class="left">
        <p>Hi, Flo! I am Left</p>
      </div>
      <div class="right">  
        <p>is</p>
        <p>this</p>
        <p>what</p>
        <p>you are looking for?</p>
        <p> It done with overflow hidden and result is same.</p>
      </div>
    </div>
    </body>
</html> 


-1

这可能起作用:

    div{
    display:inline-block;
    width:100%;
    float:left;
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.