前端入门05 -- CSS的浮动和定位

CSS浮动

  • 传统网页布局的三种方式:标准文档流浮动定位,在实际开发中,一个页面基本都包含了这三种布局方式;
  • 标准文档流:标签元素按照规定好的方式进行排列,是最基本的布局方式;
    • 块级元素按照从上往下顺序进行排列,会独占一行;
    • 行内元素按照从左到右顺序进行排列,碰到父元素边缘就自动换行;
  • 浮动:是标签元素的一个属性用于创建浮动框,将标签移动到一边,直到左边缘或右边缘碰到父标签元素或另一个标签元素浮动框的边缘;
    • 浮动最典型的应用是可以让多个块级元素在一行内排列显示
    • 多个块级元素纵向排列 找标准流多个块级元素横向排列 找浮动
image.png
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .left,
        .right {
            font-size: 20px;
            color: orangered;
            font-weight: 700;
            width: 200px;
            height: 200px;
            background-color: pink;
            float: left;
        }
        
        .right {
            float: right;
        }
    </style>
</head>

<body>
    <div class="left">的方式带来了饭的饭</div>
    <div class="right">都是废话开始的复合的方法地方</div>
</body>

</html>
浮动的特性
  • 第一点:浮动元素会脱离标准流,俗称脱标
    • 浮动脱标的盒子不会再占用原先的位置,其原先的位置会被其他标签占用;
  • 第二点:浮动的元素会在一行内进行显示并且顶部对齐;
    • 若多个盒子都设置了浮动,则它们会按照属性值一行内显示并且顶端对齐排列;
    • 浮动的元素是相互贴靠在一起的(不会有缝隙),如果父级宽度装不下这些浮动的盒子,多出的盒子会另起一行对齐;
  • 第三点:浮动的元素会具有行内块元素的特性;
    • 任何元素都可以浮动,不管原先是什么模式的元素,添加浮动之后具有行内块元素的特性,就可以直接设置其高度和宽度
    • 若块级元素没有设置宽度,默认宽度与父级一样宽,但是添加浮动之后,其宽度为内容的宽度;
  • 网页布局第一准则:首先使用标准流,让父元素上下纵向排列,然后每一行的内部子元素利用浮动左右排列
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .box {
            width: 1200px;
            height: 400px;
            background-color: pink;
            margin: 0 auto;
        }
        
        .left {
            width: 300px;
            height: 400px;
            background-color: red;
            float: left;
            text-align: center;
            line-height: 400px;
        }
        
        .right {
            width: 900px;
            height: 400px;
            background-color: green;
            float: left;
            text-align: center;
        }
    </style>

</head>

<body>

    <div class="box">
        <div class="left">左侧</div>
        <div class="right">右侧</div>
    </div>
</body>
</html>
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        li {
            list-style: none;
        }
        
        .box {
            width: 1200px;
            height: 300px;
            background-color: pink;
            margin: 0 auto;
        }
        
        .box li {
            width: 292.5px;
            height: 300px;
            float: left;
            margin-right: 10px;
            background-color: green;
        }
        /* 注意权重的优先级  */
        
        .box .last {
            margin-right: 0;
        }
    </style>

</head>

<body>

    <ul class="box">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li class="last">4</li>
    </ul>
</body>
</html>
  • 浮动布局的注意点:
    • 浮动标准流的父盒子搭配使用;
    • 一个元素浮动了,理论上其余的兄弟元素也要浮动;
    • 浮动的盒子只会影响浮动盒子后面的标准流不会影响前面的标准流
清除浮动
  • 由于父级盒子在很多情况下,不方便设置高度,但是子盒子浮动又不占有位置,最后父级盒子高度为0,就会影响下面的标准流盒子
  • 由于浮动元素不再占用原文档流的位置,所以它会对后面的元素排版产生影响;
  • 清除浮动的本质:就是清除浮动元素造成的影响,若父盒子本身有高度,则不需要清除浮动;
    • 清除浮动之后,父级就会根据浮动的子盒子自动检测高度,父级有了高度,就不会影响下面的标准流了;
    • 语法格式:选择器 {clear: 属性值}
