面试如果问你三栏布局,怎样回答可以加分?

题目:假设高度已知,请写出三栏布局,其中左栏右栏宽度各为300px,中间栏自适应?

如果面试过程(多是一面)面试官问我们三栏布局,我们会怎么回答?

我们想回答多少种做法,回答一两种做法,只是勉强到及格线,

如果回答四五种,面试官可能就会觉得我们css基础掌握还不错

可是如果想在这道题目上加分,还得将题目延伸

a:假设我们回答出五种方法,那么这五种方法各自有什么优缺点?

b:假设去掉高度已知条件,这五种方法还能实现嘛?

c:五种方法的兼容性如何?

 

首先给出5种做法,float.absolute,flex,table,grid

假设高度为100px

1/5:float实现三栏布局

代码如下:

  <section class="layout float">
    <style>
      .layout.float div {
        height: 200px;
      }

      .layout.float .left {
        float:left;
        background: gray;
        width: 300px;
      }

      .layout.float .right {
        float: right;
        background: blue;
        width: 300px;
      }

      .layout.float .center {
        background: yellow;
      }
    </style>
    <article class="left-right-center">
      <div class="left"></div>
      <div class="right"></div>
      <div class="center">
        <h1>浮动解决方案</h1>
      </div>
    </article>
  </section>

效果如下

float布局优缺点:

优先:兼容性好

缺点:浮动元素脱离文档流,要做清除浮动,这个处理不好的话,会带来很多问题,比如父容器高度塌陷等。

float有三个值:none、left、right(不浮动、向左浮动、向右浮动);使用浮动时,整个元素块就会脱离文档流,也会脱离出该元素的父元素包含的范围,成为独立元素块,但该元素块不会影响它前面的元素块,但会影响它的父元素和父元素后面的兄弟元素、该元素下面的兄弟元素

解决问题的本质是:把float的元素块控制在父元素的内部,使浮动效果只在父元素内。有两种方法:

       1、父元素使用overflow:hidden、auto、scroll。 原理是:对父元素的子元素进行计算,判断是否有超出父元素的大小,这样就会促使对float元素计算在内,使float元素块被控制在父元素内,不会脱离父元素的范围,依然是父元素的一部分。这样就只是在父元素内float,父元素外依然是正常流分布。

       2、在float元素的下一个兄弟元素内使用clear:both;是该兄弟元素认为float元素依然存在正常文档流中,这样也起到和上面1相同的作用。

      目的:让float元素块控制在父元素的范围内,成为父元素的一部分,只在父元素内部起到浮动作用。不会脱离父元素的包围范围内。

