之前看过的面试题中有关于pc端常见的三栏布局的实现,下面总结一下几种实现方案。作为一名前端小白,以往在学习和工作中遇到问题有时候会通过Evernote的方式记录,有时候直接没有记录,从来没有在公开的博客发表过技术文章,为了督促自己养成良好的工作和学习习惯,决定以后将自己的学习笔记转移到这里,谈不上技术文章,只是对遇到问题的一个总结,也便于以后自己回头查阅。
这个布局的要求是实现pc端常见的左中右三栏布局(高度已知),左右两栏宽度固定(300px),中间自适应
方案一 浮动方式
这里要注意的是html结构中,中间自适应部分的div必须写在最后。
/* html结构 */
<body>
<div class="left"></div>
<div class="right"></div>
<div class="center"></div>
</body>
/* css部分 */
body { margin: 0; padding: 0;}
div { height: 100px;}.left { width: 300px; background: red; float: left;}.right { width: 300px; background: red; float: right;}.center { background: yellow; height: 200px; overflow: hidden;}
效果如图所示:
方案二 绝对定位方式
/* html结构 */
<body>
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</body>/* css部分 */
body { position: relative;}.left, .right {
width: 300px; height: 100px; background: red; position: absolute; left: 0; top: 0;
}.left { left: 0;}.right { right: 0;}.center { height: 400px; background: #0f0; position: absolute; top: 0; left: 300px; right: 300px;}
这里的最终效果同浮动布局一致,不贴图了。
方案三 table布局方式
/* html结构 */
<body>
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</body>/* css部分 */
body { margin: 0; padding: 0; display: table; width: 100%;}div { display: table-cell;}.left, .right { width: 300px; background: red;}.center { height: 200px; background: yellow;}
效果图如下:
方案四 flex布局方式
/* html结构 */
<body>
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</body>
/* css部分 */
body { display: flex; width: 100%;}.left, .right { flex: 0 0 300px; background: red;}.center { height: 200px; background: yellow; flex: 1;}
效果同方案三
方案五 grid布局
/* html结构 */
<body>
<div class="left"></div>
<div class="center"></div>
<div class="right"></div>
</body>
/* css部分 */
body { display: grid; grid-template-columns: 300px auto 300px;}.left, .right { background: red;}.center { height: 200px; background: yellow;}
效果同方案三
几种方案的比较
- 浮动方案:缺点是需要清除浮动,如果处理不好和周边元素的关系,会带来很多问题,优点是兼容性好;
- 绝对定位:优点是快捷,便于配合js使用,缺点是脱离文档流,子元素也脱离文档流,可使用性比较差;
- flex布局:解决前面两个布局方案的不足,比较完美的方案,特别适用于移动端(ie8不支持);
- table布局:兼容性很好,但是seo不友好,当其中一个单元格的高度改变,相邻的单元格高度也会跟着变化,有些场景不适用;
- grid布局:比较新的一种布局方式,兼容性差,优点是代码简洁,写起来很方便。