目录
一、display
CSS 中的 display
属性用于控制元素的显示方式,包括其盒模型的行为,不同的 display
值会导致元素在布局中的行为不同。
1. block
元素显示为块级元素,每个块级元素从新的一行开始,并占满其父元素的宽度,可以设置宽高、内外边距。常见的块级元素包括 <div>
, <p>
, <h1>
等。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>block</title>
<style>
.block-element {
display: block;
width: 150px;
height: 150px;
background-color: blue;
}
</style>
</head>
<body>
<div class="block-element">
这是一个块级元素。
</div>
</body>
</html>
2. inline
元素显示为内联元素,内联元素不会从新的一行开始,并且只占据其内容所需的宽度。常见的内联元素包括 <span>
, <a>
, <strong>
等。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>inline</title>
<style>
.inline-element {
display: inline;
background-color: yellow;
}
</style>
</head>
<body>
<span class="inline-element">这是一个内联元素。</span>
</body>
</html>
3. inline-block
元素显示为内联块级元素,结合了 block
和 inline
的特性,类似于内联元素,不从新的一行开始,但可以设置宽度和高度。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>inline-block</title>
<style>
.inline-block-element {
display: inline-block;
width: 180px;
height: 40px;
background: red;
}
</style>
</head>
<body>
<div class="inline-block-element">这是一个内联块级元素。</div>
</body>
</html>
4. none
元素不显示,并且从文档布局中完全移除,相当于元素不存在。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>none</title>
<style>
.hidden-element {
display: none;
}
</style>
</head>
<body>
<div class="hidden-element">Hidden Element</div>
</body>
</html>
5. list-item
元素作为块级元素显示,并增加项目符号(适用于 <li>
元素)。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>list-item</title>
<style>
.list-item-element {
display: list-item;
list-style-type: disc;
}
</style>
</head>
<body>
<ul>
<li class="list-item-element">List Item Element</li>
</ul>
</body>
</html>
6. table
、table-row
、table-cell
table
:元素作为块级表格显示,适用于多列布局。
table-row
:元素作为表格行显示。
table-cell
:元素作为表格单元格显示。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>table</title>
<style>
.table-element {
display: table;
width: 100%;
border-collapse: collapse;
}
.table-row-element {
display: table-row;
}
.table-cell-element {
display: table-cell;
border: 1px solid black;
padding: 10px;
}
</style>
</head>
<body>
<div class="table-element">
<div class="table-row-element">
<div class="table-cell-element">Cell 1</div>
<div class="table-cell-element">Cell 2</div>
</div>
</div>
</body>
</html>
7. flex
元素成为弹性容器,其子元素成为弹性项目。弹性布局(Flexbox)用于一维布局,即水平或垂直布局。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>flex</title>
<style>
.flex-container {
display: flex;
justify-content: center;
align-items: center;
height: 100px;
background-color: lightgray;
}
</style>
</head>
<body>
<div class="flex-container">
Flex Container
</div>
</body>
</html>
8. inline-flex
类似于 flex
,但容器本身是内联的,且兼容性较差。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>inline-flex</title>
<style>
.inline-flex-element {
display: inline-flex;
width: 150px;
height: 50px;
background: green;
}
</style>
</head>
<body>
<div class="inline-flex-element">Inline-Flex Element</div>
</body>
</html>
9. grid
元素成为网格容器,其子元素成为网格项目。网格布局(Grid)用于二维布局,即行和列布局。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>grid</title>
<style>
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
</style>
</head>
<body>
<div class="grid-container">
<div>Grid Item 1</div>
<div>Grid Item 2</div>
<div>Grid Item 3</div>
</div>
</body>
</html>
10. inline-grid
类似 grid
,但容器本身是内联的,且兼容性较差。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>inline-grid</title>
<style>
.inline-grid-element {
display: inline-grid;
width: 150px;
height: 50px;
background: purple;
}
</style>
</head>
<body>
<div class="inline-grid-element">Inline-Grid Element</div>
</body>
</html>
11. contents
使元素不产生边界框,仅保留内容,但背景、边框和填充部分不会渲染。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>contents</title>
<style>
.contents-element {
display: contents;
}
</style>
</head>
<body>
<div class="contents-element">
<span>Contents Element</span>
</div>
</body>
</html>
12. run-in
用于将元素作为块级元素或行内元素显示,具体取决于上下文。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.run-in-element {
display: run-in;
}
</style>
</head>
<body>
<p class="run-in-element">Run-In Element</p>
</body>
</html>
13. 综合示例
以下是一个综合示例,展示了上述部分 display
属性的使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>CSS Display 属性示例</title>
<style>
.block-element {
display: block;
width: 100px;
height: 100px;
background-color: blue;
}
.inline-element {
display: inline;
background-color: yellow;
}
.inline-block-element {
display: inline-block;
width: 150px;
height: 50px;
background: red;
}
.hidden-element {
display: none;
}
.list-item-element {
display: list-item;
list-style-type: disc;
}
.table-element {
display: table;
width: 100%;
border-collapse: collapse;
}
.table-row-element {
display: table-row;
}
.table-cell-element {
display: table-cell;
border: 1px solid black;
padding: 10px;
}
.flex-container {
display: flex;
justify-content: center;
align-items: center;
height: 100px;
background-color: lightgray;
}
.inline-flex-element {
display: inline-flex;
width: 150px;
height: 50px;
background: pink;
}
.grid-container {
display: grid;
grid-template-columns: repeat(3, 1fr);
gap: 10px;
}
.inline-grid-element {
display: inline-grid;
width: 150px;
height: 50px;
background: green;
}
.contents-element {
display: contents;
}
.run-in-element {
display: run-in;
}
</style>
</head>
<body>
<div class="block-element">Block Element</div>
<span class="inline-element">Inline Element</span>
<div class="inline-block-element">Inline-Block Element</div>
<div class="hidden-element">Hidden Element</div>
<ul>
<li class="list-item-element">List Item Element</li>
</ul>
<div class="table-element">
<div class="table-row-element">
<div class="table-cell-element">Cell 1</div>
<div class="table-cell-element">Cell 2</div>
</div>
</div>
<div class="flex-container">
Flex Container
</div>
<div class="inline-flex-element">Inline-Flex Element</div>
<div class="grid-container">
<div>Grid Item 1</div>
<div>Grid Item 2</div>
<div>Grid Item 3</div>
</div>
<div class="inline-grid-element">Inline-Grid Element</div>
<div class="contents-element">
<span>Contents Element</span>
</div>
<p class="run-in-element">Run-In Element</p>
</body>
</html>
二、浮动
CSS浮动(float)是一种重要的布局方式,通过将元素从文档流中移除并使其向左或右浮动,从而实现页面元素的灵活排列。
1. 浮动的基本概念
浮动(float)属性允许元素脱离文档流,向左或右移动,直到碰到父元素的边界或另一个浮动元素为止。浮动元素会自动成为块级元素,并且可以设置宽度和高度属性。
2. 浮动的属性值
-
none
:默认值,元素不浮动。 -
left
:元素向左浮动。 -
right
:元素向右浮动。 -
inherit
:元素继承其父元素的浮动值。
3. 浮动的特点
-
脱离文档流 浮动元素会脱离标准文档流,不再占据原来的位置,而是向左或向右移动,直到碰到父元素的边界或另一个浮动元素为止。
-
行内块元素特性 浮动元素具有行内块(inline-block)的特性,可以设置宽度和高度,且不会独占一行显示,多个浮动元素会紧挨着排列,顶部对齐。
-
影响其他元素布局 浮动元素会影响其他非浮动元素的排列和布局,非浮动元素会环绕在浮动元素的周围进行布局。
-
不遮挡文字 浮动元素不会遮挡文字,文字会环绕在浮动元素周围,形成“文字环绕”效果。
-
不会独占一行 浮动元素不会独占一行,而是与其他元素共享一行显示,即使没有设置宽度,浮动元素也会根据内容撑开。
-
不影响前一个标准流元素 浮动元素只影响其后的标准流元素,不会影响前面的标准流元素。
-
默认不合并margin 浮动元素的margin不会合并,因此可能会出现margin重叠的情况。可以通过清除浮动(如使用
clear
属性)来解决此问题。 -
高度塌陷问题 当父元素中所有子元素浮动后,父元素的高度可能会塌陷为0。解决方法包括给父元素设置
min-height
、height
或使用伪元素模拟父元素高度。
4. 浮动的实现方式
浮动的实现方式非常简单,只需在CSS中设置float
属性即可:
/*向左浮动*/
.float-left {
float: left;
}
/*向右浮动*/
.float-right {
float: right;
}
示例 1:基础文字环绕
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.float-left {
float: left;
margin-right: 15px;
width: 200px;
}
</style>
</head>
<body>
<div class="container">
<img src="image/1.png" alt="示例图片" class="float-left">
<p>这是一段围绕浮动图片的文字。浮动让文字自然环绕在图片周围,类似于杂志排版效果。</p>
</div>
</body>
</html>
示例 2:两栏布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.left-column {
float: left;
width: 200px;
background: #f0f0f0;
}
.right-column {
margin-left: 200px; /* 避免内容重叠 */
background: #e5e5e5;
}
</style>
</head>
<body>
<div class="container">
<div class="left-column">左侧栏</div>
<div class="right-column">右侧内容区</div>
</div>
</body>
</html>
示例 3:三栏布局
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.column {
float: left;
width: 33.33%;
box-sizing: border-box;
padding: 20px;
}
.clearfix::after {
content: "";
display: table;
clear: both;
}
</style>
</head>
<body>
<div class="container clearfix">
<div class="column">左栏</div>
<div class="column">中栏</div>
<div class="column">右栏</div>
</div>
</body>
</html>
示例 4:导航菜单
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<style>
.nav li {
float: left;
margin-right: 20px;
list-style: none;
}
</style>
</head>
<body>
<ul class="nav">
<li><a href="#">首页</a></li>
<li><a href="#">产品</a></li>
<li><a href="#">我的</a></li>
</ul>
</body>
</html>
5. 清除浮动
CSS浮动的清除是前端开发中非常重要的一环,主要目的是解决浮动元素对后续元素布局的影响,避免布局混乱。
以下是几种常见的清除浮动的方法及其优缺点:
(1)使用 clear
属性
clear
属性可以防止元素与浮动元素重叠,使当前元素从浮动元素下方开始排列。clear
属性有四个取值:
-
left
:清除左侧的浮动对象。 -
right
:清除右侧的浮动对象。 -
both
:清除左右两侧的浮动对象。 -
none
:默认值,允许两边都有浮动对象。
.clear {
clear: both;
}
优点:
-
简单易用。
-
不需要额外的HTML结构。
缺点:
-
需要手动指定需要清除浮动的元素,不够灵活。
(2)使用伪元素清除浮动
通过在父元素上使用伪元素(如 ::after
)来清除浮动,是一种非常常用的方法。具体步骤如下:
-
在浮动元素的父级类名中添加
.clearfix::after
伪元素。 -
设置
content: ""
创建一个空内容。 -
设置
clear: both
清除伪元素两边的浮动流。 -
设置
display: block
将伪元素变为块元素。
.container::after {
content: "";
display: table;
clear: both;
}
优点:
-
不需要手动指定需要清除浮动的元素。
-
不增加额外的HTML结构。
缺点:
-
需要额外写一行CSS代码。
(3)使用 overflow
属性
通过设置父元素的 overflow
属性为 hidden
或 auto
,可以触发BFC(块级格式化上下文),从而清除浮动。具体方法如下:
-
overflow: hidden
-
overflow: auto
.parent {
overflow: hidden;
}
优点:
-
简单易用。
-
不需要额外的HTML结构。
缺点:
-
当元素有阴影或存在下拉菜单时可能会被截断。
-
兼容性较好,但需注意IE浏览器的兼容性问题。
(4)使用 clearfix
类
clearfix
类是一种常见的清除浮动的方法,通过在父元素上添加 clearfix
类来实现清除浮动。具体步骤如下:
-
在父元素上添加
clearfix
类。 -
在CSS中添加以下代码:
.clearfix::after {
content: "";
display: table;
clear: both;
}
优点:
-
不需要手动指定需要清除浮动的元素。
-
不增加额外的HTML结构。
缺点:
-
需要额外写一行CSS代码。
(5)使用 Flexbox 和 Grid 布局
CSS Flexbox 和 Grid 布局可以自动包含所有子元素,无需手动清除浮动。具体方法如下:
-
使用 Flexbox 布局:
.parent {
display: flex;
}
-
使用 Grid 布局:
.parent {
display: grid;
}
优点:
-
简单易用。
-
不需要手动清除浮动。
缺点:
-
需要了解 Flexbox 和 Grid 布局的基本概念。