• Float详解(转贴)


    FLOAT(浮动)概念也许是 CSS中最让人迷惑的一个概念吧。Float经常被错误理解,而且因为将上下文元素全部浮动导致的可读性、可用性问题备受责难。然而,这些问题的根源并不在于理论本身,而是开发人员以及浏览器对理论的解读造成的。

    如果你认真的去读一下浮动概念,你会发现并不像所见的那样复杂。大多数问题都是由于老版本的IE带来的(我只是猜想)。如果你知道这些bug,你就能避免这些问题。

    让我们尝试去解决这些问题并澄清一些以前使用浮动的误解。我们参考了成打的相关文章,并选取了最为重要的一些你必须了解的问题。

    “ 关于图文围绕的实践可以追溯到很久很久以前。这也就是为什么从Netscape1.1开始这个功能被引入浏览器,以及为什么CSS使用浮动属性来实现它。 ‘Float(浮动)’这个术语引用自伴随Netscape1.1一同发布的‘Additions to HTML 2.0’文档,描述一个元素浮动至某一侧并停下的表现方式。”[Containing Floats]

    “浮动元素的定位还是基于正常的文档流,然后从文档流中抽出并尽可能远的移动至左侧或者右侧。文字内容会围绕在浮动元素周围。当一个元素从正常文档流中抽出后,仍然在文档流中的其他元素将忽略该元素并填补他原先的空间。” [Float Positioning]

    元素浮动后将自动转为块级元素。该元素可以被移动至当前行的左侧或右侧。属性如下:float: left, float: right or float: none”[Floatutorial: Float Basics]

    你应该为所有的浮动元素设定宽度属性(除非是<img>元素,因其具有隐含的宽度)。如果不设定宽度,结果将是不可预知的。”[Floatutorial: Float Basics]

    “ 举例来说,浮动元素应该定义宽度属性,不论是显式指定的还是隐含的。另外,它会尽可能的水平的填充容器元素,就像非浮动内容那样,不给其他内容空间以围绕 它们。其次,和正常文档流中的元素不同,浮动元素的垂直边距 (margin)不会叠加(这句是什么意思?什么叫垂直边距的叠加?)最后,浮动元素可以和临近在正常文档流中块级元素重叠(译注:浮动 元素不占任何正常文档流空间,所以建议不要理解成重叠,而是腾空浮动的概念。)。”[CSS Positioning: Floats]

    “首先我们要牢记的一件事情是,浮动元素只能浮动至左侧或者右侧,没有浮动至中间一说,这是很多新手容易范的错误。记住,最基本的规则,浮动元素只能浮动至两侧。” [Float Layouts]

    “ 当我们让一个元素浮动,它会往右或者往左浮动直至遇到容器的边缘。如果我们向同一方向再浮动一个元素,它会浮动直至碰到前一个浮动元素的边缘。如果我们浮 动更多的元素,他们将一个挨一个排列,但不久就会空间不足,当该行已经无法容纳更多的浮动元素,则下一个浮动元素会换行继续排列。” [Float Layouts]

    Containing blocks or containing boxes:“容器元素是指包含其他子元素的行级或块级元素。。。。” [Floatutorial]

    当明确指定时,浮动元素垂直位置由它原先在文档流中的位置决定,顶端与当前行顶端对其。但是水平方向上,它尽可能远的向容器元素边缘移动,但是仍遵循容器 元素的填充距离(padding)。同行行内元素围绕浮动元素排列。” [CSS Positioning: Floats]

    “ 由于浮动元素不占据正常文档流空间,所以浮动元素前后那些未明确指定位置的块级元素会占据浮动元素本来应该处在的位置,就好像它从来不曾存在过。而浮动元 素之后的那行会根据浮动元素缩小宽度浮动元素之前的元素则会重新被排列,占据独立的一行(我验证了下,IE8.0中是的确这样)(译注:ie 和 ff 在这种情况下的表现不尽相同)

    如果当前行的水平方向上没有足够的空间容纳浮动元素,则向下一行,直至有能容纳该元素的行

    “任何浮动元素都不可能超过原来所处文档流位置的上边界。浮动元素的顶端必定和当前行顶端对齐(或者在没有当前行元素时和前一个块级元素底部边缘对齐)。”[Float Layouts]

    “ 想要真正理解浮动理论,你必须明白在CSS中什么是行 (line box)。不幸的是,为了解释什么是行,你必须先明白什么是行级元素。行级元素指的是那些非块级元素,例如<em>(强调标签).而行是一个逻辑上的概念,是一个虚拟的 矩形,包含了组成该行的所有行级元素,其高度至少等于这些行级元素中最高的那个。” [Float Layouts]

    “如果我们将DIV中所有的列都加上 float: left 它们会挨个向左排列,如果我们希望在页面底部有一个页脚,并不需要一个最长的列,只要加上 clear: both 就可以了”[Float Layouts]

    “使用浮动元素包含浮动元素这样的布局方式有一个潜在的缺点,即你的页面是否能够一直保持一致的展现效果将取决于浏览器的实现是否保持一致。特别是当浮动元素是一个更为复杂的布局中的一部分的话,将变得更加不堪一击。”[Containing Floats]

    浮动元素之后的元素会自动围绕该浮动元素。如果你不希望这样,你可以为这些元素(指浮动元素之后的元素)应用‘clear’属性。该属性有4种设值:clear: left, clear: right, clear: both or clear: none”[Floats and “clear”]

    有 很多技巧可以做到清理浮动元素,但不引入额外的无语义标签。下面3种是比较常见的做法:

    a) 将容器元素一起浮动 (这我试了下,但似乎不管用啊)

    b) 在容器元素上使用 overflow: hidden (不太明白,overflow是针对溢出的内容而说的,那设置的float属性的元素其大小究竟是多少,边界在哪里?)

    c) 使用:after这样的css伪类。 (完全不明白,什么意思啊?)

    “插入一个清理元素是使容器正确包裹所有浮动元素的标准做法,这样做具有将容器底部边缘 ‘拖拉’以包裹所含元素的效果。” [How To Clear Floats Without Structural Markup]

    “对于基于浮动设计的布局来说,一个常见的问题就是浮动元素的容器不会自动伸展来包含浮动元素(也就是说如果父级元素除了float外没有其它显示的内容,则该父级元素会塌陷)。如果你希望在所有的浮动元素的外面加上边框(例如,在容器元素上加上边框),这样你必须显示的命令浏览器来伸展容器。你可以是用overflow method(为父级容器设置overflow:hidden或overflow:auto)方法。

    使 用:after 想像一下我们使用:after来插入一个点号,并且设置它的属性{clear: both;}。这就是所有你需要做的事情,但是没有人会接受容器底部有那么一丝空隙,所以我们还要设置{height: 0;} 和 {visibility: hidden;} 来保证严丝合缝。

    补充:清除浮动的方法目前用来清除浮动的方法,主要是以下四种:

    1.    额外标签法

    这种方法就是向父容器的末尾再插入一个额外的标签,并令其清除浮动(clear)以撑大父容器。这种方法浏览器兼容性好,没有什么问题,缺点就是需要额外的(而且通常是无语义的)标签,但这是W3C推荐的方法

    <div style="clear:both;"></div>
    或者使用

    <br style="clear:both;" />

    2. 使用after伪类

    这种方法就是对父容器使用after伪类和内容声明在指定的现在内容末尾添加新的内容。经常的做法就是添加一个“点”,因为它比较小不太引人注意。然后我们再利用它来清除浮动(闭合浮动元素),并隐藏这个内容。
    这种方法兼容性一般,但经过各种 hack 也可以应付不同浏览器了,同时又可以保证html 比较干净,所以用得还是比较多的。

    以下为引用的内容:
    #outer:after{
         content:".";
         height:0;
         visibility:hidden;
         display:block;
         clear:both;
    }

    3.    设置overflow为hidden或者auto

    这种做法就是将父容器的overflow设为 hidden或auot就可以在标准兼容浏览器中闭合浮动元素.
    不过使用overflow的时候,可能会对页面表现带来影响,而且这种影响是不确定的,你最好是能在多个浏览器上测试你的页面

    4. 浮动外部元素,float-in-float

    这种做法就是让父容器也浮动,这利用到了浮动元素的一个特性——浮动元素会闭合浮动元素。这种方式在 IE/Win 和标准兼容浏览器中都有较好的效果,但缺点也很明显——父容器未必想浮动就浮动的了,毕竟浮动是一种比较特殊的行为,有时布局不允许其浮动也很正常。

  • 相关阅读:
    100 道 Linux 常见面试题
    借助Redis锁,完美解决高并发秒杀问题
    'cnpm'安装install
    Git常用命令及方法大全
    idea controller service impl mapper xml切换跳转快捷键
    idea创建springboot项目用阿里云镜像
    mybatis.type-aliases-package的作用和用法
    MyBatis Generator
    https://antdv.com/components/layout-cn/
    https://mvnrepository.com/search?q=mysql-connector-java //maven
  • 原文地址:https://www.cnblogs.com/showker/p/1740847.html
Copyright © 2020-2023  润新知