一周一章前端书·第20周:《HTML与CSS进阶教程》S02E07

第9-10章:浮动和定位布局

9.1 普通文档流布局

  • W3C标准中的normal flow,叫做普通文档流 /正常文档流/普通流。
  • 所谓 普通文档流就是指block(块)元素由上到下逐行排序,inline(行内)元素在行内从左到右排列,也是页面默认的布局方式 。
  • 如果发现默认的页面布局无法满足要求,也可以通过浮动或者定位脱离文档流,实现更多其他形式的页面布局。

9.2 浮动布局

  • 当我们想要实现例如水平两列或多列布局时,就可以考虑 使用float属性实现水平方向的并排布局 。
  • float属性有三个取值:leftrightnone
  • 当元素 设置了float属性后,元素会脱离文档流浮动到左边或者右边,并使得后面的文字或其他元素围绕它 。

9.2.1 浮动的影响

对自身的影响
  • 当元素定义了float:left或者float:right时,会将该元素变成block元素。 (意味着浮动元素可以设置块元素的样式属性,比如widthheightpaddingmargin等)
对父级元素的影响
  • 当元素定义了float属性时,如果父元素的height属性未定义或者height值小于该浮动元素时,会出现“父元素高度塌陷”的情况 ,也就是说该浮动元素会脱离父元素。因为该浮动元素的高大于包含子级的容器元素的高度时,就意味着父元素不能将子元素包裹起来,说白了,就是老爸管不住儿子,儿子离家出走了。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .parent{
                border: 1px solid black;
            }
            
            .float{
                float: left;
                width: 100px;
                height: 50px;
                background-color: gray;
            }
            
        </style>
    </head>
    <body>
        <div class="parent">
            <div class="float"></div>
        </div>
    </body>
</html>

对同级元素的影响
  • 当 元素定义了float属性时,如果后面的同级元素也是浮动元素,则根据浮动方向紧挨着排列 ;
  • 如果后面的同级元素是非浮动元素,则会填补浮动元素原来位置,被该浮动元素遮盖;
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            div{
                width: 100px;
                height: 50px;
            }
            
            .wrapper{
                width: 800px;
                border: 1px solid black;
            }
            
            .float{
                float: left;
            }
            
            .me{
                background-color: gray;
            }

            .brother{
                width: 120px;
            }
                        
            .brother.float{
                background-color:aquamarine;
            }
            
            .brother.normal{
                background-color: coral;
            }
            
        </style>
    </head>
    <body>
        <div class="wrapper">
            <div class="me float"></div>
            <div class="brother normal">1</div>
            <div class="brother float">2</div>
        </div>
    </body>
</html>
对子级元素的影响
  • 当元素定义了float属性时,作为一个浮动的容器,即便未设置height属性,也会自动适应子级浮动元素的高度,而 不会出现“父元素高度塌陷”的情况;
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .parent{
                float: left;
                border: 1px solid black;
            }
            
            .children{
                float: left;
                height: 50px;
                width: 100px;
                background-color: gray;
            }           
        </style>
    </head>
    <body>
        <div class="parent">
            <div class="children"></div>
        </div>
    </body>
</html>

9.2.2 清除浮动

  • 我们可以通过常见的三种方法来清除浮动,从而避免布局的错乱。
clear:both
  • clear属性取值有三个:left/right/both,也就是清除左边/右边,或者清除所有浮动。
  • clear属性不是设置在浮动元素本身,而是设置在浮动元素后面的元素。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .wrapper{
                width: 800px;
                border: 1px solid black;
            }
            
            .float{
                width: 100px;
                height: 50px;
                float: left;
                background-color: gray;
            }
            
            .clear{
                clear: both;
            }
        </style>
    </head>
    <body>
        <div class="wrapper">
            <div class="float"></div>
            <div class="clear"></div>
        </div>
    </body>
</html>
overflow:hidden
  • overflow:hidden样式设置在浮动元素的父元素 可以清除浮动。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .wrapper{
                width: 800px;
                border:1px solid black;
            }
            
            .float{
                float: left;
                width: 100px;
                height: 50px;
                background-color: gray;
            }
        </style>
    </head>
    <body>
        <div class="wrapper" style="overflow: hidden;">
            <div class="float"></div>
        </div>
    </body>
