三栏布局那些事儿

中间宽度自适应,两边宽度固定的三栏布局,是前端页面开发中极为常见网站布局方式。博主认为,一名合格的前端工程师总是会将之熟记于心。
以下是博主总结的五种三栏布局的常用方法,与大家分享。

正文


1、浮动布局

浮动布局是一种极易理解,也是初学者首先想到的布局方式。仅借用CSS的float属性即可轻松实现。
html代码

<div class="left">Left</div>
<div class="right">Right</div>
<div class="main">Main</div>
<!-- 注意其先后顺序,main必须在left和right后-->

CSS代码

.left{
            background-color: #ffd0d0;
            width: 160px;
            height: 400px;
            float: left;
        }
.right{
            background-color: #a9ffa9;
            width: 160px;
            height: 400px;
            float: right;
        }
.main{
            background-color: #ffffa9;
            height: 500px;
            width: auto;
        }

注意html代码中三栏的先后顺序
浮动布局的优点是简单,但也有不少缺点:

  1. 主要内容main在文档后侧,所以直到最后才能渲染主要内容。
  2. left和right其实是浮动到了main上面,也就是说,当主栏高度大于侧栏高度时(这种情况极为常见),main下面的部分内容会和页面同宽。不多说,下面一张图胜过千言万语。

2、绝对定位布局

仅两个侧栏使用绝对定位,脱离文档流,始终在页面的两边。然后,为了避免主栏和侧栏内容重叠,给主栏设置外边距,其数值等于侧栏宽度。
html代码

<div class="main">Main</div>
<div class="right">Right</div>
<div class="left">Left</div>

CSS代码

.main{
            background-color: #ffffa9;
            height: 500px;
            width: auto;
            margin: 0 160px;
           /* min-width: 200px;  */

        }
.left{
            background-color:#ffd0d0;
            width:160px;
            height: 400px;
            position: absolute;
            top: 0;
            left: 0;
        }
.right{
            background-color: #a9ffa9;
            width: 160px;
            height: 400px;
            position: absolute;
            top: 0;
            right: 0;
        }

用绝对定位布局思路简单清晰,但有一个明显的缺点,就是如果中间栏有最小宽度限制,当浏览器 缩小至一定程度时,会出现层叠现象。如下图

3、圣杯布局

最为经典的圣杯布局,其思路主要是借用浮动分别将左栏和右栏浮动至主栏的两边;然后用外层容器的内边距将主栏两边“推”向中间一定宽度,给左栏和右栏腾出空间;最后借助相对定位 将左栏和右栏定位至合适位置即可。
话不多说,先上代码:
html代码

<div class="container">
    <div class="main">Main</div>
    <div class="left">Left</div>
    <div class="right">Right</div>
</div>

CSS代码

.container{
        /*向中间“推”主栏,给两个侧栏 腾地儿*/
        padding: 0 160px;
}
 .main{
            background-color: #ffffa9;
            width: 100%;        /*主栏宽度设置为100%,自适应*/
            height: 500px;
            float: left;
        }
.left{
            background-color:#ffd0d0;
            width: 160px;
            height: 500px;
            position: relative;
            float: left;
            /*左侧外边距为-100%,也就是主栏的宽度,使.left上浮,且左移至main的左边*/
            margin-left:-100%;
            /*.left继续左移,直到屏幕的最左边,此时.left正好占据.container左边padding的160px*/
            left: -160px;
        }
.right{
            background-color: #a9ffa9;
            width: 160px;
            height: 400px;
            float: right;
            /*上移至容器最右边*/
            margin-right: -160px;
            position: relative;
        }

注意,main(也就是主栏)在最前面,两个侧栏尾随其后,当然左栏和右栏谁在前谁在后都是可以的。这样布局的好处是:主栏在文档的前面,所以重要的东西会优先渲染。

4、双飞翼布局

双飞翼布局是对圣杯布局的优化,以增加一个div为代价换取去掉了相对布局
“双飞翼”,顾名思义,是在main外围增加一个div(.main-outer),然后给.main-outer设置左右内边距(或者给main设置外边距,效果相同),像两个翅膀。两侧栏上浮后刚好位于.main-outer的内边距处,因此内边距的值需等于侧栏的宽度.
html代码

<div class="container">
    <div class="main-outer">
        <div class="main">Main</div>
    </div>
    <div class="left">Left</div>
    <div class="right">Right</div>
</div>

CSS代码

 .main-outer{
            box-sizing: border-box;
            padding: 0 160px;
            width: 100%;
            float: left;
        }
 .main{
            background-color: #ffffa9;
            height: 500px;
        }
 .left{
            background-color:#ffd0d0;
            width:160px;
            height: 400px;
            float: left;
            margin-left:-100%;
        }
.right{
            background-color: #a9ffa9;
            width: 160px;
            height: 400px;
            float: left;
            margin-left: -160px;
        }        

主栏内容同样在文档的开头部分,优先渲染。双飞翼布局不需使用相对定位,相对来说更易理解。

5、使用flex布局

是时候拿出终极武器了,flex布局。万能的flex啊,赐我以能量吧!

html代码

<div class="container">
    <div class="left">Left</div>
    <div class="main">Main</div>
    <div class="right">Right</div>
</div>

CSS代码

.container{
            display: flex;

            /*以下是默认属性,不写也行,为便于理解,博主在此将其罗列出来
            flex-flow: row nowrap;
            justify-content: flex-start;
            align-items: flex-start;   */
        }
