面试官问:你会几种三栏布局方式? 我答:我会5种。

三栏布局

介绍

什么是三栏布局?

顾名思义,就是将页面分为三部分,分别为左侧栏、中间栏和右侧栏。

中间栏由于其较大的宽度和内容的重要性,自然而然成为用户的视觉中心,而两侧栏作为补充,辅助用户获取更多信息或进行额外操作。

三栏布局的特点

  1. 在三栏布局中,两侧栏往往固定宽度,中间栏自适应浏览器宽度,以保证内容区域的最大可用空间。
  2. 在三栏布局的代码中,执行的顺序是从上往下。为了让用户可以快速浏览到页面中间栏的内容,要将中间栏的代码放在左侧栏和右侧栏之前,这样页面就会优先加载中间栏的内容。

三栏布局实现方式

圣杯布局(浮动+定位)

html部分

html 复制代码
<div class="page">
    <div class="content">中间栏</div>
	<div class="left">左侧栏</div>
	<div class="right">右侧栏</div>
</div>

可以实现三栏布局中的中间栏被优先加载。

css部分

  1. 对整个页面的元素进行一个基本的样式重置,将内外边距设置为0。

    css 复制代码
    * {
        margin: 0;
        padding: 0;
    }
  2. 设置基础宽度、高度和背景颜色。

    css 复制代码
    .page {
        height: 200px;
    }
    .left,.right {
        height: 200px;
        width: 200px;
        background-color: green;
    }
    .content {
        width: 100%;
        height: 200px;
        background-color: red;
    }
  1. 为了让元素在一行上排列,将各元素添加float : left浮动样式,但是左侧栏和右侧栏被中间栏挤出第一行了。

    css 复制代码
    .page div {
        float: left;
    }
  1. 为了让左侧栏和右侧栏分别在第一行的最左边和最右边,我们要为中间栏设置左右内边距,这样方便实现三栏布局。

    css 复制代码
    .page {
        height: 200px;
        padding: 0 200px;
    }
  1. 要将左侧栏移动到第一行的最左侧,我们可以使用定位操作。

    css 复制代码
    .left {
        margin-left: -200px;
        position: relative;
        left: -100%;
    }
    1. 首先执行 margin-left: -200px;左侧栏移动到第一行。
  1. 再通过执行 position: relative;和left: -100%;移动到第一行最左侧。也就是通过相对定位,向左移动父容器的宽度大小距离。
  1. 将右侧栏移动到第一行的最右侧。

    css 复制代码
    .right {
        margin-left: -200px;
        position: relative;
        right: -200px;
    }
    1. 首先执行 margin-left: -200px;左侧栏移动到第一行。


    2. 再通过执行 position: relative;和left: -100%;移动到第一行最左侧。也就是通过相对定位,向左移动父容器的宽度大小距离。

特点

  1. 实现了三栏布局的页面样式。
  2. 实现了中间栏优先加载。

双飞翼布局(浮动)

html部分

html 复制代码
<div class="page">
    <div class="content">
        <div class="inner">中间栏</div>
    </div>
    <div class="left">左侧栏</div>
    <div class="right">右侧栏</div>
</div>

与圣杯布局不同的是,中间栏外还有一层。这使得双飞翼布局比圣杯布局优雅一些。

双飞翼布局也实现了中间栏优先加载。

css部分

  1. 对整个页面的元素进行一个基本的样式重置,将内外边距设置为0。

    css 复制代码
    * {
        margin: 0;
        padding: 0;
    }
  2. 设置基础宽度、高度和背景颜色。

    css 复制代码
    .page {
        height: 200px;
    }
    .left,.right {
        height: 200px;
        width: 200px;
        background-color: blue;
    }
    .content {
        height: 200px;
        width: 100%;
        background-color: red;
    }
    .inner {
        height: 100%;
        background-color: pink;
    }


3. 为了让元素在一行上排列,将各元素添加`float : left`浮动样式,但是左侧栏和右侧栏被中间栏挤出第一行了。

css 复制代码
.page>div {
float: left;
}
  1. 为了让左侧栏和右侧栏分别在第一行的最左边和最右边,我们要为中间栏设置左右外边距,这样方便实现三栏布局。在这里开始与圣杯布局开始不一样了。中间栏的两层盒子的作用开始发挥作用了。

    css 复制代码
    .inner {
        height: 100%;
        margin: 0 200px;
        background-color: pink;
    }
  1. 要将左侧栏移动到第一行的最左侧,我们不需要像圣杯布局那样进行定位操作。通过设置一个负的父级宽度的外边距实现移动左侧栏到第一行的最左侧。是不是比圣杯布局优雅一些。

    css 复制代码
    .left {
        margin-left: -100%;
    }
  1. 要将右侧栏移动到第一行的最右侧,和将左侧栏移动到第一行最左侧的思想一样。通过设置一个-200px的外边距实现移动右侧栏到第一行的最右侧。

    css 复制代码
    .right {
        margin-left: -200px;
    }

特点

  1. 实现了三栏布局的页面样式。
  2. 实现了中间栏优先加载。

相比之下双飞翼布局比圣杯布局更简便一些。

弹性布局

它来了,它带着最优雅的实现三栏布局的方式走来了。它就是弹性布局。

html部分

html 复制代码
<div class="page">
    <div class="main">中间栏</div>
    <div class="left">左侧栏</div>
    <div class="right">右侧栏</div>
</div>

一样的配方,一样的味道。不用我说了,你都快要抢答了。没错弹性布局也能实现中间栏内容优先加载。

