美文网首页
CSS基础之清除浮动,Margin塌陷现象详解

CSS基础之清除浮动,Margin塌陷现象详解

作者: Owen270 | 来源:发表于2017-12-15 17:37 被阅读206次

1.浮动的清除

1.1.浮动现象

现在两个div,div身上没有任何属性。每个div中都有li,这些li都是浮动的,我们本以为这些li,会分为两排,但是,第二组中的第1个li,去贴靠第一组中的最后一个li了,而实际结果:第二个div中的li,去贴第一个div中最后一个li的边了。原因就是因为div没有高度,不能给自己浮动的孩子们,一个容器。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        li{
            float: left;
            width: 90px;
            height: 40px;
            background-color: gold;
            /*文本居中*/
            text-align: center;
        }
    </style>
</head>
<body>
    <div>
        <ul>
            <li>HTML</li>
            <li>CSS</li>
            <li>JS</li>
            <li>HTML5</li>
            <li>设计模式</li>
        </ul>
    </div>

    <div>
        <ul>
            <li>学习方法</li>
            <li>英语水平</li>
            <li>面试技巧</li>
        </ul>
    </div>
</body>
</html>
image.png

1.2. 清除浮动方法1(高度固定,很少使用)

给浮动的元素的祖先元素加高度,如果一个元素要浮动,那么它的祖先元素一定要有高度。高度的盒子,才能关住浮动,只要浮动在一个有高度的盒子中,那么这个浮动就不会影响后面的浮动元素。所以就是清除浮动带来的影响了
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding:0;
        }
        div{
            height: 40px;
            border: 1px solid #000;
        }
        li{
            float: left;
            width: 90px;
            height: 40px;
            margin-right: 10px;
            background-color: gold;
            /*文本居中*/
            text-align: center;
        }
    </style>
</head>
<body>
    <div>
        <ul>
            <li>HTML</li>
            <li>CSS</li>
            <li>JS</li>
            <li>HTML5</li>
            <li>设计模式</li>
        </ul>
    </div>

    <div>
        <ul>
            <li>学习方法</li>
            <li>英语水平</li>
            <li>面试技巧</li>
        </ul>
    </div>
</body>
</html>
图片.png

1.2. 清除浮动方法2(margin失效了)

clear:both;clear就是清除,both指的是左浮动、右浮动都要清除。意思就是:清除别人对我的影响。这种方法有一个非常大的、致命的问题,margin失效了。如果用用方法一,高度height就会固定,因为能被内容撑高,这也是为什么方法一用的少的原因
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding:0;
        }
        li{
            float: left;
            width: 120px;
            height: 40px;
            text-align: center;
            background-color: orange;
        }
        .box2{
            clear: both;
            margin-top: 100px;//margin是失效的
        }
    </style>
</head>
<body>
    <div class="box1">
        <ul>
            <li>HTML</li>
            <li>CSS</li>
            <li>JS</li>
            <li>HTML5</li>
            <li>设计模式</li>
        </ul>
    </div>

    <div class="box2">
        <ul>
            <li>学习方法</li>
            <li>英语水平</li>
            <li>面试技巧</li>
        </ul>
    </div>
</body>
</html>

1.3. 清除浮动方法:隔墙法

1.3.1 外墙法:在两部分浮动元素中间,建一个墙。隔开两部分浮动,让后面的浮动元素,不去追前面的浮动元素。墙用自己的身体当做了间隙
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding:0;
        }
        .box1{
            background-color: gold;
        }
        li{
            float: left;
            width: 120px;
            height: 40px;
            background-color: orange;
        }
        .cl{
            clear: both;
        }
        .h8{
            height: 2px;
            _font-size:0;
        }

    </style>
</head>
<body>
    <div class="box1">
        <ul>
            <li>HTML</li>
            <li>CSS</li>
            <li>JS</li>
            <li>HTML5</li>
            <li>设计模式</li>
        </ul>
    </div>
    
    <div class="cl h8"></div>

    <div class="box2">
        <ul>
            <li>学习方法</li>
            <li>英语水平</li>
            <li>面试技巧</li>
        </ul>
    </div>
