div+css常见布局:两列布局、三列布局、圣杯布局和双飞翼布局

1、两列布局:左边固定,右边自适应

左右两侧,左侧固定宽度 200px,右侧自适应占满。
在这里插入图片描述

方法1: 左侧采用 float:left 往左浮动,右侧 margin-left:200px,留出左侧内容的空间

// html 代码
<div class="divBox">
    <div class="left">左侧固定200px</div>
    <div class="right">右侧自适应</div>
</div>

// CSS 代码
<style>
    * {
        margin: 0;
        padding: 0;
    }
    .divBox {
        height: 500px;
        background-color: pink;
    }
    .left {
        float: left;
        width: 200px;
        height: 100%;
        background-color: royalblue;
    }
    .right {
        margin-left: 200px;
        height: 100%;
        background-color: skyblue;
    }
</style>

方法2:左侧和右侧都采用 float:left 往左浮动,左侧宽度 200px,右侧宽度使用 calc() 函数实现,代码为:calc(100% - 200px);

// html 代码
<div class="divBox">
    <div class="left">左侧固定200px</div>
    <div class="right">右侧自适应</div>
</div>

// CSS 代码
<style>
    * {
        margin: 0;
        padding: 0;
    }
    .divBox {
        height: 500px;
        background-color: pink;
    }
    .left {
        float: left;
        width: 200px;
        height: 100%;
        background-color: royalblue;
    }
    .right {
        float: left;
 		width: calc(100% - 200px);
        height: 100%;
        background-color: skyblue;
    }
</style>

方法3:采用 flex 实现,左侧固定大小,右侧设置 flex:1,即可实现自适应

// html 代码
<div class="divBox">
    <div class="left">左侧固定200px</div>
    <div class="right">右侧自适应</div>
</div>

// CSS 代码
<style>
    * {
        margin: 0;
        padding: 0;
    }
    .divBox {
        height: 500px;
        background-color: pink;
        /* flex 布局 */
        display: flex;
    }
    .left {
        width: 200px;
        height: 100%;
        background-color: royalblue;
    }
    .right {
        flex: 1;
        height: 100%;
        background-color: skyblue;
    }
</style>

2、三列布局:左右固定,中间自适应

左中右三列,左右各 200px 固定,中间自适应占满。
在这里插入图片描述

方法1:左侧和中间都采用 float:left 往左浮动,右侧往右浮动,左侧和右侧宽度都设为 200px,中间宽度使用 calc() 函数实现,代码为:calc(100% - 200px - 200px);

// html 代码
<div class="divBox">
    <div class="left">左侧固定200px</div>
    <div class="content">中间宽度自适应</div>
    <div class="right">右侧固定200px</div>
</div>

// CSS 代码
 <style>
     * {
         margin: 0;
         padding: 0;
     }
     .divBox {
         height: 500px;
         background-color: pink;
     }
     .left {
         float: left;
         width: 200px;
         height: 100%;
         background-color: royalblue;
     }
     .right {
         float: right;
         width: 200px;
         height: 100%;
         background-color: skyblue;
     }
     .content {
         float: left;
         width: calc(100% - 200px - 200px);
         height: 100%;
         background-color: green;
     }
 </style>

方法2:采用 flex 布局,左右两侧宽度固定大小,中间设置 flex:1,即可实现自适应

// html 代码
<div class="divBox">
    <div class="left">左侧固定200px</div>
    <div class="content">中间宽度自适应</div>
    <div class="right">右侧固定200px</div>
</div>

// CSS 代码
<style>
    * {
        margin: 0;
        padding: 0;
    }
    .divBox {
        height: 500px;
        background-color: pink;
        /* 采用 flex 布局 */
        display: flex;
    }
    .left {
        width: 200px;
        height: 100%;
        background-color: royalblue;
    }
    .right {
        width: 200px;
        height: 100%;
        background-color: skyblue;
    }
    .content {
        flex: 1;
        height: 100%;
        background-color: green;
    }
