整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

技术干货:CSS的浮动和定位,我是这么来理解的!

准流的默认特性

1、分行、块级元素,并且能够dispay转换。

2、块级元素(block):默认独占一行,不能并列显示,能够设置宽、高,宽度为父盒子的100%。例如:div、p、标题元素(h1-h6)、列表元素(ul li、dl dt dd)

3、行内元素(inline):默认并排显示,不能设置宽、高,宽度为内容的宽度。例如:span、a、b、i

4、margin-bottom 和margin-top 塌陷,以最大值为准。

脱标的元素的特性

只要是脱离了标准流,元素都是不区分行、块的,体现在任何元素都可以设置宽、高了。都有了收缩的 性质,就是不设置宽度,就自动缩减为里面内容的宽度。

浮动的元素有贴边的性质,绝对定位的元素可以自由定位。

1.盒子的浮动(float 属性):

在标准流中,一个块级元素在水平方向会自动伸展,直到包含它的元素的边界;在竖直方向和兄弟元素一次排列。不能并排。

CSS的float属性默认为none,将float属性设置为left或者right后,元素会向其父元素的左侧或右侧紧靠,同时默认情况下,盒子的宽度不再伸展,而是根据盒子里面的内容的宽度来确定。 脱离了标准文件流。(但是,本显示会占据一定的空间)。

这样未填满的部分就会进行填充。 为了消除影响,不让后面的元素因为浮动产生的这些空间进行填充,使用clear属性进行消除浮动对后面的元素造成的影响:

clear 属性:

clear属性除了可以设置right、left 也可以设置为both,表示同时消除左右两边的影响。

clear属性设置要放到 float 之后的 要消除float影响的兄弟div里面,而不是float本身所在的div。

设置上clear之后,该div会把前面设置float的div 当做块级div来看待。

使用示例:

因为浮动的元素都不在标准流里,如果盒子内部元素都是浮动元素,父级div 缩成一条。

解决方法,在后面加一个空div 并清除 浮动影响.

高度消失后,父级将只保留margin和border的高度,与父级平行的div 将会紧挨着父级显示,显示漂浮的内容 会占据空间,后面div内容 会依次紧挨着漂浮的内容显示。

脱离了标准流,但内容显示上 会被其他元素包围。(其他元素可以“趁空而入”)

浮动可以使块级元素并排显示,用于页面布局。

2.盒子的定位(position):

static (标准流中默认)

盒子按照标准流(包括浮动方式)进行布局。

relative (位于标准流中):

以标准流的排版方式为基础,然后使盒子相对于它在原本的的标准位置偏移指定的距离。相对定位的盒子,仍在标准流中,它后面的盒子仍以标准流方式对待它。

只要标识该div position:relative ;使用 top left 等属性 可以设置偏移量,与父级元素的定位方式无关。

总结:

1.使用相对定位的盒子仍在标准流中,它对付款和兄弟盒子没有任何影响。

2.使用相对定位的菏泽仍在标准流中,它对父块和兄弟盒子没有任何影响。

对浮动的盒子使用相对于定位 也是一样的

absolute (非标准流)

绝对定位,盒子位置以它的包含框为基准进行偏移,绝对定位的盒子从标准流中脱离,其他盒子就当这个盒子不存在一样。

设置position后:div 脱离标准流,宽度自动按内容宽度,覆盖在后面的元素之上。

设置top,left等属性:

top:5px;

跑出了父级的div ,

把father div块 设置成相对定位:

1.使用绝对定位的盒子 以它的”最近“的一个”已经定位“的祖先元素 为基准进行偏移,如果没有定位定位的祖先元素, 那会以浏览器窗口进行定位。

已经定位:position 属性被设置,且被设置的不是 static的任意一种方式。

最近,离该节点最近的一个已经定位的节点。

2.绝对定位的框从标准流中脱离,这意味着对其后兄弟盒子的定位没有影响,其他盒子就好像这个盒子不存在一样。

通过实验可知道:

如果设置了绝对定位,而没有设置偏移属性,那么它仍将保持原来的位置,这个性质可以用于需要使某个元素脱离标准流,而仍然希望保持原来的位置的情况。

fixed (以窗口为基准)

固定定位,基准不是祖先元素 而是浏览器窗口 或者其他县市设备的窗口。

z-index:

当块被设置了position属性时,该值便可设置各块之间的重叠高低关系,默认z-index值为0

盒子的display属性:

none :此元素不会被显示。

block:显示为块级元素,前后会带有换行符。

inline:默认 此元素被显示为内联元素,元素前后没有换行符。

list-item:作为列表显示

图书推荐:大家可以参考《CSS彻底研究》来进行学习,如需相关资料请留言!


浮动是为了元素标签的并排显示问题。

我们在浏览网页的时候,经常会看到 几个 div 块是可以并排显示的, 浮动就是解决这样问题的方法之一。

float属性有以下的值

  • float: left; 左浮动
  • float: right 右浮动

