CSS 为定位和浮动提供了一些属性,利用这些属性,能够创建各类布局,极大提升HTML页面的表现力。css
定位的基本思想很简单,它容许你定义元素框相对于其正常位置应该出现的位置,或者相对于父元素,或者另外一个元素甚至浏览器窗口自己的位置。html
CSS 有三种基本的定位机制:segmentfault
普通流,包含默认定位(static
)和相对定位(relative
)。浏览器
浮动 float
.ssh
绝对定位,包含 absolute
和 fixed
.ide
在 CSS 盒模型 一文中简单的认识了元素框的概念(主要是块框),这里再进行部分补充。wordpress
div
、h1
或 p
元素经常被称为 块级元素 。这意味着这些元素显示为一块内容,即 块框 。与之相反,span
和 strong
等元素称为 行内元素,这是由于它们的内容显示在行中,即 行内框。不过,您可使用 display
属性改变生成的框的类型。布局
还有一种框叫 无名框。这种状况发生在把一些文本添加到一个块级元素(好比 div
)中。假设有一个包含三行文本的段落,每行文本造成一个 无名框。字体
<div> some text - 无名框 <p> Some more text. - 无名框 <br> Some more test. - 无名框 <span>google</span> - 行内框 <br> Some more test. - 无名框 </p> </div>
在HTML默认布局中,块框从上到下一个接一个地排列,框之间的垂直距离是由框的垂直外边距计算出来(注意外边距值合并的状况)。ui
行内框在一行中水平布置。可使用水平内边距、边框和外边距调整它们的间距。可是,垂直内边距、边框和外边距不影响行内框的高度。
引用 张鑫旭 文章中对框的描述:
<p>这是一行普通的文字,这里有个 <em>em</em> 标签。</p>
这段HTML代码涉及到四种 boxes:
首先是 p
标签所在的 containing box,此box包含了其余的boxes;
而后就是 inline boxes,如图标注;
被标签包围的叫行内框,若是是光秃秃的文字,则属于匿名行内框(无名框)。
line boxes,见下图标注;
在 containing boxes 里,一个一个的 inline boxes 组成了 line boxes。
content area,见下图标注;
content area 是一种围绕文字看不见的box。content area 的大小与 font-size
大小相关。
position
position
属性规定元素的定位类型。有如下 5 种值可供选择。
值 | 描述 |
---|---|
absolute |
<p>生成绝对定位的元素,相对于 static 定位之外的第一个父元素进行定位。</p> <p>元素的位置经过 left , top , right 以及 bottom 属性进行规定。</p> |
fixed |
<p>生成绝对定位的元素,相对于浏览器窗口进行定位。</p> <p>元素的位置经过 left , top , right 以及 bottom 属性进行规定。</p> |
relative |
<p>生成相对定位的元素,相对于其正常位置进行定位。</p> <p>元素的位置经过 left , top , right 以及 bottom 属性进行规定。</p> |
static |
默认值。没有定位,元素出如今正常的流中(忽略 left , top , right , bottom 以及 z-index 声明)。 |
inherit |
从父元素继承,IE8以前不支持。 |
任何元素均可以定位,不过 absolute
或 fixed
会生成一个块级框,而不论该元素自己是什么类型。相对定位元素会相对于它在正常流中的默认位置偏移。
absolute
元素框从文档流彻底删除,并相对于其包含块定位。元素定位后生成一个块级框,而不论原来它在正常流中是何种类型的框。
绝对定位的元素的位置相对于 最近的已定位祖先元素(这里的已定位元素指除 static
默认定位的其他三种),若是元素没有已定位的祖先元素,那么它的位置相对于 最初的包含块。
#box2 { position: absolute; left: 30px; top: 20px; }
由于绝对定位的框与文档流无关,因此它们能够覆盖页面上的其它元素。能够经过设置 z-index
属性来控制这些框的堆放次序。
fixed
固定定位相似于将 position
设置为 absolute
,不过其包含块是视窗自己。
fixed
是一种特殊的绝对定位,对其设置的偏移量永远是相对于视窗自己。咱们常见到的导航条固定在页面顶部,回到页面顶部按钮基本都是采用此定位方式。
div#top { position: fixed; right: 5px; bottom: 5px; }
一样能够经过设置 z-index
属性来控制这些框的堆放次序。
relative
元素仍保持其未定位前的形状,它本来所占的空间仍保留。
在使用相对定位时,不管是否进行移动,元素仍然占据原来的空间。一样能够经过设置 z-index
属性来控制这些框的堆放次序。
static
元素框正常生成,按框类型正常定位。
float
浮动的框能够向左或向右移动,直到它的外边缘碰到 包含框或 另外一个浮动框的边框为止。
浮动和绝对定位相似(因为其是否脱离文档流存在争议故这里避而不谈),可能会覆盖掉页面正常的框。
向右浮动,原来的空间被其余框所占用。
向左浮动,覆盖其余框。
三个框都浮动,后面的框碰着前一个框的边框顺序排列。
当一行没法容纳下完整的一个框时,自动从下一行依次排列。
若是一行中没法容纳全部浮动框,后面的框会从下一行依次排列,排列起始位置取决于第一行已经排好的框的高度,以已经排好的行的最后一个框的高度为基准,从后往前找比此基准高的框,若是找到则起始位置为找到的这个框的下一个框的下面,若是没有找到比此基准高的框则从第一个日后排,始终保证新一行全部框的顶部与基准框的底部处于同一水平线上。(语言描述太麻烦了,我本身看都快晕了,看图吧)
图中第一行为排好的,其中框一高度最大,框三次之,其他三个高度相同,以框五为基准,往前找比框五大的,找到了框三,第二行第一个位置即为框四的下面(框三的下一个),框六,框七的顶部与框五的底部保持同一水平线(即便框四的高度小于80px,也应该同框五底部保持一致),框八以框七为基准继续往前找。
咱们上面也说了,浮动可能会覆盖别的框,但有例外。
当行框与浮动框相遇时,浮动框旁边的行框被缩短,从而给浮动框留出空间,行框围绕浮动框,这里的行框也仅限于普通文档流中的行框(绝对定位中的文本仍是会被覆盖的)。
浮动框确实覆盖了p
元素框,可是文本没有被覆盖,换句话说就是行框被缩短。
有时咱们仅仅但愿使用浮动来进行文档布局,浮动元素的尺寸仍然保留,这就须要用到浮动清除(clear
)了。
clear
用下面这个实际场景来介绍浮动清除的使用吧。
假设但愿让一个图片浮动在左边,文本块浮动在右边,而且但愿这幅图片和文本包含在另外一个具备背景颜色和边框的元素中。
因为浮动,容器将没法包围他们,固然没法达到咱们想要的效果。
因为两个块都是浮动的,没法对他们进行清除浮动,因此只能借助第三方了。
咱们使用一个空的div
元素以实现下图的目标。
div.clear { clear: both; }
清除浮动的方式固然不止上面一种,但上面的方式兼容性强,使用方便,是初学时使用的上佳之选。
下面再介绍两种不错的选择。
overflow
+zoom
方法
.clearfix{overflow:hidden; zoom:1;}
after
+zoom
方法
.clearfix{zoom:1;} .clearfix:after{display:block; content:'clear'; clear:both; line-height:0; visibility:hidden;}
此方法能够说是综合起来最好的方法,不会影响任何其余样式,通用性强,覆盖面广。
除了上面介绍的主要属性,与定位和框相关联的其余属性也顺道一块儿简要了解一下吧。
z-index
z-index
属性设置元素的堆叠顺序。拥有更高堆叠顺序的元素老是会处于堆叠顺序较低的元素的前面,其值可正可负,默认为0。
img.x { position:absolute; left:0px; top:0px; z-index:-1; }
display
display
属性规定元素应该生成的框的类型。经过此属性你能够轻松的实现块级元素与行级元素的互转,甚至能够经过此属性是元素脱离文档流隐藏起来。
经常使用的也就:none
, block
, inline
, inline-block
。
值 | 描述 |
---|---|
none |
此元素不会被显示。 |
block |
此元素将显示为块级元素。 |
inline |
此元素会被显示为内联元素。 |
inline-block |
行内块元素。 |
list-item |
此元素会做为列表显示。 |
run-in |
此元素会根据上下文做为块级元素或内联元素显示。 |
table |
此元素会做为块级表格来显示。 |
inline-table |
此元素会做为内联表格来显示。 |
table-row-group |
此元素会做为一个或多个行的分组来显示(相似 <tbody> )。 |
table-header-group |
此元素会做为一个或多个行的分组来显示(相似 <thead> )。 |
table-footer-group |
此元素会做为一个或多个行的分组来显示(相似 <tfoot> )。 |
table-row |
此元素会做为一个表格行显示(相似 <tr> )。 |
table-column-group |
此元素会做为一个或多个列的分组来显示(相似 <colgroup> )。 |
table-column |
此元素会做为一个单元格列显示(相似 <col> ) |
table-cell |
此元素会做为一个表格单元格显示(相似 <td> 和 <th> ) |
table-caption |
此元素会做为一个表格标题显示(相似 <caption> ) |
inherit |
规定应该从父元素继承 display 属性的值。 |
a#top { display: none; }
记住经常使用的便可,其他的仅供查阅。
visibility
visibility
属性规定元素是否可见。
值 | 描述 |
---|---|
visible |
默认值。元素可见。 |
hidden |
元素不可见。 |
collapse |
当在表格元素中使用时,此值可删除一行或一列,可是它不会影响表格的布局。被行或列占据的空间会留给其余内容使用。若是此值被用在其余的元素上,会呈现为 hidden 。 |
inherit |
从父元素继承。 |
h2 { visibility:hidden; }
注意:使用此属性,即便不可见的元素也会占据页面上的空间。请使用 display
属性来建立不占据页面空间的不可见元素。
clip
clip
属性用来剪裁绝对定位元素。这个属性能够定义一个剪裁矩形。对于一个绝对定位元素,在这个矩形内的内容才可见。剪裁区域可能比元素大,也可能比元素小。
该属性的默认值为 auto
, 不该用任何剪裁。
position: absolute; clip: rect (top, right, bottom, left);
top
, bottom
都是相对于包围此元素的祖先元素上框的距离。right
, left
都是相对于包围此元素的祖先元素左框的距离。
四个尺寸围成一个矩形,元素在此矩形内的部分被显现出来。
img { position:absolute; clip:rect(0px 50px 200px 0px) }
cursor
光标定位应该叫光标样式,此属性用来设置当鼠标移动到元素上鼠标应该呈现的样式。这个内容很简单,直接贴出示例。
请将代码自行添加到HTML文件中检验效果。
<span style="cursor:auto;">auto</span><br /> <span style="cursor:crosshair;">crosshair</span><br /> <span style="cursor:default;">default</span><br /> <span style="cursor:pointer;">pointer</span><br /> <span style="cursor:move;">move</span><br /> <span style="cursor:e-resize;">e-resize</span><br /> <span style="cursor:ne-resize;">ne-resize</span><br /> <span style="cursor:nw-resize;">nw-resize</span><br /> <span style="cursor:n-resize;">n-resize</span><br /> <span style="cursor:se-resize;">se-resize</span><br /> <span style="cursor:sw-resize;">sw-resize</span><br /> <span style="cursor:s-resize;">s-resize</span><br /> <span style="cursor:w-resize;">w-resize</span><br /> <span style="cursor:text;">text</span><br /> <span style="cursor:wait;">wait</span><br /> <span style="cursor:help;">help</span>
overflow
overflow
属性规定当内容溢出元素框时发生的事情。
值 | 描述 |
---|---|
visible |
默认值。内容不会被修剪,会呈如今元素框以外。 |
hidden |
内容会被修剪,而且其他内容是不可见的。 |
scroll |
内容会被修剪,可是浏览器会显示滚动条以便查看其他的内容。 |
auto |
若是内容被修剪,则浏览器会显示滚动条以便查看其他的内容。 |
inherit |
从父元素继承。 |
div { background-color:#00FFFF; width:150px; height:150px; overflow: scroll }
若是值为 scroll
,不管是否须要,用户代理都会提供一种滚动机制。所以,有可能即便元素框中能够放下全部内容也会出现滚动条。
vertical-align
vertical-align
属性设置元素的垂直对齐方式。
该属性定义行内元素的基线相对于该元素所在行的基线的垂直对齐。容许指定负长度值和百分比值。
在表单元格中,这个属性会设置单元格框中的单元格内容的对齐方式。
值 | 描述 |
---|---|
baseline |
默认。元素放置在父元素的基线上。 |
sub |
垂直对齐文本的下标。 |
super |
垂直对齐文本的上标 |
top |
把元素的顶端与行中最高元素的顶端对齐 |
text-top |
把元素的顶端与字体的顶端对齐 |
middle |
把此元素放置在中部。 |
bottom |
把元素的顶端与行中最低的元素的顶端对齐。 |
text-bottom |
把元素的底端与字体的底端对齐。 |
length |
|
% |
使用 "line-height" 属性的百分比值来排列此元素。容许使用负值。 |
inherit |
从父元素继承。 |
具体样式请将代码自行添加到HTML文档中验证。
<p> 这是一幅H<SUB>2</SUB>O<img src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> baseline 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:sub;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> sub 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:super;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> super 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:top;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> top 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:text-top;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> text-top 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:middle;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> middle对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:bottom;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> bottom 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:text-bottom;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> text-bottom 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:24px;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> 24px 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:0px;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> 0px 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:-50px;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> -50px 对齐的图像。 </p> <p> 这是一幅H<SUB>2</SUB>O<img style="vertical-align:20%;" src="http://i11.buimg.com/b8eaac4d3b209c7c.gif" />X<SUP>2</SUP> 20% 对齐的图像。 </p>
CSS 定位和浮动是HTML布局中的重要部分,须要认真参透。注意掌握定位的几种类型及区别,理解浮动的排列及清除,掌握与定位相关的一些属性。
篇幅仍是稍长,估计大伙都没时间看完了。
还有一篇讨论浮动是否是脱离文档流的帖子:float 有没有脱离文档流 ??