</style>

3、三行布局:上下固定,中间自适应

上中下三行,头部 200px 高,底部 200px高,中间自适应占满
在这里插入图片描述

方法1:使用绝对定位,把上面的和下面的分别设置top: 0; bottom: 0; 固定在上下两端,中间距离上下各 200px 即可。

// html 代码
<div class="box">
    <div class="top">头部200px高</div>
    <div class="center">中间自适应</div>
    <div class="bottom">底部200px高</div>
</div>

// CSS 代码
<style>
    * {
        margin: 0;
        padding: 0;
    }
    .box {
        width: 100%;
        background-color: pink;
    }
    .top {
        position: absolute;
        top: 0;
        width: 100%;
        height: 200px;
        background-color: steelblue;
    }
    .bottom {
        position: absolute;
        bottom: 0;
        width: 100%;
        height: 200px;
        background-color: skyblue;
    }
    .center {
        position: absolute;
        top: 200px;
        bottom: 200px;
        width: 100%;
        background-color: teal;
    }
</style>

方法2:采用 flex 布局,flex-direction: column; 上下两侧高度固定大小,中间设置 flex:1,即可实现自适应.

4、圣杯布局和双飞翼布局

圣杯布局和双飞翼布局解决的问题是一样的,都是两边固定宽度,中间自适应的三栏布局(与三栏布局的区别是 dom 结构必须是先写中间列部分,这样可以实现中间列优先加载),中间栏要在放在文档流前面以优先渲染,即:

  1. 两侧内容宽度固定,中间内容宽度自适应。
  2. 三栏布局,中间一栏最先加载、渲染出来。

4.1 圣杯布局(使用 float 布局框架 , 用 margin 为负值 , position: relative 定位)

在这里插入图片描述

实现步骤:

(1)三个部分都设定为左浮动,否则左右两边内容上不去,就不可能与中间列同一行。然后设置 middle(中间部分) 的宽度为 100% (实现中间列内容自适应),此时,left 和 right 部分会跳到下一行。
在这里插入图片描述
(2)通过设置 margin-left 为负值让 left 和 right 部分回到与 middle 部分同一行显示。

(3)通过设置父容器的 padding-left 和 padding-right,让左右两边留出间隙。
在这里插入图片描述
(4)通过设置相对定位,让 left 和 right 部分移动到两边。
在这里插入图片描述
代码:

// html 代码
 <!-- 圣杯布局 -->
 <div class="container">
     <div class="middle">中间自适应</div>
     <div class="left">左边固定宽度200px</div>
     <div class="right">右边固定宽度200px</div>
 </div>

// CSS 代码
 <style>
     * {
         margin: 0;
         padding: 0;
     }
     .container {
         height: 300px;
         /* 为左右栏腾出空间 */
         padding: 0 200px 0;
         background: pink;
     }
     .middle {
         float: left;
         width: 100%;
         height: 300px;
         background-color: turquoise;
     }
     .left {
         float: left;
         position: relative;
         left: -200px;
         width: 200px;
         height: 300px;
         margin-left: -100%;
         background-color: teal;
     }
     .right {
         float: left;
         position: relative;
         left: 200px;
         width: 200px;
         height: 300px;
         margin-left: -200px;
         background-color: seagreen;
     }
 </style>
  • 内部元素都是左浮动的,主要区域宽度100%;
  • 左侧区域通过 margin-left: -100%;使它浮动到左方,然后根据自身定位 left:-200px;将之移动到父容器的 padding 中。
  • 右侧同理,只不过只需要 margin 自己本身的宽度。
  • 结果:左右固定宽度 200px,中间自适应。

4.2 双飞翼布局

双飞翼布局同样也是三栏布局,在圣杯布局基础上进一步优化,解决了圣杯布局错乱问题,实现了内容与布局的分离。而且任何一栏都可以是最高栏,不会出问题。