</body>
</html>
图片.png
1.3.2.内墙法,外墙法虽然好用,但是第一个div,还是没有高度。如果我们现在想让第一个div,自动的根据自己的儿子,撑出高度,那么可以使用内墙法(内墙法的本质:给没有高的父亲撑出高度)(推荐使用)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding:0;
        }
        .box1{
            background-color: gold;
        }
        li{
            float: left;
            width: 120px;
            height: 40px;
            background-color: orange;
            text-align: center;
        }
        .cl{
            clear: both;
        }
        .h16{
            height: 16px;
        }
    </style>
</head>
<body>
    <div class="box1">
        <ul>
            <li>HTML</li>
            <li>CSS</li>
            <li>JS</li>
            <li>HTML5</li>
            <li>设计模式</li>
        </ul>

        <div class="cl h16"></div>
    </div>

    <div class="box2">
        <ul>
            <li>学习方法</li>
            <li>英语水平</li>
            <li>面试技巧</li>
        </ul>
    </div>
</body>
</html>
图片.png
内墙法的用途
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        .content{
            width: 900px;
            margin: 0 auto;
            background-color: yellow;
        }
        .content .ad{
            float: left;
            width: 100px;
            height: 300px;
            background-color: blue;
        }
        .content .news{
            float: left;
            width: 600px;

        }
        .cl{
            clear: both;
        }
    </style>
</head>
<body>
    <div class="content">
        <div class="ad"></div>
        <div class="news">
             
             容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
            容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内.............
        </div>

        <div class="cl"></div>
    </div>
</body>
</html>
a:没有使用内墙的时候,父容器高度撑不起来,不显示黄色背景
图片.png
b:使用内墙,父容器高度撑起来,显示黄色背景
图片.png

1.4.overflow:hidden;(推荐使用)

这个属性的本意,就是将所有溢出盒子的内容,隐藏掉。但是,我们发现这个东西能够用于浮动的清除。我们知道,一个父亲,不能被自己浮动的儿子撑出高度,但是,如果这个父亲加上了overflow:hidden;那么这个父亲就能够被浮动的儿子撑出高度了。这个现象,不能解释,就是浏览器的小偏方。并且,overflow:hidden;能够让margin生效。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        div{
            width: 400px;
            overflow: hidden;
            border: 10px solid black;
        }
        .p1{
            float: left;
            width: 100px;
            height: 150px;
            background-color: red;
        }
        .p2{
            float: left;
            width: 100px;
            height: 380px;
            background-color: yellow;
        }
        .p3{
            float: left;
            width: 100px;
            height: 120px;
            background-color: blue;
        }
    </style>
</head>
<body>
    <div>
        <p class="p1"></p>
        <p class="p2"></p>
        <p class="p3"></p>
    </div>
</body>
</html>
a:不加overflow: hidden;父容器没有被撑出高度
图片.png
b:不加overflow: hidden;父容器被撑出高度
图片.png

使用overflow清除浮动的案例

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding:0;
        }
        li{
            float: left;
            width: 120px;
            height: 40px;
            background-color: orange;
            text-align: center;
        }
        .box1{
            overflow: hidden;
            _zoom:1;
            margin-bottom: 10px;
        }
    </style>
</head>
<body>
    <div class="box1">
        <ul>
            <li>HTML</li>
            <li>CSS</li>
            <li>JS</li>
            <li>HTML5</li>
            <li>设计模式</li>
        </ul>
    </div>

    <div class="box2">
        <ul>
            <li>学习方法</li>
            <li>英语水平</li>
            <li>面试技巧</li>
        </ul>
    </div>
</body>
</html>
a:加 overflow: hidden;
图片.png
b:不加 overflow: hidden;
图片.png

2.margin的塌陷现象

2.1.标准文档流中,竖直方向的margin不叠加,以较大的为准。

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        div{
            width: 200px;
            border: 10px solid red;
            overflow: hidden;
        }
        .p1{
            width: 200px;
            height: 100px;
            background-color: orange;
            margin-bottom: 30px;
            float: left;
        }
        .p2{
            width: 200px;
            height: 100px;
            background-color: orange;
            margin-top: 50px;
            float: left;
        }
    </style>
</head>
<body>
    <div>
        <p class="p1"></p>
        <p class="p2"></p>
    </div>
</body>
</html>
图片.png

2.2.如果不在标准流,比如盒子都浮动了,那么两个盒子之间是没有塌陷现象的:

图片.png

