【CSS】圣杯布局和双飞翼布局(包括完整代码)

14 篇文章 0 订阅
11 篇文章 0 订阅

1. 前言

  圣杯布局和双飞翼布局是各类网站经常使用的布局,本文将通过两种布局的 示例图布局过程、以及 完整代码 进行讲解,如果你想进行练习,可以到我的 github地址 上获取已去除了关键代码的版本,只留下最初始的元素和颜色样式,供你对自己进行强化的练习;同时,你也可以在这里获取到 完整代码

2. 圣杯布局

2.1 示例图

  • 拥有 headerfooter,中间是主内容行
  • leftright 分别固定了宽度,center 会随着整体布局宽度的变化而进行伸缩
    在这里插入图片描述

常见的类似圣杯布局如 CSDN 文章页:
在这里插入图片描述


2.2 设计过程

  • 以下讲解中,会分别使用如 centerleftright 等叫法来描述某一个色块
  • 此讲解需要了解 margin 为负值 时会产生的效果,如果不了解的话请务必先看这篇文章 margin为负值会发生什么?
  • 可以结合如下 2.3 完整代码 进行理解,里面的 注释序号对应该设计过程的序号

1)初始样式
在这里插入图片描述

2)把中间部分留出左右元素的宽度
在这里插入图片描述

3)margin-right 能让 right 元素被其自身右方的空白元素覆盖上去,相当于自身宽度被消除,从而能浮动到 center 上去
在这里插入图片描述

4)left 向左移动 center 的宽度,来移动到 center 所在的行
在这里插入图片描述

问:为何设置 margin-left: 100% 就能让 left 顶到 center 的最左边?

答:由于 center 内边距的存在,现在 left 的真实位置可以理解为如下图,因此向左偏移 center 的宽度,就让能 left 到达 center 的最左边
在这里插入图片描述

5)left 再向左移动自身宽度,露出被覆盖的 center
在这里插入图片描述

问:为何需要设置 position: relative

答:因为 relative 设置,并且设置了 right: 200px 后,元素只会 自身进行移动,不会影响到其他元素。

2.3 完整代码

<!DOCTYPE html>
<html>
	<head>
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<meta http-equiv="X-UA-Compatible" content="ie=edge">
		<title>圣杯布局</title>
		<style type="text/css">
			body {
				min-width: 550px;
			}

			#header {
				background-color: #999999;
			}
			
			#middle{
				/* 2.把中间部分留出左右元素的宽度 */
				padding-left: 200px;
				padding-right: 150px;
			}
			
			#middle .column{
				float: left;
				height: 200px;
			}
			
			#left{
				width: 200px;
				background-color: #FFFF00;
				/* 4. 向左移动center的宽度 */
				margin-left: -100%;
				/* 5. 再向左移动自身宽度,露出被覆盖的center块 */
				position: relative;
				right: 200px;
			}
			
			#center{
				width: 100%;
				background-color: pink;
			}
			
			#right{
				/* 3.margin-right让右方元素覆盖自身,达到消除自身宽度的目的,浮动到center上面去 */
				margin-right: -150px;
				width: 150px;
				background-color: #CCCCCC;
			}
			
			#footer {
				background-color: #999999;
			}
			
			.clearfix:after{
				display: table;
				content: '';
				clear: both;
			}
		</style>
	</head>
	<body>
		<div id="header">header</div>
		<div id="middle" class="clearfix">
			<div id="center" class="column">
				center
			</div>
			<div id="left" class="column">
				left
			</div>
			<div id="right" class="column">
				right
			</div>
		</div>
		<div id="footer">footer</div>
	</body>
</html>


3. 双飞翼布局

3.1 示例图

  • leftright 固定宽度
  • 中间 main 会随着整体布局宽度的变化而伸缩
    在这里插入图片描述

3.2 设计过程

1)整体设置浮动
在这里插入图片描述

2)将 main 左右内边距留出 left 和right 的宽度
在这里插入图片描述

3)left 向左偏移 main 的宽度
在这里插入图片描述

4)right 向左偏移自身宽度
在这里插入图片描述

3.3 完整代码

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>双飞翼布局</title>
    <style type="text/css">
        body {
            min-width: 550px;
        }
        .col {
			/* 1.设置浮动 */
			float: left;
        }

        #main {
            width: 100%;
            height: 200px;
            background-color: #FFC0CB;
        }
        #main-wrap {
			/* 2.将 main 左右内边距留出 left 和 right 的宽度 */
			margin: 0 200px 0 150px;
        }

        #left {
            width: 150px;
            height: 200px;
            background-color: #FFFF00;
			/* 3.left 向左偏移 main 的宽度 */
			margin-left: -100%;
        }
        #right {
            width: 200px;
            height: 200px;
            background-color: #cccccc;
			/* 4.right 向左偏移自身宽度 */
			margin-left: -200px;
        }
    </style>
</head>
<body>
    <div id="main" class="col">
        <div id="main-wrap">
            main
        </div>
    </div>
    <div id="left" class="col">
        left
    </div>
    <div id="right" class="col">
        right
    </div>
</body>
</html>

4. 技术点总结

双飞翼圣杯
主内容两边的边距用 margin-left 和 margin-right用 padding-left 和 padding-right
左右元素的偏移均使用 margin-left
左:向左偏移main的宽度;
右:向左偏移自身宽度
左:使用 margin-left(向左偏移main的宽度)
右:margin-right(取消自身宽度)
  • 6
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值