前端 div + CSS 布局方法小结

作者 Marlous 日期 2019-04-27
前端 div + CSS 布局方法小结

一 布局方法

布局图示

1 准备工作

  • 用 div 标签作为容器,进行嵌套布局。

  • 画出草图,计算出间距的值。

  • 先搞清楚由哪些块组成,用 div 写出整个框架(一个个容器嵌套)。

2 布局思路

  • 以文档流中的每个占一整行的块级元素为主线,将整个网页切分成多个横条的块容器。

  • 在某一个文档流中的横条的块容器内,通过 float 属性使用多个容器排列,分割成多列(其父元素即横条的块容器记得清除浮动 clearfix)。

  • 用递归的思路,此时这个横条的块容器内的某个 float 的容器即看作是一个新的文档流,再次进行布局。

3 详解

  • 在文档流中的块级元素,都是独占一行。通过这个性质将整个网页切成若干个横条块。

  • 只要是想将某个横条块分割成多列的块,就用 float 属性;同时记得其父元素必须清除浮动(不然父元素会因为子元素变成浮动的而失去高度)。

  • 如果有多层嵌套,最里面的块级容器设不设置成 float 无所谓,但是其父元素要设置成浮动(参考),不然子元素在设置 margin 值时会和父元素的 margin 重叠(也就是说子元素的 margin 并不会在父元素的内容里,而是在其外)。当然不给父元素设置成 float,也可以用绝对定位或设置其他属性达到目的。

  • 竖着布局块元素就是在文档流中布局。/ 然后想在文档流中的某横块元素中布局多列块元素,则这几个列块元素设置为 float,同时某横块元素设置清除浮动。/ 每个容器都可看作是一个文档流,然后在这个容器(文档流)中再布局。

4 div + CSS 布局小结

  • 横着布局块元素,将页面或容器横着分成若干个条状块区域。
  • 想把哪个条状块区域分割成几个列区域,就将子元素若干个列块设置成 float,同时其父元素条状块清除浮动。
  • 每个块都可看作是一个新的文档流,然后在其中分成若干个条状块区域,或分割成几个列块区域。
  • 使用递归的思想。
  • margin 是元素之间的距离。记得 padding、border 也会占距离,一开始设计时就要考虑,因为设置的宽度高度是内容的(也可以通过 box-sizing 属性设置,默认值是 content-box),后添加 padding、border 的话,距离会向外扩展。

5 注意

参考:
1、 设计网页,常见的宽度是多少像素?
2、 流布局与响应式网页设计有什么区别?

  1. PC 屏幕:
  • 条状块区域左右使用 margin auto,设置固定宽度来确保此条状区域位于文档流中央,不会因为屏幕改变而使整个网页宽度变形(具体宽度可以使用 1024px 为基准)。/ 使用 flex 布局。/ 页面宽度小于等于手机竖着的屏幕宽度,同时两边的 margin 设为 auto;高度在网页主区域上下使用 vh。这样手机、PC 上都可以正常显示。
  1. 适配不同屏幕:
  • 使用响应式布局,使用前端框架(参考)。

二 示例代码

1 HTML

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<!DOCTYPE html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link type="text/css" href="./main.css" rel="stylesheet">
<title>Test Web</title>
</head>
<body>

<div class="nav clearfix">
<div class="nav-left-item">Home</div>
<ul class="nav-right-item">
<li>Blog</li>
<li>Works</li>
<li>About</li>
</ul>
</div>

<div class="content clearfix">
<div class="content-left">
<div class="content-left-item"></div>
<div class="content-left-item"></div>
<div class="content-left-item"></div>
</div>
<div class="content-right">
<div class="content-right-top">
<div class="content-right-top-bar"></div>
<div class="content-right-top-articles"></div>
</div>
<div class="content-right-bottom"></div>
</div>
</div>

<div class="footer clearfix"></div>

</body>
</html>

2 CSS

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
.clearfix::after{
content: " ";
clear: both;
}


/* nav */

.nav{
height: 70px;
width: 100%;
background-color: black;
}

.nav-left-item{
float: left;
height: 70px;
width: 120px;
margin-left: 80px;
color: aliceblue;
text-align: center;
line-height: 70px;
}

.nav-right-item{
float: right;
height: 70px;
width: 320px;
list-style: none;
margin: 0 50px 0 0;
padding: 0;
}

.nav-right-item li{
display: inline-block;
height: 70px;
width: 30%;
color: aliceblue;
text-align: center;
line-height: 70px;
}


/* content */

.content{
height: 550px;
width: 100%;
background-color: aqua;
}

.content-left{
float: left;
height: 550px;
width: 40%;
background-color: blue;
}

.content-left-item{
height: 170px;
width: 95%;
margin: 10px 2.5% 0 2.5%;
background-color: bisque;
}

.content-right{
float: right;
height: 550px;
width: 58%;
background-color: blueviolet;
}

.content-right-top{
float: left;
height: 200px;
width: 95%;
margin: 10px 2.5% 0 2.5%;
background-color: cadetblue;
}

.content-right-top-bar{
height: 30px;
margin: 5px 5px 0 5px;
background-color: chartreuse;
}

.content-right-top-articles{
height: 160px;
margin: 0 5px 5px 5px;
background-color: coral;
}

.content-right-bottom{
float: left;
height: 320px;
width: 95%;
margin: 10px 2.5% 0 2.5%;
background-color: yellow;
}

/* footer */

.footer{
height: 120px;
width: 100%;
background-color: brown;
}