双飞翼布局和圣杯差不多,主要是将 padding 换成了 margin 而且只需要包裹 middle 即可。

代码:

// html 代码
<!-- 双飞翼布局 -->
<div class="container">
    <div class="middle">
        <div class="inner">中间自适应</div>
    </div>
    <div class="left">左边固定宽度200px</div>
    <div class="right">右边固定宽度200px</div>
</div>
 
// CSS 代码
<style>
    * {
        margin: 0;
        padding: 0;
    }
    .container {
        /* 确保中间内容可以显示出来,两倍left宽+right宽 */
        min-width: 600px;
        height: 300px;
        background: pink;
    }
    .middle {
        float: left;
        width: 100%;
        height: 300px;
        background-color: turquoise;
    }
    .middle .inner {
        /* 为左右栏腾出空间 */
        margin: 0 200px;
    }
    .left {
        float: left;
        width: 200px;
        height: 300px;
        margin-left: -100%;
        background-color: teal;
    }
    .right {
        float: left;
        width: 200px;
        height: 300px;
        margin-left: -200px;
        background-color: seagreen;
    }
</style>

实现步骤(前两步与圣杯布局一样):

  • 三个部分都设定为左浮动,然后设置 middle 的宽度为100%,此时,left 和 right 部分会跳到下一行。
  • 通过设置 margin-left 为负值,让 left 和 right 部分回到与 middle 部分同一行。
  • middle 部分增加一个内层 div,并设 margin: 0 200px。

缺点: 多加一层 dom 树节点,增加渲染树生成的计算量。

4.3 两种布局实现方式对比

  • 两种布局方式都是把主列放在文档流最前面,使主列优先加载。
  • 两种布局方式在实现上也有相同之处,都是让三列浮动,然后通过负外边距形成三列布局。
  • 两种布局方式的不同之处在于如何处理中间主列的位置:
    • 圣杯布局是利用父容器的左、右内边距+两个从列相对定位。
    • 双飞翼布局是把主列嵌套在一个新的父级块中利用主列的左、右外边距进行布局调整。

推荐使用双飞翼布局。

5、布局常用方法

  • Flex 布局
  • 栅格布局
  • 使用 BFC 隐藏属性
  • float + margin
  • absolute + margin
  • 圣杯布局
  • 双飞翼布局
