淼淼是什么意思| saucony是什么品牌| 风热感冒吃什么药好| 小赤佬是什么意思| 拐枣泡酒有什么功效| 四月二十八什么星座| 伟五行属什么| 热伤风吃什么药| 总咳嗽是什么原因| 阴部痒是什么原因| 胃幽门螺旋杆菌吃什么药效果好| 46属什么| 骨髓穿刺能查出什么病| 奕五行属什么| 红豆有什么功效和作用| 乙肝两对半15阳性是什么意思| 喝苦荞茶有什么好处和坏处| 秀禾服是什么意思| 家里适合养什么花| bodywash是什么意思| 什么时候喝牛奶最好| sdh是什么意思| 什么是甲母痣| 什么是生化流产| 什么叫同工同酬| 什么叫脑白质病变| 臣附议是什么意思| 月亮是什么生肖| 舌苔发黄是什么原因| 风热感冒 吃什么| 桃酥为什么叫桃酥| 四季平安是什么生肖| 螃蟹是什么季节吃的| 蒙脱石是什么东西| 一厢情愿是什么生肖| 女人梦见下雪是什么征兆| 称中药的小秤叫什么| 肝脏在什么位置| 什么可以代替狗狗沐浴露| 什么黄河| 芒果过敏吃什么药| momo是什么意思| 脑门疼是什么原因| 亭字五行属什么| 皮肤溃烂化脓用什么药| 海鲜配啤酒有什么反应| 丹毒是什么原因引起的| 视力矫正是什么意思| 螃蟹过街的歇后语是什么| 番茄红素有什么作用| 东山再起是什么生肖| 菡字五行属什么| 大人有大量是什么意思| 畅销是什么意思| 天蝎座和什么星座最配| 强字五行属什么| 生气容易得什么病| 解尿支原体是什么| 吐了后吃点什么能舒服| 打乙肝疫苗需要注意什么| 大包子什么馅好吃| 高低肩挂什么科| 蒙昧是什么意思| 清关是什么意思| 睡不着觉是什么原因引起的| 下眼睑浮肿是什么原因| 起死回生是什么生肖| 阿司匹林主治什么病| 高密度脂蛋白偏低是什么意思| 跟腱炎吃什么药| 暴殄天物是什么生肖| 深海鱼油什么牌子好| 囊肿是什么原因引起的| 总流鼻血是什么原因| 增强ct是什么| 鱼油对眼睛有什么好处| 急性胃肠炎用什么药| 顺势而为什么意思| 新生儿甲状腺偏高有什么影响| 自欺欺人是什么生肖| 惊讶表情是什么意思| 先考是什么意思| mpd是什么意思| 膝盖有积液是什么症状| 朔望月是什么意思| 丝瓜不能和什么食物一起吃| 棘手是什么意思| 平方和是什么| 黄体酮有什么作用| 手抖头抖是什么病| 一什么不什么| 汗斑是什么原因引起的| 阑尾炎手术后可以吃什么水果| 血糖高早餐吃什么好| 直辖市市长是什么级别| mect是什么意思| 积福是什么意思| 灶性肠化是什么意思| 流口水什么原因| 化疗什么意思| 肾的作用和功能是什么| 婴儿湿疹用什么| 川字纹有什么影响| 喝藏红花有什么好处| 10月10日是什么星座| g代表什么单位| 百香果是什么季节的水果| 骸骨是什么意思| 肚脐眼周围痛挂什么科| 查甲状腺应该挂什么科| utc是什么时间| 流黄鼻涕是什么感冒| 哺乳期什么时候来月经正常| 万岁是什么意思| 解脲支原体阳性是什么病| 最高的学历是什么| 健康证是什么样的| 南瓜可以做什么美食| 腿抽筋缺什么| 不遗余力的遗是什么意思| 罗嘉良为什么娶苏岩| 可可和咖啡有什么区别| 夏至该吃什么| 打酱油是什么意思| 胃胀气吃什么药见效快| 梦见牙齿掉光了是什么征兆| 冬瓜炖什么好吃| 王加几念什么| 口腔溃疡缺什么维生素| 麻鸡是什么鸡| 上海是什么省| 餐饮五行属什么| 肠镜活检意味着什么| 老舍原名叫什么| 妈妈的姐姐的儿子叫什么| 血液由什么和什么组成| 妊娠阴性是什么意思| 什么时候初伏第一天| secret什么意思| 裤裙搭配什么上衣好看| 天降横财什么意思| 蓝莓泡酒有什么功效| 茶壶嘴为什么不能对着人| 两个水念什么| 乞巧节是什么节| pp材质是什么材质| 橡胶过敏是什么症状| 梦见买楼房有什么预兆| 马赫是什么意思| 舌苔厚白吃什么药| 什么的枣| 社恐的人适合什么工作| 三教九流代表什么生肖| qd医学上是什么意思| 见人说人话见鬼说鬼话是什么意思| 猫叫是什么意思| 一阵一阵的胃疼是什么原因| 胃泌素偏低是什么原因| 劼字取名的寓意是什么| 踏空是什么意思| 嗜是什么意思| 势如破竹是什么意思| 梦见玉碎了是什么意思| 什么是子宫腺肌症| 心里不舒服是什么原因| 胃强脾弱吃什么中成药| 武则天是什么朝代| 宫禁糜烂用什么药| 艾叶泡脚有什么好处| 肾虚挂什么科| 胎盘附着于子宫前壁是什么意思| 咀嚼什么意思| 汆水是什么意思| 晟读什么| 早上8点属于什么时辰| 心脏跳动过快吃什么药| 什么玉便宜又养人| 830是什么意思| 好运是什么生肖| 口干口苦吃什么药| 质量是什么| 老是打饱嗝是什么原因| 香蕉皮擦脸有什么作用与功效| 女生心脏在什么位置| 气化是什么意思| 显赫是什么意思| 女生流白带意味着什么| 血管为什么是青色的| 刚拔完智齿可以吃什么| 腹直肌是什么| 菜肴是什么意思| 肠粘连是什么原因引起| 晚上睡觉脚抽筋是什么原因引起的| 用字五行属什么| 掉头发是什么原因| n2o是什么气体| 吃青椒有什么好处| 惊醒是什么意思| 97年什么命| 牙疼吃什么食物好得快| 什么是早教机| 腹腔积液是什么原因| 去香港需要办理什么证件| 小便次数多是什么原因| 有什么汤菜谱大全| 什么叫私生饭| 眼底检查主要查什么| 子宫内膜6mm意味着什么| 深海鱼都有什么鱼| 什么鸡适合炖汤| 窒息什么意思| 公积金缴存基数是什么意思| 咳白色泡沫痰是什么病| 18年属什么生肖| 鲜字五行属什么| 17数字代表什么意思| 安瓶是什么| 孵化器公司是干什么的| 孩子出疹子应该注意什么| 白斑是什么原因引起的| cc代表什么意思| 什么是精神| 十月十日什么星座| 道字五行属什么| 拉屎像拉水一样为什么| 友女是什么意思| 水泊梁山什么意思| 下巴的痣代表什么| 卡布奇诺是什么意思| 女性尿路感染挂什么科| 细菌性阴道炎用什么洗液| 玫瑰花和什么一起泡水喝好| 十一月十一号是什么星座| 夯实是什么意思| 打瓜是什么瓜| 过期的牛奶有什么用途| 进重症监护室意味什么| 泡妞是什么意思| 爱心是什么牌子| 苦海翻起爱恨是什么歌| 儿童发烧挂什么科| 胆水的成分是什么| 玄女是什么意思| 镜花缘是什么意思| 旗开得胜是什么意思| 美帝是什么意思| 低血压高什么原因| 2.3什么星座| 肾结石什么不可以吃| 肺部有结节要注意什么| cg是什么| 大卡是什么意思| 腿脚浮肿是什么原因引起的| 头发没有光泽是什么原因| 阑尾炎打什么消炎针好| 夜里睡觉手麻是什么原因| 尿频是什么原因导致的| 桥本是什么意思| 阴道没水什么原因| 眼袋肿是什么原因| 婴儿泡奶粉用什么水好| 白酒优级和一级有什么区别| 百合花代表什么意思| 豆腐吃多了有什么坏处| 百度
Skip to content

