布局是元素的摆放模式,把元素以正确的大小摆放在正确的位置上。
关键词:普通流模型、浮动模型、层模型/定位、弹性盒模型。
本节主要介绍浮动和定位,弹性盒子请点这里。
一、元素框显示方式
语法
display: block | inline | inline-block | none | ...;
常见属性值对比
属性值 |
描述 |
默认宽度 |
宽高和边距 |
显示 |
元素 |
block |
块级元素 |
容器宽度 |
可设置 |
独占一行 |
p,h1~h6,div,table,form,ul等 |
inline |
行内元素 |
内容宽度 |
宽高和竖向边距设置无效 |
和其他元素同行 |
a,span,br,label等 |
inline-block |
行内块元素 |
内容宽度 |
可设置 |
和其他元素同行 |
video,input,button等 |
list-item |
列表块 |
同block |
同block |
同block |
无 |
table |
表格块 |
同block |
同block |
同block |
无 |
none |
不显示 |
无 |
设置无效 |
不显示,也不占空间 |
无 |
- 虽然inline元素的
padding-top
和padding-bottom
设置无效,但是会撑大背景。
-
display:none
与visibility:hidden
的区别:后者仅使元素不显示,但仍然占据空间。
inline-block
的兼容性问题
去除inline-block
和inline
元素间的空白
- 如果
inline-block
或inline
元素间有换行、空格和tab,元素间就会产生间距。
- 解决方法一:将元素写在同一行,且中间无空白符(可读性极差)。
- 解决方法二:在父元素上设置
font-size:0;
,去掉水平方向的空白;然后在子元素上设置vertical-align
,去掉垂直方向的空白。旧Chrome限制字体最小为12px,用-webkit-text-size-adjust:none;
兼容。
- 解决方法三:将父元素的
letter-spacing
或word-spacing
设为负值,子元素恢复为0。Opera限制letter-spacing
最小为1px,Chrome下word-spacing
方法可能无效。
- 解决方法四:将元素的
margin-left
设为负值,具体值要根据浏览器和字号决定。
参考:去除inline-block元素间间距的N种方法
示例
- 块级元素水平居中:
block-element {margin:0 auto;}
- 横向居中导航栏:
ul {text-align:center;} /* 使内容居中 */
li, a {display:inline-block;} /* 设置为行内块元素 */
二、定位
定位方式
position: static | relative | absolute | fixed;
值 |
描述 |
参照物 |
元素表现 |
static |
无定位(默认) |
无 |
在普通文档流中 |
relative |
相对定位 |
自身正常位置 |
在普通文档流中 |
absolute |
绝对定位 |
第一个定位祖先或根元素 |
脱离文档流 |
fixed |
固定定位 |
浏览器视窗 |
脱离文档流,不随浏览器的滚动条滚动 |
- 由于
static
表示无定位,因此以下说“定位”时都不包括static
。
- 所有定位都可以提高
z-index
值;脱离文档流的定位元素,其默认宽度为内容宽度。
-
relative
定位在偏移后仍然占据原位置的空间,常用于提高元素层级或作为absolute
定位的参照物。
-
absolute
和fixed
会忽略元素的float
属性,并使元素变为块级元素。
定位位置
示例
- 页面遮罩:
.mask {
postion: fixed; /* 固定位置,使遮罩不会随着滚动条滚动 */
z-index: 999; /* 设置一个极大值,使遮罩显示在最上层 */
top:0; left:0; /* 从浏览器视窗的左上角开始 */
width:100%; height:100%; /* 宽高充满视窗 */
}
- 三行自适应(固定顶栏+固定底栏+自适应内容区)
.header {
position: absolute;
top:0; left:0; width:100%; height:100px;
}
.main {
position: absolute;
right:0; left:0; /* 同时设置对面属性值,可撑开内容区 */
top:100px; bottom:100px; /* 让出header和footer的区域 */
overflow: auto;
}
.footer {
position: absolute;
bottom:0; left:0; width:100%; height:100px;
}
三、浮动
浮动位置
float: left | right | none | inherit;
- 默认值为
none
,即不浮动。
- 浮动元素向指定方向一直移动到容器边缘,默认宽度为内容宽度。
- 浮动元素半脱离文档流——元素脱离但内容还占据空间;同一容器中的浮动元素在同一文档流中。
- 假设一个容器内只有一个子元素;如果容器没有设置高,那么子元素浮动后,容器的高度就会坍塌。
-
float
会使元素变为块级元素。
清除浮动
clear: both | left | right | none | inherit;
- 默认值为
none
。
- 应用于浮动元素的后续块级元素。
清除浮动的方法
- 方法一:在浮动元素后面添加一个空白元素
blank_element {
clear: both; /* 清除浮动 */
height:0; overflow:hidden; /* 隐藏元素 */
}
- 方法二:给容器添加一个clearfix类
/* 利用::after伪元素 */
.clearfix:after {
content: ""; /* 在容器最后添加一个伪元素,内容随意 */
display: block; /* clear属性只能用于块级元素 */
clear: both; /* 清除浮动 */
height:0; overflow:hidden; visibility:hidden; /* 隐藏伪元素 */
}
/* 兼容低版本IE浏览器 */
.clearfix {*zoom:1;}
/* .clearfix {*+height:1%;} 这种兼容也可以 */
- 方法三:利用
overflow
属性
.clearfix {overflow:auto; _height:1%;}
/* 这样写也行: */
.clearfix {overflow:hidden; _zoom:1;}
- 方法四:给容器设置高或绝对定位或浮动,并不是真的清除了浮动。
网友评论