1、关于ul的padding-left:40px的问题;
首先,我们来看一段代码:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>ul的padding-left:40px的问题</title>
6 <style type="text/css">
7 ul.imglist{
8 width: 536px;
9 height: 20px;
10 border: 1px solid #000;
11 }
12 </style>
13 </head>
14 <body>
15 <ul class="imglist"></ul>
16 </body>
17 </html>
以上代码中,我们给ul元素设置了一个类属性,命名为imglist。
并在样式中,给ul设置宽度为:536px,高度:20px,边框为1像素的黑色实线。
显示的效果:

由上图,我们可以看出ul.imglist的宽度居然变成了578px,除去边框的2px,576px减去536px,整整多出了40px。
究其根本原因,是因为浏览器对HTML元素默认样式设置不同所产生的。
Firefox浏览器中的默认样式里面关于ul和ol的定义:

我们可以根据-moz-padding-start:40px,可以得出浏览器对ul和ol元素,默认会自动加上40px的填充。
那我们应该怎么样处理掉这浏览器默认的40px填充的像素?我们需要将常用的元素的内外边界初始化。
有以下两种解决办法:
1、在css的开头加上:
*{
margin: 0px;
padding: 0px;
}
但是这一种方式比较占资源
2、第二种方式,指它特定的标签设置:
body, div, dl, dt, dd, ul, ol, li, h1, h2, h3, h4, h5, h6, pre, code, form, fieldset, legend, input, button, textarea, p, blockquote, table, th, td {
margin:0;
padding:0;
}
下面我们修改一下代码:对ul进行初始化设置。

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>ul的padding-left:40px的问题</title>
6 <style type="text/css">
7 ul{
8 margin: 0px;
9 padding: 0px;
10 }
11 ul.imglist{
12 width: 536px;
13 height: 20px;
14 border: 1px solid #000;
15 }
16 </style>
17 </head>
18 <body>
19 <ul class="imglist"></ul>
20 </body>
21 </html>
显示效果:

2、在代码中,中文字体为什么要用Unicode编码?
在代码中,我们常常把“宋体”写成“\5b8b\4f53”。当网页的编码是 utf-8时,某些情况下直接写:宋体、微软雅黑之类的中文字体名字时,会出现不能识别导致字体设置失效的问题,如果把字体名字转成对应编码如:‘\5b8b\4f53’,就不会出现这个问题。
3、font:14px/22px "\9ED1\4F53";是什么意思呢?
font:14px/22px "\9ED1\4F53";
14px是指字体大小,font-size。
22px是指行距,line-height。
"\9ED1\4F53"是指黑体。
4、margin:0 auto;的作用?
(1)语法格式
margin:0 auto;设置对象的上下间距为0,左右自动。
margin:0 auto可拆分为:margin: 0 auto 0 auto
margin-top: 0; margin-right: auto;margin-bottom: 0;margin-left: auto;(上、右、下、左)
下面,让我们看一段代码:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .aa,.bb{
8 width: 300px;
9 height: 50px;
10 }
11 .aa{
12 border: 1px solid #F00;
13 margin-bottom: 30px;
14 }
15 .bb{
16 border: 1px solid #00F;
17 }
18 </style>
19 </head>
20 <body>
21 <div class="aa"></div>
22 <div class="bb"></div>
23 </body>
24 </html>
显示效果:

小结:我们在类名为aa的div中设置属性:margin-bottom: 30px;,效果如上图所示。
(2)作用
在div标签上设置margin:0 auto样式,是为了让div在浏览器中水平居中。
布局居中,水平居中,均可加入:margin:0 auto样式即可。
(3)关键点
关键点是:auto(自动,自适应)
将上面的代码进行修改,如下所示:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .aa,.bb{
8 width: 300px;
9 height: 50px;
10 margin: 0 auto;
11 }
12 .aa{
13 border: 1px solid #F00;
14 margin-bottom: 30px;
15 }
16 .bb{
17 border: 1px solid #00F;
18 }
19 </style>
20 </head>
21 <body>
22 <div class="aa"></div>
23 <div class="bb"></div>
24 </body>
25 </html>
显示效果:

小结:以上例子中,我们统一设置div(aa)和div(bb)的宽度为:300px,边框1px。
可以测量出,浏览器的body长度为:1366px,因为设置了margin:0 auto,左右的边距自动,浏览会自动去解析div,左右边距自动设置值为(body长度-
(div长度+2*边框))/2,即为(1366px-(300+2))/2等于532px。
具体距离显示如下:


