05_CSS文档流、浮动、定位

知识点

  • 文档流
  • 浮动作用
  • 文本绕图
  • 制作导航
  • 网页布局
  • 清除浮动的三种方式
  • 额外标签法
  • 父元素添加:overflow:hidden;
  • 伪元素法:.clearfix:after
  • CSS初始化
  • overflow
  • visible
  • hidden
  • scroll
  • auto
  • 定位:position
  • static:静态定位
  • absolute:绝对定位
  • relative:相对定位
  • fixed:固定定位

文档流(标准流)

元素自上而下,自左而右,块元素独占一行,行内元素在一行上显示,碰到父集元素的边框换行。

浮动布局

float: left | right

特点:
  元素浮动之后不占据原来的位置(脱标)
  浮动的盒子在一行上显示
  行内元素浮动之后转换为行内块元素。(不推荐使用,转行内元素最好使用display: inline-block;)

浮动的作用
  • 文本绕图


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .content img{
            float: left;
        }
    </style>
</head>
<body>
    <div class="content">
        ![](1.jpg)
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
        <p>你好,的点点滴滴多多多多多多多多多多</p>
    </div>
</body>
</html>

注意:文本为什么没有被图片遮挡,因为当img和p一起时,img浮动之后就是这样的。这就叫文本绕图

  • 制作导航
    简单导航


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        body,ul,li{
            margin:0;
            padding: 0;
        }
        ul,li{
            list-style: none;
        }
        .nav{
            width: 800px;
            height: 40px;
            background: pink;
            margin: 20px auto;
        }
        .nav ul li{
            float: left;
        }
        .nav ul li a{
            height: 40px;
            display: inline-block;
            font:12px/40px 微软雅黑;
            padding:0 8px;
            text-decoration: none;
        }
        .nav ul li a:hover{
            background: #ccc;
        }
    </style>
</head>
<body>
    <div class="nav">
        <ul>
            <li><a href="#">百度一下</a></li>
            <li><a href="#">百度导航</a></li>
            <li><a href="#">百度商城</a></li>
        </ul>
    </div>
</body>
</html>

上和导航


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        body ,ul ,li{
            margin: 0;
            padding: 0;
        }
        li{
            list-style: none;
        }
        .nav{
            height: 55px;
            margin: 10px auto;
            background: url('head_bg.jpg');
            border-top: 1px solid #999;
        }
        .nav .nav-con{
            width: 1000px;
            height: 55px;
            margin:0px auto;
        }
        .nav ul li{
            float: left;
            background: url('li_bg.png') no-repeat right center;
            padding: 0px 30px;
            height: 55px;
        }
        .nav ul li a{
            height: 55px;
            font:18px/55px 微软雅黑;
            text-decoration: none;
            color: #000;
        }
        .nav ul li a:hover{
            color:green;
        }
    </style>
</head>
<body>
    <div class="nav">
        <div class="nav-con">
            <ul>
                <li><a href="#">智能手机</a></li>
                <li><a href="#">平板电脑</a></li>
                <li><a href="#">百度</a></li>
                <li><a href="#">人工智能</a></li>
            </ul>
        </div>
    </div>
</body>
</html>
  • 网页布局
  • 浮动布局


<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .title , .footer{
            width: 500px;
            height: 120px;
            background: #666;
        }
        .content{
            width: 500px;
            height: 300px;
            background: #eee;
            margin: 10px 0px;
        }
        .left{
            width: 300px;
            height: 300px;
            background: orange;
            float: left;
        }
        .right{
            width: 190px;
            height: 300px;
            background: green;
            float: right;
        }
    </style>
</head>
<body>
    <div class="title"></div>
    <div class="content">
        <div class="left"></div>
        <div class="right"></div>
    </div>
    <div class="footer"></div>
</body>
</html>
  • 复杂一点的浮动布局


<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .header,.main,.footer{
            width: 500px;
        }
        .header,.footer{
            height: 100px;
            background: #555;
        }
        .main{
            height: 300px;
        }
        .left , .right{
            width: 100px;
            height: 300px;
            background: blue;
        }
        .left{
            float: left;
        }
        .right{
            float: right;
        }
        .content{
            width: 300px;
            height: 300px;
            background: #ccc;
            float: left;
        }
        .content-top,.content-bot{
            height: 150px;
        }
        .content-top{
            background: red;
        }
        .content-bot{
            background: orange;
        }
    </style>
