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

前言

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

问题

三栏布局实现起来非常简单,就是一个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的方式,你呢?

相关推荐
轻口味8 分钟前
命名空间与模块化概述
开发语言·前端·javascript
前端小小王43 分钟前
React Hooks
前端·javascript·react.js
迷途小码农零零发1 小时前
react中使用ResizeObserver来观察元素的size变化
前端·javascript·react.js
娃哈哈哈哈呀1 小时前
vue中的css深度选择器v-deep 配合!important
前端·css·vue.js
旭东怪2 小时前
EasyPoi 使用$fe:模板语法生成Word动态行
java·前端·word
ekskef_sef3 小时前
32岁前端干了8年,是继续做前端开发,还是转其它工作
前端
sunshine6414 小时前
【CSS】实现tag选中对钩样式
前端·css·css3
真滴book理喻4 小时前
Vue(四)
前端·javascript·vue.js
蜜獾云4 小时前
npm淘宝镜像
前端·npm·node.js