其他分享
首页 > 其他分享> > 三栏布局

三栏布局

作者:互联网

固比固(浮动布局)

知识点。保存。忘记来看

左 内容 右 两边固定,内容自适应

和元素位置有关系

​ 当DOM元素位置为

	<aside class="left">1</aside>
    <aside class="right">3</aside>
    <div class="contain">2</div>

原理: 内容在文档流, 左边栏左浮动, 右边栏右浮动

	由于浮动元素不会覆盖在另一个BFC(块级格式上下文,也就是块级盒子出现的区域)区域上。

样式分布为:

* {
 margin: 0;
 padding: 0;
}
.left {
 float: left;
 width: 30px;
 height: 100vh;
 background-color: aqua;
}
.right {
 float: right;
 width: 30px;
 height: 100vh;
 background-color: aqua;
}
.contain {
 background-color: blue;
 height: 100vh;
}

缺点 : 最后渲染文档流

优点: 兼容性比较好,但是 浮动布局具有局限性,浮动元素脱离文档流, 要做清楚浮动,这个处理不好的话,会带来很多问题(父元素塌陷等问题)

定位布局

dom结构

<div class="main">2</div>
<aside class="left">1</aside>
<aside class="right">3</aside>
*{
    margin: 0;
    padding: 0;
}
body {
    position: relative;
}
.left, .right {
    position: absolute;
}
.left {
    top: 0;
    left: 0;
    background: burlywood;
    height: 100vh;
    width: 200px;
}
.right {
    top: 0;
    right: 0;
    background: chartreuse;
    height: 100vh;
    width: 200px;
}
.main {
    padding: 0 200px;
    background-color: cornflowerblue;
    height: 100vh;
}

也涉及不到什么原理,就是 定位元素脱离文档流。 左边栏和右边栏固定宽度,中间元素用padding 隔开位置,防止绝对定位元素遮盖文档流。

圣杯布局

实现原理:

​ 这个需要首先渲染 中间内容元素。

<div class="main">2</div>
<aside class="left">1</aside>
<aside class="right">3</aside>

​ 实际上就是 中间内容宽度占盒子的100%,三个元素都浮动,下面两个元素就会在下一行排列。不占据BFC。 然后margin-left 让元素 遮盖中间内容。 然后相对定位。把中间露出来。

三个元素都浮动。 包裹三个元素的父元素设置padding(留白) 为一会儿露出遮盖的中间内容

​ 左边栏 margin-left: -100%

​ 右边栏 margin-left: -左边栏的宽

​ 相对定位 左边栏 left: -左边栏的宽度

​ 相对定位 右边栏 right: -左边栏的宽度

 * {
        margin: 0;
        padding: 0;
    }
    body {
        width: 400px;
        height: 400px;
        margin: auto;
        border: 5px solid red;
        padding: 100px;
    }
    .main, .left, .right {
        float: left;
    }
    .main {
        height: 100px;
        width: 100%;
        background-color: cornflowerblue;
    }
    .left {
        height: 100px;
        width: 20px;
        background: cyan;
        margin-left: -100%; 
        position: relative;
        left: -20px; 
    }
    .right {
        width: 20px;
        height: 100px;
        background: darkgoldenrod;
         margin-left: -20px;
        position: relative;
        right: -20px;
    }

最后注意清除浮动。

body:after {
        content: '';
        display: block;
        clear: both;
    }

缺点: 当main部分小于 left 的时候(宽度).布局会混乱

双飞翼布局

​ 双飞翼布局和圣杯差不多。双飞翼也是使用浮动 margin-left 使元素排列在一行,因为遮盖了中间内容。这个使用的方式是 为内容 嵌套一层元素。 使用margin 顶开距离。

<div class="main">
    <div class="item">内容</div>
</div>
<aside class="left">左边</aside>
<aside class="right">右边</aside>
* {
    margin: 0;
    padding: 0;
}
body {
    border: 5px solid red;
    width: 500px;
    height: 500px;
    margin: auto;
}
.main, .left, .right {
    float: left;
}
.main {
    
    background-color: aqua;
    width: 100%;
}
.main .item {
    margin: 0 200px 0 200px;
}
.left {
    width: 200px;
    background-color: blanchedalmond;
    margin-left: -100%;
}
.right {
    width: 200px;
    background-color: brown;
    margin-left: -200px;
}

还是注意清除浮动。

body:after {
    content: '';
    display: block;
    clear: both;
}

优点:先渲染内容, 当main 小于 left 的时候, 不会像圣杯布局那样混乱页面。

缺点: 多了一层dom节点。

flex 的三栏布局 (固比固)

可以这么设置

<style>
    body {
        display: flex;
    }
    .left, .right {
        width: 200px;
        background-color: brown;
        /* 不允许缩小 */
        flex-shrink: 0;
    }
    .main {
        flex: 1;
        background-color: chartreuse;
    }
</style>
<body>  
      
        <aside class="left">左</aside>
        <div class="main">中</div>
        <aside class="right">右</aside>
</body>

这样设置 先渲染的不是主要内容。

我们可以利用 order 属性,先渲染 主要内容。

<style>
    body {
        display: flex;
    }
    .left, .right {
        width: 200px;
        background-color: brown;
        /* 不允许缩小 */
        flex-shrink: 0;
    }
    .main {
        flex: 1;
        background-color: chartreuse;
        order: 1;
    }
    .left {
        order: 0;
    }
    .right {
        order: 2;
    }
</style>
<body>  
        <div class="main">中</div>
        <aside class="left">左</aside>
        <aside class="right">右</aside>
</body>

添加一个属性。 使其优先渲染 主要内容。

缺点: IE8 及以下浏览器不兼容

标签:right,三栏,color,布局,width,background,margin,left
来源: https://blog.csdn.net/qq_35898059/article/details/106607593