</html>
::after伪元素
  • 上述的两种方式其实都存在一定的弊端,clear:both的方式需要添加在浮动元素同级的每个元素上,造成很多冗余样式代码;而overflow:hidden的方式虽然清除了浮动,但同时也强制隐藏父容器的内容。
  • 在实际开发中 ,我们 通常采用的解决方案是通过::after伪元素结合clear:both,定义成一个清除浮动的公共类,进行全局引用 ,以便减少CSS代码。使用的时候,设置在浮动元素的父元素。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .wrapper{
                width: 800px;
                border:1px solid black;
            }
            
            .float-left{
                float: left;
                background-color: gray;
                width: 100px;
                height: 50px;
            }
            
            .float-right{
                float: right;
                background-color:saddlebrown;
                width: 100px;
                height: 50px;
            }
            
            
            .clearfix{*zoom: 1;}/*解决IE6&7的浮动问题*/
            .clearfix::after{
                clear: both;
                content: '';
                display: block;
                height: 0;
                visibility: hidden;
            }
        </style>
    </head>
    <body>
        <div class="wrapper clearfix">
            <div class="float-left"></div>
            <div class="float-right"></div>
        </div>
    </body>
</html>

10.1 定位布局

  • 浮动和定位布局是CSS两大布局方式,定位布局 虽然没有浮动布局灵活,但是却 可以精准地定位页面中元素的位置。

10.1.1 position属性

  • CSS通过position属性实现 定位布局 ,总共有四种方式:static(静态定位)、fixed(固定定位)、relative(相对定位)、absolute(绝对定位) 。
  • 默认情况下,fixedabsolute定位是相对于浏览器窗口而言的,而relative定位则是相对于元素的原始位置而言的。
  • position属性通常配合 topbottomleftright属性 一起使用,也只有 当元素定义position为非static属性值时 ,方向偏移属性 才会生效。
相对于父元素定位
  • 相对于父元素定位的方式:给指定祖先元素定义成position:relative,然后给子元素定义position:absolute;,然后配合元素的方向偏移属性来定位。
  • absolute绝对定位是相对于外层最近一个设置position属性值为非static的祖先元素来进行定位的 。
  • position:absolute;会将元素转换成block块元素。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            .father{
                position: relative;
                width: 160px;
                height: 30px;
                background-color: gray;
            }
            
            .son{
                position: absolute;
                bottom: -10px;
                right: 80px;
                width: 0px;
                height: 0px;
                border-left: 6px solid transparent;
                border-right: 6px solid transparent;
                border-top: 10px solid gray;
            }
            
        </style>
    </head>
    <body>
        <div class="father">
            <div class="son"></div>         
        </div>
    </body>
</html>

10.1.2 z-index属性

  • 实际上页面是三维结构的,除了x轴、y轴还有z轴。
  • 默认情况下,元素的 z-index属性处于无效的休眠状态,只有当元素定义了position属性值为非static时才会被激活生效 。
z-index属性值 说明
auto 默认值,堆叠顺序与父元素相等
number 可以为正整数、0和负整数
inherit 从父元素继承z-index属性值
  • 根据W3C标准的定义,z-index属性用来来控制元素的堆叠顺序,z-index属性数值大的在前面,如果数值相同,则遵循“后来者居上”规则叠加。
<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            div{
                width: 100px;
                height: 100px;
                font-size: 50px;
                position: absolute;
            }
            
            .A{
                background-color: #000000;
                top: 10px;
                left: 10px;
            }
            
            .B{
                background-color:orangered;
                top: 40px;
                left: 40px;
                /*通过z-index调整层叠位置*/
                z-index: 2;
            }

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • CSS 是什么 css(Cascading Style Sheets),层叠样式表,选择器{属性:值;属性:值}h...
    崔敏嫣阅读 1,475评论 0 5
  • 当在这一个页面上实现布局和定位有几种不同的技术。使用哪种技术,很大程序上取决于内容和目标页面,因为有很多技术比别人...
    lulu_c阅读 1,048评论 0 5
  • 妈妈老了老了 坐在阳光里 像一片随时可以落下的叶子 说起年轻时住过的 月亮下的老房子 一个又一个逝去亲人的名字 和...
    吴僖阅读 515评论 0 6
  • 我们的生命本来多轻盈,都是被这肉体和各种欲望的污浊给拖住。阿太,我记住了。“肉体是拿来用的,不是拿来伺候的。”请一...
    肥肉666阅读 227评论 0 0