圣杯布局与双飞翼布局
上一篇文章介绍了三种方法实现CSS三栏布局,本文则在此基础上,进一步介绍常用的圣杯布局与双飞翼布局。
一.圣杯布局
圣杯布局的要求:
1. header和footer占屏幕全部高度,高度固定
2. 中间的contaier部分是一个三栏布局
3. left和right宽度固定,middle自适应填满整个区域;高度为三栏中最大的高度;
实现的方法:
1.header和footer设width为100%
2.中间的三栏布局,可参考三种方法实现CSS三栏布局,这里采用margin负值法来实现
先直接实现下三栏布局:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>圣杯布局</title>
<style type="text/css">
body {
margin: 0;
padding: 0;
}
header,
footer {
height: 100px;
width: 100%;
background-color: #BBBBBB;
}
.container {
height: 300px;
}
.container div {
float: left;
}
.left {
width: 200px;
height: 300px;
background-color: #DC698A;
margin-left:-100%;
}
.middle {
width: 100%;
height: 300px;
background-color: #3EACDD;
}
.right {
width: 300px;
height: 300px;
background-color: #8CB08B;
margin-left:-300px;
}
</style>
</head>
<body>
<header>头部</header>
<div class="container">
<div class="middle">中间栏</div>
<div class="left">左栏</div>
<div class="right">右栏</div>
</div>
<footer>底部</footer>
</body>
</html>
实现效果如下:
看上去好像已经达到圣杯布局的要求了,但是可以看到中间栏蓝色块并没有显示出“中间栏”,感觉应该是被左栏覆盖了。为了验证,这里将左右两栏设置透明度,中间栏多增加些内容,可以看到:
可以看出中间栏确实被左右两栏各覆盖了一部分内容。
要想左右两栏不遮盖中间栏,就需要中间栏给左右两栏腾些位置处理,可以想到用padding属性或者margin属性来腾位置。圣杯布局是用padding属性来腾位置,而双飞翼布局则是用margin属性,同时要修改下html的布局结构。
圣杯布局的实现,需要给左栏、中间栏、右边栏加上padding属性,腾些位置:
(1)第一步,给container设置padding-left和padding-right属性,值分别为左栏、右栏的宽度:
.container {
...
padding-left: 200px;
padding-right: 300px;
}
效果如下:
(2)第二步,将左右两栏设置为相对定位,同时左栏的left值设为-左栏宽度,右栏的right设为-右栏宽度。
.container div{
...
position: relative;
}
.left{
...
left:-200px;
}
.right{
...
right:-300px;
}
这里附上完整的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>圣杯布局</title>
<style type="text/css">
body {
margin: 0;
padding: 0;
}
header,
footer {
height: 100px;
width: 100%;
background-color: #bbbbbb;
}
.container {
height: 300px;
padding-left: 200px;
padding-right: 300px;
}
.container div{
float: left;
/* 圣杯布局 */
position:relative;
}
.left {
width: 200px;
height: 300px;
background-color: #DC698A;
margin-left: -100%;
/* 圣杯布局 */
left:-200px;
}
.middle {
width: 100%;
height: 300px;
background-color: #3EACDD;
}
.right {
width: 300px;
height: 300px;
background-color: #8CB08B;
margin-left: -300px;
/* 圣杯布局 */
right:-300px;
}
</style>
</head>
<body>
<header>头部</header>
<div class="container">
<div class="middle">中间栏</div>
<div class="left">左栏</div>
<div class="right">右栏</div>
</div>
<footer>底部</footer>
</body>
</html>
实现的效果如下:
二.双飞翼布局
前面介绍过,双飞翼布局和圣杯布局的区别,就在于如何处理中间栏被遮挡的问题。双飞翼布局要稍微修改下html。
具体实现:
在中间栏中在放一个div来显示内容,并设置其margin。margin-left为左边栏的宽度,margin-right为右边栏的宽度
/* 双飞翼布局 */
.main{
margin-left:200px;
margin-right:300px;
}
之所以要修改html的布局,在中间栏中又增加的div,是因为原来中间栏的div设置了width:100%,如果再设置margin的话,就会超过窗口的宽度。因此,这里增加了个div,将要显示的内容放到这个div里面,给这个div来设置margin。
这里附上完整的代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>双飞翼布局</title>
<style type="text/css">
body {
margin: 0;
padding: 0;
}
header,
footer {
height: 100px;
width: 100%;
background-color: #bbbbbb;
}
.container {
height: 300px;
}
.container div {
float: left;
}
.left {
width: 200px;
height: 300px;
background-color: #DC698A;
margin-left: -100%;
}
.middle {
width: 100%;
height: 300px;
background-color: #3EACDD;
}
.right {
width: 300px;
height: 300px;
background-color: #8CB08B;
margin-left: -300px;
}
/* 双飞翼布局 */
.main{
margin-left:200px;
margin-right:300px;
}
</style>
</head>
<body>
<header>头部</header>
<div class="container">
<div class="middle">
<div class="main">中间栏</div>
</div>
<div class="left">左栏</div>
<div class="right">右边栏</div>
</div>
<footer>footer</footer>
</body>
</html>
实现的效果如下:
三.小结
本文主要介绍了如何一步步地实现圣杯布局和双飞翼布局。圣杯布局相较于双飞翼布局,样式设置稍有些复杂。双飞翼布局样式设置比较简单,但需要修改html布局结构。建议在阅读本文前,可以先阅读下三种方法实现CSS三栏布局,便于加深理解。如有问题,欢迎指正。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- echarts常用功能封装|抽象为mixin
- TCB系列学习文章——云开发的云托管(八)
- TCB系列学习文章——云开发登录篇(九)
- 字符串操作的全面总结
- C 语言 C++ 中 assert 的用法
- kubernetes之StatefulSet控制器
- 如何使用 S3CMD 访问 COS 服务
- 利用STS临时密钥服务快速搭建直传页面的实践
- codeforces 1436C(二分+数学)
- WAF案例:为什么curl可以wget不行?
- React进阶(4)-拆分Redux-将store,Reducer,action,actionTypes独立管理
- React进阶(5)-分离容器组件,UI组件(无状态组件)
- React进阶(6)-react-redux的使用
- Kubernetes 1.19.0——服务svc(2)
- Android菜单的定义及ActionBar的实现