</head>
<body>
    <div class="header"></div>
    <div class="main">
        <div class="left"></div>
        <div class="content">
            <div class="content-top"></div>
            <div class="content-bot"></div>
        </div>
        <div class="right"></div>
    </div>
    <div class="footer"></div>
</body>
</html>

清除浮动

当父盒子没有定义高度,嵌套的盒子浮动之后,下边的元素发生位置错误。
清除浮动不是不用浮动,清除浮动产生的不利影响。

清除浮动的方法

clear: left | right | both

工作里用的最多的是clear:both;

  1. 额外标签法
    在最后一个浮动元素后添加标签,。
    拿上面的浮动布局案例为例子,我们去掉中间盒子.content的高度,底部.footer盒子跑上去了

    这就是浮动造成的影响
    在中间盒子中添加一个标签
    <div class="content">
        <div class="left"></div>
        <div class="right"></div>
        <!-- 额外标签法 -->
        <div style="clear:both;"></div>
    </div>

这样底部.footer盒子就又回到底部了

  • 给父集元素使用

overflow:hidden;

bfc


如果有内容出了盒子,不能使用这个方法。

  • 伪元素清除浮动 推荐使用

.clearfix:after

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .title , .footer{
            width: 500px;
            height: 120px;
            background: #666;
        }
        .content{
            width: 500px;
            /*height: 300px;*/
            background: #eee;
            margin: 10px 0px;
        }
        .left{
            width: 300px;
            height: 300px;
            background: orange;
            float: left;
        }
        .right{
            width: 190px;
            height: 300px;
            background: green;
            float: right;
        }
        .clearfix:after{
            content: "121111111111111111111111111";
            display: block;
            height: 30px;
        }
    </style>
</head>
<body>
    <div class="title"></div>
    <div class="content clearfix">
        <div class="left"></div>
        <div class="right"></div>
        <!-- 额外标签法 -->
        <!-- <div style="clear:both;"></div> -->
    </div>
    <div class="footer"></div>
</body>
</html>
Paste_Image.png

本质和额外标签法很相似

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .title , .footer{
            width: 500px;
            height: 120px;
            background: #666;
        }
        .content{
            width: 500px;
            /*height: 300px;*/
            background: #eee;
            margin: 10px 0px;
        }
        .left{
            width: 300px;
            height: 300px;
            background: orange;
            float: left;
        }
        .right{
            width: 190px;
            height: 300px;
            background: green;
            float: right;
        }
        .clearfix:after{
            content: "";
            display: block;
            height: 0;
            line-height: 0;
            visibility: hidden;
            clear: both;
        }
        /*兼容IE浏览器*/
        .clearfix{
            zoom:1;
        }
    </style>
</head>
<body>
    <div class="title"></div>
    <div class="content clearfix">
        <div class="left"></div>
        <div class="right"></div>
        <!-- 额外标签法 -->
        <!-- <div style="clear:both;"></div> -->
    </div>
    <div class="footer"></div>
</body>
</html>

CSS初始化

  • 腾讯:
