小拿
03月14日
本文探讨下面试常谈问题之三栏布局,说到三栏布局,可能大家心中至少也可以想出 2-3 种答案,这些谷歌就一大堆解决方案的题目为什么还要拿出来谈谈呢?
这里主要是考察掌握知识度的延伸,比如你能答出几种? => 这几种方式的优缺点在哪? => 最佳方案是哪个以及如何解决这些缺点...
这些可以考验到你是否背题亦或者真正掌握到这些知识点。
高度已知,实现三栏布局,左右300px中间自适应
在实现前先重置一下默认的样式
* {
margin: 0;
padding: 0;
}
.layout {
margin-top: 20px;
}
.layout article div {
min-height: 100px;
}浮动布局解决方案
左右浮动,给宽度,这样就实现了,是不是很简单~但是也存在一些缺点,后边会讲到。
<section class="layout float">
<style>
.layout.float .left {
float: left;
width: 300px;
background: red;
}
.layout.float .right {
float: right;
width: 300px;
background: blue;
}
.layout.float .center {
background: yellow;
}
</style>
<article class="left-right-center">
<div class="left"></div>
<div class="right"></div>
<div class="center">
<h1>浮动解决方案</h1>
1. 这是三栏布局中间部分 2. 这是三栏布局中间部分
</div>
</article>
</section>绝对定位布局解决方案
left/center/right 均给绝对定位,左右给 300px,中间设置 left 300 right 300,也同样实现这个布局~
<!-- 绝对定位解决方案 -->
<section class="layout absoulute">
<style>
.layout.absoulute .left-center-right > div {
position: absolute;
}
.layout.absoulute .left {
left: 0;
width: 300px;
background: red;
}
.layout.absoulute .center {
left: 300px;
right: 300px;
background: yellow;
}
.layout.absoulute .right {
right: 0;
width: 300px;
background: blue;
}
</style>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h1>绝对定位解决方案</h1>
1. 这是三栏布局中间部分 2. 这是三栏布局中间部分
</div>
<div class="right"></div>
</article>
</section>flex布局解决方案
父级 box 给 display: flex , 左右宽 300, 中间 flex : 1 ,flex 的灵活性也十分的好用 ~
<section class="layout flexbox">
<style>
.layout.flexbox {
margin-top: 140px;
}
.layout.flexbox .left-center-right {
display: flex;
}
.layout.flexbox .left {
width: 300px;
background: red;
}
.layout.flexbox .center {
flex: 1;
background: yellow;
}
.layout.flexbox .right {
width: 300px;
background: blue;
}
</style>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h1>flex 布局解决方案</h1>
1. 这是三栏布局中间部分 2. 这是三栏布局中间部分
</div>
<div class="right"></div>
</article>
</section>table布局解决方案
父级 display: table; 左中右 display: table-cell;
<section class="layout table">
<style>
.layout.table .left-center-right {
width: 100%;
display: table;
height: 100px;
}
.layout.table .left-center-right > div {
display: table-cell;
}
.layout.table .left {
width: 300px;
background: red;
}
.layout.table .center {
background: yellow;
}
.layout.table .right {
width: 300px;
background: blue;
}
</style>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h1>表格布局解决方案</h1>
1. 这是三栏布局中间部分 2. 这是三栏布局中间部分
</div>
<div class="right"></div>
</article>
</section>grid布局解决方案
利用网格布局 ,父级 display: grid; width: 100%; grid-template-columns: 300px auto 300px;
<section class="layout grid">
<style>
.layout.grid .left-center-right {
display: grid;
width: 100%;
grid-template-rows: 100px;
grid-template-columns: 300px auto 300px;
}
.layout.grid .left {
background: red;
}
.layout.grid .center {
background: yellow;
}
.layout.grid .right {
background: blue;
}
</style>
<article class="left-center-right">
<div class="left"></div>
<div class="center">
<h1>grid布局解决方案</h1>
1. 这是三栏布局中间部分 2. 这是三栏布局中间部分
</div>
<div class="right"></div>
</article>
</section>优缺点
上面我们给出 5 种解决方案,那么面试官怎么延伸这个问题呢? 如果把高度已知去掉,又该如何实现呢?那我们不止要考虑水平方向的,同时要考虑中间的高度问题。那我们刚写的五种方案,哪些可以适用,哪些又不能适用了呢 这五种方案的兼容性又如何,最优的解决方案又是哪个
1、float
缺点:在于脱离文档流,意味着它下面的子元素也必须脱离文档流,还需要清除浮动带来的影响,如果处理不好会带来很多问题,这是它本身的局限性
优点:兼容性很好,快捷,不容易出问题
2、absolute
3、flex
缺点:兼容到 IE 8
在 float 、absoulute 出现之后出现的一种布局方式,为了解决两种布局方式的不足。flex 布局方案算是比较完美的一种,尤其是现在移动端基本都是使用 flex 布局
4、table
缺点:操作麻烦,对 seo 不友好 ,当某一个单元格高度超出的时候,那么其他单元格也会跟着调整高度,有时候我们场景是不允许的
优点:兼容性很好,当 flex 解决不了的话,可以尝试下用表格布局
5、grid
新出的网格布局,通过 网格布局可以做很多事情,代码精简
当我们增加内容高度时会发生什么事情呢?

很明显
浮动布局文字自动排版到左边了。(浮动的基本原理)
绝对定位撑开中间部分的布局,两边不变
flex 、table 布局中内容撑开盒子的高度 - better
grid 布局中内容中不撑开高度
页面布局总结
1、语义化掌握到位
2、页面布局深刻理解
3、CSS 基础知识扎实
4、代码书写规范
页面布局的变通
三栏布局
左右宽固定,中间自适应
上下高固定,中间自适应
两栏布局
左宽度固定,右自适应 或者相反
上宽度固定,下自适应 或者相反
芝麻酱
11月20日
这套课质量挺值得价格的
银河绘日
08月15日
很基础的题,但还是要细心才能做对
书为
11月24日
这问题真不好答
目田
01月07日
学到数据库了 感觉有些难度 我太难了