CSS入门:CSS中Position、Float属性深入探讨

文章来源:http://www.zretc.com/technologyDetail/430.html

Position、Float是平时使用频率非常高的两个CSS属性,对于这两个属性的使用,可能大多数人存在一些模糊与不清晰的地方。今天小卓为大家分享的文章主要是对这两个属性使用上的介绍,以及两个属性交叉使用上的一些探讨。

1.HTML布局的基本要点

如果要掌握、运用好Position、Float属性必须要对HTML的两个基本点有清晰的了解。

盒子模型(box model)

HTML的普通流(normal flow)

盒子模型

在HTML中元素的盒子模型分为两种:块状元素、行内元素,请注意这里的块状元素(Block)和行内元素(Inline)与Display属性中的inline、block两个属性值并不等同。盒子模型中的Inline、Block类似于是Display属性的父类,例如:Display属性中的list-item属性值是属于块状(Block)类型的。

我们直观的上看两种盒子模型的区别:

  • 块状(Block)类型的元素可以设置width、height属性,而行内(Inline)类型设置无效。
  • 块状(Block)类型的元素会独占一行(直观的说就是会换行显示,无法与其他元素在同一行内显示,除非你主动修改元素的样式),而行内(Inline)类型的元素则都会在一行内显示。
  • 块状(Block)类型的元素的width默认为100%,而行内(Inline)类型的元素则是根据自身的内容及子元素来决定宽度。
  • 列举出一些大家常见的元素的分类:
  • 块状元素:p、div、ul、li、dd、dt…
  • 行内元素:a、img、span、strong…

HTML的普通流

浏览器在读取HTML源代码的时候是根据元素在代码出现的顺序读取,最终元素的呈现方式是依据元素的盒子模型来决定的。行内元素是从左到右,块状元素是从上到下。(如下图)

strongemspan

A

B

C

如果你不改变元素的默认样式前提下,元素在HTML的普通流中会“占用”一个位置,而“占用”位置的大小、位置则是由元素的盒子模型来决定。因此,在后续讲的Position、Float属性是否会使元素脱离这个普通流是一个关键点。

2. Position属性

我们首先来谈谈Position属性,因为Position属性能够很好的体现HTML普通流这个特征。重点在于应用了不同的position值之后是否有脱离普通流和改变Display属性这两点。

Position的属性值

Position的属性值共有四个static、relative、absolute、fixed。

Static

所有元素在默认的情况下position属性均为static,而我们在布局上经常会用到的相对定位和绝对定位常用的属性top、bottom、left、right在position为static的情况下无效。其用法为:在改变了元素的position属性后可以将元素重置为static让其回归到页面默认的普通流中。

Relative

俗称的相对定位,重点在于对相对理解。我们此前说过每个元素在页面的普通流中会有“占用”一个位置,这个位置可以理解为默认位置,而相对定位就是将元素偏离元素的默认位置,但普通流中依然保持着原有的默认位置,并没有脱离普通流,只是视觉上发生的偏移。

我们先用块状元素来做个示例:

A

B

C

右图中的黑色虚线部分为元素B的默认普通流位置,而黄色线则代表元素B的相对偏移量。我们可以很明显的看出在元素C依然还是保留在原位,并没有因为元素B发生了偏移而随之变化。

我们再来看看行内元素(在这里用大家最常用的span来做示例)

strongemspan

请注意看,在这里我是有对span进行width属性的赋值(为100px)。但是我们可以看到span在运用了relative这个position属性值后,依然对width属性无效,换而言之,position: relative并没有改变行内元素的Display属性,这个概念非常重要(注意与接下来的absolute的区别)。

Absolute

俗称的绝对定位,绝对定位是相对而言的,怎么理解呢?应用了position: absolute的元素会循着节点树中的父(祖)元素来确定“根”,然后相对这个“根”元素来偏移。如果在其节点树中所有父(祖)元素都没有设置position属性值为relative或者absolute则该元素最终将对body进行位置偏移。应用了position: absolute的元素会脱离页面中的普通流并改变Display属性(重点)!

我们先用一个默认嵌套的div来做示例

A

A - 1

A - 2

现在我们对A-2这个div设置绝对定位(Top: 0, Left: 0),而没有对它的父元素(A、A-1)设置任何的position值

