内部,而现在刚好反过来了,从语义化来说,子级元素设置成display:table不友好,可以将子级元素中的display:table设置成display:block,而div默认属性是block,这样语义化更好。当然无论改与不该,效果都是水平垂直居中
设置tabl-cell的元素,宽度和高度的值设置百分比无效,需要给它的父元素设置display: table;
才生效
table-cell不感知margin,在父元素上设置table-row等属性,也会使其不感知height
设置float或position会对默认布局造成破坏,可以考虑为之增加一个父div定义float等属性;内容溢出时会自动撑开父元素
原理
button内的文字等内容,默认是自动水平居中的,只需要将其子元素转化为行内元素或者行内块级元素,即可实现水平垂直居中布局
<button class="parent">
<div class="child"></div>
</button>
.parent{
height:200px;
width: 200px;
background: aqua;
outline: none;
border: none;
}
.child{
height:50px;
width: 50px;
background: #e60023;
display: inline-block; /*button自带text-align: center,改为行内水平居中生效*/
/* button有默认padding值,不影响水平垂直居中布局,不想要,清除其默认样式即可 */
}
优点和缺点
优点:简单方便,充分利用button默认内容水平居中
缺点:只适用于行内内容;需要清除button标签部分默认样式;水平垂直居中兼容性很好,但是ie下点击会有凹陷效果
<div class="parent">
<div class="child"></div>
</div>
.parent{
width: 400px;
height: 400px;
background: #c12023;
position: relative; /*父相 */
/* 在父级元素中开启定位,设置成relative absolute fixed任意一个值都是可以的,只要开启定位就行,只有position的默认值static是不开启定位的
相对对位是不脱离文档流的,而绝对定位和固定定位是脱离文档流的
如果在父级元素中不开启定位,则是相对于整个页面进行定位
如果在父级元素中开启定位,则是相对于父级元素定位
*/
}
.child{
width: 100px;
height: 100px;
background:skyblue;
position: absolute; /* 子绝 */
top: 50%;
left: 50%;
transform:translate(-50%,-50%);
/* 之所以回退-50%,是因为子元素的左上角顶点是相对于上一级居中定位的,子元素的左上角顶点居中,整个元素并不是居中的,所以要回退自身高度的-50% * /
}
优点和缺点
优点:不管是块级还是行内元素都可以实现
优点:CSS3新属性对老版本浏览器兼容性不好
5. 定位与margin无限延伸实现平分
原理
当top、bottom为0时,margin-top&bottom设置auto的话会无限延伸占满空间并且平分,实现水平居中
当left、right为0时,margin-left&right设置auto的话会无限延伸占满空间并且平分,实现垂直居中
谁设置相对定位,其子元素就相对谁定位
<div class="parent">
<div class="child">
</div>
</div>
.parent{
height:200px;
width: 200px;
background: aqua;
position: relative;
/* 父元素设置相对定位,那子元素就相对于父元素定位 */
}
.child{
height:50px;
width: 50px;
background: #e60023;
top: 0;
bottom: 0;
left: 0;
right: 0;
margin: auto;
position: absolute;
}
优点和缺点
优点:无需关注宽高;兼容性较好(ie8+)
缺点:脱离文档流
6. flex同时横轴和纵轴
<div class="parent">
<div class="child"></div>
</div>
/* height:200px;
width: 200px;
background: aqua;
display: flex;
justify-content: center; */
/* 横轴 让其子元素水平居中 */
/* align-items: center; */
/* 纵轴 让其子元素垂直居中 */
/* .child{
height:50px;
width: 50px;
background: #e60023;
} */
/* 或 */
.parent{
height:200px;
width: 200px;
background: aqua;
display: flex;
}
.child{
height:50px;
width: 50px;
background: #e60023;
margin: auto;
}
/* 或 */
/* .parent{
display: flex;
justify-content: center;
}
.child{
align-self: center;
} */
原理
两列布局
由于屏幕的的大小,自适应的那一列宽度可能是不确定的
左列定宽,右列自适应
1. float配合margin
要点
定宽列设置宽度并float,自适应列margin
<div class="left">左列定宽</div>
<div class="right">右列自适应</div>
.left{
/* 左列定宽 */
width: 300px;
height: 300px;
background: aqua;
/* 设置浮动后,当前元素脱离文档流 */
float: left;
}
.right{
height: 300px;
background-color: #c60023;
/* margin-left让被左列覆盖的宽度,吐出来 */
margin-left: 300px;
/*大于等于.left的宽度即可*/
}
原理
float浮动,让元素脱离文档流,margin-left让被左列覆盖的宽度,吐出来
优点和缺点
优点:实现方式简单
缺点:
-
当右列的自适应区域中含有子级元素的时候,当前布局样式,已经乱套了,子级元素浮动的问题
-
自适应元素的margin-left属性值,需要和定宽元素的width属性值保持一致
-
定宽元素浮动与自适应元素不浮动导致浏览器兼容性不好
-
margin-left的值,和左列的width值高度关联
改良版
当右列的自适应区域中含有子级元素的时候,当前布局样式,已经乱套了
<div class="left">左列定宽</div>
<!-- 为自适应元素定义父级元素 -->
<div class="right-box">
<div class="right">
<div class="inner"></div>
</div>
</div>
.left,.right{
height: 300px;
}
.left {
width: 400px;
background-color: #c9394a;
/* 当前元素脱离文档流 */
float: left;
/* 定位的层级高于浮动,这样左列就可以显示出来了 */
/* position: relative; */
}
/* 自适应,右列的父级元素和左列的是兄弟元素,都是浮动的 */
.right-box {
float: right;
/* 设置为浮动后,导致默认宽度为0,需要重新设置宽度 */
/* 100%表示为父级元素宽度100%,而当前div元素的父级为body,即现这right-box的宽度为页面的100% */
width: 100%;
/* 此时宽度为100%,自己就被挤到下一行了 */
margin-left: -400px;
/* 此时margin-left为-400px,即向左移动,,就会上到第一行,覆盖原来第一行的左列*/
background-color: blue;
}
.right{
/* div默认的宽度为父级元素的100% */
background-color: #cccccc;
margin-left: 400px;
}
.inner{
background-color: green;
height:300px;
clear: both;
}
改良版只解决了浮动与浮动的问题,和子级元素清除浮动的问题。
margin-left: -400px的值与左列的宽度之间高度耦合关联的关系,暂未改良
2. float配合overflow属性
要点
定宽列设置宽度并float,自适应列overflow:hidden
<div class="left">左列定宽</div>
<div class="right">右列自适应</div>
.left {
width: 40px;
background-color: #c60023;
float: left;
}
.right{
background-color: #cccccc;
overflow: hidden;
/*
* overflow除了又溢出时隐藏的作用,
还可开启CSS 的BFC模式 - 当前元素的内部画家与外界完全隔离 实现自适应
*/
}
原理
overflow除了又溢出时隐藏的作用,
还可开启CSS 的BFC模式 - 当前元素的内部画家与外界完全隔离 实现自适应
优点和缺点
优点:简单易用,不用管高度,BFC模式自适应
缺点:
- overflow属性不仅解决了两列布局问题,同时设置了内容溢出的情况
- 浮动脱离文档流,需要手动清除浮动,否则会产生高度塌陷;
- 不支持ie6
3. table单元格自动分配宽度
要点
父元素设置display:table,定宽列设置宽度,自适应列设置table-cell
原理
table单元格没有设置宽度width值的话,自动分配达到自适应效果,也就是50%和50%等分,左列定宽后,就把剩下的所有宽度分配给自适应的元素,最终实现两列布局的效果
<div class="parent">
<div class="left"></div>
<div class="right"></div>
</div>
.parent{
/*c父级元素设置100%c*/
width: 100%;
display: table;
/* 防止撑破 */
table-layout: fixed;
}
.left,.right{
height: 300px;
display: table-cell;
}
.left{
/* 定宽 */
width: 400px;
background-color: #c60233;
}
.right{
background-color: skyblue;
}
优点和缺点
优点:浏览器兼容性好,给定左列宽度,无需管高度,自动分配
缺点:将所有元素的display属性设置为table相关值,收到响应制约,单元格的宽度是自动的,表格默认双边框
4. 绝对定位
要点
子绝父相,定宽列设置宽度,自适应列top和right为0,left为定宽列宽度
<div class="parent">
<div class="left">左列定宽</div>
<div class="right">右列自适应</div>
</div>
.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;
}
5. flex均分剩余空间
要点
父元素设置display:flex,定宽列子元素设置宽度,自适应列设置flex值均分剩余空间
<div class="parent">
<div class="left">左列定宽</div>
<div class="right">右列自适应</div>
</div>
.parent{
width: 100%;
height: 500px;
display: flex;
}
.left {
width: 100px;
background-color: #f00;
}
.right {
flex: 1; /*均分了父元素剩余空间*/
background-color: #0f0;
}
6. grid实现
要点
父元素设置grid grid-template-columns: 100px auto;定宽列定宽,自适应列auto
<div class="parent">
<div class="left">左列定宽</div>
<div class="right">右列自适应</div>
</div>
.parent {
width: 100%;
height: 500px;
display: grid;
grid-template-columns: 100px auto; /*设定2列就ok了,auto换成1fr也行*/
}
.left {
background-color: #f00;
}
.right {
background-color: #0f0;
}
左列自适应,右列定宽
1. float配合margin
要点
定宽列设置宽度并float,自适应列overflow:hidden,父元素用padding-left的正值抵消自适应列的margin-left的负值
<div class="left">左列自适应</div>
<div class="right">右列定宽</div>
.parent{
height: 500px;
padding-left: 100px; /*抵消.left的margin-left以达到#parent水平居中*/
}
.left {
width: 100%;
height: 500px;
float: left;
margin-left: -100px; /*正值等于.right的宽度*/
background-color: #f00;
}
.right {
height: 500px;
width: 100px;
float: right;
background-color: #0f0;
}
2. float配合overflow属性
要点
自适应列overflow:hidden,定宽列设置宽度
<div class="parent">
<div class="right">右列定宽</div>
<div class="left">左列自适应</div> <!--顺序要换一下-->
</div>
.left {
overflow: hidden; /*触发bfc*/
height: 500px;
background-color: #f00;
}
.right {
margin-left: 10px; /*margin需要定义在#right中 设置边距*/
float: right;
width: 100px;
height: 500px;
background-color: #0f0;
}
3. table自动分配
要点
父元素设置display: table; 自适应列设置table-cell,定宽列定宽
<div class="parent">
<div class="left"></div>
<div class="right"></div>
</div>
.parent{
/*c父级元素设置100%c*/
width: 100%;
display: table;
/* 防止撑破 */
table-layout: fixed;
}
.left,.right{
height: 300px;
display: table-cell;
}
.left{
background-color: #c60233;
}
.right{
/* 定宽 */
width: 400px;
background-color: skyblue;
}
4. 绝对定位
要点
子绝父相,自适应列设置left值,定宽列设置宽度
<div class="parent">
<div class="left">左列自适应</div>
<div class="right">右列定宽</div>
</div>
.parent{
position: relative; /*子绝父相*/
}
.left {
position: absolute;
top: 0;
left: 0;
right: 100px; /*大于等于#rigth的宽度*/
background-color: #f00;
height: 500px;
}
#right {
position: absolute;
top: 0;
right: 0;
background-color: #0f0;
width: 100px;
height: 500px;
}
5. flex均分剩余空间
要点
父元素设置flex,自适应列设置flex值为1,定宽列设置宽度
<div class="parent">
<div class="left">左列自适应</div>
<div class="right">右列定宽</div>
</div>
.parent{
width: 100%;
display: flex;
}
.left{
height: 100px;
background-color: aqua;
flex: 1;
}
.right{
width: 200px;
height: 100px;
background-color: #c60025;
}
6. grid
要点
父元素设置grid grid-template-columns: 100px auto;自适应列auto 定宽列定宽
<div class="parent">
<div class="left">左列自适应</div>
<div class="right">右列定宽</div>
</div>
.parent {
height: 500px;
display: grid;
grid-template-columns: auto 100px; /*设定2列,auto换成1fr也行*/
}
.left {
background-color: #f00;
}
.right {
background-color: #0f0;
}
三列布局
左侧两个挨着的列定宽,右侧一个列自适应
1. 定宽列float配合自适应列margin
要点
定宽列float并且定宽,自适应列给margin-left值(值为定宽列宽度之和)
<div class="left">左列定宽</div>
<div class="center">中列定宽</div>
<div class="right">右列自适应</div>
.left,.center,.right{
height: 300px;
}
.left{
/* 左列定宽 */
width: 400px;
background-color: #c9394a;
float: left;
}
.center{
/* 中列定宽 */
width: 400px;
background-color: aqua;
float: left;
}
/* 就算再来一列,给该定宽的列浮动,给右侧自适应的列,一个重新计算和后的值,该方案也可用 */
.right{
background-color: pink;
/* 此时的margin-left值Wie左侧两列宽度之和 */
margin-left: 800px;
}
2. 定宽列float配合自适应列overflow
要点
定宽列设置宽度并float,自适应列overflow:hidden
<div class="left">左列定宽</div>
<div class="center">中列定宽</div>
<div class="right">右列自适应</div>
.left,.center,.right{
height: 300px;
}
.left{
/* 左列定宽 */
width: 400px;
background-color: #c9394a;
float: left;
}
.center{
/* 中列定宽 */
width: 400px;
background-color: aqua;
float: left;
}
.right{
background-color: pink;
/* 触发BFC 实现自适应 */
overflow: hidden;
}
优点和缺点
优点:代码简单,容易理解,无需关注定宽的宽度,利用bfc达到自适应效果
缺点:浮动脱离文档流,需要手动清除浮动,否则会产生高度塌陷;不支持ie6
3. table
要点
父元素设置display: table,定宽列设置table-cell和宽度,自适应列设置rtable-cell
<div class="parent">
<div class="left">左列定宽</div>
<div class="center">中列定宽</div>
<div class="right">右列自适应</div>
</div>
.parent {
width: 100%;
display: table;
}
.left,.center,.right{
height: 300px;
}
.left{
/* 左列定宽 */
width: 400px;
background-color: #c9394a;
display: table-cell;
margin: -10px 0; /*抵消上下边间距10的位置影响*/
/*左右两边间距大了一点,子元素改用padding设置盒子间距就没有这个问题*/
border-spacing: 10px; /*关键!!!设置间距*/
}
.center{
/* 中列定宽 */
width: 400px;
background-color: aqua;
display: table-cell;
}
.right{
background-color: pink;
display: table-cell;
}
优点和缺点
优点:代码简单,容易理解,无需关注定宽的宽度,利用单元格自动分配达到自适应效果
缺点:margin失效;设置间隔比较麻烦;不支持ie8
4. flex均分剩余空间
要点
父元素设置flex,定宽类定宽,自适应列设置flex值为1
<div class="parent">
<div class="left">左列定宽</div>
<div class="center">中列定宽</div>
<div class="right">右列自适应</div>
</div>
.parent{
width: 100%;
height: 500px;
display: flex;
}
.left {
width: 100px;
background-color: #f00;
}
.center{
width: 150px;
background-color: skyblue;
}
.right {
flex: 1; /*均分了父元素剩余空间*/
background-color: #0f0;
}
5. grid
要点
父元素设置display: grid ,父元素设置 grid-template-columns: 100px 200px auto;给定宽列定宽
<div class="parent">
<div class="left">左列定宽</div>
<div class="center">中列定宽</div>
<div class="right">右列自适应</div>
</div>
.parent{
display: grid;
grid-template-columns: 100px 200px auto; /*设置3列,固定第一第二列的宽度,第三列auto或者1fr*/
}
.left,.center,.right{
height: 300px;
}
.left{
background-color: #c9394a;
}
.center{
background-color: aqua;
}
.right{
background-color: pink;
}
两侧的2列定宽,中间一列自适应
1. 圣杯布局
因布局效果类似圣杯而得名,核心在于中间的主体部分自适应
<div class="left">左列定宽</div>
<div class="right">右列定宽</div>
<div class="center">中列自适应</div>
<!-- 把页面的主要部分center放到后面解析,不利于被搜素引擎收录 -->
.left,.center,.right{
height: 300px;
}
/* 两列定宽 左列定宽 中列自适应 右列定宽 */
.left,.right{
width: 300px;
}
.left{
background-color: aqua;
float: left;
}
.center{
background-color: #c60023;
margin-left: 300px;
margin-right: 300px;
}
.right{
background-color: pink;
float: right;
}
不足
搜索引擎收录页面是按照HTML的解析顺序,而将页面最重要的center部分放到最后,不利于被搜素引擎收录
改良
<div class="parent">
<!--为了利于搜索引擎抓取 center需要放在前面-->
<div class="center">中间自适应
</div>
<div class="left">左列定宽</div>
<div class="right">右列定宽</div>
</div>
.parent{
height: 300px;
/* margin-left对应的是left这个元素的宽度 */
margin-left: 300px;
/* margin-right对应的是right这个元素的宽度 */
margin-right: 300px;
/* 此时左右就空出了可以放left这一列和right这一列的位置 */
}
.left,.center,.right{
height: 300px;
float: left;
}
/* 左列和右列定宽 */
.left,.right{
width: 300px;
}
.left{
background-color: aqua;
/* 将当前元素从当前行,移动上一行同一个位置 */
margin-left: -100%;
/* 开启定位 相对定位不会脱离文档流 */
position: relative;
/* 向左移动定宽的px */
left: -300px;
}
.center{
/* 为父级元素的100% */
width: 100%;
background-color: #c60023;
}
.right{
background-color: pink;
margin-left: -300px;
position: relative;
/* right为负值表示向右移动,移动的距离是当前元素的宽度 */
right: -300px;
}
2. 双飞翼布局
双飞翼布局是针对圣杯布局的优化解决方案,主要是优化了圣杯布局中,定宽列开启定位的问题
即在自适应元素下再加一个div
<div class="parent">
<!--为了利于搜索引擎抓取 center需要放在前面-->
<div class="center">
<div class="inner"></div>
</div>
<div class="left">左列定宽</div>
<div class="right">右列定宽</div>
</div>
.parent{
height: 300px;
}
.left,.center,.right{
height: 300px;
float: left;
}
/* 左列和右列定宽 */
.left,.right{
width: 300px;
}
.left{
background-color: aqua;
/* 将当前元素从当前行,移动上一行同一个位置 */
margin-left: -100%;
}
.center{
/* 为父级元素的100% */
width: 100%;
background-color: #c60023;
}
.right{
background-color: pink;
margin-left: -300px;
}
.inner{
height: 300px;
background-color: yellow;
/* margin-left对应的是left这个元素的宽度 */
margin-left: 300px;
/* margin-right对应的是right这个元素的宽度 */
margin-right: 300px;
}
3. grid实现
<div class="parent">
<div class="header"></div>
<!--#center需要放在前面-->
<div class="center">中间自适应
<hr>
</div>
<div class="left">左列定宽</div>
<div class="right">右列定宽</div>
<div class="footer"></div>
</div>
.parent {
height: 500px;
display: grid;
grid-template-columns: 100px auto 200px; /*设定3列*/
grid-template-rows: 60px auto 60px; /*设定3行*/
/*设置网格区域分布*/
grid-template-areas:
"header header header"
"leftside main rightside"
"footer footer footer";
}
.header {
grid-area: header; /*指定在哪个网格区域*/
background-color: #ccc;
}
.left {
grid-area: leftside;
background-color: #f00;
opacity: 0.5;
}
.center {
grid-area: main; /*指定在哪个网格区域*/
margin: 0 15px; /*设置间隔*/
border: 1px solid #000;
background-color: #eeff2b;
}
.right {
grid-area: rightside; /*指定在哪个网格区域*/
background-color: #0f0;
opacity: 0.5;
}
.footer {
grid-area: footer; /*指定在哪个网格区域*/
background-color: #ccc;
}
4. table实现
<div class="parent">
<div class="left">左列定宽</div>
<div class="center">中间自适应</div>
<div class="right">右列定宽</div>
</div>
.parent {
width: 100%;
height: 500px;
display: table;
}
.left {
display: table-cell;
width: 100px;
background-color: #f00;
}
.center {
display: table-cell;
background-color: #eeff2b;
}
.right {
display: table-cell;
width: 200px;
background-color: #0f0;
}
5. flex实现
<div class="parent">
<div class="left">左列定宽</div>
<div class="center">中间自适应</div>
<div class="right">右列定宽</div>
</div>
.parent {
height: 500px;
display: flex;
}
.left {
width: 100px;
background-color: #f00;
}
.center {
flex: 1; /*均分#parent剩余的部分*/
background-color: #eeff2b;
}
.right {
width: 200px;
background-color: #0f0;
}
6. position实现
<div class="parent">
<div class="left">左列定宽</div>
<div class="center">中间自适应</div>
<div class="right">右列定宽</div>
</div>
.parent {
position: relative; /*子绝父相*/
}
.left {
position: absolute;
top: 0;
left: 0;
width: 100px;
height: 500px;
background-color: #f00;
}
.center {
height: 500px;
margin-left: 100px; /*大于等于#left的宽度,或者给#parent添加同样大小的padding-left*/
margin-right: 200px; /*大于等于#right的宽度,或者给#parent添加同样大小的padding-right*/
background-color: #eeff2b;
}
.right {
position: absolute;
top: 0;
right: 0;
width: 200px;
height: 500px;
background-color: #0f0;
}
多列布局
多列布局就是几个元素呈现水平方式排列的效果
- 块级元素默认是垂直方向排列,给他们设置浮动即可让他们,水平排列
- 内 元素默认本身就是水平方向排列的
- 行内块级元素也是默认水平方向排列的
CSS3多列布局
columns属性
- columns属性是一个简写属性
- column-count属性:定义列的数量或者允许的最大列数
- auto 为默认值,用于表示列的数量由其他css属性决定
- number 必须是正整数,用于定义列数量
- column-width属性:定义列的宽度
- auto 为默认值,用于表示列的数量由其他css属性决定
- lenght 必须是正整数,用于定义列的宽度
column-gap属性
column-gap属性定义用columns属性设置的列后的间距
column-gap
- normal 规定列间间隔为一个常规的间隔。W3C 建议的值是 1em
- length 必须是正整数,把列间的间隔设置为指定的长度
column-rule属性
column-rule属性 用于定义列与列之间的边框属性,其中包括边框的宽度、边框颜色以及边框样式
- column-rule-width 设置边框的宽度
- column-rule-style 设置边框线条的样式
- column-rule-color 设置边框的颜色
注意:只是间隙中的边框,并不是围绕上下左右
column-span 横跨多列属性
column-span属性用于定义一个列元素是否跨列
- none:用于表示元素不跨列
- all 用于表示元素跨所有列
- 1 用于表示元素跨一列
column-fill 列的填充属性
column-fill属性用于定义列的宽度是由内容决定,还是统一高度
- auto 默认值,用于表示列的高度由内容决定
- balance 用于表示列的高度根据内容最多的一列为准
等分布局(多列等宽)
等分布局就是一行被分为若干列,每一列的宽度是相同的值
1. float属性配合宽度百分比实现
要点
由于div默认宽度是100%,给子级元素设置浮动后,需要给子元素设置均分的宽度百分比和高度
<!-- 作为父级容器出现 -->
<div class="parent">
<div class="col1"></div>
<div class="col2"></div>
<div class="col3"> </div>
<div class="col4"> </div>
</div>
.col1,.col2,.col3,.col4{
float: left;
/* 由于div默认宽度是100%,高度是0,所以需要设置高度 */
height: 300px;
/* 由于是4列等分,每列就是25% */
width: 25%;
}
.col1{
background-color: hotpink;
}
.col2{
background-color: aqua;
}
.col3{
background-color: yellowgreen;
}
.col4{
background-color: green;
}
优点和缺点
优点:简单易懂
缺点:需要给子元素设置高度,或者需要手动清除浮动,否则会产生高度塌陷
2. display属性配合table实现
要点
父容器设置宽度为100%,display: table子元素设置table-cell
<!-- 作为父级容器出现 -->
<div class="parent">
<div class="col1"></div>
<div class="col2"></div>
<div class="col3"> </div>
<div class="col4"> </div>
</div>
.parent{
/* 认为设置宽度为父级的100% */
width: 100%;
/* display: table相当于table元素 */
display: table;
}
.col1,.col2,.col3,.col4{
/* 由于div默认宽度是100%,高度是0,所以需要设置高度 */
height: 300px;
/* display: table-cell相当于td元素,由于表格的特点,它会被自动分配宽度 */
display: table-cell;
}
.col1{
background-color: hotpink;
}
.col2{
background-color: aqua;
}
.col3{
background-color: yellowgreen;
}
.col4{
background-color: green;
}
3. 间距问题
间距
公式:间距+容器宽度=(间距+列宽度)x N
4. float边距问题解决思路
给子元素添加一个容器
<div class="parent-fix">
<!-- 作为父级容器出现 -->
<div class="parent">
<div class="col1">
<div class="inner">
</div>
</div>
<div class="col2">
<div class="inner">
</div>
</div>
<div class="col3">
<div class="inner">
</div> </div>
<div class="col4">
<div class="inner">
</div> </div>
</div>
</div>
.parent{
height: 300px;
/* 移走左边的10px边距 */
margin-left: -10px;
}
.col1,.col2,.col3,.col4{
float: left;
/* 由于div默认宽度是100%,高度是0,所以需要设置高度 */
height: 300px;
/* 由于是4列等分,每列就是25% */
width: 25%;
/* 子元素各自向右挤压10px */
padding-left: 10px;
box-sizing: border-box;
/* 原本的页面宽度是 各个子元素的25% + 和各自元素的padding-left值
设置成border-sizing后,整个盒子,包括padding值在内,就是25%,向内收缩,此时无论怎么去设置padding值,都不会影响这个元素在页面中所占的区域
*/
}
.inner{
height: 300px;
}
.col1 .inner{
background-color: hotpink;
}
.col2 .inner{
background-color: aqua;
}
.col3 .inner{
background-color: yellowgreen;
}
.col4 .inner{
background-color: green;
}
要点
给子元素添加一个容器元素后,给子元素padding-left(同时配合box-sizing: border-box,防止内容撑爆影响所占区域),使用margin-left的负值挤出左边的间距
优点和缺点
优点:代码简单,容易理解;兼容性较好
缺点:需要记得给父元素高度,或者使用overflow:hidden,避免高度塌陷
5. table边距问题
<div class="parent-fix">
<!-- 作为父级容器出现 -->
<div class="parent">
<div class="col1">
<div class="inner">
</div>
</div>
<div class="col2">
<div class="inner">
</div>
</div>
<div class="col3">
<div class="inner">
</div> </div>
<div class="col4">
<div class="inner">
</div> </div>
</div>
.parent-fix{
overflow: hidden;
}
.parent{
/* 此时外层容器的宽度应等于 当前容器的宽度减去边距的宽度 ,经过测试发现parent宽度为1520,此时把外层父容器的宽度设置1510即可,但是在实际开发定宽中,只要保证此等式成立即可 */
width: 100%;
display: table;
margin-left: -10px;
}
.col1,.col2,.col3,.col4{
height: 300px;
display: table-cell;
box-sizing: border-box;
padding-left: 10px;
/* 此时,.parent-fix 多出10px的右边距 */
}
.inner{
height: 300px;
}
.col1 .inner{
background-color: hotpink;
}
.col2 .inner{
background-color: aqua;
}
.col3 .inner{
background-color: yellowgreen;
}
.col4 .inner{
background-color: green;
}
要点
给子元素添加 padding-left的同时,要给父元素margin-left赋值,抵消最左边的边距
此外由于用户浏览器和设备等原因,分辨率大小不一样,需要保证此等式成立即可:外层父容器的宽度=当前容器的宽度-边距
优点和缺点
优点:table自动划分
缺点:需要保证此公式(外层父容器的宽度=当前容器的宽度-边距)成立,即可保证外层容器最右侧,不会也出现边距
等高布局
1. display属性配合table属性
div class="parent">
<div class="left">左边测试</div>
<div class="right">大熊猫(学名:Ailuropoda melanoleuca):属于食肉目、熊科、大熊猫亚科和大熊猫属唯一的哺乳动物。仅有二个亚种。雄性个体稍大于雌性。体型肥硕似熊、丰腴富态,头圆尾短,头躯长1.2-1.8米,尾长10-12厘米。体重80-120千克,最重可达180千克,体色为黑白两色,脸颊圆,有大的黑眼圈,标志性的内八字的行走方式,也有解剖刀般锋利的爪子。大熊猫皮肤厚,最厚处可达10毫米。黑白相间的外表,有利于隐蔽在密林的树上和积雪的地面而不易被天敌发现。</div>
</div>
.parent{
display: table-cell;
}
.left,.right{
width: 300px;
display: table-cell;
}
.left{
background-color: aqua;
}
.right{
background-color: pink;
}
要点
表格中的单元格默认是等高的,无论内容多少
2. padding配合margin属性实现
dy>
<div class="parent">
<div class="left">左边测试</div>
<div class="right">大熊猫(学名:Ailuropoda melanoleuca):属于食肉目、熊科、大熊猫亚科和大熊猫属唯一的哺乳动物。仅有二个亚种。雄性个体稍大于雌性。体型肥硕似熊、丰腴富态,头圆尾短,头躯长1.2-1.8米,尾长10-12厘米。体重80-120千克,最重可达180千克,体色为黑白两色,脸颊圆,有大的黑眼圈,标志性的内八字的行走方式,也有解剖刀般锋利的爪子。大熊猫皮肤厚,最厚处可达10毫米。黑白相间的外表,有利于隐蔽在密林的树上和积雪的地面而不易被天敌发现。</div>
</div>
.parent{
overflow: hidden;
}
.left,.right{
width: 300px;
float: left;
/* padding和margin互相对冲 */
padding-bottom: 9999px;
/* margin-bottom为赋值,表示向上移动 */
margin-bottom: -9999px;
}
.left{
background-color: aqua;
}
.right{
background-color: pink;
}
要点
使用margin极大的负值荷padding极大的正值相冲,给子元素设置浮动后,再给父元素设置overflow:hidden
但是这种实现的并不是真正的等高布局,只是视觉上等高的伪等高布局
全屏布局
全屏布局是指HTML页面铺满整个浏览器窗口,并且没有滚动条。而且还可以根据浏览器大小变化而变化,高度和宽度达到自适应的效果,其次在垂直方向中作为主要内容的承载者,第2行的高度是自适应的
1. 固定定位
<header></header>
<div class="content">
<div class="left"></div>
<div class="right"></div>
</div>
<footer></footer>
/* 清除默认样式 body的默认像素是8px */
html,body{
margin: 0;
overflow: hidden;
}
header{
/* width默认为父级元素的100% */
height: 100px;
/* 头部固定在窗口顶部 */
position: fixed;
top: 0;
left: 0;
right: 0;
background-color: lightgray;
}
.content{
position: fixed;
left: 0;
right: 0;
/* top等于header的高度 bottom等于footer的高度 */
top: 100px;
bottom: 100px;
background-color: lightblue;
overflow: auto;
}
/* 中部内容区 定宽+自适应 */
.content .left{
width: 300px;
height: 100%;
position: fixed;
left: 0;
/* top等于header的高度 bottom等于footer的高度 */
top: 100px;
bottom: 100px;
background-color: lightcoral;
}
.content .right{
/* div是块元素,块元素默认高度为后代元素高度之和 */
height: 1000px;
margin-left: 300px;
background-color: greenyellow;
}
footer{
height: 100px;
position: fixed;
bottom: 0;
left: 0;
right: 0;
background-color: lightslategray;
}
2. 绝对定位
<div class="parent">
<div class="top">top</div>
<div class="left">left</div>
<div class="right">right</div>
<div class="bottom">bottom</div>
</div>
html, body, .parent {height: 100%;overflow: hidden;}
.parent > div {
border: 1px solid #000;
}
.top {
position: absolute;
top: 0;
left: 0;
right: 0;
height: 100px;
background-color: lightgray;
}
.left {
position: absolute;
top: 100px; /*值大于等于.top的高度*/
left: 0;
bottom: 50px; /*值大于等于.bottom的高度*/
width: 200px;
background-color: pink;
}
.right {
position: absolute;
overflow: auto;
left: 200px; /*值大于等于.left的宽度*/
right: 0;
top: 100px; /*值大于等于.top的高度*/
bottom: 50px; /*值大于等于.bottom的高度*/
background-color: aqua;
}
.bottom {
position: absolute;
left: 0;
right: 0;
bottom: 0;
height: 50px;
background-color: lightslategray;
}
3. flex
<div class="parent">
<div class="top">top</div>
<div class="middle">
<div class="left">left</div>
<div class="right">right</div>
</div>
<div class="bottom">bottom</div>
</div>
*{
margin: 0;
padding: 0;
}
html,body,.parent{
height:100%;
}
.parent {
display: flex;
flex-direction: column;
background-color: pink;
}
.top {
height: 100px;
background-color: lightgray;
}
.bottom {
height: 50px;
background-color: lightslategray;
}
.middle {
flex: 1;
display: flex;
}
.left {
width: 200px;
background-color: limegreen;
}
.right {
flex: 1;
overflow: auto;
background-color: skyblue;
}
4. grid
<div class="parent">
<div class="top">top</div>
<div class="left">left</div>
<div class="right">right</div>
<div class="bottom">bottom</div>
</div>
*{
margin: 0;
padding: 0;
}
html, body, .parent {
height: 100%;
}
.parent {
width: 100%;
height: 100%;
display: grid;
/*分成2列,第一列宽度200px,第二列1fr平分剩余的部分,此处换成auto也行*/
grid-template-columns: 200px 1fr;
/*分成3行,第一行高度100px,第二行auto为自适应,此处换成1fr也行,第3行高度为50px*/
grid-template-rows: 100px auto 50px;
/*定义网格区域分布*/
grid-template-areas:
"header header"
"aside main"
"footer footer";
}
.parent>div{
border: 1px solid #000;
}
.top{
grid-area: header; /*指定在哪个网格区域*/
background-color: lightgray;
}
.left{
grid-area: aside; /*指定在哪个网格区域*/
background-color: skyblue;
}
.right{
grid-area: main; /*指定在哪个网格区域*/
background-color: yellow;
}
.bottom{
grid-area: footer; /*指定在哪个网格区域*/
background-color: lightsalmon;
}
css主流布局