关于css浮动框是否脱离文档流的分析

在了解浮动属性之前,首先我们先了解一下html中关于display属性的相关知识。

display属性常用的有inline, block, inline-block.

inline也就是内联的意思。 常见的html标签中如 span, font, a, b, em 都是内联元素。

所谓内联,简单理解就是不会换行的元素

<body>
  <b>bold element</b>
  <a href="http://www.google.com">google</a>
  <font color=‘red‘>red font</font>
  <span style="height: 230px;width:100px;">span</span>
</body>

结果如下:

这个例子很简单,也说明了inline属性的特点,即不会换行。 页面上4个元素的文本都是连在一起的。

这里需要注意一点。 inline元素是不支持宽、高属性的。 如例子中的span元素设置了宽和高,但是没有起作用。

block是“块”的意思。 block元素与inline元素相反,它会自动换行。 常见的html标签中如 div, form, ul, li, p, h1都是块元素。

<body>
  <form name="testForm" action="">
    <input type="text" name="demo"/>
  </form>
  <div>
      div content
  </div>
  <h1>h1</h1>
  <p>p</p>
  <ul>
    <li>123</li>
    <li>123</li>
    <li>123</li>
  </ul>
  <span>span!</span>
  <span>span!</span>
</body>

结果如下:

图中很明显的看见,这个块元素都默认换行了。

inline-block本文不讨论。

那么有什么方法可以让block元素变成内敛元素呢。

肯定有是的,有两种方法。

第一种就是通过css改变块元素的display属性, 改成inline即可。

<body>

  <div style="width: 40px; height: 40px; margin-right: 10px;display:inline;">
      div1
  </div>
  <div style="width: 40px; height: 40px; margin-right: 10px;display:inline;">
      div2
  </div>
  <div style="width: 40px; height: 40px; margin-right: 10px;display:inline;">
      div3
  </div>

</body>

但是由于inline属性会忽略宽和高,因此这种方法在实际运用场合上上基本不会用的。 直接忽略!

第二种就是本文要讨论的浮动属性了。

<body>

  <div style="width: 40px; height: 40px; margin-right: 10px;float: left">
      div1
  </div>
  <div style="width: 40px; height: 40px; margin-right: 10px;float: left">
      div2
  </div>
  <div style="width: 40px; height: 40px; margin-right: 10px;float: left">
      div3
  </div>

</body

我们可以看w3c上对浮动的说明。   点击查看->

具体的例子这篇文章已经很详细了。

我们看 开头的一句话:

浮动的框可以向左或向右移动,直到它的外边缘碰到包含框或另一个浮动框的边框为止。

由于浮动框不在文档的普通流中,所以文档的普通流中的块框表现得就像浮动框不存在一样。

说的很明确, 浮动的框会直到它的外边缘碰到“包含框”或“另一个浮动框的边框“为止。

我们分析一下w3c的第一个例子:

框1右浮,并且它的边缘碰到了包含宽的边框,因此停留在了如图所在的位置。

再看第二个例子:

左图框1左浮,也碰到了包含框的边框。 由于浮动的元素脱离的文档流,不占据空间,所以接下来框2会无视掉框1,但是由于浮动元素优先级较高,因此框2在框1的下面,被遮住了。框3由于没有浮动,是block元素, 因此自动换行,在框2的下方。

这2个例子说明2个原理。

  一, 浮动的元素脱离文档元素, 不占据空间。 不浮动的元素会直接无视掉这个元素。

  二,浮动元素浮动的依据跟包含框和附近另外1个浮动的框,碰到了就会停止下来。

这里有一个注意点:

我们先看浮动框定义的第二句话的后半句  (所以文档的普通流中的块框表现得就像浮动框不存在一样

请注意,普通流中的 "块框" 表现得就像浮动框不存在一样。 这里指的是块框, 而不是内联元素。

比如以下例子:

#container {
    background-color: red;
    padding: 10px;
    height: 200px;
    width: 200px;
}

.left {
    float: left;
    width: 50px;
    height: 50px;
}

.right {
    float: right;
    width: 60px;
    height: 60px;
}
.green {
    background-color: green;
}

.blue {
    background-color: blue;
}

<body>
    <div id="container">
        <div class="left blue"></div>
        <div class="right blue"></div>
        <span>This is inline element</span>
    </div>
</body>

结果如下:

我们可以看到。 span这个内联元素不会忽略两个浮动元素的。

我们将以上代码的span元素替换成div块框元素。

修改后的html代码如下:

<body>
    <div id="container">
        <div class="left blue"></div>
        <div class="right blue"></div>
        <div style="width: 50px; height: 60px;" class="green"></div>
    </div>
</body>

结果:

很明显地看到,这个绿色的块框元素忽略的浮动元素。

但是如果我们将html代码改成如下:

<body>
    <div id="container">
        <div style="width: 50px; height: 60px;" class="green"></div>
        <div class="left blue"></div>
        <div class="right blue"></div>
    </div>
</body>

结果却是这样:

从结果可以很明显地看出, 块框元素在container容器中占据了第高度为60像素的那块区域。 两个浮动的元素都是在这块框区域下开始渲染的。

这样是不是违背了w3c的定义:浮动框会无视普通流中的块框。

根据个人的理解:

  这可能是由于html的渲染顺序导致的。html代码中先写了块框, 导致先渲染了这个块框的区域。

  之后渲染两个浮动框, 渲染浮动框的时候发现上面已经被块框渲染过了。 于是从块框之后开始渲染。

