面试成功锦囊之页面布局

说起前端开发,首先会想到页面布局,作为资深前端来说,用页面布局来谈前端可能会认为太浅显,但作为前端开发中最基础的技能,是不是已经get到了所有的精髓了?秉着边回顾边分享的原则记录,欢迎大家指正。

一、假设高度已知,写出三栏布局,左右300px,中间自适应。

  • 方式1:float
<style type="text/css">
.float div{
    height: 300px;
}
.float .left{
    float: left;
    width: 300px;
}
.float .right{
    float: right;
    width: 300px;
}
</style>
<section class="float">
    <div class="left">left</div>
    <div class="right">right</div>
    <div class="center">center缺点:主内容最后加载,影响用户体验</div>
</section>
  • 方式2:定位(自己动手练习吧)
  • 方式3:flex-box(弹性布局)
<style type="text/css">
    .flex div{ 
        height: 300px;
    }
    .flex{
        display: flex;
    }
    .flex .left,.flex .right{
        width: 300px;
    }
    .flex .center{
        flex: 1;
    }
</style>
<section class="flex">
    <div class="left">left</div>
    <div class="center">center</div>
    <div class="right">right</div>
</section>

补充:弹性布局
父容器属性:

  • display:felx/inlineflex;
  • felx-direction:row(➡️)/row-reverse(⬅️)/column(⬇️)/column-reverse(⬆️);
  • felx-warp:nowarp(不换行)/warp/warp-reverse;
  • flex-flow:flex-direction+flex-wrap;
  • justify-content:flex-start(左对齐)/flex-end(右对齐)/center(居中)/space-between(两端对其)/space-around(每个项目两侧的间隔相等)
  • align-items:flex-start(起点对齐)/flex-end(终点对齐)/center(中点对齐)/baseline(项目的第一行文字的基线对齐)/stretch(默认值,如果项目未设置高度或设为auto,将占满整个容器的高度)

子容器属性:

  • order:排序,越小排的越靠前
  • flex-grow:放大,默认0
  • flex-shrink:缩小,默认1
  • flex-basis:分配多余空间前,项目占据的主轴空间
  • flex:flex-grow, flex-shrink 和 flex-basis的简写
  • align-self:单个项目的对齐方式 auto | flex-start | flex-end | center | baseline | stretch
  • 方式4:table-cell
<style type="text/css">
.table{
    width: 100%;
    display: table;
    height: 300px;
}
.table div{
    display: table-cell;
}
.table .left,.table .right{
    width: 300px;
}
</style>
<h1>表格</h1>
<section class="table">
    <div class="left">left</div>
    <div class="center">center</div>
    <div class="right">right</div>
</section>

补充:表格布局
父容器属性:display:table;
子容器属性(与table对应):
tr { display: table-row }
thead { display: table-header-group }
tbody { display: table-row-group }
tfoot { display: table-footer-group }
col { display: table-column }
colgroup { display: table-column-group }
td, th { display: table-cell }
caption { display: table-caption }

二、盒模型

  • 标准盒模型:width不包含border、padding


  • IE盒模型:width包含border、padding


如何设置切换两种模型?
css3的box-sizing属性:
box-sizing:content-box;(浏览器默认,表示标准模型)
box-sizing:border-box;(IE模型)
box-sizing:padding-box;(width包含padding)

如何获取盒模型的高度?
1、document.getElementById("dom").style.width/height---------只能取到内联样式的宽高
2、document.getElementById("dom").currentStyle.width/height---------渲染后的宽高,(内联,外链、style标签)【只适用于IE】
3、window.getComputedStyle(dom).width/height---------与2原理一样,兼容性好
4、dom.getBoundingClientRect().width/height---------(用于计算位置,获取某个元素相对于视窗的位置集合,返回一个对象,对象包含属性left、righ、top、bottom、width、height等,兼容ie5以上 )

三、BFC(block formatting context)块级格式化上下文

  • 原理:
    BFC的内部元素不会影响以外的元素【BFC内部的元素与外部的元素相互隔离,使内外元素的定位不会相互影响】(父子关系时,内部元素即子元素不会影响父元素的边距)

  • 如何创建BFC

  1. float != none;
  2. position:absolute/fixed--------加在父元素上;
  3. display:inline-block、table-、flex/inline-flex------加在父元素或各自兄弟元素上;
  4. overflow!=visible---------加在父元素上;
  5. 加在父元素上的解决方法,对于兄弟元素,可以给兄弟元素再包一层。

最常见的就是overflow:hidden、float:left/right、position:absolute。
一个元素不能同时存在于两个BFC中。