面试官:如何实现两栏布局,右侧自适应?三栏布局中间自适应呢??#103

@huihuiha

Description

@huihuiha

一、背景

在日常布局中,无论是两栏布局还是三栏布局,使用的频率都非常高

两栏布局

两栏布局实现效果就是将页面分割成左右宽度不等的两列,宽度较小的列设置为固定宽度,剩余宽度由另一列撑满,

比如 Ant Design 文档,蓝色区域为主要内容布局容器,侧边栏为次要内容布局容器

这里称宽度较小的列父元素为次要布局容器,宽度较大的列父元素为主要布局容器

这种布局适用于内容上具有明显主次关系的网页

三栏布局

三栏布局按照左中右的顺序进行排列,通常中间列最宽,左右两列次之

大家最常见的就是github

二、双栏布局

双栏布局非常常见,往往是以一个定宽栏和一个自适应的栏并排展示存在

实现思路也非常的简单:

  • 使用 float 左浮左边栏
  • 右边模块使用 margin-left 撑出内容块做内容展示
  • 为父级元素添加BFC,防止下方元素飞到上方内容

代码如下:

<style>
    .box{
        overflow: hidden; 添加BFC
    }
    .left {
        float: left;
        width: 200px;
        background-color: gray;
        height: 400px;
    }
    .right {
        margin-left: 210px;
        background-color: lightgray;
        height: 200px;
    }