优缺点内容来自(https://www.jianshu.com/p/bbde87714e5f)

假设高度不确定,当float的元素高度超过同一行其他的元素后,会变成下面这样

 

2/5:absolute实现三栏布局

代码如下:

  <section class="layout absolute">
    <style>
      .layout.absolute {
        height: 100px;;
      }

      .layout.absolute div {
        position: absolute;
        height: 100px;
      }

      .layout.absolute .left {
        width: 300px;
        left: 0;
        background: red;
      }

      .layout.absolute .center {
        left: 300px;
        right: 300px;
        background: yellow;
      }

      .layout.absolute .right {
        right: 0;
        width: 300px;
        background: blue;
      }
    </style>
    <article class="left-center-right">
      <div class="left"></div>
      <div class="center">
        <h1>绝对定位解决方案</h1>
      </div>
      <div class="right"></div>
    </article>
  </section>

效果如下

绝对定位布局优缺点:

优点:快捷,方便,不容易出问题

缺点:容器脱离了文档流,后代元素也脱离了文档流,高度未知的时候,会有问题,这就导致了这种方法的有效性和可使用性是比较差的。

假设高度不确定,三栏的高度有可能一个高一个矮,需要另外处理

3/5:flexbox实现三栏布局

代码如下:

 <section class="layout flexbox">
    <style>
      .layout.flexbox .left-center-right {
        display: flex;
      }

      .layout.flexbox  div {
        flex-basis: 300px;
        height: 100px;
      }

      .layout.flexbox .left {
        background: red;
        flex-shrink: 0;
      }

      .layout.flexbox .right {
        background: blue;
        flex-shrink: 0;
      }

      .layout.flexbox .center {
        flex-grow: 1;
        background: yellow;
      }
    </style>
    <article class="left-center-right">
      <div class="left"></div>
      <div class="center">
        <h1>flexbox解决方案</h1>
      </div>
      <div class="right"></div>
    </article>
  </section>

效果如下

flexbox布局优缺点:

优点:flexbox布局是css3里新出的一个,它就是为了解决上述两种方式的不足出现的,是比较完美的一个。目前移动端的布局也都是用flexbox。

缺点:部分浏览器,一些较低版本的浏览器不支持

假设高度不确定,由于flex容器内的元素flex-shrink属性默认值为1,所以当任何一栏高度撑开时,另外两栏也会跟着撑开

4/5:table布局实现三栏布局

代码如下:

  <section class="layout table">
    <style>
      .layout.table .left-center-right {
        display: table;
        height: 100px;
        width: 100%;
      }

      .layout.table .left-center-right>div {
        display: table-cell;
      }

      .layout.table .left {
        width: 300px;
        background: red;
      }

      .layout.table .center {
        background: yellow;
        text-align: center;
        line-height: 100px;
      }

      .layout.table .right {
        width: 300px;
        background: blue;
      }
    </style>
    <article class="left-center-right">
      <div class="left"></div>
      <div class="center">
        <h1>table解决方案</h1>
      </div>
      <div class="right"></div>
    </article>
  </section>

效果如下:

表格布局优缺点:

优点:兼容性很好,在flex布局不兼容的时候,可以尝试表格布局。当内容溢出时会自动撑开父元素。

缺点:①无法设置栏边距;②对seo不友好;③当其中一个单元格高度超出的时候,两侧的单元格也是会跟着一起变高的,第三点看实际需求,可能是优先,可能是缺点

假设高度不确定,内容溢出时会自动撑开父元素,当其中一个单元格高度超出的时候,两侧的单元格也是会跟着一起变高

5/5:网格布局(grid)实现三栏布局

代码如下:

  <section class="layout grid">
    <style>
      .layout.grid .left-center-right {
        display: grid;
        grid-template-rows: 100px;
        grid-template-columns: 300px auto 300px;
      }

      .layout.grid .left {
        background: red;
      }

      .layout.grid .center {
        background: yellow;
        line-height: 100px;
        text-align: center;
      }

      .layout.grid .right {
        background: blue;
      }
    </style>
    <article class="left-center-right">
      <div class="left"></div>
      <div class="center">
        <h1>网格布局解决方案</h1>
      </div>
      <div class="right"></div>
    </article>
  </section>

效果如下:

网格布局优缺点:

优点:Grid是创建网格布局最强大和最简单的工具。就像表格一样,网格布局可以让Web设计师根据元素按列或行对齐排列,但他和表格不同,网格布局没有内容结构,从而使各种布局不可能与表格一样。例如,一个网格布局中的子元素都可以定位自己的位置,这样他们可以重叠和类似元素定位。

缺点:网格布局的兼容性不好,IE10+上支持,而且也仅支持部分属性。

假设高度不确定,网格布局也比较灵活

 

PS:如果不熟悉flexbox布局网格布局(grid)相关的知识,建议读一读阮一峰大神的网络日记,

读的过程自己动手操作一次,很快就可以掌握

Flex 布局教程:语法篇

Flex 布局教程:实例篇

CSS Grid 网格布局教程

第一篇文章打卡,个人博客暂时选择CSDN了,

有访问量的记录,看到访问量慢慢增加,比较容易有坚持下去的动力

 

要有危机意识,哪天公司不要你了,你能够很快找到另一家公司嘛?

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值