HTML脱离文档流的几种方法

一、什么是文档流?

将窗体自上而下分成一行一行,并在每行中按从左至右依次排放元素,称为文档流,也称为普通流。

这个应该不难理解,HTML中全部元素都是盒模型,盒模型占用一定的空间,依次排放在HTML中,形成了文档流。


二、什么是脱离文档流?

元素脱离文档流之后,将不再在文档流中占据空间,而是处于浮动状态(可以理解为漂浮在文档流的上方)。脱离文档流的元素的定位基于正常的文档流,当一个元素脱离文档流后,依然在文档流中的其他元素将忽略该元素并填补其原先的空间。


三、怎么脱离文档流?

1:float

使用float可以脱离文档流。

注意!!!:使用float脱离文档流时,其他盒子会无视这个元素,但其他盒子内的文本依然会为这个元素让出位置,环绕在该元素的周围。

举个栗子:


     
     
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title </title>
  6. <style>
  7. .first {
  8. width: 200px;
  9. height: 200px;
  10. border: 3px solid red;
  11. float: left;
  12. }
  13. .second {
  14. width: 200px;
  15. height: 100px;
  16. border: 3px solid blue;
  17. }
  18. </style>
  19. </head>
  20. <body>
  21. <div class="first">123 </div>
  22. <div class="second">456 </div>
  23. </body>
  24. </html>

运行效果:


这段代码中把红色的框设置为了左浮,所以红色的框称为了浮动状态(浮动在蓝色框的上面),而蓝色框占用了原来空色框的位置。注意到,蓝色框中的文本依然认为红色框存在,所以为红色框让出了位置。由于div是块状元素,所以456出现在下方。


2:absolute

absolute称为绝对定位,其实博主觉得应该称为相对定位,因为使用absolute脱离文档流后的元素,是相对于该元素的父类(及以上,如果直系父类元素不满足条件则继续向上查询)元素进行定位的,并且这个父类元素的position必须是非static定位的(static是默认定位方式)。

