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

前言

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

问题

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

相关推荐
Dontla2 小时前
为什么React列表项需要key?(React key)(稳定的唯一标识key有助于React虚拟DOM优化重绘大型列表)
javascript·react.js·ecmascript
EndingCoder3 小时前
React从基础入门到高级实战:React 实战项目 - 项目三:实时聊天应用
前端·react.js·架构·前端框架
阿阳微客4 小时前
Steam 搬砖项目深度拆解:从抵触到真香的转型之路
前端·笔记·学习·游戏
德育处主任Pro5 小时前
『React』Fragment的用法及简写形式
前端·javascript·react.js
CodeBlossom5 小时前
javaweb -html -CSS
前端·javascript·html
CodeCraft Studio5 小时前
【案例分享】如何借助JS UI组件库DHTMLX Suite构建高效物联网IIoT平台
javascript·物联网·ui
打小就很皮...6 小时前
HBuilder 发行Android(apk包)全流程指南
前端·javascript·微信小程序
集成显卡6 小时前
PlayWright | 初识微软出品的 WEB 应用自动化测试框架
前端·chrome·测试工具·microsoft·自动化·edge浏览器
前端小趴菜057 小时前
React - 组件通信
前端·react.js·前端框架
Amy_cx8 小时前
在表单输入框按回车页面刷新的问题
前端·elementui