`

<转>对CSS中的Position、Float属性的一些深入探讨

    博客分类:
  • web
 
阅读更多

 

对CSS中的Position、Float属性的一些深入探讨

http://www.cnblogs.com/coffeedeveloper/p/3145790.html

对CSS中的Position、Float属性的一些深入探讨

对于Position、Float我们在平时使用上可以说是使用频率非常高的两个CSS属性,对于这两个属性的使用上面可能大多数人存在一些模糊与不清晰的地方。本文主要对这两个属性使用上的一个介绍以及两个属性交叉使用上的一些探讨。

本文主要探讨点:

  1. Position、Float属性的基本使用方法
  2. Position、Float属性对元素所造成的影响
  3. Position、Float属性交叉使用上面的影响
  4. Position、Float属性使用上的小技巧

本文结构点:

  1. HTML布局的基本要点(点我直接跳转)
      盒子模型
      HTML的普通流
  2. Position属性(点我直接跳转)
      属性值介绍
      用法介绍
      一些关于position的小知识
  3. Float属性(点我直接跳转)
      属性值介绍
      用法介绍
      与Position之间的兼容问题

HTML布局的基本要点:

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

  1. 盒子模型(box model)
  2. 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源代码的时候是根据元素在代码出现的顺序读取,最终元素的呈现方式是依据元素的盒子模型来决定的。行内元素是从左到右,块状元素是从上到下。(如下图)

复制代码
<style type="text/css">
  div { width: 100px; height: 50px; line-height: 50px; text-align: center; color: #fff; }
  strong { background: #808080; }
  em { background: #ffd800; }
  span { background: #b6ff00; }
</style>
<strong>strong</strong><em>em</em><span>span</span>
<div style="background: blue">A</div>
<div style="background: red">B</div>
<div style="background: green">C</div>
复制代码

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

Position属性:

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

Position属性值

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

Static

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

Relative

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

复制代码
<style type="text/css">
div{ width: 100px; height: 50px; line-height: 50px; text-align: center; color: #fff; }
</style>
<div style="background: blue">A</div>
<div style="background: red; position: relative; top: 20px; left: 20px;">B</div>
<div style="background: green">C</div>
复制代码


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

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

复制代码
<style type="text/css">
strong { background: #808080; }
em { background: #ffd800; }
span { background: #b6ff00; position: relative; top: 10px; left: 10px; width: 100px; }
</style>
<strong>strong</strong><em>em</em><span>span</span>
复制代码

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

 

Absolute

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

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

复制代码
<body style="background: yellow;">
    <div style="background: #fff">
        A
        <div style="background: #81b6ff">
            A - 1
            <div style="background: #b6ff00;">
                A - 2
            </div>
        </div>
    </div>
</body>
复制代码

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

复制代码
<body style="background: yellow;">
    <div style="background: #fff">A
        <div style="background: #81b6ff">A - 1
            <div style="background: #b6ff00; position: absolute; top: 0; left: 0;">
                A - 2</div></div></div></body>
复制代码

可以看到(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。

复制代码
<div id="a" style="background: #fff; width: 200px;">A
    <div id="b" style="background: #81b6ff; width: 150px; position: relative; padding-top: 100px;">A - 1
        <div id="c" style="background: #b6ff00; position: absolute; left: 0; top: 0">A - 2
        </div>
    </div>
</div>
复制代码

 

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

复制代码
<!-- 解决方案,父元素设置一个更大的z-index值即可 -->
<div style="z-index: 2;">
  a
    <div style="position: relative; z-index: 1;">
      b
    </div>
</div>
复制代码

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

<span style="position: absolute; width: 100px; height: 100px; top: 10px; left: 10px; background: #fff;">
        我的display属性由inline变成了block
</span>


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


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

 

Fixed

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

  1. 会改变行内元素的呈现模式,使display之变更为block。
  2. 会让元素脱离普通流,不占据空间。
  3. 默认会覆盖到非定位元素上。

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

 

Float属性

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

  1. 只有横向浮动,并没有纵向浮动。
  2. 当元素应用了float属性后,将会脱离普通流,其容器(父)元素将得不到脱离普通流的子元素高度。
  3. 会将元素的display属性变更为block。
  4. 浮动元素的后一个元素会围绕着浮动元素(典型运用是文字围绕图片),与应用了position的元素相比浮动元素并不会遮盖后一个元素。
  5. 浮动元素的前一个元素不会受到任何影响(如果你想让两个块状元素并排显示,必须让两个块状元素都应用float)。

与position的兼容性问题

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

<div style="position:relative; float:right; left:50px; top:10px;">div</div>

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

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

复制代码
<div style="position: absolute; right:10px; top: 10px; float: left;">
我是一个应用了position:absolute和float:left的DIV,不过我还是在浏览器的右边,没有浮动到左边。
</div>
复制代码


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

复制代码
<div style="position: absolute; left:10px; top: 10px;">
    我是一个应用了position:absolute的DIV。
</div>
<div style="float:left; background: red; width: 300px; height: 150px; ">
    我是float:left的DIV
</div>
复制代码

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

4)同时应用position: absolute和float: left会导致清除浮动无效(position: relative则可以清除浮动)。
常用的清除浮动的方法有两种:

  1. 通过在容器中添加一个标签,设置该标签的样式为 clear: both
  2. 容器设置overflow: hidden
复制代码
<div style="background: #fff; width: 100%; overflow: hidden;">
    <div style="float: left; position: absolute;">我是DIV</div>
    <div style="clear: both;"></div>
<div>
复制代码

 

最后,如果你觉得这篇文章对你有用的话。请帮忙点一下推荐,谢谢!^_^

分享到:
评论

相关推荐

    对CSS中的Position、Float属性的一些深入探讨

    在CSS布局中,Position和Float属性是至关重要的概念,它们能极大地影响网页元素的排列方式。本文将深入探讨这两个属性的使用方法、影响以及它们之间的交互。 首先,我们需要理解HTML布局的基本要点,尤其是盒子模型...

    html css参考手册

    下面我们将深入探讨这两门技术的核心概念、语法以及在实际应用中的使用技巧。 **HTML参考手册** HTML是一种标记语言,它通过各种标签来描述文档的结构,如`&lt;head&gt;`、`&lt;body&gt;`、`&lt;h1&gt;`、`&lt;p&gt;`、`&lt;a&gt;`等。HTML5是...

    CSS+div下拉菜单(js).pdf

    本文将深入探讨如何使用CSS和div结合JavaScript来创建一个跨浏览器兼容的下拉菜单。 首先,下拉菜单的HTML结构至关重要。通常,下拉菜单由一个主菜单和嵌套的子菜单组成。在示例代码中,我们可以看到一个`&lt;div&gt;`...

    HTML5培训技术分享 定位属性、列表的高级应用及带有图片列表的网页制作(下)

    - **导航栏** (`&lt;nav&gt;`): 使用了 `&lt;ul&gt;` 和 CSS 的 `float` 属性来实现导航菜单。 - **横幅** (`&lt;div class="banner"&gt;`): 显示网站的主要横幅图像。 - **主体内容** (`&lt;main&gt;`): 包括了带有图片的列表。 - **页脚** ...

    HTML+CSS 实现个人主页

    使用浮动(float)或定位(position)属性可以实现元素的位置控制。此外,CSS3引入了许多新特性,如渐变(gradients)、阴影(box-shadow)、过渡(transitions)、动画(animations)和响应式设计(media queries)...

    html常用的标签和css

    在这里,我们将深入探讨HTML常用标签以及CSS的基本概念和用法。 一、HTML常用标签 1. 文本元素: - `&lt;h1&gt;`至`&lt;h6&gt;`:定义标题,`&lt;h1&gt;`为最高级别,`&lt;h6&gt;`为最低级别。 - `&lt;p&gt;`:定义段落。 - `&lt;em&gt;`:定义斜体...

    HTML和CSS教程

    2. 标签与属性:学习常用的HTML标签,如`&lt;head&gt;`、`&lt;body&gt;`、`&lt;h1&gt;`到`&lt;h6&gt;`(标题)、`&lt;p&gt;`(段落)、`&lt;a&gt;`(链接)、`&lt;img&gt;`(图像)和`&lt;div&gt;`(分组元素)等,以及它们的属性用法。 3. 表格与列表:掌握`&lt;table&gt;...

    html练习+css

    5. **CSS布局**:CSS提供了多种布局方式,如浮动布局(float)、定位(position)和Flexbox(弹性盒模型)以及Grid(网格布局)。这些布局方式帮助开发者实现复杂的网页布局设计。 6. **响应式设计**:随着移动设备...

    HTMLCSS网站设计基础教程教学大纲.docx

    在浮动和定位方面,学生需要熟悉如何使用float属性实现元素的浮动布局,以及如何使用position属性进行精确的定位。清除浮动以避免布局问题也是必备技能。 第七章介绍表单的应用,包括表单的创建、不同类型的表单...

    Accp6.0_S1.使用HTML语言和CSS开发商业素材

    下面我们将深入探讨HTML和CSS在构建网页时所涉及的核心概念和技巧。 **HTML:网页结构的基础** 1. **基本结构**:HTML由一系列标签组成,这些标签定义了网页的各个部分,如`&lt;html&gt;`、`&lt;head&gt;`和`&lt;body&gt;`等,它们...

    Head First HTML与CSS 第2版 中文版

    - **布局方式**:CSS提供流式布局、网格布局和定位布局,如`display`属性用于控制元素显示方式,`position`属性实现定位。 - **响应式设计**:使用媒体查询(`@media`)适应不同设备屏幕大小,实现响应式网页设计。 ...

    百度新闻页面布局html+css

    例如,`&lt;head&gt;`标签包含元信息,`&lt;body&gt;`包含实际内容,`&lt;h1&gt;`至`&lt;h6&gt;`定义标题等级,`&lt;p&gt;`用于段落,`&lt;a&gt;`创建链接,`&lt;ul&gt;`和`&lt;li&gt;`构建无序列表,`&lt;ol&gt;`和`&lt;li&gt;`构建有序列表。对于新闻列表,我们可以使用`...

    html+css版块划分

    传统的布局方法如浮动(`float`)和定位(`position`)虽然简单,但存在一些局限。现代CSS布局如Flexbox(弹性盒模型)和Grid(网格布局)提供了更强大的布局解决方案。Flexbox适用于一维布局(如导航栏、列表),而...

    CSS参考手册_第5章__CSS基本布局属性

    在《CSS参考手册》的第五章中,我们深入探讨CSS基本布局属性的核心概念及其实际应用。这一章节旨在帮助读者掌握网页布局的基础,理解如何使用CSS来创建美观且功能性强的网页。通过本章的学习,读者将能够掌握: - ...

    HTML第9章 课堂练习 PPT及答案 CSS.ACCP6.0

    在本“HTML第9章 课堂练习 PPT及答案 CSS.ACCP6.0”中,我们将深入探讨HTML的第九章节,这通常涉及到更高级的主题,如表格、表单、框架和样式控制。这一章节的学习对于理解和掌握网页设计至关重要。 1. **HTML表格*...

    京东1号店网页html-css实现

    在实际的“1号店-刘畅”项目中,开发人员可能会结合HTML5的新特性,如语义化元素(`&lt;header&gt;`、`&lt;footer&gt;`、`&lt;article&gt;`等),以及CSS3的一些高级功能,如多列布局、阴影和渐变等,来构建一个功能丰富、视觉吸引力强...

    html.css达内学习资料

    - `&lt;head&gt;`部分包含了关于文档的信息,如&lt;title&gt;、&lt;meta&gt;、&lt;link&gt;等。 - `&lt;body&gt;`部分包含页面的所有可见内容。 3. **基本标签**: - `&lt;p&gt;`:段落标签。 - `&lt;a&gt;`:超链接标签,用于创建到其他网页或位置的链接...

    CSS的ul和li实现横向排列和去掉li的点

    - `&lt;dd&gt;`:定义与`&lt;dt&gt;`相关联的描述,即对`&lt;dt&gt;`中词语的解释或定义。 通过合理使用`&lt;dl&gt;`、`&lt;dt&gt;`和`&lt;dd&gt;`标签,可以组织和展示结构化的信息,这些信息往往不便于用无序列表或有序列表表示。 例如: ```html &lt;dl...

    Head First HTML与CSS 第2版

    3. **属性**:元素可以有属性来提供更多信息,例如`&lt;a href="http://example.com"&gt;`中的`href`属性表示链接地址。 4. **内容**:元素内部可以包含文本或其他元素,构成网页的实际内容。 5. **结构化文档**:通过`...

Global site tag (gtag.js) - Google Analytics