Boy*_*smo 195 html css css-float
我想问一下高度和浮子的工作原理.我有一个外部div和一个内部div,里面有内容.它的高度可能会根据内部div的内容而有所不同,但似乎我的内部div会溢出它的外部div.这样做的正确方法是什么?
<html>
<body>
<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange">
<div style="width:500px; height:200px; background-color:black; float:right"></div>
</div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
Mr.*_*ien 566
浮动元素不会增加容器元素的高度,因此如果不清除它们,容器高度不会增加......
我会直观地告诉你:
更多说明:
<div>
<div style="float: left;"></div>
<div style="width: 15px;"></div> <!-- This will shift
besides the top div. Why? Because of the top div
is floated left, making the
rest of the space blank -->
<div style="clear: both;"></div>
<!-- Now in order to prevent the next div from floating beside the top ones,
we use `clear: both;`. This is like a wall, so now none of the div's
will be floated after this point. The container height will now also include the
height of these floated divs -->
<div></div>
</div>
Run Code Online (Sandbox Code Playgroud)
你也可以添加overflow: hidden;
容器元素,但我建议你clear: both;
改用.
此外,如果您想要自我清除可以使用的元素
.self_clear:after {
content: "";
clear: both;
display: table;
}
Run Code Online (Sandbox Code Playgroud)
该float
物业被大多数初学者误解.那究竟是float
做什么的?最初,该float
属性被引入以围绕图像流动文本,这些图像是浮动的left
或right
.这是 @Madara Uchicha 的另一个解释.
那么,使用该float
属性并排放置盒子是错误的吗?答案是否定的 ; 如果您使用该float
属性以便并排设置框,则没有问题.
浮动一个inline
或一个block
级别元素将使该元素的行为像一个inline-block
元素.
如果浮动元素left
或者right
,该width
元素将被限制在其持有,除非该内容width
被明确定义...
你不能float
一个元素center
.这是我一直看到的初学者使用的最大问题,它不是该float: center;
float
属性的有效值.float
通常用于float
将内容移动到最左侧或最右侧.只有4有效值float
财产即left
,right
,none
(默认)和inherit
.
父元素在包含浮动的子元素时会折叠,为了防止这种情况,我们使用clear: both;
属性来清除两侧的浮动元素,这将阻止父元素的折叠.有关更多信息,请参阅此处的另一个答案.
(重要)想一想我们拥有各种元素的堆栈.当我们使用float: left;
或float: right;
元素在堆栈上方移动一个.因此,正常文档流中的元素将隐藏在浮动元素后面,因为它位于正常浮动元素之上的堆栈级别.(请不要将其与此z-index
完全不同.)
以一个案例为例来解释CSS浮动的工作原理,假设我们需要一个带有页眉,页脚和2列的简单2列布局,所以这里是蓝图的样子......
在上面的例子中,我们将浮动只有红色箱子,要么你可以float
同时向left
,或者你可以float
上left
,另一个right
为好,取决于布局,如果是3列,你可能float
2列left
,其中另一一到right
如此取决于,尽管在这个例子中,我们有一个简化的2列布局所以将float
一个left
和另一个的right
.
用于创建布局的标记和样式进一步向下解释...
<div class="main_wrap">
<header>Header</header>
<div class="wrapper clear">
<div class="floated_left">
This<br />
is<br />
just<br />
a<br />
left<br />
floated<br />
column<br />
</div>
<div class="floated_right">
This<br />
is<br />
just<br />
a<br />
right<br />
floated<br />
column<br />
</div>
</div>
<footer>Footer</footer>
</div>
* {
-moz-box-sizing: border-box; /* Just for demo purpose */
-webkkit-box-sizing: border-box; /* Just for demo purpose */
box-sizing: border-box; /* Just for demo purpose */
margin: 0;
padding: 0;
}
.main_wrap {
margin: 20px;
border: 3px solid black;
width: 520px;
}
header, footer {
height: 50px;
border: 3px solid silver;
text-align: center;
line-height: 50px;
}
.wrapper {
border: 3px solid green;
}
.floated_left {
float: left;
width: 200px;
border: 3px solid red;
}
.floated_right {
float: right;
width: 300px;
border: 3px solid red;
}
.clear:after {
clear: both;
content: "";
display: table;
}
Run Code Online (Sandbox Code Playgroud)
让我们一步一步地进行布局,看看float是如何工作的..
首先,我们使用的主要的包装元素,你可以认为它是你的口,然后我们使用header
和分配height
的50px
所以没有什么花哨那里.它只是一个普通的非浮动块级元素,它将占用100%
水平空间,除非它浮动或我们分配inline-block
给它.
第一个有效值float
是left
在我们的例子中,我们使用float: left;
for .floated_left
,所以我们打算将一个块浮动到left
我们的容器元素.
是的,如果你看到,父元素,它是.wrapper
折叠的,你看到的绿色边框没有展开,但它应该是正确的?会在一段时间内再回过头来看,现在,我们已经有了一个专栏left
.
来到第二列,让float
这一个到了right
在这里,我们有一个300px
宽列,我们float
的right
,因为它漂浮到这将坐在第一列的旁边left
,而且因为它是浮动的left
,它创建的空装订线right
,并因为有充足的空间上right
,我们right
漂浮的元素完美地坐在旁边left
.
尽管如此,父元素已经崩溃了,现在让我们解决这个问题.有许多方法可以防止父元素被折叠.
clear: both;
在父元素结束之前使用,它保存浮动元素,现在这个是clear
浮动元素的廉价解决方案,它将为您完成工作但是,我建议不要使用它.添加,<div style="clear: both;"></div>
在.wrapper
div
结束之前,像
<div class="wrapper clear">
<!-- Floated columns -->
<div style="clear: both;"></div>
</div>
Run Code Online (Sandbox Code Playgroud)
好吧,修复得很好,没有折叠的父级了,但是它为DOM添加了不必要的标记,所以有人建议,overflow: hidden;
在父元素上使用保存浮动的子元素,这些元素按预期工作.
使用overflow: hidden;
上.wrapper
.wrapper {
border: 3px solid green;
overflow: hidden;
}
Run Code Online (Sandbox Code Playgroud)
这为我们每次需要时节省了一个元素clear
float
但是当我用这个测试各种情况时,它在一个特定的一个中失败了,它box-shadow
在子元素上使用.
演示(无法看到所有4面的阴影,overflow: hidden;
导致此问题)
所以现在怎么办?保存一个元素,不是overflow: hidden;
那么明确修复hack,在CSS中使用下面的代码片段,就像你overflow: hidden;
用于父元素一样,在父元素上调用class
下面的元素来自我清除.
.clear:after {
clear: both;
content: "";
display: table;
}
<div class="wrapper clear">
<!-- Floated Elements -->
</div>
Run Code Online (Sandbox Code Playgroud)
在这里,阴影按预期工作,它也会自动清除阻止崩溃的父元素.
最后,我们clear
在浮动元素之后使用页脚.
什么时候float: none;
使用,因为它是默认的,所以任何使用声明float: none;
?
嗯,这取决于,如果您要进行响应式设计,当您希望浮动元素以特定分辨率在另一个下方渲染时,您将多次使用此值.因为那个float: none;
地产在那里发挥了重要作用.
关于如何float
有用的几个真实世界的例子.
img
浮动内部p
,这将使我们的内容流动.演示(不浮动img
)
演示2(img
浮动到left
)
float
用于创建水平菜单- 演示最后但并非最不重要,我想解释一下这个特殊情况,你float
只有单个元素left
而不是float
另一个,那么会发生什么?
假设如果我们float: right;
从我们中移除.floated_right
class
,div
则将从极端渲染,left
因为它没有浮动.
所以在这种情况下,要么你float
将到left
,以及
要么
您可以使用margin-left
哪个等于左浮动列的大小,即200px
宽.
j08*_*691 35
您需要添加overflow:auto
到您的父div,以包含内部浮动div:
<div style="margin:0 auto;width: 960px; min-height: 100px; background-color:orange;overflow:auto">
<div style="width:500px; height:200px; background-color:black; float:right">
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
您遇到浮动错误(虽然我不确定它是否因为有多少浏览器出现此行为而在技术上是一个错误).以下是发生的事情:
在正常情况下,假设没有设置显式高度,块级元素(如div)将根据其内容设置其高度.父div的底部将延伸到最后一个元素之外.不幸的是,浮动元素会阻止父级在确定其高度时考虑浮动元素.这意味着如果您的最后一个元素是浮动的,它将不会像普通元素那样"拉伸"父元素.
空地
有两种常见的方法可以解决这个问题.第一个是添加"清除"元素; 也就是说,浮动的另一个元素将迫使父母伸展.所以添加以下html作为最后一个孩子:
<div style="clear:both"></div>
Run Code Online (Sandbox Code Playgroud)
它不应该是可见的,并且通过使用clear:both,你确保它不会位于浮动元素的旁边,而是在它之后.
溢出:
大多数人(我认为)首选的第二种方法是更改父元素的CSS,以便溢出只是"可见".因此,将溢出设置为"隐藏"将强制父级伸出浮动子级的底部.只有当你没有在父母身上设置身高时才会这样.
就像我说的那样,第二种方法是首选的,因为它不需要你去为你的标记添加语义无意义的元素,但有时你需要overflow
可见,在这种情况下添加一个清除元素是可接受的.