image.png
  • 清除浮动的方法有如下:

    • 额外标签法:也称为隔墙法;
    • 父级添加overflow属性;
    • 父级添加after伪元素;
    • 父级添加双伪元素;
  • 额外标签法:会在浮动元素末尾添加一个空的标签;

    • 优点:通俗易懂,书写方便;
    • 缺点:添加许多无意义的标签,结构化较差,且要求新添加的标签必须是块级元素;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .box {
            width: 400px;
            border-width: 2px;
            border-color: green;
            border-style: solid;
            margin: 0 auto;
            background-color: pink;
        }
        
        .one {
            width: 100px;
            height: 200px;
            background-color: red;
            float: left;
        }
        
        .two {
            width: 100px;
            height: 200px;
            background-color: royalblue;
            float: left;
        }
        
        .footer {
            height: 300px;
            background-color: black;
        }
        
        .clear {
            clear: both;
        }
    </style>
</head>

<body>
    <div class="box">
        <div class="one">one</div>
        <div class="two">two</div>
        <div class="clear"></div>
    </div>
    <div class="footer"></div>
</body>
</html>
  • 给父级添加overflow:其属性值设置为hidden,auto,scroll;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .box {
            width: 400px;
            border-width: 2px;
            border-color: green;
            border-style: solid;
            margin: 0 auto;
            background-color: pink;
            /* 给父级添加overflow属性 可清除浮动 */
            overflow: hidden;
        }
        
        .one {
            width: 100px;
            height: 200px;
            background-color: red;
            float: left;
        }
        
        .two {
            width: 100px;
            height: 200px;
            background-color: royalblue;
            float: left;
        }
        
        .footer {
            height: 300px;
            background-color: black;
        }
    </style>

</head>

<body>
    <div class="box">
        <div class="one">one</div>
        <div class="two">two</div>
    </div>
    <div class="footer"></div>
</body>
</html>
  • 父级添加after伪元素:是额外标签法的升级版,也是给父级元素添加;
    • 优点:没有添加新标签,结构简单;
    • 缺点:照顾低版本浏览器;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .clearfix:after {
            content: "";
            display: block;
            height: 0;
            clear: both;
            visibility: hidden;
        }
        
        .clearfix {
            *zoom: 1;
        }
        
        .box {
            width: 400px;
            border-width: 2px;
            border-color: green;
            border-style: solid;
            margin: 0 auto;
            background-color: pink;
        }
        
        .one {
            width: 100px;
            height: 200px;
            background-color: red;
            float: left;
        }
        
        .two {
            width: 100px;
            height: 200px;
            background-color: royalblue;
            float: left;
        }
        
        .footer {
            height: 300px;
            background-color: black;
        }
    </style>

</head>

<body>
    <div class="box clearfix">
        <div class="one">one</div>
        <div class="two">two</div>
    </div>
    <div class="footer"></div>
</body>
</html>
  • 父级添加双伪元素:也是给父元素添加;
    • 优点:代码简洁;
    • 缺点:照顾低版本浏览器;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .clearfix:before,
        .clearfix:after {
            content: "";
            display: block;
        }
        
        .clearfix:after {
            clear: both;
        }
        
        .clearfix {
            *zoom: 1;
        }
        
        .box {
            width: 400px;
            border-width: 2px;
            border-color: green;
            border-style: solid;
            margin: 0 auto;
            background-color: pink;
        }
        
        .one {
            width: 100px;
            height: 200px;
            background-color: red;
            float: left;
        }
        
        .two {
            width: 100px;
            height: 200px;
            background-color: royalblue;
            float: left;
        }
        
        .footer {
            height: 300px;
            background-color: black;
        }
    </style>

</head>

<body>
    <div class="box clearfix">
        <div class="one">one</div>
        <div class="two">two</div>
    </div>
    <div class="footer"></div>
</body>
</html>
  • CSS清除浮动的总结:
image.png

定位

  • 定位:将盒子定在某个位置,所以定位也是在摆盒子,按照定位的方式移动盒子;
  • 定位 = 定位模式 + 边偏移
  • position:指定一个元素在文档中定位方式,其值有如下;
image.png
  • 边偏移:决定目标元素的最终位置,有如下四个属性:
image.png
静态定位static
  • 静态定位:元素默认的定位方式,即无定位;
  • 静态定位按照标准流的特性摆放位置,它没有偏移;
  • 静态定位在布局时很少使用;