(4)为什么要设置margin:0 auto?
1、让div布局,水平居中于浏览器;
2、兼容各大浏览器让布局居中;
注意点:加入div居中布局中,如果果入了margin::0 auto就不能加入float浮动样式,避免逻辑错误,造成布局居中不兼容。
5、理解overflow: hidden的作用
我们先来看一段代码:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 background-color: black;
9 }
10 .div1{
11 background-color: aqua;
12 width: 100px;
13 height: 100px;
14 }
15 .div2{
16 background-color: red;
17 width: 100px;
18 height: 100px;
19 }
20 </style>
21 </head>
22 <body>
23 <div class="container">
24 <div class="div1"></div>
25 <div class="div2"></div>
26 </div>
27 </body>
28 </html>
显示效果如下:父级div(container)的高度是auto,可以被子div无限的撑大,如下图的所示。

1、隐藏溢出;
现在我们给上段代码中的div(container),设置高度:height: 150px;
代码如下:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 background-color: black;
9 height: 150px;
10 }
11 .div1{
12 background-color: aqua;
13 width: 100px;
14 height: 100px;
15 }
16 .div2{
17 background-color: red;
18 width: 100px;
19 height: 100px;
20 }
21 </style>
22 </head>
23 <body>
24 <div class="container">
25 <div class="div1"></div>
26 <div class="div2"></div>
27 </div>
28 </body>
29 </html>
显示效果:

现在我们给上段代码中的父div(container),设置高度:height: 150px的同时,加入overflow: hidden;代码如下:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 background-color: black;
9 height: 150px;
10 overflow: hidden;
11 }
12 .div1{
13 background-color: aqua;
14 width: 100px;
15 height: 100px;
16 }
17 .div2{
18 background-color: red;
19 width: 100px;
20 height: 100px;
21 }
22 </style>
23 </head>
24 <body>
25 <div class="container">
26 <div class="div1"></div>
27 <div class="div2"></div>
28 </div>
29 </body>
30 </html>
显示效果:

小结:在默认情况下,当我们设置了父div(container)的高度为150px,子级div(div1, div2)的高度和为:200px,大于父级div(container)的高度,所以
此时子级div就会溢出父级div,如上图所示。
当我们在父div(container)上设置了:overflow: hidden;的时候,情况就发生变化了。overflow对子div(div1, div2)进行控制,设置overflow: hidden;
属性可以将超出父级div的子div进行溢出隐藏。
2、清除浮动
我们来看下面一段代码:
当父元素的高height:auto时,子元素分别设置:float:left时,使用overflow: hidden;来清除浮动。
①不清除浮动的时候
代码如下:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 background-color: black;
9 }
10 .div1{
11 float: left;
12 background-color: aqua;
13 width: 100px;
14 height: 100px;
15 }
16 .div2{
17 float: left;
18 background-color: red;
19 width: 100px;
20 height: 100px;
21 }
22 </style>
23 </head>
24 <body>
25 <div class="container">
26 <div class="div1"></div>
27 <div class="div2"></div>
28 </div>
29 </body>
30 </html>
显示效果:

小结:我们很容易发现一个问题,就是为黑色背景的父元素div(container)消失了?
为什么会出现这样的情况呢?
原因是:子元素是浮动的,浮动的元素脱离文档元素,不占据空间。
不浮动的父级元素会直接无视这些浮动的子元素,又加之父元素div(container)的height:auto,即我们并没有设置,所以父元素div就没有显示出来了。
②清除浮动的时候
(1)方法一:使用overflow: hidden;
代码始下:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 background-color: black;
9 overflow: hidden;
10 }
11 .div1{
12 float: left;
13 background-color: aqua;
14 width: 100px;
15 height: 100px;
16 }
17 .div2{
18 float: left;
19 background-color: red;
20 width: 100px;
21 height: 100px;
22 }
23 </style>
24 </head>
25 <body>
26 <div class="container">
27 <div class="div1"></div>
28 <div class="div2"></div>
29 </div>
30 </body>
31 </html>

