05. CSS 浮动

浮动图文解析

浮动的特性

清除浮动

浏览器的兼容性问题

在 CSS 中,通过 float 属性来实现元素的浮动。

浮动会使使元素脱离文档流,按照指定的方向(左或右发生移动),直到它的外边缘碰到包含框或另一个浮动框的边框为止。

  

说到脱离文档流要说一下什么是文档流,文档流是是文档中可显示对象在排列时所占用的位置/空间,而脱离文档流就是在页面中不占位置了。

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

一、浮动图文解析

(1) 标准流

(2) div2 左浮动

  • div2 将脱离标准流,但div1、div3、div4仍然在标准流当中

  • div3会自动向上移动,占据div2的位置,div1、div3、div4依次排列,重新组成一个流。

  • 因为浮动是漂浮在标准流之上的,因此div2挡住了一部分div3,div3看起来变“矮”了

浮动可以理解为让某个div元素脱离标准流,漂浮在标准流之上,和标准流不是一个层次

(3) div2、div3 左浮动

  • div2、div3 将脱离标准流,但 div1、div4 仍然在标准流当中

  • div4 会自动上移,与 div1 组成一个“新”标准流,而 div3 会跟随在 div2 之后

  • 浮动是漂浮在标准流之上,因此 div2 又挡住了 div4

div2在每个例子中都是浮动的,但并没有跟随到div1之后。因此,我们可以得出一个重要结论:

假如某个div元素A是浮动的,如果A元素上一个元素也是浮动的,那么A元素会跟随在上一个元素的后边(如果一行放不下这两个元素,那么A元素会被挤到下一行);如果A元素上一个元素是标准流中的元素,那么A的相对垂直位置不会改变,也就是说A的顶部总是和上一个元素的底部对齐。

(4) div2、div4 左浮动

  • div2、div4 将脱离标准流

  • div3 将会自动上移,与 div1 组成新标准流

  • div2 上一个元素 div1 是标准流中的元素,因此 div2 相对垂直位置不变,与 div1 底部对齐。

  • div4 上一个元素 div3 是标准流中的元素,因此div4的顶部和div3的底部对齐, 并且总是成立的,因为从图中可以看出,div3上移后,div4也跟着上移,div4总是保证自己的顶部和上一个元素div3(标准流中的元素)的底部对齐。

浮动的特殊情况:如果有浮动元素的高度大于换行的那个元素,那么当换行元素换行时会被高的那个元素“卡住”

浮动对文字的影响:文本围绕浮动框

二、浮动的特性

① 块级元素可以横排显示

② 行内元素可以设置宽度和高度

③ 元素没有设置宽度和高度时,宽度为内容撑开宽

④ 支持margin

⑤ 脱离文档流

提升半层级(和内容一个层级,所以外边的内容就会围绕它)

问题:不支持margin:auto;

三、清除浮动

元素浮动之后,周围的元素将重新排列,浮动元素之后的元素会围绕它,为了避免这种情况,可以使用 clear 属性。

clear 属性指定元素两侧不能出现浮动元素。 clear : none | left | right | both

简单理解:div1、div2 左浮动

要想让 div 下移,就必须在 div2 的 CSS 样式中 clear:left/both 来指定 div2 元素左边/左右两边不允许出现浮动元素,这样 div2 就被迫下移一行。如果在 div1 的 CSS 样式中清浮动是没有用的,因为它只会作用在 div1 中,不会影响 div2。

对于CSS的清除浮动(clear),一定要牢记:这个规则只能影响使用清除的元素本身,不能影响其他元素。

深入理解:

创建一个父级div,并设置border属性,然后下边创建两个子元素span,并设置浮动。具体代码如下所示:

解决方法:

(1) 给父级元素单独定义高度(height)

原理:如果父级元素没有定义高度,父元素的高度完全由子元素撑开时,父级div手动定义height,就解决了父级div无法自动获取到高度的问题。

优点:简单、代码少、容易掌握。

缺点:只适合高度固定的布局,要给出精确的高度,如果高度和父级div不一样时,会产生问题。对于响应式布局会有很大影响。

(2) 在标签结尾处加空div标签 clear:both