浮动的特点

  • 浮动主要针对的是并排显示的盒子而言。
  • 在一个父容器的盒子里, 兄弟元素之间要浮动必须都浮动。
  • 父容器必须要有一个足够的宽度,否则不足以使得各个子元素之间并排展示。
  • 一个父容器的盒子内,兄弟元素会按照顺序贴靠,如果是左浮动,就往左贴合;如果是右浮动,就往右贴合。如果发现贴合的盒子后没有足够的空间,则会在寻找前一个兄弟元素进行贴靠。直到空间合适为止。
  • 浮动的元素已经脱离了标准的HTML文档流,不再区分块级元素、行内元素并且一律能设置宽度和高度,即使它是span标签或者a标签


一个浮动的例子

<!--一个浮动的例子-->
<style>


    .box1 {
        width: 600px;
        height: 200px;
        border: 1px solid #000;
    }


    .box1 .con1 {
        width: 200px;
        height: 200px;
        background-color: orange;
        float: left;
    }


    .box1 .con2 {
        width: 200px;
        height: 200px;
        background-color: blue;
        float: left;
    }


    .box1 .con3 {
        width: 201px;
        height: 200px;
        background-color: yellowgreen;
        float: left;
    }
</style>
<div class="box1">
        <div class="con1"></div>
        <div class="con2"></div>
        <div class="con3"></div>
</div>


一个顺序贴靠的例子

<!--  一个顺序贴靠的例 子-->
<!-- 以下代码中 兄弟元素 con1, con2, con3 之间会进行顺序贴靠-->
<!-- con3 在贴靠 con2 的时候,发现父容器的宽度只能是400px, 分别被con1 和 con2 占据, 所以con3 会找 cont1 贴靠,最终con3 位于 con1右边, con2下边 -->


<style>


  .box1 {
      width: 400px;
      height: 200px;
      border: 1px solid #000;
  }


  .box1 .con1 {
      width: 200px;
      height: 200px;
      background-color: orange;
      float: left;
  }


  .box1 .con2 {
      width: 200px;
      height: 100px;
      background-color: blue;
      float: left;
  }


  .box1 .con3 {
      width: 200px;
      height: 100px;
      background-color: yellowgreen;
      float: left;
  }
</style>
<div class="box1">
  <div class="con1"></div>
  <div class="con2"></div>
  <div class="con3"></div>
</div>


清除浮动

清除浮动是为了 不影响设置浮动标签的后续的标签的布局展示。

因为,在一个父容器中,子元素浮动了,脱离了标准文档流,不在占用之前的位置,会导致 无法撑开没有设置高度的父元素;从而导致后续的结构挤压,造成整个页面布局的混乱。

  • 给父元素加个高度。在那些明确知道父容器高度的情况下,可以使用。
<style>
  * {
    margin: 0;
    padding: 0;
  }


  div {
    height: 100px;
  }
  p {
    float: left;
    width: 100px;
    height: 100px;
    margin-right: 20px;
    background-color: red;
  }
</style>


<body>
  <div>
    <p></p>
    <p></p>
  </div>


  <div>
    <p></p>
    <p></p>
    <p></p>
  </div>
</body>
  • 后续元素增加 clear:both ,清除前面元素对自己的影响。
<style>
    * {
        margin: 0;
        padding: 0;
    }


    .box2 {
        margin-top: 20px;
        clear: both;
    }
    p {
        float: left;
        width: 100px;
        height: 100px;
        margin-right: 20px;
        background-color: red;
    }
</style>


<body>
<div>
    <p></p>
    <p></p>
</div>


<div class="box2">
    <p></p>
    <p></p>
    <p></p>
</div>
</body>
  • 浮动的父容器添加后续伪元素,clear:both ,清除浮动对后续元素的影响(推荐方式)。
<style>
  * {
      margin: 0;
      padding: 0;
  }


  .cleafix::after {
      content: '';
      clear: both;
      display: block
  }


  p {
      float: left;
      width: 100px;
      height: 100px;
      margin-right: 20px;
      background-color: red;
  }
</style>


<body>


<div class="cleafix">
  <p></p>
  <p></p>
</div>


<div class="cleafix">
  <p></p>
  <p></p>
  <p></p>
</div>
</body>
  • 额外的空标签,在浮动元素的父盒子之后添加一个空标签,空标签上添加 clear:both 属性。
<style>
* {
  margin: 0;
  padding: 0;
}


.clearboth {
  clear: both;
}


p {
  float: left;
  width: 100px;
  height: 100px;
  margin-right: 20px;
  background-color: red;
}
</style>


<body>
<div>
<p></p>
<p></p>
</div>


<div class="clearboth"></div>


<div>
<p></p>
<p></p>
<p></p>
</div>
</body>
  • 浮动元素的父容器添加 overflow:hidden , 使得子元素的浮动只能作用在父容器内。

节课介绍CSS的浮动。