补充:什么是边距重叠
边距重叠问题(只产生在普通流文档的上下外边距之间)边距重叠不是双边距,双边距是IE6的问题

两个或多个块级盒子相邻(兄弟)或嵌套(父子)的边界(其间没有任何非空内容、补白、边框)。结果的边界宽计算:
a、全部为正取最大值;
b、不全为正,则在最大正边界中减去绝对值最大的负边界;

c、没有正值,都取绝对值,0减去绝对值最大的。
解决边距重叠:BFC 或 内层盒子加透明边框 或 外层盒子用padding代替

应用:

  • 解决垂直方向margin重叠
  • BFC元素不与float元素相重叠
    举例:两栏布局。左右都定高,左设float:left,如果右边高于左边,会出现如下图,即右边占据了左侧的下方。给右侧使用BFC可解决。



    使用BFC后如下图:


<style type="text/css">
        html *{
            padding: 0;
            margin: 0;
        }
        .father{
            width: 100%;
            background-color: #ccc;
        }
        .fl{
            float: left;
        }
        .left{
            width: 200px;
            height: 100px;
            background-color: red;
        }
        .right{
            height: 200px;
            background-color: yellow;
            overflow: hidden;
        }
    </style>
  </head>
  <body>
        <div class="father">
            <div class="left fl">
                aa
            </div>
            <div class="right">
                dd
            </div>
  </body>

四、层叠上下文、层叠等级、层叠顺序

  • 层叠上下文:元素提升为一个比较特殊的图层,在三维空间中 (z轴) 高出普通元素一等。


如何创建层叠上下文?

  1. <html></html>-------“根层叠上下文”。
  2. 普通元素设置position属性为非static值并设置z-index属性为具体数值。
  3. CSS3中的新属性也可以产生层叠上下文。
  • 层叠等级:在同一个层叠上下文中,它描述定义的是该层叠上下文中的层叠上下文元素在Z轴上的上下顺序。
  • 层叠顺序:元素发生层叠时按照特定的顺序规则在Z轴上垂直显示。
    *优先显示文字内容



    *普通元素的层叠等级优先由其所在的层叠上下文决定。
    *层叠等级的比较只有在当前层叠上下文元素中才有意义。不同层叠上下文中比较层叠等级是没有意义的。
    ** 套路:

1、首先先看要比较的两个元素是否处于同一个层叠上下文中:
1.1如果是,谁的层叠等级大,谁在上面(怎么判断层叠等级大小呢?——看“层叠顺序”图)。
1.2如果两个元素不在统一层叠上下文中,请先比较他们所处的层叠上下文的层叠等级。
2、当两个元素层叠等级相同、层叠顺序相同时,在DOM结构中后面的元素层叠等级在前面元素之上。

五、居中布局

  • 水平居中
    行内元素:text-align:center;
    块级元素:margin:0 auto;
    定位:position:absolute;left:50%;margin-left:-1/2*width;
    弹性布局:display: flex;justify-content: center;
  • 垂直居中
    一行文字:line-height
    定位:position:absolute;top:50%;margin-top:-1/2*height;
    弹性布局:display: flex;align-items: center;
  • 水平垂直居中
    定位:position:absolute;left:50%;top:50%;margin-left:-1/2width;margin-top:-1/2height; OR:position:absolute;top:0;left:0;bottom:0;right:0;margin:auto;OR:position:absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);
    弹性布局:display: flex;justify-content: center;align-items: center;
<head>
<style type="text/css">
    html,body{
        height: 100%;
    }
    .child{
        height: 100%;
        display: flex;
        justify-content: center;
        align-items: center;
    }
</style>
</head>
<body>
        <div class="child">水平垂直居中</div>
</body>

vh:

<body>
        <div style="text-align: center;line-height: 100vh;">水平垂直居中</div>
</body>

表格元素:text-align:center;vertical-align:middle;
模拟表格:display:table-cell;text-align:center;vertical-align:middle;

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,737评论 1 92
  • CSS 是什么 css(Cascading Style Sheets),层叠样式表,选择器{属性:值;属性:值}h...
    崔敏嫣阅读 1,475评论 0 5
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,449评论 1 45
  • 我曾经想帮助每一个人,却忽略了人最需要得到的是情感的安慰与关注,对不起,那些年曾经被我无心伤害的人,如果有机会弥补...
    Alextang阅读 136评论 0 0
  • 爱情心理学家说过:上帝之所以创造男人和女人,就是有意让男女在相互的牵引、相互的补充之中,求得完整的“人”的概念。因...
    子琪baby阅读 540评论 0 0