</style>
<div class="box">
    <div class="left">左边</div>
    <div class="right">右边</div>
</div>

还有一种更为简单的使用则是采取:flex弹性布局

flex弹性布局

<style>
    .box{
        display: flex;
    }
    .left {
        width: 100px;
    }
    .right {
        flex: 1;
    }
</style>
<div class="box">
    <div class="left">左边</div>
    <div class="right">右边</div>
</div>

flex可以说是最好的方案了,代码少,使用简单

注意的是,flex容器的一个默认属性值:align-items: stretch;

这个属性导致了列等高的效果。 为了让两个盒子高度自动,需要设置: align-items: flex-start

三、三栏布局

实现三栏布局中间自适应的布局方式有:

  • 两边使用 float,中间使用 margin
  • 两边使用 absolute,中间使用 margin
  • 两边使用 float 和负 margin
  • display: table 实现
  • flex实现
  • grid网格布局

两边使用 float,中间使用 margin

需要将中间的内容放在html结构最后,否则右侧会臣在中间内容的下方

实现代码如下:

<style>
    .wrap {
        background: #eee;
        overflow: hidden; <!-- 生成BFC,计算高度时考虑浮动的元素 -->
        padding: 20px;
        height: 200px;
    }
    .left {
        width: 200px;
        height: 200px;
        float: left;
        background: coral;
    }
    .right {
        width: 120px;
        height: 200px;
        float: right;
        background: lightblue;
    }
    .middle {
        margin-left: 220px;
        height: 200px;
        background: lightpink;
        margin-right: 140px;
    }
</style>
<div class="wrap">
    <div class="left">左侧</div>
    <div class="right">右侧</div>
    <div class="middle">中间</div>
</div>

原理如下:

  • 两边固定宽度,中间宽度自适应。
  • 利用中间元素的margin值控制两边的间距
  • 宽度小于左右部分宽度之和时,右侧部分会被挤下去

这种实现方式存在缺陷:

  • 主体内容是最后加载的。

  • 右边在主体内容之前,如果是响应式设计,不能简单的换行展示

两边使用 absolute,中间使用 margin

基于绝对定位的三栏布局:注意绝对定位的元素脱离文档流,相对于最近的已经定位的祖先元素进行定位。无需考虑HTML中结构的顺序

<style>
  .container {
    position: relative;
  }
  
  .left,
  .right,
  .main {
    height: 200px;
    line-height: 200px;
    text-align: center;
  }

  .left {
    position: absolute;
    top: 0;
    left: 0;
    width: 100px;
    background: green;
  }

  .right {
    position: absolute;
    top: 0;
    right: 0;
    width: 100px;
    background: green;
  }

  .main {
    margin: 0 110px;
    background: black;
    color: white;
  }
</style>

<div class="container">
  <div class="left">左边固定宽度</div>
  <div class="right">右边固定宽度</div>
  <div class="main">中间自适应</div>
</div>

实现流程:

  • 左右两边使用绝对定位,固定在两侧。
  • 中间占满一行,但通过 margin和左右两边留出10px的间隔

两边使用 float 和负 margin

<style>
  .left,
  .right,
  .main {
    height: 200px;
    line-height: 200px;
    text-align: center;
  }

  .main-wrapper {
    float: left;
    width: 100%;
  }

  .main {
    margin: 0 110px;
    background: black;
    color: white;
  }

  .left,
  .right {
    float: left;
    width: 100px;
    margin-left: -100%;
    background: green;
  }

  .right {
    margin-left: -100px; /* 同自身宽度 */
  }
</style>

<div class="main-wrapper">
  <div class="main">中间自适应</div>
</div>
<div class="left">左边固定宽度</div>
<div class="right">右边固定宽度</div>

实现过程:

  • 中间使用了双层标签,外层是浮动的,以便左中右能在同一行展示
  • 左边通过使用负 margin-left:-100%,相当于中间的宽度,所以向上偏移到左侧
  • 右边通过使用负 margin-left:-100px,相当于自身宽度,所以向上偏移到最右侧