A

A - 1

A - 2

可以看到(A-2)最终是根据body来产生了位移,让我们对比分别设置一下父元素position。

从上面的图,我们可以总结以下几个结论。

1)块状元素在position(relative/static)的情况下width为100%,但是设置了position: absolute之后,会将width变成auto(会受到父元素的宽度影响)。

2)元素设置了position: absolute之后,如果没有设置top、bottom、left、right属性的话,浏览器会默认设置成auto,而auto的值则是该元素的“默认位置”。即设置position: absolute前后的offsetTop和offsetLeft属性值不变。

特殊情况:

  • Firefox的话会直接将top、left设置成offsetTop和offsetLeft的值而非auto。
  • IE7下的表现更类似于float,会附加到父元素的末尾。

一些Position的小知识

1)应用了position: relative/absolute的元素,margin属性仍然有效,以position:relative来举例。如果设置了left、top、bottom、right的属性,建议大家不要设置margin数据,因为很难精确元素的定位,尽量减少干扰因素。

2)position: absolute忽略根元素的padding。

A

A - 1

A - 2

3)在IE6/7中设置position属性后会导致z-index属性失效

a

b

4)行内元素在应用了position:absolute之后会改变display。

我的display属性由inline变成了block

因此,要注意到relative是并没有改变行内元素的呈现模式,而absolute是会改变行内元素的呈现模式,如果设置了absolute并不需要显式的的将元素display改成block。

5)应用了position: absolute / relative之后,会覆盖其他非定位元素(即position为static的元素),如果你不想覆盖到其他元素,也可以将z-index设置成-1。

Fixed

在很长的时间里,这个属性值因为兼容性问题,并没有得到非常广泛的应用(IE6未实现该属性值)。fixed和absolute有很多共同点:

n 会改变行内元素的呈现模式,使display之变更为block。

n 会让元素脱离普通流,不占据空间。

n 默认会覆盖到非定位元素上。

fixed与absolute最大的区别在于:absolute的”根元素“是可以被设置的,而fixed则其”根元素“固定为浏览器窗口。即当你滚动网页,其元素与浏览器窗口之间的距离是恒定不变的。

3. Float属性

float的属性值有none、left、right,有几个要点:

  • 只有横向浮动,并没有纵向浮动。
  • 当元素应用了float属性后,将会脱离普通流,其容器(父)元素将得不到脱离普通流的子元素高度。

  • 浮动元素的后一个元素会围绕着浮动元素(典型运用是文字围绕图片),与应用了position的元素相比浮动元素并不会遮盖后一个元素。
  • 浮动元素的前一个元素不会受到任何影响(如果你想让两个块状元素并排显示,必须让两个块状元素都应用float)。

与Position的兼容问题

1)元素同时应用了position: relative、float、(top / left / bottom / right)属性后,则元素先浮动到相应的位置,然后再根据(top / left / bottom / right)所设置的距离来发生偏移。

div

左图中的div是没有设置top、left值的,而右边则设置了50px的偏移。

2)元素同时应用了position: absolute及float属性,则float失效。

我是一个应用了position:absolute和float:left的DIV,不过我还是在浏览器的右边,没有浮动到左边。

3)第一个元素应用了position之后会覆盖着接下来的float元素(如果两个元素所处的位置相同)

我是一个应用了position:absolute的DIV。

我是float:left的DIV

回顾:如果你不将float的元素的position设置成relative的话,你想通过设置float元素的z-index来的达到覆盖position:absolute是无效的。同理,float元素下面存在position: absolute的子元素,如果你不将float的元素的position设置成relative的话,absolute元素是不会定位到float元素的。

4)同时应用position: absolute和float: left会导致清除浮动无效(position: relative则可以清除浮动)。

常用的清除浮动的方法有两种:

  • 通过在容器中添加一个标签,设置该标签的样式为 clear: both
  • 容器设置overflow: hidden

我是DIV

以上的知识,你是否吸收了呢?希望能对你有所帮助。欢迎进入中软国际教育集团技术知识库,这里有解决问题的钥匙哦!

时间: 2024-10-15 14:54:42

CSS入门:CSS中Position、Float属性深入探讨的相关文章