.main{
            background-color: #ffffa9;
            height: 500px;
            width:100%;
        }
.left{
            background-color:#ffd0d0;
            width:160px;
            height: 400px;
        }
.right{
            background-color: #a9ffa9;
            width: 160px;
            height: 400px;
        }

上面代码有一个缺陷,就是在html代码中,left,main,right的相对位置不能改变,这就导致了main中的主要内容不能被优先渲染。那怎么办呢?(≧?≦)ゞ

万能的flex当然有办法咯!
给.mian.left.right三个类中添加如下代码:

.left{
    order: 1;
}
.main{
    order: 2;
}
.right{
    order: 3;
}

搞定!
***
以上五种方法各有优缺点,根据实际情况挑选适合项目的即可,大的项目的尽量使用main内容可优先渲染的。

时间: 2024-10-11 11:56:16

三栏布局那些事儿的相关文章

转载:CSS实现三栏布局的四种方法示例

转载网址:http://www.jb51.net/css/529846.html 前言 其实不管是三栏布局还是两栏布局都是我们在平时项目里经常使用的,也许你不知道什么事三栏布局什么是两栏布局但实际已经在用,或许你知道三栏布局的一种或两种方法,但实际操作中也只会依赖那某一种方法,本文具体的介绍了三栏布局的四种方法,并介绍了它的使用场景. 所谓三栏布局就是指页面分为左中右三部分然后对中间一部分做自适应的一种布局方式. 1.绝对定位法 HTML代码如下: <div class="left&quo

详解 CSS 七种三栏布局技巧

作者:林东洲 链接:https://zhuanlan.zhihu.com/p/25070186 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 三栏布局,顾名思义就是两边固定,中间自适应.三栏布局在开发十分常见,那么什么是三栏布局?比如我打开某东的首页: 映入眼帘的就是一个常见的三栏布局:即左边商品导航和右边导航固定宽度,中间的主要内容随浏览器宽度自适应. 下面围绕的这样的目的,即左右模块固定宽度,中间模块随浏览器变化自适应,想要完成的最终效果如下图所示: 红色

负边距、三栏布局(圣杯布局、双飞翼布局)

首先来了解下 一.负边距在让元素产生偏移时和position: relative有什么区别? position:relative产生偏移时,他原来的位置不会脱离文档流的,即还占用原来的空间,但负边距产生偏移时它原来的位置并不占用空间: 例如下面的代码 Document *{ margin: 0px; padding: 0px; } .up,.down,.middle{ background-color: red; height: 100px; width: 100px; } .negative-

记一道css面试题 : 三栏布局两边宽度固定,中间宽度自适应,并且布局随屏幕大小改变。

前几天面试时有道css题没做出来,回来好好学习一番后把其记录下来. 题目是这样的:左中右三栏布局,左右两栏宽度固定,左右两栏的宽度为200像素,中间栏宽度自适应.当屏幕小于600px时,3栏会分别占用一行.像这样 当屏幕大于600px时,是这样 我做出来用了css3的@media,如果不用这个,好吧,水平有限想不出来... 下面是代码: <!DOCTYPE> <html> <head> <style> body{ margin: 0 ; padding: 0

CSS总结(七)——常见的两栏、三栏布局

一.两栏布局 — 左栏固定宽度,右栏宽度自适应 1. 左浮动+margin <div class=“left”></div> <div class=“main”></div> css:  .left{width:200px;float:left;} .main{margin-left:200px;} ps:    IE6中可能出现双margin的bug,可以通过display:inline来解决 2.  绝对定位 + margin-left (兼容性好) &

转:CSS布局:Float布局过程与老生常谈的三栏布局

使用CSS布局网页,那是前端的基本功了,什么两栏布局,三栏布局,那也是前端面试的基本题了.一般来说,可以使用CSSposition属性进行布局,或者使用CSSfloat属性布局.前者适合布局首页,因为首页上的内容往往可以完全控制.后者适合布局模板,模板中填充的内容你没法控制——比如,在编辑wordpress模板时,你肯定没法考虑每篇博文的长度.这篇博文,就是总结一下怎样使用CSS中的float属性进行布局,其实网上有很多讨论这个话题的文章了,但我觉得都没说到点子上.那就来老生常谈一次吧,CSS之

css高度已知,左右定宽,中间自适应三栏布局

css高度已知,左右定宽,中间自适应三栏布局: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X

Css三栏布局自适应实现几种方法

Css三栏布局自适应实现几种方法 自适应实现方法我们可以从三个方法来做,一个是绝对定位 ,自身浮动法 和margin负值法了,下面我们一起来看看这三个例子吧,希望例子能帮助到各位同学. 绝对定位法三栏布局自适应: 代码如下 复制代码 <!doctype html> <html> <head> <meta charset="utf-8"> <title>绝对定位法</title> <style>  .pa

中间固定 两边平分的 自适应三栏布局

NEC 和网上有很多关于两栏三栏布局的案例,而关于三栏布局大体为: 两边固定大小 中间自适应: 无意中一个朋友问我: 中间固定 两边平分的 自适应三栏布局 怎么实?! 当时第一时间想到的是用 display: flex; 然而这个属性不是全兼容的,目前市场上一些国产机的浏览器 实现不了想要的结果: 回去细想后觉得用position是个方法——不管怎样这是在布局中被我用坏了的属性,总能帮我解决很多问题! 以下是贴出的代码: <style> *{ padding: 0; margin: 0; }