2.3. 盒子居中margin:0 auto;

margin的值可以为auto,表示自动。当left、right两个方向,都是auto的时候,盒子居中了:
1 margin-left: auto;
2 margin-right: auto;
简写为 margin:0 auto;
注意:
1) 使用margin:0 auto; 的盒子,必须有width,有明确的width
2) 只有标准流的盒子,才能使用margin:0 auto; 居中。
也就是说,当一个盒子浮动了、绝对定位了、固定定位了,都不能使用margin:0 auto;
3) margin:0 auto;是在居中盒子,不是居中文本。
文本的居中,要使用
1   text-align:center;
1   margin:0 auto;   → 让这个div自己在大容器中居中。
2   text-align: center;  → 让这个div内部的文本居中。

普及一下知识,text-align还有
1   text-align:left;     没啥用,因为默认居左
2   text-align:right;    文本居右
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        div{
            width: 400px;
            height: 100px;
            background-color: orange;
            margin:50px auto;
            text-align: center;
        }
        p{
            width: 100px;
            height: 100px;
            background-color: green;
            margin: 0 auto;
            float: left;
        }
    </style>
</head>
<body>
    <div>哈哈哈</div>
    
    <p></p>
</body>
</html>     
图片.png

2.4. 善于使用父亲的padding,而不是儿子的margin

如果父亲没有border,那么儿子的margin实际上踹的是“流”,踹的是这“行”。所以,父亲整体也掉下来了,margin这个属性,本质上描述的是兄弟和兄弟之间的距离; 最好不要用这个marign表达父子之间的距离。所以,我们一定要善于使用父亲的padding,而不是儿子的margin。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        div{
            width: 300px;
            height: 250px;
            padding-top: 50px;
            background-color: orange;
        }
        p{
            width: 100px;
            height: 100px;
            background-color: green;
        }
    </style>
</head>
<body>
    <div>
        <p></p>
    </div>
</body>
</html>
图片.png
如果有边框的话,也可以使用marginTop
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
    <title>Document</title>
    <style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        div{
            width: 300px;
            height: 250px;
            /*padding-top: 50px;*/
            background-color: orange;
            border: 1px solid orange;
        }
        p{
            width: 100px;
            height: 100px;
            margin-top: 50px;
            background-color: green;
        }
    </style>
</head>
<body>
    <div>
        <p></p>
    </div>
</body>
</html>
图片.png

相关文章

  • CSS基础之清除浮动,Margin塌陷现象详解

    1.浮动的清除 1.1.浮动现象 现在两个div,div身上没有任何属性。每个div中都有li,这些li都是浮动的...

  • 2018-12-21 reset css清除浏览器自带的样式及防

    1-reset css清除浏览器自带的样式2-浮动解决方案(浮动导致高度塌陷)方法1 *{margin:0;pad...

  • CSS 中的浮动

    浮动的定义: 元素脱离文档流 举栗子: 修改 CSS 代码,清除浮动: 浮动的影响: 父元素高度塌陷 清除浮动: ...

  • 清除浮动之clearfix

    案例: css用clearfix清除浮动实例 *{margin:0;padding:0;}.box...

  • Test10

    引用文章: 那些年我们一起清除过的浮动 CSS浮动float详解 Clear Float CSS float浮动的...

  • HTML清除浮动,清除margin-top塌陷

    在样式中增加如下样式 before的样式是清除margin-top塌陷要用的,after的样式是清除浮动用的(防止...

  • 清除浮动,定位

    定位 clear 清除左浮动 清除右浮动 both 可以清除对它影响最大的浮动可以解决高度塌陷 谁塌陷就加上cle...

  • css之margin

    margin的塌陷现象 标准文档流中,竖直方向的margin不叠加,以较大的为准。 如果不在标准流,比如盒子都浮动...

  • css清除浮动的三种方法

    摘要:css清除浮动float的三种方法总结,为什么要清除浮动?浮动会有哪些影响? 一.先看现象(display:...

  • css 清除浮动详解

    在平时写css 的时候为了让多个div并排显示,通常采用的方式是 这样写造成的问题是会对接下来的div 造成不可控...

网友评论

      本文标题:CSS基础之清除浮动,Margin塌陷现象详解

      本文链接:https://www.haomeiwen.com/subject/srvdwxtx.html