前端知识点之三栏布局 左右宽度固定 上下高度固定 中间自适应 几

2019-01-05  本文已影响0人  无故下架内容so账号已弃用

“题目:假设高度已知,请写出三栏布局,其中左、右栏的宽度为 300px,中间自适应”
面试经常会遇到这样的一道题来考察对页面布局的基本功,相信大部分人都会想到通过 float 和绝对定位这两种方法来实现,但是想要在面试官面前得到更多的认可,还需要列举出更多的解决办法和优缺点:

三栏布局 左右宽度固定 中间自适应 五种解决办法

以下五种解决办法的公共样式

<style>
  /* 偷懒样式重置 */
  html * { margin: 0; padding: 0; }
  .layout { margin-top: 20px; }
  .layout .container > div { height: 100px; }
</style>

第一种:浮动解决方案:
1.兼容性好,
2.三栏高度互不影响,
3.需要清除浮动

<section class="layout float">
  <style>
    .layout.float .left { float: left; width: 300px; background-color: gray; }
    .layout.float .right { float: right; width: 300px; background-color: gray; }
    .layout.float .center { margin: 0 300px; background-color: #ddd; }
  </style>
  <article class="container">
    <div class="left"></div>
    <div class="right"></div>
    <div class="center">
      <p>三栏布局 左右宽度固定 中间自适应</p>
      <p>浮动解决方案</p>
    </div>
  </article>
</section>

第二种:绝对定位解决方案:
1.兼容性好,
2.三栏高度互不影响,
3.内容脱离文档流
4.适用范围不广

<section class="layout absolute">
  <style>
  .layout.absolute .container { height: 100px; position: relative; }
  .layout.absolute .left { position: absolute; left: 0; top: 0; width: 300px; background-color: gray; }
  .layout.absolute .right { position: absolute; right: 0; top: 0; width: 300px; background-color: gray; }
  .layout.absolute .center { position: absolute; left: 300px; right: 300px; top: 0; background-color: #ddd; }
  </style>
  <article class="container">
    <div class="left"></div>
    <div class="center">
      <p>三栏布局 左右宽度固定 中间自适应</p>
      <p>绝对定位解决方案</p>
    </div>
    <div class="right"></div>
  </article>
</section>

第三种: flexbox 解决方案:
1.适用于移动端布局,
2.使用简单
3.兼容性较差,
4.如果未设置高度,三栏高度由内容撑开,始终等高

    <section class="layout flexbox">
      <style>
        .layout.flexbox .container { display: flex; }
        .layout.flexbox .left { width: 300px; background-color: gray; }
        .layout.flexbox .right { width: 300px; background-color: gray; }
        .layout.flexbox .center { flex: 1; background-color: #ddd; }
      </style>
      <article class="container">
        <div class="left"></div>
        <div class="center">
          <p>三栏布局 左右宽度固定 中间自适应</p>
          <p>flexbox 解决方案</p>
        </div>
        <div class="right"></div>
      </article>
    </section>

第四种: table 解决方案:
1.兼容性好
2.如果未设置高度,三栏高度由内容撑开,始终等高
3.设置 vertical:middle 可以使内联元素/文本内容垂直居中
4.三栏高度由内容撑开,始终等高

<section class="layout table">
  <style>
    .layout.table .container { display: table; width: 100%; }
    .layout.table .container > div { display: table-cell; }
    .layout.table .left { width: 300px; background-color: gray; }
    .layout.table .right { width: 300px; background-color: gray; }
    .layout.table .center { background-color: #ddd; }
  </style>
  <article class="container">
    <div class="left"></div>
    <div class="center">
      <p>三栏布局 左右宽度固定 中间自适应</p>
      <p>table 解决方案</p>
    </div>
    <div class="right"></div>
  </article>
</section>

第五种: Grid 解决方案:
1.兼容性很差,只支持高版本的浏览器
2.讲真,这个我不太懂,后续学习下。

<section class="layout grid">
  <style>
    .layout.grid .container { display: grid; grid-template-columns: 300px auto 300px; }
    .layout.grid .left { background-color: gray; }
    .layout.grid .right { background-color: gray; }
    .layout.grid .center { background-color: #ddd; }
  </style>
  <article class="container">
    <div class="left"></div>
    <div class="center">
      <p>三栏布局 左右宽度固定 中间自适应</p>
      <p>grid 解决方案</p>
    </div>
    <div class="right"></div>
  </article>
</section>

效果图:


QQ图片20190105152429.png

三栏布局 上下高度固定 中间自适应 四种解决方案

第一种:绝对定位解决方案:

<style>
  /* 偷懒样式重置 */
  html * { margin: 0; padding: 0; }
  html,
  body { width: 100%; height: 100%; }
  .layout { position: relative; width: 100%; height: 100%; }
  .layout .header,
  .layout .footer { height: 100px; width: 100%; position: absolute; background-color: #ddd; }
  .layout .header { top: 0; }
  .layout .footer { bottom: 0; }
  .layout .content { position: absolute; top: 100px; right: 0; left: 0; bottom: 100px; background-color: #999; }
</style>
<!-- 绝对定位 解决方案 -->
<section class="layout">
  <header class="header">头部</header>
  <article class="content">
    <p>中间部分 高度自适应</p>
    <p>绝对定位 解决方案</p>
  </article>
  <footer class="footer">底部</footer>
</section>

第二种: flex解决方案

<style>
  /* 偷懒样式重置 */
  html * { margin: 0; padding: 0; }
  html,
  body { width: 100%; height: 100%; }
  .layout { width: 100%; height: 100%; display: flex; flex-direction: column; }
  .layout .header,
  .layout .footer { height: 100px; width: 100%; background-color: #ddd; }
  .layout .content { flex: 1; background-color: #999; }
</style>
<!-- flex 解决方案 -->
<section class="layout">
  <header class="header">头部</header>
  <article class="content">
    <p>中间部分 高度自适应</p>
    <p>flex 解决方案</p>
  </article>
  <footer class="footer">底部</footer>
</section>

第三种: table解决方案

<style>
  /* 偷懒样式重置 */
  html * { margin: 0; padding: 0; }
  html,
  body { width: 100%; height: 100%; }
  .layout { width: 100%; height: 100%; display: table; flex-direction: column; }
  .layout .header,
  .layout .footer { display: table-row; height: 100px; width: 100%; background-color: #ddd; }
  .layout .content { display: table-row; background-color: #999; }
</style>
<!-- table 解决方案 -->
<section class="layout">
  <header class="header">头部</header>
  <article class="content">
    <p>中间部分 高度自适应</p>
    <p>table 解决方案</p>
  </article>
  <footer class="footer">底部</footer>
</section>

第四种:grid解决方案

<style>
  /* 偷懒样式重置 */
  html * { margin: 0; padding: 0; }
  html,
  body { width: 100%; height: 100%; }
  .layout { width: 100%; height: 100%; display: grid; grid-template-rows: 100px auto 100px; }
  .layout .header,
  .layout .footer { background-color: #ddd; }
  .layout .content { background-color: #999; }
</style>
<!-- grid 解决方案 -->
<section class="layout">
  <header class="header">头部</header>
  <article class="content">
    <p>中间部分 高度自适应</p>
    <p>grid 解决方案</p>
  </article>
  <footer class="footer">底部</footer>
</section>

嗯,对的,和上面的横向排列类似,就是竖直方向浮动不再能用移动端比较,这种需求在常见,需要上下固定,中间部分能滚动,

左宽度固定,右自适应
右宽度固定,左自适应
上高度固定,下自适应
下高度固定,上自适应

还有常见的两栏布局也同样适用以上布局方法

以上为学习笔记,参考资料: 慕课网的课程

源码查看
github https://github.com/liguoyou/layout-demos
或者
码云 https://gitee.com/liguoyou/layout-demos

上一篇下一篇

猜你喜欢

热点阅读