css部分

  1. 对整个页面的元素进行一个基本的样式重置,将内外边距设置为0。

    css 复制代码
    * {
        margin: 0;
        padding: 0;
    }
  2. 设置基础宽度、高度和背景颜色。

    css 复制代码
    .page {
        height: 200px;
    }
    .main {
        background-color: pink;
    }
    .left,.right {
        width: 200px;
        background-color: blue;
    
    }
  3. 使用弹性布局,让子元素在一行上排列。

    css 复制代码
    .page {
        height: 200px;
        display: flex;
    }
  1. 通过对中间栏添加flex:1;样式,让中间栏自适应得扩大到占据完所有的空隙。

    css 复制代码
    .main {
        background-color: pink;
        flex: 1;
    }
  1. 但是这样还没有实现左中右的布局呀,别急。灵魂浇给来了,那就是弹性布局中的order属性。

    order 属性用于设置弹性子元素的排列顺序。它可以是一个整数,也可以是负数,默认值为 0。

    当 order 属性的值为正数时,值越小,排列顺序越靠前。当 order 属性的值为负数时,值越大,排列顺序越靠前。

    我们给左侧栏设置order:0;,给中间栏设置order:1;,给右侧栏设置order:2;。这样排列顺序就是左中右了(并不影响加载顺序,因为加载顺序由html里的代码块顺序决定)。

    css 复制代码
    .main {
        background-color: pink;
        flex: 1;
        order: 1;
    }
    .left {
        order: 0;
    }
    .right {
        order: 2;
    }

特点

雅,太雅了,感觉世界少了一些勾心斗角。

  1. 实现了三栏布局的页面样式。
  2. 实现了中间栏优先加载。

表格布局

html部分

html 复制代码
<div class="page">
    <div class="left">左侧栏</div>
    <div class="main">中间栏</div>
    <div class="right">右侧栏</div>
</div>

终于把小老弟给盼来了,它不能实现中间栏的布局了。

css部分

  1. 老样子,对整个页面的元素进行一个基本的样式重置,将内外边距设置为0;设置基础宽度、高度和背景颜色。

    css 复制代码
    * {
        margin: 0;
        padding: 0;
    }
    .page {
        width: 100vw;
        height: 200px;
    }
    .left,
    .right {
        height: 200px;
        width: 200px;
        background-color: blue;
    }
    .main {
        width: 100%;
        height: 200px;
        background-color: pink;
    }
  1. 通过添加display: table;样式让元素以表格的特性来呈现;添加display: table-cell;样式让元素在同一行内排列;添加table-layout: fixed;样式让列宽由元素自身的宽度决定。

    css 复制代码
    .page {
        width: 100vw;
        height: 200px;
        display: table;
        table-layout: fixed;
    }
    
    .page>div {
        display: table-cell;
    }

特点

可以方便地实现列的对齐和等宽等效果,但是不能实现中间栏优先加载。

网格布局

有来了一个方法,但是它很快。别眨眼。

html部分

html 复制代码
<div class="page">
    <div class="left">左侧栏</div>
    <div class="main">中间栏</div>
    <div class="right">右侧栏</div>
</div>

它不能实现中间栏优先加载。

css部分

css 复制代码
* {
    margin: 0;
    padding: 0;
}

.page {
    width: 100vw;
    height: 200px;
    display: grid;
    grid-template-columns: 200px auto 200px;
}

.left,
.right {
    height: 200px;
    background-color: blue;
}

.main {
    height: 200px;
    background-color: pink;
}

定义了一个网格布局:

  • display: grid; 表示将元素设置为网格布局模式。
  • grid-template-columns: 200px auto 200px; 定义了网格的列模板,即明确了有三列,第一列宽度为 200 像素,第二列宽度自动适应(根据内容宽度自动调整),第三列宽度又是 200 像素。

特点

方便地实现元素在网格内的对齐,包括水平和垂直方向。可以精确指定列和行的尺寸,可以是固定值、比例值或自动适应。

但是不能实现中间栏优先加载。

相关推荐
丑陋小蚊子7 小时前
邮件投简历,正文和附件各写什么?
面试·求职招聘·大学生·简历·简历下载
陈随易7 小时前
bm2,Node.js 与 Bun 项目部署新选择
前端·后端·程序员
架构技术专栏8 小时前
学习率:一次参数更新,到底应该改多少
面试
架构技术专栏8 小时前
AI Agent 框架怎么选:从一次制度查询拆出技术边界
后端·面试
福兮说8 小时前
canvas 旋转图片的六个坑:四角被裁、Math.ceil 多出 1px 黑边、JPG 角发黑、翻转方向反了
前端·javascript·图像处理·canvas
传人once10 小时前
多图片上传预览功能如何写
前端·css·html·jquery·html5
Eric.4610 小时前
Wan‑Animate+MiniMax-H3 本地部署 AI 漫剧流水线:8G 显存动作迁移与动态分镜工程实战
前端·人工智能·comfyui·ai漫剧
库拉镜像AI牛牛12 小时前
短剧内容自动化生产:知漫剧工作室落地教程
大数据·服务器·前端·人工智能·语音识别
律宏阔12 小时前
Flutter 列表图片内存优化:CachedNetworkImage 与 ClipRRect 的取舍
前端·flutter
行者全栈架构师12 小时前
【鸿蒙心迹】相册文搜图工程化落地:HarmonyOS 7.0 端侧 AI 检索全链路实战与 5 个踩坑解法
前端