缺点:

  • 增加了 .main-wrapper 一层,结构变复杂
  • 使用负 margin,调试也相对麻烦

使用 display: table 实现

<table> 标签用于展示行列数据,不适合用于布局。但是可以使用 display: table 来实现布局的效果

<style>
  .container {
    height: 200px;
    line-height: 200px;
    text-align: center;
    display: table;
    table-layout: fixed;
    width: 100%;
  }

  .left,
  .right,
  .main {
    display: table-cell;
  }

  .left,
  .right {
    width: 100px;
    background: green;
  }

  .main {
    background: black;
    color: white;
    width: 100%;
  }
</style>

<div class="container">
  <div class="left">左边固定宽度</div>
  <div class="main">中间自适应</div>
  <div class="right">右边固定宽度</div>
</div>

实现原理:

  • 层通过 display: table设置为表格,设置 table-layout: fixed`表示列宽自身宽度决定,而不是自动计算。
  • 内层的左中右通过 display: table-cell设置为表格单元。
  • 左右设置固定宽度,中间设置 width: 100% 填充剩下的宽度

使用flex实现

利用flex弹性布局,可以简单实现中间自适应

代码如下:

<style type="text/css">
    .wrap {
        display: flex;
        justify-content: space-between;
    }

    .left,
    .right,
    .middle {
        height: 100px;
    }

    .left {
        width: 200px;
        background: coral;
    }

    .right {
        width: 120px;
        background: lightblue;
    }

    .middle {
        background: #555;
        width: 100%;
        margin: 0 20px;
    }
</style>
<div class="wrap">
    <div class="left">左侧</div>
    <div class="middle">中间</div>
    <div class="right">右侧</div>
</div>

实现过程:

  • 仅需将容器设置为display:flex;
  • 盒内元素两端对其,将中间元素设置为100%宽度,或者设为flex:1,即可填充空白
  • 盒内元素的高度撑开容器的高度

优点:

  • 结构简单直观
  • 可以结合 flex的其他功能实现更多效果,例如使用 order属性调整显示顺序,让主体内容优先加载,但展示在中间

grid网格布局

代码如下:

<style>
    .wrap {
        display: grid;
        width: 100%;
        grid-template-columns: 300px auto 300px;
    }

    .left,
    .right,
    .middle {
        height: 100px;
    }

    .left {
        background: coral;
    }

    .right {
        width: 300px;
        background: lightblue;
    }

    .middle {
        background: #555;
    }
</style>
<div class="wrap">
    <div class="left">左侧</div>
    <div class="middle">中间</div>
    <div class="right">右侧</div>
</div>

flex弹性布局一样的简单

参考文献

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

      骨是什么结构 正连级相当于地方什么级别 田螺吃什么食物 孩子肠胃炎吃什么药 仙人是什么生肖
      甲状腺密度不均匀是什么意思 高会是什么意思 高度鳞状上皮内病变是什么意思 12月20号是什么星座 夏天的诗句有什么
      子宫内膜息肉有什么症状 特警属于什么编制 鸡皮肤是什么原因引起的 谁也不知道下一秒会发生什么 梦见自己娶媳妇是什么意思
      压测是什么意思 鸡肉和什么菜搭配最好 梦见输钱是什么预兆 咳出血是什么原因 peek是什么材质
      瘢痕子宫是什么意思hcv8jop4ns2r.cn 铁蛋白高吃什么药能降下来xianpinbao.com 抑郁症发作是什么感觉hcv7jop9ns1r.cn 长期失眠应该吃什么药hcv9jop0ns4r.cn 外痔疼痛用什么药最好hcv8jop9ns9r.cn
      家伙是什么意思hcv9jop1ns1r.cn 脉搏是什么hcv7jop9ns3r.cn 腹直肌分离是什么意思hcv8jop0ns1r.cn 匝道是什么tiangongnft.com 梦见嫖娼是什么意思hcv8jop7ns5r.cn
      moi是什么意思creativexi.com hpv31阳性是什么意思hcv9jop1ns4r.cn 男性生殖长水泡是什么原因hcv9jop5ns7r.cn 绿原酸是什么hcv7jop9ns6r.cn 木瓜什么味道hcv9jop2ns8r.cn
      淋巴细胞是什么意思hcv8jop0ns7r.cn 鱼油什么人不能吃hcv8jop1ns5r.cn 梦见水代表什么hcv9jop5ns6r.cn 轻微骨裂了有什么表现bjhyzcsm.com kms是什么药hcv8jop2ns6r.cn
      百度