css :float:left深入探究1

大家好,本周和大家分享的主题是CSS进阶。CSS不是编程语言,它的语法易懂,使用方便,但同时,利用CSS布局时我们也常常被CSS里各种属性的性质和使用搞得头晕目眩,完全不知所云(这也是CSS不是编程语言的弱势,其逻辑性和严密性不及编程语言)。因此,要想真正掌握CSS,掌握CSS的进阶应用非常必要。话不多说,开始今天的主题,浮动。

    相信使用过浮动布局的同学对浮动是又爱又恨。爱它布局时带来的方便,恨它在布局时产生的“副作用”,怎样才能摆脱这些“副作用”,正确利用CSS浮动进行布局呢?我们还是得从浮动的基本使用开始谈起。 


    首先明确一个准则(非常重要,下面的例子都以它为基础):浮动是一种定位模型,浮动的元素可以左右移动,直到它的外边缘碰到包含框活着另一个浮动框的边缘。浮动元素脱离文本流,因此,在文档的普通流中的元素就会表现得像浮动元素根本不存在一样。


    这句话是什么意思呢?我们来看下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<!doctype html>
< html  lang = "en" >
< head >
     < meta  charset = "UTF-8" >
     < title >Document</ title >
     < style >
         .box1{
             background-color: red;
  }
         .box2{
             background-color: blue;
  }
         .box3{
             background-color: yellow;
  }
         .box{
             width: 500px;
  height: 200px;
  }
     </ style >
</ head >
< body >
     < div  class = "box1 box" ></ div >
     < div  class = "box2 box" ></ div >
     < div  class = "box3 box" ></ div >
</ body >
</ html >

现在有三个div元素,分别是box1,box2和box3.在没有浮动的情况下它们的显示效果如下图所示:

547340d400014c7205000237.jpg

变形一:我们给box2添加左浮动,则会出现下面的效果:

547341f10001da2505000236.jpg

    咦?box3哪儿去了?消失了吗?显然没有(不信你可以在chrome下用F12打开开发者工具查看)!最终呈现效果是这样的原因有以下几点:

        1.由于box2设置了左浮动,因此它会脱离文本流,直到它的外边缘碰到包含框或者另一个浮动元素的边缘,显然,这里只有box2一个元素是浮动的,因此,这里box2的外边缘碰到的是包含框,具体而言,这里的包含框就是body元素的左边缘。

        2.由于box1是块级元素,因此它会占领整个height为200px的区域的所有宽度(即使它自身的宽度只有500px,但该高度内的其它区域仍被它占据),因此box2不能浮动到box1的右边,只能浮动到box1下面的左边缘。即是说,浮动元素的上一个元素如果是标准流中的元素,那么,浮动元素的顶部总是和上一个元素的底部对齐。

        3.由于box2元素浮动,因此在普通文档流中它不占位置,因此,box3元素会向上移动,直到其顶部碰到box1元素的底部(即box3位于box1下面),但是由于box2元素是浮动的,它会浮动于普通文本流之上,因此,形成了box2遮挡box3的效果。


变形二:我们给box3也添加左浮动,效果如下:

547348ca00019c1005000234.jpg

    现在,box3元素出现在box2元素的右边,原因还是最开始提到的那条准则。因为现在有box2,box3两个浮动元素。因此,box3元素的外边缘在碰到同为浮动元素box2的边缘时,停止左浮动。


变形三:现在我们改变三个框的宽度、高度,设置box1高300px,box2,box3高200px,三个box都左浮动,最终的效果如下:

54734b0800012a0105000235.jpg

    这里有两个现象值得注意:

        1.box3出现在box1和box2下面

        2.box3被box1“卡住”

    由于三个box均设置为左浮动,因此在理想情况下三个box应该是并列为一行显示,但是由于每个box宽度为500px,屏幕宽度为1368px,显然第三个box在第一列放不下,因此,box3出现在box1和box2下面。另一方面,由于浮动元素最终停靠在碰到另一个浮动元素边缘的位置,而这里box1的高度为300px,因此box3最终碰到的边缘是box1的边缘,因此最终呈现的效果是box3被“卡住”。


变形四:给这三个box加上一个父元素,mainbox(设置其margin-left:200px)。仍然设置仅有box2浮动,效果如下图所示:(注意和变形一对比)

54734e0c0001449605000235.jpg

    变形四和变形一唯一的区别就是多了一个带margin-left的父元素mainbox,但呈现的效果是box2并没有浮动到页面的左边缘,而是出现在距左边缘200px的位置。原因还是上面的那条准则,浮动元素左移到它的外边缘碰到包含元素的边缘为止(这里没有其它的浮动元素,故不考虑碰到其它浮动元素边缘的情况),而这里的外边缘不再是body元素的边缘,而是mainbox的边缘,因此有了这样的效果。


    明白了浮动元素浮动的原理,那么浮动元素还会给其它元素带来什么影响呢?我们明天继续!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值