Css中Position定位属性与层级关系

今天同事发现一个有意思的问题,关于position的层级关系的,他要不说我也没注意过 测试后果然有趣,有待深入研究: 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Css中Position定位属性与层级关系</title> 6 <style type="text/css"> 7 #W{ 8

CSS中&quot;position:relative&quot;属性与文档流的关系

前言 近期遇到一个问题--"position:relative"到底会不会导致元素脱离文档流?主流观点是不会,但都给不出一个有说服力的论据.最后我自己佐证了一番,总算有了个结果:"position:relative"不会导致元素脱离文档流. 博文地址:CSS中"position:relative"属性与文档流的确切关系 "relative"与文档流 说到标准,最权威的自然莫过于CSS标准文档.经过一番繁琐的查找之后(w3c网站

css样式表中四种属性选择器

css样式表中四种属性选择器1> 简易属性 tag[class]{ font-weight:bold } It will affect all tag with any class. e.g. <h2 class="old" > or <h2 class="new"> 2>精确属性值 a[href="http://www.cnblogs.cn"][title="textTitle"]{fon

关于CSS中position的属性

position的属性: 1.static (文档流):默认值,没有进行定位,元素出现在正常流中,忽略top   left   right   bottom   z-index的申明 (无影响). 一行接着一行 2.relative(相对定位):生成相对定位的元素,相对于其正常的位置进行定位.例如,"left:20px" 会向元素的 LEFT 位置添加 20 像素.即通过left.right.top.bottom属性在正常文档流中的偏移位置,相对定位完成的过程是首先按static(fl

CSS中的float属性

在上一节中提到过行内块元素(inline-block),display设置为inline-block后, 元素可以设置宽度和高度,又能以行内形式显示,即水平排列,而不是像块级元素一样 从上到下排列.这一点很好地解决了页面的布局问题.      inline-block不是唯一,还有一个float浮动属性也能够到达类似的效果.float分为左浮left和右浮right,会让元素脱离文档流,且子级浮动会导致父级高度 塌陷(父级可使用overflow:hidden属性恢复自身高度).下面举例说明flo

css的position,float属性的理解

我们知道,html是按照普通流来加载的,这个时候我们有些需求就不好实现.因此出现了非普通流: 1.普通流:按照顺序正常的排列,长度或不够就往下挤.position默认的static 2.非普通流:脱离了普通流(不按照普通流渲染),后面介绍的有position的relative, absolute, fixed以及float属性.尤其是float属性,滥用情况非常. 以下所说的"脱离普通流"是指不按照正常普通流的方式渲染,不要和单独一层混谈! static: 处于普通流,也就是按照普通流

css样式布局中position的那些事儿

哎,页面布局及设计开发,对于一个一直从事后台开发来说屌丝来说,确实是件很费时.费力,很艰难的一件事. 今晚是想实现把多张重叠在一起,或是标记一张图片中不同的位置然后赋以超链接.花了一晚上的时间,才算初步搞定,大致明白了以下几个css属性用法. [1]将标签设置为float,和同事讨论: html的标签有块级和行级(至于那些是块级,可百度之),每个块级会占用html文档的一行(之所以是一行,是因为块级后面会带有换行).如果把块级标签设置为float时,则标签:(1)脱离原来父级标签.(2)可以在一

前端开发HTML&amp;css入门——CSS的文本格式化

长度单位 像素 px 百分比 % em - 像素是我们在网页中使用的最多的一个单位, * 一个像素就相当于我们屏幕中的一个小点, * 我们的屏幕实际上就是由这些像素点构成的 * 但是这些像素点,是不能直接看见. * - 不同显示器一个像素的大小也不相同, * 显示效果越好越清晰,像素就越小,反之像素越大. - 也可以将单位设置为一个百分比的形式, * 这样浏览器将会根据其父元素的样式来计算该值 * - 使用百分比的好处是,当父元素的属性值发生变化时, * 子元素也会按照比例发生改变 * - 在我

C#入门经典中的SelectionFont属性为null

14.6.2.richtextbox控件: private void buttonbold_click(object sender, eventargs e)        {            font newfont;            font oldfont;            oldfont = this.richtextboxtext.selectionfont;            if (oldfont.bold)                newfont =