左中右 三栏式 布局

一、中间 自适应,左右两边 宽度固定

方法1:box容器 Flex布局,center设置为 flex:1

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        #box {
            width: 100%;
            height: 100px;
            display: flex;
            margin: 10px;
        }

        #left,
        #right {
            width: 200px;
            height: 100px;
            margin: 10px;
            background-color: #999;
        }

        #center {
            flex: 1;
            height: 100px;
            margin: 10px;
            /*左右margin不会叠加*/
            background-color: #f00;
        }
    </style>
</head>

<body>
    <div id="box">
        <div id="left">left</div>
        <div id="center">center</div>
        <div id="right">right</div>
    </div>
</body>

</html>

方法2:左、右两栏 分别 float:left、float:right。center左右margin,或者激活center的BFC

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        .left,
        .right {
            width: 200px;
            height: 200px;
            background-color: #999;
        }

        .left {
            float: left;
        }

        .right {
            float: right;
        }

        .center {
            /* 方式二、 */
            /* margin: 0 200px; */

            overflow: hidden;
            /* 方式一、激活center的BFC,使之无法被 两边的浮动元素 覆盖*/

            height: 300px;
            background-color: #f00;
        }
    </style>
</head>

<body>
    <!--该布局法的好处是受外界影响小,但是不足是 三个元素的顺序,center一定要放在最后,这是            	
        和绝对定位不一样的地方,center占据文档流位置,所以一定要放在最后,左右两个元素位置没有关系。
        当浏览器窗口很小的时候,右边元素会被挤到下一行。-->
    <div class="left">left</div>
    <div class="right">right</div>
    <div class="center">center</div>
</body>

</html>

方法3:左、右两栏 分别 绝对定位,center左右margin

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        /*左右固定,中间自适应  利用绝对定位*/
        .container {
            width: 100%;
            height: 100%;
            position: relative;
        }

        .left {
            position: absolute;
            left: 0;
            top: 0;
            width: 400px;
            height: 200px;
            background-color: black;
            color: #fff;
        }

        .center {
            margin: 0 400px;
            overflow: hidden;
            height: 400px;
            background-color: yellow;
        }

        .right {
            position: absolute;
            top: 0;
            right: 0;
            width: 400px;
            height: 300px;
            background-color: red;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="left">left</div>
        <div class="center">center</div>
        <div class="right">right</div>
    </div>
</body>
</html>

 方法4:三栏都 float: left;center的宽度 进行 calc()计算

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        .container {
            overflow: hidden;
        }

        .left,
        .right {
            float: left;
            width: 100px;
            background: red;
        }

        .center {
            float: left;
            width: calc(100% - 200px);
            background: yellow;
        }
    </style>
</head>

<body>
    <div class="container">
        <div class="left">left</div>
        <div class="center">center</div>
        <div class="right">right</div>
    </div>
</body>

</html>

 方法5:双飞翼布局(重点)优先显示 main主要部分 !

分析:

1.首先container只是一个三栏布局整体的包裹,不是布局重点。main占据整行,main的子元素main-wrap才是中间的内容区域。main-wrap设置 左、右margin的目的是为left、right两栏留空

2.三栏都 float: left;

3.中间栏width:100%;左栏margin-left: -100%; 右栏 (负 自身宽度) margin-left: -190px

(解释:由于main宽100%,此时left、right两栏都被挤到第二行。设置各自的 “负margin-left值”使它们分别移动到 第一行的左右两边)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        body {
            min-width: 550px;
        }

        .col {
            float: left;
        }

        #main {
            width: 100%;
            /* height: 200px; */
            background-color: #ccc;
        }

        #main-wrap {
            background-color: lightblue;
            margin: 0 190px;
            /*这是圣杯和双飞翼最明显的区别,在main内部使用的是margin,而圣杯是直接在container部分使用padding*/
        }

        #left,
        #right {
            width: 190px;
            height: 200px;
            background-color: #0000FF;
        }

        #left {
            margin-left: -100%;
        }

        #right {
            margin-left: -190px;
            background-color: #FF0000;
        }
    </style>
</head>

<body>
    <div id="container">
        <div id="main" class="col">
            <div id="main-wrap"> #main
                <br />ipsum dolor sit amet consectetur adipisicing elit. Rerum consequatur
                amet assumenda quasi, nulla unde laboriosam non id eum natus magni praesentium quibusdam ducimus sed!
                Fuga iusto veniam ipsam voluptatum?
            </div>
        </div>
        <div id="left" class="col">#left</div>
        <div id="right" class="col">#right</div>
    </div>
</body>

</html>

 

 


 方法6:圣杯布局(也是重点)优先显示 main主要部分 !

分析:

1.最外层wrapper设置padding-left、padding-right。目的是为left、right两栏留空。

2.三栏都 float: left;

3.main的width: 100%、 left栏margin-left: -100%、right栏margin-left: -100px(负 自身宽度)

(解释:由于main宽100%,此时left、right两栏都被挤到第二行。设置各自的 “负margin-left值”使它们分别移动到 第一行的左右两边)

4.left栏left: -100px;、right栏right: -100px;  两栏都 相对自身定位position: relative;

(解释:left、right两栏都 相对于自身, 分别 向左右两边 移动自身的宽度)

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style type="text/css">
        .wrapper {
            padding: 0 100px;
            overflow: hidden;
        }

        .col {
            float: left;
        }

        .main {
            width: 100%;
            height: 200px;
            background: yellow;
        }

        .left,
        .right {
            position: relative;
            width: 100px;
            height: 200px;
            background: red;
        }

        .left {
            margin-left: -100%;
            left: -100px;
        }

        .right {
            margin-left: -100px;
            right: -100px;
        }
    </style>
</head>

<body>
    <section class="wrapper">
        <section class="col main">main</section>
        <aside class="col left">left</aside>
        <aside class="col right">right</aside>
    </section>
</body>

</html>


总结

1. 为避免因窗口缩放,或窗口变窄而出现 布局错乱,可为三栏布局的外层包裹设置min-width。

2.双飞翼 与圣杯布局比较:

相同点:三栏都利用float,中间栏width100%,另外两栏利用“负margin-left”移动到上一行。

不同点:为left、right两栏留空的方式不同(不同的标签嵌套方式)!圣杯在最外层包裹上使用了padding,使得left、right两栏需要添加position:relative,相对自身向两边位移。

相较而言,双飞翼布局方式不需要 position,更直观一些。

详见:css三列布局--两边固定中间自适应和中间固定两边自适应_中间固定两边自适应布局_DOM曼珠沙华的博客-CSDN博客

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值