面试官:你知道几种三栏布局方法?

前言

三栏布局,见名知意,就是一种三列的布局方式。它的特点是让中间的主体内容布局先加载,左右两边的内容后加载,且左右固定宽度,中间自适应。这种布局方式十分常见,正如掘金的官网就是一个正儿八经的三栏布局,那么像这样的布局我们应该如何实现呢?这其中又有哪些是需要我们注意的呢?欢迎各位客官大老爷阅读本篇文章。

问题

三栏布局实现起来非常简单,就是一个page盒子里面放三个小盒子嘛,左边一个中间一个,右边一个。但是这不是我们想要的三栏布局。我们知道代码是一行一行往下执行的,所以这样的html排列方式会导致我们最左边的盒子优先被加载,这不是我们想要的效果,我们想要主体内容优先加载,两边的次要内容后加载。这样我们就需要将主体内容的html往前提,但是其布局的样式会被改变,有没有办法可以恢复其布局样式呢又能将主体内容的html往前提呢?有,我们可以通过以下几种CSS的方式改变其样式。

第一种 圣杯布局

使用浮动将盒子去到同一行,page 盒子使用 padding 左右两边盒子大小用于缩小控制中间主体内容范围,使用相对定位 left 100%和magin-left -自身盒子宽度控制左边的盒子位置,使用相对定位left -自身盒子宽度和magin-left -自身盒子宽度控制右边盒子位置。

xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .page{
            height: 200px;
            padding: 0 200px;
        }
    .left, .right{
        height: 200px;
        width: 200px;
        background-color: pink;
    }
    .item{
        float: left;
    }
    .content{
        height: 200px;
        width: 100%;
        background-color: aqua;
    }
    .left{
        margin-left: -200px;
        position: relative;
        left: -100%;
    }
    .right{
        margin-left: -200px;
        position: relative;
        right: -200px;
    }
    </style>
</head>
<body>
    <div class="page">
        <div class="item content">
            主体内容
        </div>
        <div class="item left">
            广告位
        </div>
        <div class="item right">
            广告位
        </div>
    </div>
</body>
</html>

第二种 双飞翼布局

在主体内容content再加一个盒子inner用于放主体内容,使用浮动将三个盒子去到同一行,给 inner 加 margin: 0 左右盒子宽度,使用magin-left -100% 控制左边盒子 使用magin-left -自身盒子宽度控制右边盒子

xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        *{
            margin: 0;
            padding: 0;
        }
        .page{
            height: 200px;
        }
    .left, .right{
        height: 200px;
        width: 200px;
        background-color: pink;
    }
    .item{
        float: left;
    }
    .content{
        height: 200px;
        width: 100%;
        background-color: aqua;
    }
    .inner{
        margin: 0 200px;
        height: 100%;
    }
    .left{
        margin-left: -100%;
    }
    .right{
        margin-left: -200px;
    }
    </style>
</head>
<body>
    <div class="page">
        <div class="item content">
            <div class="inner">主体内容</div>
        </div>
        <div class="item left">
            广告位
        </div>
        <div class="item right">
            广告位
        </div>
    </div>
</body>
</html>

第三种 弹性布局 + order

使用弹性布局将三块内容去到同一行,使用flex 1 给中间主体内容自动填充整个父盒子,两边盒子固定宽度,使用order设置弹性盒子的子元素排列顺序,但是并不是优先加载,加载还是要看html结构

xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .page {
            height: 200px;
            display: flex;
        }
        .left,
        .right {
            width: 200px;
            background-color: pink;
        }
        .content {
            flex: 1;
            background-color: aqua;
            /* order设置弹性盒子的子元素排列顺序,但是并不是优先加载,加载还是要看html结构*/
            order: 1;
        }
        .left {
            order: 0;
        }
        .right {
            order: 2;
        }
    </style>
</head>
<body>
    <div class="page">
        <div class="item content">
            主体内容
        </div>
        <div class="item left">
            广告位
        </div>
        <div class="item right">
            广告位
        </div>
    </div>
</body>
</html>

第四种 表格布局

使用display:table给page盒子设置成表格布局,并且需要设置宽度为屏幕宽度,使用table-layout: fixed设置里面的表格列宽由表格宽度和列宽度设定,给三个盒子添加display: table-cell 让标签元素以表格单元格的形式呈现

xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .page {
            height: 200px;
            width: 100vw;
            /* 表格布局 */
            display: table;
            /* 列宽由表格宽度和列宽度设定。 */
            table-layout: fixed;
        }
        .left,
        .right {
            height: 200px;
            width: 200px;
            background-color: pink;
        }
        .content {
            width: 100%;
            height: 200px;
            background-color: aqua;
        }
        .item {
            /* 让标签元素以表格单元格的形式呈现 */
            display: table-cell;
        }  
    </style>
</head>
<body>
    <div class="page">
        <div class="item left">
            广告位
        </div>
        <div class="item content">
            主体内容
        </div>
        <div class="item right">
            广告位
        </div>
    </div>
</body>
</html>

第五种 网格布局

使用display: grid 给page设置为网格布局,使用grid-template-columns: 200px auto 200px 制作三列网格容器

xml 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .page {
            height: 200px;
            /* 网格布局 */
            display: grid;
            /* 三列 */
            grid-template-columns: 200px auto 200px;
        }
        .left,
        .right {
            height: 200px;
            background-color: pink;
        }
        .content {
            height: 200px;
            background-color: aqua;
        }      
    </style>
</head>
<body>
    <div class="page">
        <div class="item left">
            广告位
        </div>
        <div class="item content">
            主体内容
        </div>
        <div class="item right">
            广告位
        </div>
    </div>
</body>
</html>

效果

总结

这五种布局方式都是巧妙的利用了CSS灵活的特性,实现了三栏布局。今天我们学习了三栏布局,分别是圣杯布局,双飞翼布局,弹性布局+order,表格布局,网格布局。每种布局都各有其特点,蘑菇头比较喜欢弹性布局+order的方式,你呢?

相关推荐
PAK向日葵2 小时前
【算法导论】PDD 0817笔试题题解
算法·面试
加班是不可能的,除非双倍日工资4 小时前
css预编译器实现星空背景图
前端·css·vue3
wyiyiyi5 小时前
【Web后端】Django、flask及其场景——以构建系统原型为例
前端·数据库·后端·python·django·flask
gnip5 小时前
vite和webpack打包结构控制
前端·javascript
excel5 小时前
在二维 Canvas 中模拟三角形绕 X、Y 轴旋转
前端
阿华的代码王国6 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端
一条上岸小咸鱼6 小时前
Kotlin 基本数据类型(三):Booleans、Characters
android·前端·kotlin
Jimmy6 小时前
AI 代理是什么,其有助于我们实现更智能编程
前端·后端·ai编程
ZXT6 小时前
promise & async await总结
前端
Jerry说前后端6 小时前
RecyclerView 性能优化:从原理到实践的深度优化方案
android·前端·性能优化