CSS 圣杯布局的多种实现方式,以及各种方法的优缺点总结。

关于圣杯布局的提问?

实现下图布局,Header 和 Footer 固定高度 100px,Left 和 Right 固定宽度 200px,Middle 部分的宽度自适应。

圣杯布局的实现?

1. flex

[代码实现]

重点在与 main 中设置 display 为 flex,left 、right 定宽设置为 200px,middle 设置 flex: 1 即可

    <header>Header</header>
	<main>
		<div class="left">Left</div>
		<div class="middle">Middle</div>
		<div class="right">Right</div>
	</main>
    <footer>Footer</footer>
header, footer {
    width: 100%;
	height: 100px;
	background: rgb(251, 84, 48);
}
main {
	display: flex;
	background-color: rgb(109, 110, 106);
}
.left {
	width: 200px;
	height: 400px;
	background-color: rgb(253, 214, 99);
}
.middle {
	flex: 1;
	height: 400px;
	background-color: rgb(78, 187, 252);
}
.right {
	width: 200px;
	height: 400px;
	background-color: rgb(30, 215, 209);
}

[优缺点]

使用 flex 写圣杯布局特别简单,而且缩放到最小也不会变形。

但是 flex 会有有浏览器兼容性问题,可以在网站  https://caniuse.com/?search=flex  查看支持,可以看到,其实大部分浏览器都支持了 flex,重点还是在 IE 上。

2. float 布局一

[代码实现]

left、right 使用 float 向左右浮动,脱离文档流。middle 通过 margin-left 和 margin-right 使得内容不被 left 、right 遮挡。

    <header>Header</header>
	<main>
		<div class="left">Left</div>
		<div class="right">Right</div>
		<div class="middle">Middle</div>
	</main>
    <footer>Footer</footer>
html, body {
    margin: 0;
	padding: 0;
	color: #FFF;
	text-align: center;
}
header, footer {
	width: 100%;
	height: 100px;
	background: rgb(251, 84, 48);
}
.left {
	float: left;
	width: 200px;
	height: 400px;
	background-color: rgb(253, 214, 99);
}
.middle {
	margin: 0 200px;
	height: 400px;
	background-color: rgb(78, 187, 252);
}
.right {
	float: right;
	width: 200px;
	height: 400px;
	background-color: rgb(30, 215, 209);
}

[优缺点]

middle 在 html 结构中放在最后,这样有什么影响呢?

1. 不利于SEO优化,搜索引擎抓取html 的顺序是从上到下,有的搜索引擎对抓取的长度有限制,所以最好把重要的内容放前面;

2. 读屏软件按照标签顺序进行读屏

3. 样式按顺序加载,样式加载慢的情况下当然是先加载主要内容的样式更好

3. float 布局二

为了解决上面的问题,以同样的思路进行思考,可以将 middle 放到最上面,这时候 left right 脱离文档流排在 middle 下方,此时我们再利用 position: relative; top: -高度; 将 left right 上移。

[代码实现]

    <header>Header</header>
	<main>
		<div class="middle">Middle</div>
		<div class="left">Left</div>
		<div class="right">Right</div>
	</main>
    <footer>Footer</footer>
html, body {
    margin: 0;
	padding: 0;
	color: #FFF;
	text-align: center;
}
header, footer {
	width: 100%;
	height: 100px;
	background: rgb(251, 84, 48);
}
.left, .right {
	position: relative;
	top: -400px;
}
.left {
	float: left;
	width: 200px;
	height: 400px;
	background-color: rgb(253, 214, 99);
}
.middle {
	margin: 0 200px;
	height: 400px;
	background-color: rgb(78, 187, 252);
}
.right {
	float: right;
	width: 200px;
	height: 400px;
	background-color: rgb(30, 215, 209);
}

!根据 float 两种实现方式,可以再进行各种拓展,实现方式多种多样,思路是一致的。

4. 绝对定位

[代码实现]

    <header>Header</header>
	<main>
		<div class="middle">Middle</div>
		<div class="left">Left</div>
		<div class="right">Right</div>
	</main>
    <footer>Footer</footer>
        html, body {
			margin: 0;
			padding: 0;
			color: #FFF;
			text-align: center;
		}
		header, footer {
			width: 100%;
			height: 100px;
			background: rgb(251, 84, 48);
		}
		main {
			position: relative;
		}
		.left, .right {
			position: absolute;
			top: 0;
		}
		.left {
			left: 0;
			width: 200px;
			height: 400px;
			background-color: rgb(253, 214, 99);
		}
		.middle {
			margin: 0 200px;
			height: 400px;
			background-color: rgb(78, 187, 252);
		}
		.right {
			right: 0;
			width: 200px;
			height: 400px;
			background-color: rgb(30, 215, 209);
		}

5. 利用 calc 计算属性

left、middle、right均浮动,中间宽度设置为 100% - 两边宽度和,非常清晰易懂,父容器main清除浮动。

[代码实现]

    <header>Header</header>
	<main>
		<div class="left">Left</div>
		<div class="middle">Middle</div>
		<div class="right">Right</div>
	</main>
	<footer>Footer</footer>
        html, body {
			margin: 0;
			padding: 0;
			color: #FFF;
			text-align: center;
		}
		header, footer {
			width: 100%;
			height: 100px;
			background: rgb(251, 84, 48);
		}
		main {
			overflow: hidden;
		}
		.left, .right, .middle {
			float: left;
		}
		.left {
			width: 200px;
			height: 400px;
			background-color: rgb(253, 214, 99);
		}
		.middle {
			width: calc(100% - 400px);
			height: 400px;
			background-color: rgb(78, 187, 252);
		}
		.right {
			width: 200px;
			height: 400px;
			background-color: rgb(30, 215, 209);
		}

注意:calc 计算属性计算符号两边需要有空格,同 flex 布局一样,也存在兼容性问题,可以在上面提到的网站查看

6. Table 布局

main 设置 display: table; width: 100%; 子元素按顺序排列,设置display:table-cell 就好了

[代码实现]

    <header>Header</header>
	<main>
		<div class="left">Left</div>
		<div class="middle">Middle</div>
		<div class="right">Right</div>
	</main>
	<footer>Footer</footer>
        html, body {
			margin: 0;
			padding: 0;
			color: #FFF;
			text-align: center;
		}
		header, footer {
			width: 100%;
			height: 100px;
			background: rgb(251, 84, 48);
		}
		main {
			display: table;
			width: 100%;
		}
		.left, .right, .middle {
			display: table-cell;
		}
		.left {
			width: 200px;
			height: 400px;
			background-color: rgb(253, 214, 99);
		}
		.middle {
			height: 400px;
			background-color: rgb(78, 187, 252);
		}
		.right {
			width: 200px;
			height: 400px;
			background-color: rgb(30, 215, 209);
		}

交流前端问题可 + vx : zoe1997233    欢迎大家指出问题~

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值