原理:添加一个空div,利用css提高的clear:both清除浮动,让父级div能自动获取到高度。

优点:简单、代码少、浏览器支持好、不容易出现怪问题

缺点:不少初学者不理解原理;如果页面浮动布局多,就要增加很多空div,不利于页面的优化

(3) 父级div定义 伪类:after 和 zoom (推荐使用)

原理:元素生成伪类的作用和效果相当于方法2中的原理,但是IE8以上和非IE浏览器才支持:after,zoom(IE转有属性)可解决ie6,ie7浮动问题

优点:浏览器支持好、不容易出现怪问题,写法是固定的,不理解也可以直接复制使用;(小编大力推荐使用此种方法,简单便捷,只需添加一个class即可解决问题)

缺点:css代码多、不少初学者不理解原理,要两句代码结合使用才能让主流浏览器都支持。

(4) 父级div定义 overflow:hidden

优点:简单、代码少、浏览器支持好

缺点:不能和position配合使用,因为超出的尺寸的会被隐藏。(不建议使用此种方式,可能会影响页面元素布局)

四、浏览器的兼容性问题

(1) 微型盒子

IE6不支持小于12px的盒子,任何小于12px的盒子,在IE6中看着都比较大,所以 IE 6不支持微型盒子。

举个例子,我们设置一个 height:5pxwidth:200px 的盒子,看下在IE 8和 IE 6中的显示效果:

解决办法很简单,就是将盒子的字号大小,设置为小于盒子的高,比如,如果盒子的高为5px,那就把font-size设置为0px(0px < 5px)。如下:

height: 5px;
_font-size: 0px;

浏览器hack就是“黑客”,就是使用浏览器提供的后门,针对某一种浏览器做兼容。

IE6留了一个后门:只要给css属性之前,加上下划线,这个属性就是IE6的专有属性。

比如说,我们给背景颜色这个属性加上下划线,就变成了 _background-color: green; 效果如下:

于是乎,为了解决微型盒子(即height小于12px)的问题,正确写法:(注意不要忘记下划线)

height: 10px;
_font-size:0;

(2) IE6 不支持用 overflow:hidden;来清除浮动

解决办法,追加一条:

overflow: hidden;
_zoom:1;

实际上,_zoom:1;能够触发浏览器 hasLayout 机制。这个机制,不要深究了,因为只有IE6有。我们只需要让IE6好用,具体的实现机制,可以自行查阅。

需要强调的是,overflow:hidden; 的本意,就是让溢出盒子的 border 的内容隐藏,这个功能是IE6兼容的。不兼容的是 overflow:hidden; 清除浮动的时候。

(3) 浮动中和margin相关的知识

① margin塌陷:

标准文档流中,竖直方向的margin不叠加,是以较大的为准(水平方向的margin是可以叠加的,即水平方向没有塌陷现象)。如下图所示:

如果不在标准流,比如 div2 浮动了,那么两个盒子之间是没有塌陷现象的。

② IE6 双倍margin的bug:

当出现连续浮动的元素,携带与浮动方向相同的margin时,队首的元素,会双倍marign。

<ul>
    <li></li>
    <li></li>
    <li></li>
</ul>

解决方案:

(1)使浮动的方向和margin的方向,相反。

  • 所以,你就会发现,我们特别喜欢,浮动的方向和margin的方向相反。并且,前端开发工程师,把这个当做习惯了。
    float: left;
    margin-right: 40px;

(2)使用hack:(没必要,别惯着这个IE6)

  • 单独给队首的元素,写一个一半的margin:
<li class="no1"></li>

ul li.no1{
    _margin-left:20px;
}

③ IE6的3px bug

解决办法:不用管,因为根本就不允许用儿子踹父亲(即描述父子之间的距离,请用padding,而不是margin)。所以,如果你出现了3px bug,说明你的代码不标准。

IE6,千万不要跟他死坑、较劲,它不配。 格调要高,我们讲IE6的兼容性问题,就是为了增加面试的成功率,不是为了成为IE6的专家。

posted @ 2019-07-16 12:44  胤小飞  阅读(190)  评论(0)    收藏  举报