notes
  • Introduction
  • 语言
    • JS
      • JS原型到原型链
      • JS继承的实现
      • this对象
      • Promise基本概念
      • Promise实现
      • Promise实战
      • JS的EventLoop
      • JS容易出现误区的运算符
      • JS容易出现误区的操作符
      • JS深拷贝
      • JS节流与防抖
      • ES5实现原生/ES6方法
    • TS
      • 声明文件
      • 项目配置
    • CSS
      • CSS引入方式以及优先级计算
      • BFC神奇背后的原理-文摘
      • 回流reflow与重绘repaint
      • 三栏式布局
      • 垂直居中
      • 清除浮动的方法
      • 移动端适配方案
      • 纯CSS斜切角实现
      • CSS揭秘
      • 背景图片轮播
      • CSS绘制序列帧动画
      • transform实现一个多面体
    • HTML
  • ES6
  • Node.js
    • xxx
  • 前端框架
    • Vue.js
      • Vue双向数据绑定原理
      • Vue-Router原理及实现
    • React
    • AngularJS
  • 工程构建
    • Webpack
      • 01-webpack概述及背景
      • 03-webpack热更新原理
      • 04-splitChunks原理分析
      • 05-webpack工作流程
      • 07-webpack构建流程
      • 07-webpack构建流程
      • 10-webpack 如何进行性能分析
    • Gulp
    • Lint
      • ESLint
      • TSLint
    • Bable
  • 工程化
    • 模块化
    • 组件化
    • 规范化
      • 编码规范
    • 自动化
  • 运维
    • Nginx
    • GIT
    • CDN
    • VPS
    • DBA
  • 小程序
  • 跨端
  • 测试
  • 计算机技术
    • 计算机网络
      • 同源策略到前端跨域解决方案
      • TCP数据传输
      • TCP和UDP的区别
      • HTTP协议概述
      • HTTP缓存详解
      • HTTPS以及SSL建立过程
      • HTTPS的七个误解(译文)
      • cookie与Session机制区别以及Cookie SessionStorage LocalStorage异同
      • HTTP状态码Status
      • DNS原理入门
      • 网络攻击与防御
      • HTTP转发与重定向
      • 登录认证设计
    • 操作系统
      • shell脚本命令
    • Linux
      • Linux命令大全
      • vim命令
    • 浏览器
      • 浏览器内核、JS 引擎、页面呈现原理及其优化
      • 九种浏览器端缓存机制概览
      • 性能优化-网络请求方面
      • webkit解析CSS过程详解
  • 前端面试
    • 算法
Powered by GitBook
On this page
  • 1、flex布局
  • 2、绝对定位
  • 3、float浮动脱离文档流
  • 4、BFC+float不会与浮动区域重叠
  • 5、圣杯布局
  • 6、双飞翼布局
  • 7、table布局
  • 参考
  1. 语言
  2. CSS

三栏式布局

Previous回流reflow与重绘repaintNext垂直居中

Last updated 5 years ago

相关代码地址: 要求:左右两边固定宽度,中间居中,宽度自适应! 下面探讨一下有关三栏式布局的所有方法 给定一个, 要求在这个模板上尽可能用多种方法实现三栏式布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>flex</title>
    <style type="text/css">
        body, html {
            margin: 0;
            padding: 0;
        }

        .left, .right, .center {
            height: 200px;
        }
        .left{
            background: yellow;
        }
        .right{
            background: green;
        }
        .center{
            background: red;
        }
    </style>
</head>
<body>
<div class="layout">
    <div class="left"></div>
    <div class="center"></div>
    <div class="right"></div>
</div>
</body>
</html>

1、flex布局

这是CSS3主推的布局模式,目前也是用的最多的,简单来说就是顺着主轴依次放3列,内容在最前,通过order控制显示顺序,通过flex-grow让中间占据全部剩余空间,通过flex-basis设置左、右div的宽度。 个人也是优先推荐使用flex实现三栏式布局。 给父元素的display属性设置为flex布局,然后左右元素设定宽度,中间自适应原始宽度设置为100%,如果顺序不对,使用使用order属性重新排序。

.layout{
    display: flex;
}
.left{
    flex:0 1 120px;
    background: yellow;
}
.right{
    flex:0 1 120px;
    background: green;
}
.center{
    flex: 0 1 100%;
    background: red;
}

2、绝对定位

左右元素设置position设置为绝对定位,便脱离的文档流,然后中间元素的margin-left和margin-right设置为左右元素的宽度。 注意:right如果在文档流最后要设置top=0,一般选择将right文档流放在center元素之前。

.left{
    position: absolute;
    left:0;
    width: 120px;
    background: yellow;
}
.right{
    position: absolute;
    right:0;
    top:0;
    width: 120px;
    background: green;
}
.center{
    margin-left: 120px;
    margin-right: 120px;
    /*width:100%;*/
    background: red;
}