(2)方法二:给父div(container)设置float
当然,我们还可以有另外一种方法清除浮动,那就是父div(container)本身也设置float;
代码如下:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 float: left;
9 background-color: black;
10 }
11 .div1{
12 float: left;
13 background-color: aqua;
14 width: 100px;
15 height: 100px;
16 }
17 .div2{
18 float: left;
19 background-color: red;
20 width: 100px;
21 height: 100px;
22 }
23 </style>
24 </head>
25 <body>
26 <div class="container">
27 <div class="div1"></div>
28 <div class="div2"></div>
29 </div>
30 </body>
31 </html>
显示效果:

小结:我们没有看到黑色的父div(container)的身影,但是我们可以借助浏览器,很明显的看到父div(container),包含了两个子div(div1,div2)。这是因为浮动的div已经失去了“独霸一行”的能力,当我们手动为其设置一个宽度,如下代码所示:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 float: left;
9 background-color: black;
10 width: 500px;
11 }
12 .div1{
13 float: left;
14 background-color: aqua;
15 width: 100px;
16 height: 100px;
17 }
18 .div2{
19 float: left;
20 background-color: red;
21 width: 100px;
22 height: 100px;
23 }
24 </style>
25 </head>
26 <body>
27 <div class="container">
28 <div class="div1"></div>
29 <div class="div2"></div>
30 </div>
31 </body>
32 </html>
显示效果如下:

小结:(1)方法一:使用overflow: hidden; (2)方法二:给父div(container)设置float
以上两种方法,一种是使用了清除浮动的战略,一种是使用了浮动的战略,使父div接受子div。两者的区别在于如果都浮动的话,需要额外的设置父div的
宽度,因为浮动起来的div失去了独占一行的特征,而清除浮动的div仍然霸道。
3、解决坍塌
(1)可以使用overflow:hidden解决margin坍塌;
坍塌是不分父级div的高度是否固定的。
首先,我们要知道什么叫做坍塌?
我们在div1中加入margin-top: 50px;代码如下,我们来看看不坍塌时的效果。
代码如下:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 overflow: hidden;
9 background-color: black;
10 }
11 .div1{
12 margin-top: 50px;
13 background-color: aqua;
14 width: 100px;
15 height: 100px;
16 }
17 .div2{
18 background-color: red;
19 width: 100px;
20 height: 100px;
21 }
22 </style>
23 </head>
24 <body>
25 <div class="container">
26 <div class="div1"></div>
27 <div class="div2"></div>
28 </div>
29 </body>
30 </html>
显示效果:

当去掉 overflow: hidden;代码如下:

我们来测量一下:

我们可以发现,div1的上端距离浏览器的顶部距离是50px,而不是对它的父div。这就是坍塌。
这种坍塌指针对父亲的第一个儿子div1,div2设置margin-top: 50px;
则不会有影响。
代码如下:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 background-color: black;
9 }
10 .div1{
11 background-color: aqua;
12 width: 100px;
13 height: 100px;
14 }
15 .div2{
16 margin-top: 50px;
17 background-color: red;
18 width: 100px;
19 height: 100px;
20 }
21 </style>
22 </head>
23 <body>
24 <div class="container">
25 <div class="div1"></div>
26 <div class="div2"></div>
27 </div>
28 </body>
29 </html>
显示效果:

(2)考虑用符动来解决坍塌的问题;
我们给父div设置高度height:200px,然后给子div设置float:left;代码如下:

1 <!DOCTYPE html>
2 <html lang="en">
3 <head>
4 <meta charset="UTF-8">
5 <title>margin:0 auto;的作用</title>
6 <style type="text/css">
7 .container{
8 background-color: black;
9 height: 200px;
10 }
11 .div1{
12 margin-top: 50px;
13 float: left;
14 background-color: aqua;
15 width: 100px;
16 height: 100px;
17 }
18 .div2{
19 float: left;
20 background-color: red;
21 width: 100px;
22 height: 100px;
23 }
24 </style>
25 </head>
26 <body>
27 <div class="container">
28 <div class="div1"></div>
29 <div class="div2"></div>
30 </div>
31 </body>
32 </html>
显示效果:

显然易见,只要是符动的div就避免了坍塌的问题了。(无论是父div是否浮动)
总结:可以使用overflow:hidden来解除坍塌,浮动的div根本不用考虑坍塌;overflow:hidden的用法在溢出和清除浮动上主要针对父div是否有固定的高度加以区分。它还额外肩负了解除坍塌的重任。
来源:https://www.cnblogs.com/niuwa/p/7597810.html
