引入 float
属性是为了让 Web 开发者能够实现一种布局,即图像浮动在文本列中,文本环绕其左侧或右侧。这就像报纸版面中常见的那种布局。
但 Web 开发者很快意识到你可以浮动任何东西,而不仅仅是图像,因此浮动的使用范围扩大了,例如,用于创建有趣的布局效果,如首字下沉。
浮动曾常用于创建整个网站布局,其中包含多列信息浮动在一起(默认行为是列会按照它们在源代码中出现的顺序堆叠在彼此下方)。现在有更新、更好的布局技术可用。以这种方式使用浮动应被视为一种遗留技术。
在本文中,我们将只关注浮动的正确用法。
让我们来探索浮动的使用。我们将从一个示例开始,其中涉及围绕一个元素浮动一个文本块。你可以通过在电脑上创建一个新的 index.html
文件,用一个 HTML 模板填充它,并将以下代码插入到适当的位置来跟着学习。在本节底部,你可以看到最终代码的实时示例。
首先,我们从一些 HTML 开始。将以下内容添加到你的 HTML body 中,删除之前里面的任何内容
<h1>Float example</h1>
<div class="box">Float</div>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam
dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus
ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus
laoreet sit amet.
</p>
<p>
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse
ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis
ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et
a urna. Ut id ornare felis, eget fermentum sapien.
</p>
<p>
Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus
tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus
sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis
vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
</p>
现在将以下 CSS 应用于你的 HTML(使用 <style>
元素或 <link>
链接到单独的 .css
文件——你选择)
body {
width: 90%;
max-width: 900px;
margin: 0 auto;
font:
0.9em/1.2 "Helvetica",
"Arial",
sans-serif;
}
.box {
width: 150px;
height: 100px;
border-radius: 5px;
background-color: rgb(207 232 220);
padding: 1em;
}
如果你保存并刷新,你会看到你所期望的类似内容:盒子在文本上方,处于正常流中。
要浮动盒子,请将 float
和 margin-right
属性添加到 .box
规则中
<h1>Float example</h1>
<div class="box">Float</div>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam
dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus
ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus
laoreet sit amet.
</p>
<p>
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse
ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis
ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et
a urna. Ut id ornare felis, eget fermentum sapien.
</p>
<p>
Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus
tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus
sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis
vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
</p>
.box {
float: left;
margin-right: 15px;
width: 150px;
height: 100px;
border-radius: 5px;
background-color: rgb(207 232 220);
padding: 1em;
}
现在如果你保存并刷新,你会看到类似以下内容
让我们思考一下浮动是如何工作的。设置了浮动属性的元素(本例中的 <div>
元素)会从文档的正常布局流中取出,并被固定在其父容器的左侧(本例中是 <body>
)。在正常布局流中位于浮动元素下方的任何内容现在将环绕在其周围,填充其右侧的空间,直至浮动元素的顶部。在那里,它将停止。
将内容浮动到右侧会产生完全相同的效果,但方向相反:浮动元素将固定在右侧,内容将环绕在其左侧。尝试将浮动值更改为 right
,并在上一个规则集中将 margin-right
替换为 margin-left
,以查看结果。
虽然我们可以为浮动添加外边距以将文本推开,但我们无法为文本添加外边距以使其远离浮动。这是因为浮动元素被移出了正常流,其后元素的盒子实际上运行在浮动元素的后面。你可以通过对示例进行一些更改来看到这一点。
在浮动盒子后面的第一个段落,也就是紧随其后的段落,添加一个 special
类,然后在你的 CSS 中添加以下规则。这些规则将为我们的后续段落提供背景颜色。
.special {
background-color: rgb(148 255 172);
padding: 10px;
color: purple;
}
为了使效果更容易看到,将浮动元素的 margin-right
改为 margin
,这样浮动元素周围就会有空间。你将能够看到段落的背景颜色直接运行在浮动盒子的下方,如下面的示例所示。
<h1>Float example</h1>
<div class="box">Float</div>
<p class="special">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam
dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus
ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus
laoreet sit amet.
</p>
<p>
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse
ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis
ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et
a urna. Ut id ornare felis, eget fermentum sapien.
</p>
<p>
Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus
tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus
sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis
vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
</p>
body {
width: 90%;
max-width: 900px;
margin: 0 auto;
font:
0.9em/1.2 "Helvetica",
"Arial",
sans-serif;
}
.box {
float: left;
margin: 15px;
width: 150px;
height: 150px;
border-radius: 5px;
background-color: rgb(207 232 220);
padding: 1em;
}
我们后续元素的行盒已缩短,以便文本环绕浮动元素,但由于浮动元素已从正常流中移除,段落周围的盒子仍然保持完整宽度。
我们已经看到浮动元素从正常流中移除,并且其他元素会显示在它旁边。如果我们要阻止后续元素上移,我们需要清除它;这可以通过 clear
属性实现。
在您上一个示例的 HTML 中,给浮动元素下方的第二个段落添加一个 cleared
类。然后将以下内容添加到您的 CSS 中
.cleared {
clear: left;
}
<h1>Float example</h1>
<div class="box">Float</div>
<p class="special">
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus aliquam
dolor, eu lacinia lorem placerat vulputate. Duis felis orci, pulvinar id metus
ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at ultricies tellus
laoreet sit amet.
</p>
<p class="cleared">
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse
ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis
ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et
a urna. Ut id ornare felis, eget fermentum sapien.
</p>
<p>
Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus
tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus
sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis
vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
</p>
body {
width: 90%;
max-width: 900px;
margin: 0 auto;
font:
0.9em/1.2 "Helvetica",
"Arial",
sans-serif;
}
.box {
float: left;
margin: 15px;
width: 150px;
height: 150px;
border-radius: 5px;
background-color: rgb(207 232 220);
padding: 1em;
}
.special {
background-color: rgb(148 255 172);
padding: 10px;
color: purple;
}
.cleared {
clear: left;
}
您应该会看到第二个段落现在清除了浮动元素,不再与它并排显示。clear
属性接受以下值
left
:清除左浮动的项目。
right
:清除右浮动的项目。
both
:清除所有浮动的项目,无论是左浮动还是右浮动。
现在你知道如何清除浮动元素后面的内容,但让我们看看如果你有一个高大的浮动元素和一个短小的段落,并且一个盒子包含了两个元素时会发生什么。
修改您的文档,使第一个段落和浮动盒子共同用一个带有 wrapper
类的 <div>
包裹。
<div class="wrapper">
<div class="box">Float1</div>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
ultricies tellus laoreet sit amet.
</p>
</div>
在你的 CSS 中,为 .wrapper
类添加以下规则,然后重新加载页面
.wrapper {
background-color: rgb(148 255 172);
padding: 10px;
color: purple;
}
另外,移除原来的 .cleared
类
.cleared {
clear: left;
}
你会看到,就像我们在段落上添加背景颜色的例子一样,背景颜色会运行在浮动元素的后面。
<p>
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse
ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis
ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et
a urna. Ut id ornare felis, eget fermentum sapien.
</p>
<p>
Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus
tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus
sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis
vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
</p>
body {
width: 90%;
max-width: 900px;
margin: 0 auto;
font:
0.9em/1.2 "Helvetica",
"Arial",
sans-serif;
}
.box {
float: left;
margin: 15px;
width: 150px;
height: 150px;
border-radius: 5px;
background-color: rgb(207 232 220);
padding: 1em;
color: black;
}
这再次是因为浮动元素已从正常流中取出。您可能认为,通过将浮动框和围绕浮动框的第一个段落的文本一起包裹起来,后续内容将清除该框。但事实并非如此。
解决这个问题的方法是使用 display
属性的 flow-root
值。这个值只为解决这个特定问题而存在,无需使用任何技巧——使用它不会带来任何意外的后果。
.wrapper {
background-color: rgb(148 255 172);
padding: 10px;
color: purple;
display: flow-root;
}
<h1>Float example</h1>
<div class="wrapper">
<div class="box">Float</div>
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla luctus
aliquam dolor, eu lacinia lorem placerat vulputate. Duis felis orci,
pulvinar id metus ut, rutrum luctus orci. Cras porttitor imperdiet nunc, at
ultricies tellus laoreet sit amet.
</p>
</div>
<p class="cleared">
Sed auctor cursus massa at porta. Integer ligula ipsum, tristique sit amet
orci vel, viverra egestas ligula. Curabitur vehicula tellus neque, ac ornare
ex malesuada et. In vitae convallis lacus. Aliquam erat volutpat. Suspendisse
ac imperdiet turpis. Aenean finibus sollicitudin eros pharetra congue. Duis
ornare egestas augue ut luctus. Proin blandit quam nec lacus varius commodo et
a urna. Ut id ornare felis, eget fermentum sapien.
</p>
<p>
Nam vulputate diam nec tempor bibendum. Donec luctus augue eget malesuada
ultrices. Phasellus turpis est, posuere sit amet dapibus ut, facilisis sed
est. Nam id risus quis ante semper consectetur eget aliquam lorem. Vivamus
tristique elit dolor, sed pretium metus suscipit vel. Mauris ultricies lectus
sed lobortis finibus. Vivamus eu urna eget velit cursus viverra quis
vestibulum sem. Aliquam tincidunt eget purus in interdum. Cum sociis natoque
penatibus et magnis dis parturient montes, nascetur ridiculus mus.
</p>
body {
width: 90%;
max-width: 900px;
margin: 0 auto;
font:
0.9em/1.2 "Helvetica",
"Arial",
sans-serif;
}
.box {
float: left;
margin: 15px;
width: 150px;
height: 150px;
border-radius: 5px;
background-color: rgb(207 232 220);
padding: 1em;
color: black;
}
这就是您需要了解的关于浮动的所有内容。在下一篇文章中,我们将为您提供一些测试,您可以用来检查自己对所有这些信息的理解和掌握程度。