举个栗子:


     
     
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title </title>
  6. <style>
  7. .first {
  8. width: 200px;
  9. height: 200px;
  10. border: 3px solid red;
  11. }
  12. .second {
  13. width: 200px;
  14. height: 100px;
  15. border: 3px solid blue;
  16. position: absolute;
  17. }
  18. .third {
  19. width: 200px;
  20. height: 200px;
  21. border: 3px solid green;
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <div class="first">123 </div>
  27. <div class="second">456 </div>
  28. <div class="third">789 </div>
  29. </body>
  30. </html>


运行结果:


通过把蓝色的框的position设置为absolute使蓝色的框变为浮动状态,可以看到绿色的框被蓝色的框遮挡。emmm...,看起来貌似没有问题,但是还记得前面说的absolute是相对谁定位的吗?相对非static元素的父级定位的,这里蓝框的父级就是html,所以应该是相对于html定位,但是代码中没有提供相对位置,所以只能浮动在原来该元素在文档流中的位置上方。

下面加上相对位置并把html以dotted的形式显示出来:


     
     
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title </title>
  6. <style>
  7. .first {
  8. width: 200px;
  9. height: 200px;
  10. border: 3px solid red;
  11. }
  12. .second {
  13. width: 200px;
  14. height: 100px;
  15. border: 3px solid blue;
  16. position: absolute;
  17. left: 0;
  18. top: 0;
  19. }
  20. .third {
  21. width: 200px;
  22. height: 200px;
  23. border: 3px solid green;
  24. }
  25. html {
  26. border: dotted;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div class="first">123 </div>
  32. <div class="second">456 </div>
  33. <div class="third">789 </div>
  34. </body>
  35. </html>

运行结果:


结果很明显,蓝色的框遮住了html的点,所以当父级元素的position全是static的时候,absolute是相对于html来进行定位的。

下面举个相对于父级元素定位的栗子:


     
     
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title </title>
  6. <style>
  7. .first {
  8. width: 200px;
  9. height: 200px;
  10. border: 3px solid red;
  11. position: relative;
  12. }
  13. .second {
  14. width: 200px;
  15. height: 100px;
  16. border: 3px solid blue;
  17. position: absolute;
  18. left: 0;
  19. top: 0;
  20. }
  21. .third {
  22. width: 200px;
  23. height: 200px;
  24. border: 3px solid green;
  25. }
  26. html {
  27. border: dotted;
  28. }
  29. </style>
  30. </head>
  31. <body>
  32. <div class="first">
  33. 123
  34. <div class="second">
  35. 456
  36. </div>
  37. </div>
  38. <div class="third">
  39. 789
  40. </div>
  41. </body>
  42. </html>

运行结果:


嗯,没问题,蓝色的框是相对红色的框进行定位的,具体来说是相对于border。(可以试一下改变红色框的margin和paddind看看会发生什么)。

注意:绝对定位的窗口一般都要设置相对距离,当你同时设置top和bottom的时候,只有top会生效,同理,同时设置left和right的时候,只有left会生效。

3:fixed

完全脱离文档流,相对于浏览器窗口进行定位。(相对于浏览器窗口就是相对于html)。

 举个栗子:


     
     
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title </title>
  6. <style>
  7. .first {
  8. width: 200px;
  9. height: 200px;
  10. border: 3px solid red;
  11. }
  12. .second {
  13. width: 200px;
  14. height: 100px;
  15. border: 3px solid blue;
  16. position: fixed;
  17. right: 0;
  18. top: 0;
  19. }
  20. .third {
  21. width: 200px;
  22. height: 200px;
  23. border: 3px solid green;
  24. }
  25. html {
  26. border: dotted;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div class="first">123 </div>
  32. <div class="second">456 </div>
  33. <div class="third">789 </div>
  34. </body>
  35. </html>

运行结果:


可以很明显的看出,蓝色的框是相对于html进行定位的。当然,如果不提供相对位置的话,蓝色的框会浮动在其原先在文档流中的位置上方。

Note:文档流是在body中的,body在html中,这个在代码结构中也体现出来了,下面的例子可以更直观的看出:


     
     
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title </title>
  6. <style>
  7. .first {
  8. width: 200px;
  9. height: 200px;
  10. border: 3px solid red;
  11. }
  12. .second {
  13. width: 200px;
  14. height: 100px;
  15. border: 3px solid blue;
  16. }
  17. .third {
  18. width: 200px;
  19. height: 200px;
  20. border: 3px solid green;
  21. }
  22. body {
  23. border: dotted red;
  24. }
  25. html {
  26. border: double black;
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div class="first">123 </div>
  32. <div class="second">456 </div>
  33. <div class="third">789 </div>
  34. </body>
  35. </html>

运行结果:



最后说一个半脱离文档流的方法,就是position:relative。下面说明一下为什么是半脱离文档流。

先看下面这段代码:


     
     
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>Title </title>
  6. <style>
  7. .first {
  8. width: 200px;
  9. height: 200px;
  10. border: 3px solid red;
  11. }
  12. .second {
  13. width: 200px;
  14. height: 100px;
  15. border: 3px solid blue;
  16. position: relative;
  17. top: 100px;
  18. }
  19. .third {
  20. width: 200px;
  21. height: 200px;
  22. border: 3px solid green;
  23. }
  24. </style>
  25. </head>
  26. <body>
  27. <div class="first">123 </div>
  28. <div class="second">456 </div>
  29. <div class="third">789 </div>
  30. </body>
  31. </html>

运行结果:


可以看到,蓝色的框是浮动了,但是绿色的框却相对于蓝色的框原先在文档流中的位置进行了定位。这就是所谓的半脱离文档流,本体还在文档流中占有位置,但是却可以通过改变位置使其漂浮到其他的地方,其定位方式是相对其原先在文档流中的位置进行定位的。

注意:可以尝试改变蓝色框的margin和padding属性,看一下会发生什么。

关键就是知道蓝色框在原来的文档流占用位置,相对定位后还是在原来的位置占据文档流。(类似实体投影到另一个地方)。

以上就是脱离文档流的方法。

最后再多说一句,一般设置relative是为了让absolute有个相对定位的参照。(个人理解)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值