我们在上个例子中container容器中最后1个div后再加1个div

<div style="width: 50px; height: 60px;" class="green"></div>

在渲染最后1个div的时候。此时发现已经有两个浮动框, 这时候就会忽略这2个浮动框,从第一个块框开始继续渲染,也就跑到了第一个块框之后的位置。

所在在w3c定义浮动的那句话有点小问题。

第二句话的后半句应该改成:

  所以文档的普通流中的块框在浮动框渲染之后会表现得就像浮动框不存在一样。

综上所述,感觉浮动框并没有脱离文档流。

不知道个人的理解是否正确, 文中难免有一些错误, 希望读者发现并指出。

时间: 2024-10-12 03:13:34

关于css浮动框是否脱离文档流的分析的相关文章

DOM中关于脱离文档流的几种情况分析

所谓的文档流,指的是元素排版布局过程中,元素会自动从左往右,从上往下的流式排列.并最终窗体自上而下分成一行行, 并在每行中按从左至右的顺序排放元素.脱离文档流即是元素打乱了这个排列,或是从排版中拿走. 当前所知的脱离文档流的方式有两种:浮动和定位. a.定位属性positon 先看一下定位.看一段对定位各个字段的描述,有助于理解 值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位. 元素的位置通过 "left", "top&q

常规流和脱离文档流

常规流 又叫做文档流:在没有CSS的干预下,块级元素独占一行,宽高可设:行内元素并排显示,宽高自动. 脱离文档流 又叫做浮动流:元素在进行浮动后就是脱离文档流: 注意:浮动流在进行摆放的时候要避开常规流: 常规流在进行摆放时无视浮动流: 子级元素浮动后导致父级高度坍塌: 清除浮动 书写格式:fixed:after { content: " "; display: block; clear: both;} 属性 值 说明 clear none 默认   left 清除左浮动,元素在左浮动

网站布局之------浮动(float)和定位(position)(绝对定位,相对定位,静态固定定位),***什么叫脱离文档流?

网站布局之------浮动(float)和定位(position)(绝对定位,相对定位,静态固定定位),***什么叫脱离文档流? @参考文档:http://www.cnblogs.com/jenry/archive/2007/07/15/818660.html @什么叫脱离文档流?注意,只有绝对定位absolute和浮动float才会脱离文档流! 答案:CSS中脱离文档流,也就是将元素从普通的布局排版中拿走,其他盒子在定位的时候,会当做脱离文档流的元素不存在而进行定位. ---部分无视和完全无视

position脱离文档流与浮动脱离文档流的区别

以前我觉得position:absolute;是可以脱离文档流的,float:left;也可以脱离文档流,就觉得二者是一样的,感觉可以去浮动的方法来解决position:absolute;引起的父元素塌陷问题,结果证明我错了...下边是一个demo. 1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title></title> 6 &l

css脱离文档流

Q:什么是文档流? A:简单的说可以理解为元素在页面上出现的先后顺序. Q:什么情况下会脱离文档流? A:当使用“浮动”与“绝对定位”时. Q:脱离文档流就不占据空间了吗? A:可以这么说.更准确地一点说,是一个元素脱离文档流之后,其他的元素在定位的时候会当做没看见它,两者位置重叠都是可以的. Q: 脱离文档流是不是指该元素从dom树中脱离? A: 不是,用浏览器的审查元素就可以看到脱离文档流的元素(例如被float了)依然会出现在dom树里. 需要注意的是,使用float脱离文档流时,其他盒子

CSS中脱离文档流是什么意思?

如果一个元素脱离文档流了,是不是只是显示上脱离而已?在html中是否也会脱离?我用js取这个元素的父节点的childNodes还能否取到这个元素:同时,这个元素的parentNode还是不是html中的父节点? 脱离文档流只是对html文档的一种解析方案的说法而已.脱离文档流是相对正常文档流而言的.正常文档流就是我们没有用css样式去控制的html文档结构,你写的界面的顺序就是网页展示的顺序.比如写了5个div块.正常文档流就是依次显示这5个div块.从左往右,自上而下的顺序.脱离文档流就是指它

css之float之非完全脱离文档流

非完全脱离文档流  左右结构div盒子重叠现象,一般是由于相邻两个DIV一个使用浮动一个没有使用浮动.一个使用浮动一个没有导致DIV不是在同个"平面"上,但内容不会造成覆盖现象,只有DIV形成覆盖现象. <!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8"> <title>Title</title> <s

标准文档流与脱离文档流

在网页当中,所有的元素都有自己的占位. 标准文档流指在没有CSS干预的前提下,块级元素独占一行,可以自行定义宽.高:而行内元素并排显示,宽.高为auto. 常见的块级元素有: <address>地址<caption>表格表格标题<div>划分区域.区块<dl>定义列表<dt>定义列表中的项<dd>列表中定义条目<form>创建一个表单<h>标题标记<hr>一条横线<li>定义列表项目&l

【学习】脱离文档流分析

[学习原文自]https://www.cnblogs.com/shenfangfang/p/5278528.html 学习总结: 1.脱离文档流-部分无视:浮动的元素可以向左向右移动,直到他的外边缘碰到包含框或者另一个浮动框的边框为止. 浮动元素后跟block元素: 浮动的框之后的block元素会认为这个框不存在,但是其中的文本依然会为这个元素让出位置. 1.没有中文的很短的文本 2.没有中文的很长的文本 3.包含中文的很短的文本 4.包含中文的很长的文本 5.没有中文的很长的文本-文本设置了w