一、水平垂直居中
(1) 行内/行内块级/图片
原理:
text-align: center;控制行内内容相对于块父元素水平居中,然后就是line-height和vertical-align的基友关系使其垂直居中,font-size: 0;是为了消除近似居中的bug
.box {
width: 400px;
height: 400px;
margin: 100px auto;
border: 1px solid #ccc;
line-height: 400px;
text-align: center;
font-size: 0;
}
img {
width: 200px;
vertical-align: middle;
}
(2) 定位
方式一:子绝父相
.parent {
position: relative;
}
.son {
position: absolute;
left: 50%;
top: 50%;
transform: translate(-50%,-50%);
}
方式二:绝对定位
.parent {
position: relative;
}
.son {
position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;
margin: auto;
}
(3) flex
.parent {
display: flex;
}
.son {
margin: auto;
}
/* 或 */
.parent {
display: flex;
justify-content: center;
align-items: center;
}
/* 或 */
.parent {
display: flex;
justify-content: center;
}
.son {
align-self: center;
}
二、两列布局
2.1 左定宽、右自适应
效果图
(1)float方式
<body>
<div id="left">左列定宽</div>
<div id="right">右列自适应</div>
</body>
#left {
width: 100px;
height: 500px;
background-color: #f00;
float: left;
}
#right {
height: 500px;
background-color: #0f0;
/*大于等于#left的宽度*/
margin-left: 100px;
}
清除浮动代码
.clearfix:after {
content: "";
display: block;
height: 0;
clear: both;
visibility: hidden;
}
.clearfix {
/* IE6、7 专有 */
*zoom: 1;
}
(2)table方式
<body>
<div id="parent">
<div id="left">左列定宽</div>
<div id="right">右列自适应</div>
</div>
</body>
#parent {
width: 100%;
display: table;
height: 500px;
}
#left {
width: 100px;
background-color: #f00;
}
#right {
background-color: #0f0;
}
#left,
#right {
/*利用单元格自动分配宽度*/
display: table-cell;
}
(3)定位方式
#parent{
position: relative; /*子绝父相*/
}
#left {
position: absolute;
top: 0;
left: 0;
background-color: #f00;
width: 100px;
height: 500px;
}
#right {
position: absolute;
top: 0;
left: 100px; /*值大于等于#left的宽度*/
right: 0;
background-color: #0f0;
height: 500px;
}
(4)flex方式
#parent{
width: 100%;
height: 500px;
display: flex;
}
#left {
width: 100px;
background-color: #f00;
}
#right {
flex: 1; /*均分了父元素剩余空间*/
background-color: #0f0;
}
(5)grid方式
#parent {
width: 100%;
height: 500px;
display: grid;
grid-template-columns: 100px auto; /*设定2列就ok了,auto换成1fr也行*/
}
#left {
background-color: #f00;
}
#right {
background-color: #0f0;
}
2.2 左适应、右定宽
效果图
(1)float方式
<div id="parent">
<div id="left">左列自适应</div>
<div id="right">右列定宽</div>
</div>
#parent {
/*抵消#left的margin-left以达到#parent水平居中*/
padding-left: 100px;
}
#left {
height: 500px;
background-color: #f00;
width: 100%;
float: left;
margin-left: -100px;
}
#right {
width: 100px;
height: 500px;
background-color: #0f0;
float: right;
}
table、子绝父相、flex、grid等方式同理实现
2.3 一列不定、一列自适应
效果图
(1)float方式
<div id="parent">
<div id="left">左列自dsadsadadas适应</div>
<div id="right">自适应</div>
</div>
#left {
/*只设置浮动,不设宽度*/
height: 500px;
background-color: #f00;
float: left;
}
#right {
height: 500px;
background-color: #0f0;
/*触发bfc*/
overflow: hidden;
}
(2)flex方式
#parent{
display: flex;
}
#left { /*不设宽度*/
margin-right: 10px;
height: 500px;
background-color: #f00;
}
#right {
height: 500px;
background-color: #0f0;
flex: 1; /*均分#parent剩余的部分*/
}
(3)grid方式
<div id="parent">
<div id="left">左列自dsadsadadas适应</div>
<div id="right">自适应</div>
</div>
#parent{
display: grid;
grid-template-columns: auto 1fr; /*auto和1fr换一下顺序就是左列自适应,右列不定宽了*/
}
#left {
margin-right: 10px;
height: 500px;
background-color: #f00;
}
#right {
height: 500px;
background-color: #0f0;
}
三、三列布局
效果图
双飞翼&圣杯布局 实现原理:
- 同:两种布局都将将盒子设置为右浮动,同时在HTML中盒子加载的顺序都是中左右,给定中间容器100%的宽度让其可以随着页面宽度的变化而变化。然后再用左边距将左右容器覆盖在中间容器上。
- 异:当将三个容器拉到同一行时,圣杯布局是调整左右容器的位置,用相对定位的方式将左右容器移出中间容器,同时再给最外层容器一个内边距,防止覆盖中间容器。双飞翼布局是给中间容器再套一层内层容器,将内容在内层容器中显示,而不是在中间容器中。再给内层一个内边距,使内容不会被左右容器遮挡。
圣杯布局
实现思路:
- 结构 头、主体、底部;主体中间自适应宽度百分百,padding设置预留出左右盒子的位置。
- 3个盒子都浮动,左右盒子分别定宽度
- 左盒子通过margin-left:-100%,position: relative left: -200px达到指定位置,右盒子同理
<div class="wrap">
<div id="header">header</div>
<div id="content">
<div id="middle">
<p>middle</p>
<p>middle</p>
<p>middle</p>
</div>
<div id="left">left</div>
<div id="right">right</div>
</div>
<div id="footer">footer</div>
</div>
.wrap {
min-width: 600px;
}
#header,
#footer {
height: 50px;
width: 100%;
background: grey;
}
#left,
#right,
#middle {
float: left;
height: 200px;
}
#middle {
width: 100%;
background: greenyellow;
}
#left {
width: 200px;
background-color: red;
margin-left: -100%;
position: relative;
left: -200px;
}
#right {
width: 150px;
background-color: plum;
margin-left: -150px;
position: relative;
right: -150px;
}
#content {
/* 清除浮动 */
overflow: hidden;
padding: 0 150px 0 200px;
}
双飞翼布局
实现思路:
- 结构 头、主体、底部;主体中间自适应宽度百分百,3个盒子都浮动,左右盒子分别定宽度。
- 通过margin-left:-100% 完成在一行上,通过多套的盒子设置padding来达到指定位置
<div class="wrap">
<div id="header">header</div>
<div id="content">
<div id="middle">
<!-- 双飞翼多套一层 -->
<div class="middle-inner">
<p>middle</p>
<p>middle</p>
<p>middle</p>
</div>
</div>
<div id="left">left</div>
<div id="right">right</div>
</div>
<div id="footer">footer</div>
</div>
.wrap {
min-width: 600px;
}
#header,
#footer {
height: 50px;
width: 100%;
background: grey;
}
#left,
#right,
#middle {
float: left;
height: 200px;
}
#middle {
width: 100%;
background: greenyellow;
}
#left {
width: 200px;
background-color: red;
margin-left: -100%;
}
#right {
width: 150px;
background-color: plum;
margin-left: -150px;
}
/* 处理方式不同 */
.middle-inner {
padding: 0 150px 0 200px;
}
#content {
/* 清除浮动 */
overflow: hidden;
}
小结:
圣杯布局和双飞翼布局实现的效果都是相同的,只是在左右容器覆盖在中间容器中时,处理的容器不同而已。圣杯布局在处理左右容器,用相对定位时要注意左右平移的方向是相反的。双飞翼布局处理中间容器时要注意内层容器的内边距。
flex实现
<div class="wrap">
<div id="header">header</div>
<div id="content">
<div id="left">left</div>
<div id="middle">
<p>middle</p>
<p>middle</p>
<p>middle</p>
</div>
<div id="right">right</div>
</div>
<div id="footer">footer</div>
</div>
.wrap {
min-width: 600px;
}
#header,
#footer {
height: 50px;
width: 100%;
background: grey;
}
#content {
display: flex;
height: 600px;
}
#middle {
flex: 1;
background-color: #eeff2b;
}
#left {
width: 200px;
background-color: red;
}
#right {
width: 200px;
background-color: #0f0;
}
grid实现
(1)结构配合行列划分
<div class="wrap">
<div id="header">header</div>
<div id="content">
<div id="left">left</div>
<div id="middle">
<p>middle</p>
<p>middle</p>
<p>middle</p>
</div>
<div id="right">right</div>
</div>
<div id="footer">footer</div>
</div>
.wrap {
min-width: 600px;
height: 600px;
display: grid;
grid-template-rows: 40px auto 30px;
}
#header,
#footer {
background-color: #ccc;
}
#content {
display: grid;
height: 100%;
grid-template-columns: 200px auto 150px;
}
#left {
background-color: red;
}
#middle {
background-color: #eeff2b;
}
#right {
background-color: #0f0;
}
(2)grid-area命名方式
<div class="wrap">
<div id="header">header</div>
<div id="left">left</div>
<div id="middle">
<p>middle</p>
<p>middle</p>
<p>middle</p>
</div>
<div id="right">right</div>
<div id="footer">footer</div>
</div>
.wrap {
min-width: 600px;
height: 600px;
display: grid;
grid-template-rows: 40px auto 30px;
grid-template-columns: 200px auto 150px;
grid-template-areas:
"header header header"
"sideLeft sideMiddle sideRight"
"footer footer footer"
;
}
#header {
grid-area: header;
background-color: #ccc;
}
#footer {
grid-area: footer;
background-color: #ccc;
}
#left {
grid-area: sideLeft;
background-color: red;
}
#middle {
grid-area: sideMiddle;
background-color: #eeff2b;
}
#right {
grid-area: sideRight;
background-color: #0f0;
}
四、多列布局
4.1 等宽布局
效果图
(1) float实现
<div id="parent">
<div class="column">1 <p>我是文字我是文字我输文字我是文字我是文字</p>
</div>
<div class="column">2 <p>我是文字我是文字我输文字我是文字我是文字</p>
</div>
<div class="column">3 <p>我是文字我是文字我输文字我是文字我是文字</p>
</div>
<div class="column">4 <p>我是文字我是文字我输文字我是文字我是文字</p>
</div>
<div class="column">5 <p>我是文字我是文字我输文字我是文字我是文字</p>
</div>
<div class="column">6 <p>我是文字我是文字我输文字我是文字我是文字</p>
</div>
</div>
.column {
float: left;
width: 15%;
height: 400px;
margin-right: 20px;
}
.column:nth-child(odd) {
background-color: #f00;
}
.column:nth-child(even) {
background-color: #0f0;
}
.column:last-child {
margin-right: 0;
}
#parent {
width: 1000px;
border: 1px solid #ccc;
overflow: hidden;
}
(2) flex实现
#parent {
width: 1000px;
height: 500px;
display: flex;
justify-content: space-between;
}
.column {
width: 15%;
}
.column:nth-child(odd) {
background-color: #f00;
}
.column:nth-child(even) {
background-color: #0f0;
}
(2) grid实现
#parent {
width: 1000px;
height: 500px;
display: grid;
grid-template-columns: repeat(6, 1fr);
/*6就是列数*/
grid-column-gap: 10px;
}
.column:nth-child(odd) {
background-color: #f00;
}
.column:nth-child(even) {
background-color: #0f0;
}
4.2 九宫格布局
效果图
(1) flex实现
<div id="parent">
<div class="row">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
<div class="row">
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
</div>
<div class="row">
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
</div>
#parent {
width: 1200px;
height: 500px;
margin: 0 auto;
display: flex;
flex-direction: column;
}
.row {
display: flex;
flex: 1;
}
.item {
flex: 1;
border: 1px solid #000;
}
(2) grid实现
<div id="parent">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
<div class="item">4</div>
<div class="item">5</div>
<div class="item">6</div>
<div class="item">7</div>
<div class="item">8</div>
<div class="item">9</div>
</div>
#parent {
width: 1200px;
height: 500px;
display: grid;
grid-template-columns: repeat(3, 1fr);
grid-template-rows: repeat(3 1fr);
grid-gap: 10px;
}
.item {
border: 1px solid #ccc;
}
五、全屏布局
效果图
5.1flex方式
<div id="parent">
<div id="top">top</div>
<div id="middle">
<div id="left">left</div>
<div id="right">right</div>
</div>
<div id="bottom">bottom</div>
</div>
* {
margin: 0;
padding: 0;
}
html,
body,
#parent {
height: 100%;
}
#parent {
display: flex;
flex-direction: column;
}
#top {
height: 100px;
background-color: #ccc;
}
#bottom {
height: 50px;
background-color: #ccc;
}
#middle {
flex: 1;
display: flex;
}
#left {
width: 200px;
background-color: red;
}
#right {
flex: 1;
overflow: auto;
background-color: yellowgreen;
}
5.2 grid方式
<div id="parent">
<div id="top">top</div>
<div id="left">left</div>
<div id="right">right</div>
<div id="bottom">bottom</div>
</div>
* {
margin: 0;
padding: 0;
}
html,
body,
#parent {
width: 100%;
height: 100%;
}
#parent {
display: grid;
grid-template-columns: 200px 1fr;
grid-template-rows: 100px auto 50px;
/*方式一定义网格区域分布*/
/* grid-template-areas:
"header header"
"aside main"
"footer footer"; */
}
#top {
grid-area: header;
/*指定在哪个网格区域*/
}
#left {
grid-area: aside;
/*指定在哪个网格区域*/
}
#right {
grid-area: main;
/*指定在哪个网格区域*/
}
#bottom {
grid-area: footer;
/*指定在哪个网格区域*/
}
/* 方式二: 划区域线 */
#top,
#bottom {
grid-column: 1/3;
}