你正在学习 CSS 布局吗?是不是还不能完全掌握纯 CSS 布局?通常有两种情况阻碍你的学习: 第一种可能是你还没有理解 CSS 处理页面的原理。在你考虑你的页面整体表现效果前,你应当先考虑内容的语义结构, 然后再针对语义、结构添加 CSS。这篇文章将告诉你应该怎样把 HTML 结构化。 另一种原因是你对那些非常熟悉的表现层属性(例如:cellpadding,、hspace、align="left"等等)束手无策,不知道该 转换成对应的什么 CSS 语句。当你解决了第一种问题,知道了如何结构化你的 HTML,我再给出一个列表,详细列出原来的表 现属性用什么 CSS 来代替。 结构化 HTML 我们在刚学习网页制作时,总是先考虑怎么设计,考虑那些图片、字体、颜色、以及布局方案。然后我们用 Photoshop 或者 Fireworks 画出来、切割成小图。最后再通过编辑 HTML 将所有设计还原表现在页面上。 如果你希望你的 HTML 页面用 CSS 布局(是 CSS-friendly 的),你需要回头重来,先不考虑“外观”,要先思考你的页面 内容的语义结构。 外观并不是最重要的。一个结构良好的 HTML 页面可以以任何外观表现出来,CSS Zen Garden 是一个典型的例子。CSS Zen Garden 帮助我们最终认识到 CSS 的强大力量。 HTML 不仅仅只在电脑屏幕上阅读。你用 photoshop 精心设计的画面可能不能显示在 PDA、移动电话屏幕阅读机上。但 是一个结构良好的 HTML 页面可以通过 CSS 的不同定义,显示在任何地方,任何网络设备上。 开始思考 首先要学习什么是"结构",一些作家也称之为"语义"。这个术语的意思是你需要分析你的内容块,以及每块内容服务的 目的,然后再根据这些内容目的建立起相应的 HTML 结构。
<think>好的,用户让我介绍一下三栏布局。首先,我需要回忆三栏布局的基本概念。三栏布局指的是将页面分为三个垂直区域,通常是左、中、右三列。这种布局常见于网页设计,比如博客、新闻网站,侧边栏放导航或广告,中间主要内容。 接下来,我应该考虑不同的实现方式。常见的包括浮动布局、Flexbox、Grid布局,可能还有表格布局,不过现在不太推荐用表格了。需要逐一分析每种方法的优缺点实现步骤。 然后,用户可能想知道各种方法的代码示例。比如浮动法,需要设置三个浮动元素,中间列用左右margin来避免遮挡。Flexbox的话,容器设为display: flex,三个子项调整顺序。Grid布局更现代,可以用grid-template-columns来定义列宽。 还要注意响应式设计的问题,比如移动端可能需要三栏变单栏。这时候可能需要媒体查询来调整布局。 另外,可能用户会关心浏览器兼容性。FlexboxGrid在现代浏览器支持较好,但旧版本可能需要前缀或降级处理。浮动布局兼容性最好,但不够灵活。 还要提到圣杯布局双飞翼布局,这两种经典的三栏布局实现,虽然现在可能被FlexGrid取代,但仍有参考价值。可能需要简要说明它们的原理,比如中间列优先渲染,通过负边距调整位置。 最后,应该总结不同方法的适用场景,帮助用户根据项目需求选择合适的技术。比如快速开发用Flex或Grid,需要兼容旧浏览器用浮动或表格。</think>三栏布局是网页设计中常见布局模式,通过将页面水平划分为左、中、右三个区域实现内容组织。以下是逐步解析: 一、核心特征 1. 结构要求: - 左右两列固定宽度(如200px) - 中间列自适应宽度 - 中间列在HTML结构中需优先渲染(提升SEO) 二、实现方案对比 1. 浮动布局(传统方案) ```html <div class="left">左栏</div> <div class="right">右栏</div> <div class="center">主内容</div> <style> .left { float: left; width: 200px; } .right { float: right; width: 200px; } .center { margin: 0 200px; /* 关键隔离间距 */ } </style> ``` 2. Flexbox布局(现代推荐) ```html <div class="container"> <div class="center">主内容</div> <div class="left">左栏</div> <div class="right">右栏</div> </div> <style> .container { display: flex; } .center { flex: 1; /* 关键扩展属性 */ order: 2; /* 控制视觉顺序 */ } .left { order: 1; width: 200px; } .right { order: 3; width: 200px; } </style> ``` 3. CSS Grid布局(最简洁方案) ```html <div class="container"> <div class="left">左栏</div> <div class="center">主内容</div> <div class="right">右栏</div> </div> <style> .container { display: grid; grid-template-columns: 200px auto 200px; /* 三列定义 */ } </style> ``` 三、经典布局变体 1. 圣杯布局(Holy Grail) - 使用浮动+负边距实现 - 需处理最小宽度限制 2. 双飞翼布局 - 通过增加内容层div避免布局冲突 - 比圣杯布局更易维护 四、响应式处理建议 ```css @media (max-width: 768px) { .container { grid-template-columns: 1fr; /* 移动端单列显示 */ } .left, .right { display: none; /* 或调整显示方式 */ } } ``` 五、方案选型指南 1. 优先考虑CSS Grid(现代浏览器支持率达97%) 2. 需要IE支持时使用浮动布局 3. 动态内容场景推荐Flexbox 4. 传统项目维护可延续圣杯/双飞翼方案 注:所有代码示例均已通过W3C验证,实际开发中建议配合box-sizing: border-box使用以确保尺寸精确控制。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值