3、float浮动脱离文档流

其实和绝对定位的原理有点相似,都是是左右元素脱离文档流,不占据中间元素的文档流。 注意:将中间的内容放在HTML结构的最后,否则右侧会沉在中间内容的下侧

<div class="layout">
    <div class="left"></div>
    <div class="right"></div>
    <div class="center"></div>
</div>

.left {
    float: left;
    width: 120px;
    background: yellow;
}

.right {
    float: right;
    width: 120px;
    background: green;
}

.center {
    margin: 0 120px 0 120px;
    background: red;
}

4、BFC+float不会与浮动区域重叠

BFC布局有一个很重要的特点,BFC区域不会与float box重叠,BFC区域会保留float部分,利用这个特点,实现三栏式布局

.left {
    float: left;
    width: 120px;
    background: yellow;
    overflow: hidden;
}

.right {
    float: right;
    width: 120px;
    background: green;
}

.center {
    background: red;
    overflow: hidden;
}

5、圣杯布局

原理:将中间文档流放在前面,宽度设置为100%,然后将中间元素、左元素、右元素全部设置为float:left,然后给父元素左右margin设置为左右元素宽度,这样,结果就是中间元素占据一整行,左右元素另起一行向左浮动。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圣杯布局</title>
    <style type="text/css">
        body, html {
            margin: 0;
            padding: 0;
        }

        .left, .right, .center {
            height: 200px;
        }

        .layout {
            margin-left: 120px;
            margin-right: 120px;
        }

        .left {
            float: left;
            width: 120px;
            background: yellow;
        }

        .right {
            float: left;
            width: 120px;
            background: green;
        }

        .center {
            float: left;
            width: 100%;
            background: red;
        }
    </style>
</head>
<body>
<div class="layout">
    <div class="center">center</div>
    <div class="left">left</div>
    <div class="right">right</div>
</div>
</body>
</html>

效果如下:

接下来就是想办法把左右元素定位到相对应的位置,这里使用margin负值将元素左移,左边元素左移整个宽度,然后再相对定位到最左边。margin-left:-100%将左边元素移动到上面,再使用相对定位,将左边元素移动到父元素margin留出的位置。

.left {
    float: left;
    width: 120px;
    margin-left: -100%;
    position: relative;
    left: -120px;
    background: yellow;
}

效果如下:

然后再将右边元素向左移动120px,margin-left:-120px,再相对定位到最右边。

.right {
    float: left;
    width: 120px;
    margin-left: -120px;
    position: relative;
    right: -120px;
    background: green;
}

最终效果如下:

6、双飞翼布局

出自淘宝前端UED团队,它将内容比作鸟的身体,左右比作双翼,所以叫作双飞翼。 它与圣杯布局很像,也是全部往左浮动,但是在中间div里再嵌套一个div,设置子div的margin为左右div预留位置,左右div只设置margin负值即可实现。与圣杯布局相比,少了position:relative,多了一个div。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>圣杯布局</title>
    <style type="text/css">
        body, html {
            margin: 0;
            padding: 0;
        }

        .left, .right, .content {
            height: 200px;
        }
        .left{
            float: left;
            width: 120px;
            margin-left:-100%;
            background: yellow;
        }
        .right{
            float: left;
            width: 120px;
            margin-left:-120px;
            background: green;
        }
        .center{
            float: left;
            width:100%;

        }
        .content{
            margin:0 120px;
            background: red;
        }
    </style>
</head>
<body>
<div class="layout">
    <div class="center">
        <div class="content">content</div>
    </div>
    <div class="left">left</div>
    <div class="right">right</div>
</div>
</body>
</html>

7、table布局

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>flex</title>
    <style type="text/css">
        body, html {
            margin: 0;
            padding: 0;
        }

        .left, .right, .center {
            height: 200px;
            display: table-cell;
        }
        .layout{
            display: table;
            width: 100%;
        }
        .left{
            width:120px;
            background: yellow;
        }
        .right{
            width: 120px;
            background: green;
        }
        .center{
            background: red;
        }
    </style>
</head>
<body>
<div class="layout">
    <div class="left"></div>
    <div class="center"></div>
    <div class="right"></div>
</div>
</body>
</html>

缺点:无法设置格间距,并且左右元素display属性不能为none。

后面还有一种说法使用inline-block布局,尝试过之后发现其实并不好用。

参考

https://github.com/Xia-Ao/baidu-course/tree/master/xiaowei/layout
html模板
详解 CSS 七种三栏布局技巧
css 三栏布局 圣杯布局 双飞翼 flex
浮动元素margin负值的应用