相对定位relative
  • 相对定位:元素在定位时,以元素在标准流中的原来位置为基准;
  • 定位元素在标准流的原来位置会继续占有,后面的盒子仍然以标准流的方式对待它,不脱标,继续占用原来的位置
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>定位布局Position</title>

    <style>
        div {
            width: 200px;
            height: 100px;
        }

        .one {
            background-color: blueviolet;
        }

        .two {
            position: relative;
            top: 50px;
            left: 50px;
            background-color: pink;
        }

        .three {
            background-color: red;
        }
    </style>

</head>

<body>
    <div class="one">one</div>
    <div class="two">two</div>
    <div class="three">three</div>
</body>

</html>
image.png
  • 可以看到two设置相对定位时,以它在标准流中原来的位置为基准,进行位置偏移;
  • two设置相对定位,并没有脱离标准流,依然占据原来的位置,three排列在two原来标准流位置的下方;
绝对定位absolute
  • 绝对定位:元素在定位时,以其祖先元素为基准;
  • 如果没有祖先元素或者祖先元素没有定位,则以浏览器为基准进行定位;
  • 如果祖先元素有定位(相对,绝对,固定),则以最近一级的有定位的的祖先元素为基准;
  • 绝对定位不再占有原先的位置(脱标);
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>定位布局Position</title>

    <style>
        div {
            width: 200px;
            height: 100px;
        }

        .one {
            background-color: blueviolet;
        }

        .two {
            position: absolute;
            top: 50px;
            left: 50px;
            background-color: pink;
        }

        .three {
            background-color: red;
        }
    </style>

</head>

<body>
    <div class="one">one</div>
    <div class="two">two</div>
    <div class="three">three</div>
</body>

</html>
image.png
  • two的祖先元素没有定位,最终以浏览器为基准进行偏移;
  • two设置绝对定位后,脱标,不会再占据标准流中的原来位置;
  • three在排列时,会忽略two在标准流中的原来位置,直接排在one的下方;
固定定位fixed
  • 固定定位:元素固定在浏览器可视区域的位置,可以在浏览器页面滚动时元素的位置不会发生改变;
  • 以浏览器的可视窗口为参照点移动元素;
  • 与根父元素没有任何关系;
  • 不会随着浏览器页面滚动而滚动;
  • 固定定位不会占用原先的位置,也是脱标的,其可看成是一种特殊的绝对定位;
  • 如何让固定定位的盒子固定在版心右侧的位置:
    • 让固定定位的盒子的left: 50% 占浏览器的一半的位置;
    • 让固定定位的盒子的margin-left: 版心宽度的一半;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .w {
            width: 800px;
            height: 1400px;
            background-color: pink;
            margin: 0 auto;
        }
        
        .fixed {
            position: fixed;
            /* 走浏览器宽度的一半 */
            left: 50%;
            margin-left: 405px;
            width: 50px;
            height: 150px;
            background-color: red;
        }
    </style>
</head>

<body>
    <div class="fixed"></div>
    <div class="w"></div>
</body>
</html>
image.png
粘性定位sticky
  • 粘性定位:可视为是相对定位于固定定位的混合;
  • 以浏览器的可视窗口为参照点移动元素(固定定位的特点);
  • 占有原先的位置(相对定位的特点);
  • 必须添加top,left,right,bottom其中一个才会有效;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            height: 3000px;
        }
        
        .nav {
            position: sticky;
            top: 0;
            width: 800px;
            height: 50px;
            background-color: pink;
            margin: 100px auto;
        }
    </style>
</head>

<body>
    <div class="nav">我的导航栏</div>
</body>
</html>
image.png
  • z-index:使用定位布局时,可能会出现盒子重叠的情况,此时可使用z-index来控制盒子的前后次序(Z轴);
    • 语法格式:选择器 {z-index: 1}
    • 数值可以是正整数,负整数或0,默认是auto,数值越大,盒子越靠上;
    • 如果属性值相同,则按照书写顺序,后来居上;
    • 数字后面加单位;
    • 只有定位的盒子才有z-index属性;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .box {
            position: absolute;
            top: 0;
            width: 200px;
            height: 200px;
        }
        
        .one {
            background-color: pink;
            z-index: 1;
        }
        
        .two {
            background-color: green;
            z-index: 2;
        }
        
        .three {
            background-color: hotpink;
            z-index: 3;
        }
    </style>

</head>

<body>
    <div class="box one">熊大</div>
    <div class="box two">熊二</div>
    <div class="box three">光头强</div>
