圣杯布局和双飞翼布局

圣杯布局和双飞翼布局都是为了实现一个三列布局,其中左侧和右侧的部分宽度固定,中间部分宽度随浏览器宽度的变化而自适应变化。自然而然地会想到position:relative,float和flex。

  1. 这里用的是float
    (1)写出html代码,设置基本css属性
<div class="middle">
	Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab veritatis quis repellendus, veniam error unde a. Consequuntur possimus quia, maxime consequatur iure, ea quisquam saepe, vel esse voluptatibus nobis provident.
</div>
<div class="left">
	Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rem nesciunt quam aut illo labore eligendi, ea dolorum laborum asperiores doloribus, omnis quos accusantium assumenda fuga alias perspiciatis atque incidunt? Libero!	
</div>
<div class="right">
	Lorem ipsum dolor sit amet, consectetur adipisicing elit. Culpa aliquam, illum nulla labore nihil! Sequi distinctio fugit facilis, officiis suscipit, omnis natus itaque quaerat repellendus maxime porro nobis? Facere, officia.
</div>
.left, .right, .middle {
	float: left;
	height: 400px;
}
.middle {
	background: yellow;
}
.left {
	width: 250px;
	background: red;
}
.right {
	width: 200px;
	background: blue;
}

则显示效果如下图
显示效果1
(2)那现在需要做的就是将红色的left和蓝色的right分别移到黄色middle的左边和右边。这里使用负margin来实现。
负margin在MDN中的解释:

The margin-left CSS property sets the margin area on the left of an element. A positive value places it farther from its neighbors, while a negative value places it closer.

也就是说,负margin会使得自身的块和隔壁的块离得更近。如果设置left块的margin-left为负,则它会离前面的middle块更近。近到一定程度会移到上一行,设置为-100%则left块会到middle块的最左边。right块同理。(注意,这样情况发生的前提是两者都形成BFC)

添加代码如下

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

显示效果2
(3)我们会发现已经定位已经基本写好了,只是middle块的文字被两边挡住了。有两种解决方法:设置两边为margin(双飞翼)和设置中间middle块的padding(圣杯)。
双飞翼布局:加一个container,设置container的padding。但这会造成三列布局的整个外层都被加上了padding,可以通过position: relative移动left和right。
圣杯布局:可以选择直接给middle块加padding,但这样会影响它本身的格式,所以在middle里再加一个小的div,设置它的padding。
最终实现效果:
在这里插入图片描述
以上,就是双飞翼和圣杯布局的写法。
第一步,float,设置基本属性。
第二步,用负margin将left和middle移到middle两边。
第三步,处理被挡住的middle文字。

附:
双飞翼布局完整代码:

<div class="container">
	<div class="middle">
		Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab veritatis quis repellendus, veniam error unde a. Consequuntur possimus quia, maxime consequatur iure, ea quisquam saepe, vel esse voluptatibus nobis provident.
	</div>
	<div class="left">
		Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rem nesciunt quam aut illo labore eligendi, ea dolorum laborum asperiores doloribus, omnis quos accusantium assumenda fuga alias perspiciatis atque incidunt? Libero!	
	</div>
	<div class="right">
		Lorem ipsum dolor sit amet, consectetur adipisicing elit. Culpa aliquam, illum nulla labore nihil! Sequi distinctio fugit facilis, officiis suscipit, omnis natus itaque quaerat repellendus maxime porro nobis? Facere, officia.
	</div>
</div>
.container {
	padding: 0 200px 0 250px;
	height: 400px;
}
.left, .right, .middle {
	float: left;
	height: 400px;
}
.middle {
	background: yellow;
}
.left {
	position: relative;
	left: -250px;
	margin-left: -100%;
	width: 250px;
	background: red;
}
.right {
	position: relative;
	right: -200px;
	margin-left: -200px;
	width: 200px;
	background: blue;
}

圣杯布局完整代码:

<div class="middle">
	<div class="main">
	Lorem ipsum dolor sit amet, consectetur adipisicing elit. Ab veritatis quis repellendus, veniam error unde a. Consequuntur possimus quia, maxime consequatur iure, ea quisquam saepe, vel esse voluptatibus nobis provident.
	</div>
</div>
<div class="left">
	Lorem ipsum dolor sit amet, consectetur adipisicing elit. Rem nesciunt quam aut illo labore eligendi, ea dolorum laborum asperiores doloribus, omnis quos accusantium assumenda fuga alias perspiciatis atque incidunt? Libero!	
</div>
<div class="right">
	Lorem ipsum dolor sit amet, consectetur adipisicing elit. Culpa aliquam, illum nulla labore nihil! Sequi distinctio fugit facilis, officiis suscipit, omnis natus itaque quaerat repellendus maxime porro nobis? Facere, officia.
</div>
.left, .right, .middle {
	float: left;
	height: 400px;
}
.left {
	margin-left: -100%;
	width: 250px;
	background: red;
}
.right {
	margin-left: -200px;
	width: 200px;
	background: blue;
}
.middle {
	background: yellow;
}
.main {
	margin: 0 200px 0 250px;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值