body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select{margin:0;padding:0} 
body{font:12px"宋体","Arial Narrow",HELVETICA;background:#fff;-webkit-text-size-adjust:100%;} 
a{color:#2d374b;text-decoration:none} 
a:hover{color:#cd0200;text-decoration:underline} 
em{font-style:normal} 
li{list-style:none} 
img{border:0;vertical-align:middle} 
table{border-collapse:collapse;border-spacing:0} 
p{word-wrap:break-word} 
  • 新浪:
body,ul,ol,li,p,h1,h2,h3,h4,h5,h6,form,fieldset,table,td,img,div{margin:0;padding:0;border:0;} 
body{background:#fff;color:#333;font-size:12px; margin-top:5px;font-family:"SimSun","宋体","Arial Narrow";} 
ul,ol{list-style-type:none;} 
select,input,img,select{vertical-align:middle;} 
a{text-decoration:none;} 
a:link{color:#009;} 
a:visited{color:#800080;} 
a:hover,a:active,a:focus{color:#c00;text-decoration:underline;} 
  • 淘宝:
body, h1, h2, h3, h4, h5, h6, hr, p, blockquote, dl, dt, dd, ul, ol, li, pre, form, fieldset, legend, button, input, textarea, th, td { margin:0; padding:0; } 
body, button, input, select, textarea { font:12px/1.5tahoma, arial, \5b8b\4f53; } 
h1, h2, h3, h4, h5, h6{ font-size:100%; } 
address, cite, dfn, em, var { font-style:normal; } 
code, kbd, pre, samp { font-family:couriernew, courier, monospace; } 
small{ font-size:12px; } 
ul, ol { list-style:none; } 
a { text-decoration:none; } 
a:hover { text-decoration:underline; } 
sup { vertical-align:text-top; } 
sub{ vertical-align:text-bottom; } 
legend { color:#000; } 
fieldset, img { border:0; } 
button, input, select, textarea { font-size:100%; } 
table { border-collapse:collapse; border-spacing:0; } 

Overflow

overflow 属性规定当内容溢出元素框时发生的事情。

属性 含义
overflow:visible 默认值。内容不会被修剪,会呈现在元素框之外。
overflow:hidden 内容会被修剪,并且其余内容是不可见的。
overflow:scroll 内容会被修剪,但是浏览器会显示滚动条以便查看其余的内容。
overflow:auto 如果内容被修剪,则浏览器会显示滚动条以便查看其余的内容。

定位

  • 定位方向: left | right | top | bottom
  • 静态定位:position:static;
    默认值,就是文档流。
  • 绝对定位:position:absolute;
      position:absolute的元素是根据最近的非static的父元素定位,如果没有,则根据最初的包含块定义(一般是body)
    特点:
  • 元素使用绝对定位之后不占据原来的位置(脱标)
  • 元素使用绝对定位,位置是从浏览器出发。
  • 嵌套的盒子,父盒子没有使用定位,子盒子绝对定位,子盒子位置是从浏览器出发。
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .father{
            width: 500px;
            height: 500px;
            background: yellow;

        }
        .son{
            width: 100px;
            height: 100px;
            background: red;
            position: absolute;
            right: 100px;
            top: 100px;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son"></div>
    </div>
</body>
</html>
  • 嵌套的盒子,父盒子使用定位,子盒子绝对定位,子盒子位置是从父元素位置出发。
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .father{
            width: 500px;
            height: 500px;
            background: yellow;
            position: absolute;
        }
        .son{
            width: 100px;
            height: 100px;
            background: red;
            position: absolute;
            right: 100px;
            top: 100px;
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son"></div>
    </div>
</body>
</html>
  • 给行内元素使用绝对定位之后,转换为行内块。(不推荐使用,推荐使用display:inline-block;
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
    .baby{
        position:absolute;
        width: 100px;
        height: 100px;
        background: orange;
        /*调整元素的层叠顺序*默认值0-999,值越大,元素越在上边*/
        z-index: 2;
    }
    .baby1{
        position:absolute;
        width: 100px;
        height: 100px;
        background: red;

    }
    </style>
</head>
<body>
    <span class="baby"></span>
    <span class="baby1"></span>
</body>
</html>
  • 相对定位
    position: relative;
    特点:
  • 使用相对定位,位置从自身出发。
  • 还占据原来的位置。
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .red,.green{
            width: 100px;
            height: 100px;
        }
        .red{
            background: red;
            position: relative;
            right: 20px;
            bottom: 10px;
        }
        .green{
            background: green;
        }
    </style>
</head>
<body>
    <div class="red"></div>
    <div class="green"></div>
</body>
</html>
  • 子绝父相(父元素相对定位,子元素绝对定位)
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .fater{
            width: 500px;
            height: 500px;
            background: #eee;
            margin:100px 0 0 300px;
            position: relative;
        }
        .box{
            width: 100px;
            height: 100px;
            background: red;
            position: absolute;
            top: 50px;
        }
    </style>
</head>
<body>
    <div class="fater">
        <div class="box"></div>
    </div>
</body>
</html>
子绝父相
  • 行内元素使用相对定位不能转行内块
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
    span{
        position: relative;
        width: 100px;
        height: 100px;
        background: yellow;
    }
    </style>
</head>
<body>
    <span>web大前端</span>
</body>
</html>
设置宽高没有生效
练习

上和导航添加news

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        body ,ul ,li{
            margin: 0;
            padding: 0;
        }
        li{
            list-style: none;
        }
        .nav{
            height: 55px;
            margin: 10px auto;
            background: url('head_bg.jpg');
            border-top: 1px solid #999;
        }
        .nav .nav-con{
            width: 1000px;
            height: 55px;
            margin:0px auto;
        }
        .nav-con{
            position: relative;
        }
        .nav ul li{
            float: left;
            background: url('li_bg.png') no-repeat right center;
            padding: 0px 30px;
            height: 55px;
        }
        .nav ul li a{
            height: 55px;
            font:18px/55px 微软雅黑;
            text-decoration: none;
            color: #000;
        }
        .nav ul li a:hover{
            color:green;
        }
        .news{
            position: absolute;
            top: -8px;
            left: 55px;
        }
    </style>
</head>
<body>
    <div class="nav">
        <div class="nav-con">
            <ul>
                <li><a href="#">智能手机</a></li>
                <li><a href="#">平板电脑</a></li>
                <li><a href="#">百度</a></li>
                <li><a href="#">人工智能</a></li>
            </ul>
            <span class="news">![](new.png)</span>
        </div>
    </div>
</body>
</html>

小米定位案例

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        .main{
            width: 1226px;
            height: 460px;
            position: relative;
        }
        .menu{
            position: absolute;
            top: 0;
            left: 0;
        }
        .left{
            position: absolute;
            left: 244px;
            bottom: 178px;
        }
        .right{
            position: absolute;
            right: 10px;
            bottom: 178px;
        }
    </style>
</head>
<body>
    <div class="main">
        ![](111.jpg)
        <div class="menu">![](xiaom_left.png)</div>
        <div class="left">![](left.png)</div>
        <div class="right">![](right.png)</div>
    </div>
</body>
</html>

banner导航案例

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        body{
            margin 0;
            padding: 0;
        }
        .banner{
            width: 600px;
            margin: 0 auto;
        }
        .nav li{
            list-style: none;
        }
        .nav{
            height: 32px;
            background: url('nav_bg.jpg');
        }
        .nav ul li{
            float: left;
        }
        .nav ul,.nav li{
            padding: 0;
            margin:0;
        }
        .nav ul li a{
            display: inline-block;
            width: 80px;
            height: 32px;
            line-height: 32px;
            text-align: center;
            background: url('a_bg.jpg');
            text-decoration: none;
            font: 12px/32px 宋体;
            color: #454545;
        }
        .nav ul li a:hover{
            background: url('button2.jpg');
            color: #ccc;
        }
    </style>
</head>
<body>
    <div class="banner">
        ![](banner1.jpg)
        <div class="nav">
            <ul>
                <li><a href="#">首页导航</a></li>
                <li><a href="#">首页导航</a></li>
                <li><a href="#">首页导航</a></li>
                <li><a href="#">首页导航</a></li>
                <li><a href="#">首页导航</a></li>
            </ul>
        </div>
    </div>
</body>
</html>
  • 固定定位
    position:fixed;
    特点:
  • 固定定位之后,不占据原来的位置(脱标)
  • 元素使用固定定位之后,位置从浏览器出发。
  • 元素使用固定定位之后,会转化为行内块(不推荐,推荐使用display:inline-block;
作业

固定定位作业

<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style type="text/css">
        body{
            margin: 0;
            padding: 0;
        }
        .nav{
            position: fixed;
            top: 0;
            left: 0;
        }
        .content{
            width: 998px;
            margin:44px auto 0px;
        }
        .left{
            position: fixed;
            left: 0;
            top: 70px;
        }
        .right{
            position: fixed;
            right: 0;
            top: 70px;
        }
    </style>
</head>
<body>
    <div class="box">
        <div class="nav">![](img/r1_c1.png)</div>
        <div class="content">![](img/box.png)</div>
        <div class="left">![](img/r2_c1.png)</div>
        <div class="right">![](img/r2_c2.png)</div>
    </div>
</body>
</html>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,723评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,485评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,998评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,323评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,355评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,079评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,389评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,019评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,519评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,971评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,100评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,738评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,293评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,289评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,517评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,547评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,834评论 2 345

推荐阅读更多精彩内容

  • 一、文档流的概念指什么?有哪些方式可以让元素脱离文档流? 文档里指元素在文档中的位置由元素在html里的位置决定,...
    dengpan阅读 534评论 0 3
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,728评论 1 92
  • 选择qi:是表达式 标签选择器 类选择器 属性选择器 继承属性: color,font,text-align,li...
    wzhiq896阅读 1,731评论 0 2
  • 1.文档流的概念指什么?有哪种方式可以让元素脱离文档流? 文档流也叫常规流,其实就是文档的读取和输出顺序,也就是我...
    墨月千楼阅读 690评论 0 0
  • 一、文档流的概念指什么?有哪种方式可以让元素脱离文档流? 1、文档流指的是元素在排列布局中所占用的位置,具体的说是...
    鸿鹄飞天阅读 769评论 0 0