</body>
</html>
子绝父相
  • 子绝父相:子元素是绝对定位时,父元素要用相对定位;
    • 子元素绝对定位,不会占有位置,可以放到父盒子里面的任何一个位置,不会影响到其他兄弟盒子;
    • 子盒子的运动范围必须在父盒子内部,因此父盒子需要加定位,因为子盒子的定位基准是有定位的祖先元素
    • 父盒子布局时,需要占有位置,因此父盒子只能是相对定位;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        li {
            list-style: none;
        }
        
        .pic {
            height: 150px;
            background-color: red;
        }
        
        .icon {
            position: absolute;
            right: -10px;
            top: 10px;
            width: 20px;
            height: 20px;
            background-color: slateblue;
        }
        
        ul li {
            position: relative;
            width: 228px;
            height: 270px;
            background-color: pink;
        }
    </style>

</head>

<body>

    <ul class="clearfix">
        <li>
            <div class="icon"></div>
            <div class="pic"></div>

            <h4> ThinkPad 地方喝酒房贷首付款打发时computer game</h4>
            <div class="info"> <span>高级</span> 人才 1000左右</div>
        </li>
    </ul>
</body>
</html>
image.png
绝对定位元素居中
  • 绝对定位的盒子居中:加了绝对定位的盒子不能通过margin:0 auto进行水平居中,可通过下列计算实现水平和垂直居中:
    • left: 50%:让盒子左侧移动到父级元素的水平中心位置;
    • margin-left: -100px:让盒子向左移动自身宽度的一半;
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        .box {
            position: absolute;
            left: 50%;
            top: 50%;
            margin-left: -100px;
            margin-top: -100px;
            width: 200px;
            height: 200px;
            background-color: pink;
        }
    </style>

</head>

<body>
    <div class="box"></div>
</body>
</html>
定位元素的特性
  • 行内元素绝对定位或者固定定位,可以直接设置高度和宽度
  • 块级元素添加绝对定位或者固定定位,如果不给宽度或者高度,默认大小是内容的大小
  • 脱标的盒子不会触发外边距塌陷;
  • 浮动元素不同,只会压住它下面标准流的盒子,但是不会压住下面标准流盒子里面的文字(图片),但绝对定位(固定定位)会完全压住盒子,主要是因为浮动最初是为了文字环绕的效果,所以文字会围绕着浮动元素;
淘宝焦点图
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>

    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        li {
            list-style: none;
        }
        
        .box {
            position: relative;
            width: 400px;
            height: 300px;
            background-color: pink;
            margin: 100px auto;
        }
        
        .prev {
            position: absolute;
            left: 0;
            top: 50%;
            margin-top: -15px;
            width: 30px;
            height: 30px;
            background-color: rgba(0, 0, 0, 0.3);
        }
        
        .next {
            position: absolute;
            right: 0;
            top: 50%;
            margin-top: -15px;
            width: 30px;
            height: 30px;
            background-color: rgba(0, 0, 0, 0.3);
        }
        
        .bottom-nav {
            position: absolute;
            left: 50%;
            margin-left: -45px;
            bottom: 15px;
            background-color: red;
            width: 90px;
            height: 20px;
        }
        
        .bottom-nav li {
            float: left;
            width: 8px;
            height: 8px;
            background-color: #fff;
            border-radius: 50%;
            margin: 7px;
        }
        
        .bottom-nav .selected {
            background-color: chocolate;
        }
    </style>
</head>

<body>

    <div class="box">
        <div class="pic"></div>
        <div class="prev"></div>
        <div class="next"></div>
        <ul class="bottom-nav">
            <li class="selected"></li>
            <li></li>
            <li></li>
            <li></li>
        </ul>
    </div>

</body>

</html>
image.png
  • 网页布局总结:
    • 一个完整的网页,是标准流,浮动和定位一起完成的布局;
    • 标准流可以让盒子上下排列或者左右排列,垂直的块级盒子显示就用标准流;
    • 浮动可以让多个块级元素一行显示或者左右对齐盒子,多个块级盒子水平显示就用浮动布局;
    • 定位其最大的特点是有层叠的概念,就是可以让多个盒子前后压叠来显示,如果元素自由在某个盒子内移动就用定位布局;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,905评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,140评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,791评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,483评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,476评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,516评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,905评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,560评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,778评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,557评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,635评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,338评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,925评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,898评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,142评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,818评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,347评论 2 342

推荐阅读更多精彩内容