【正视CSS 08】巅峰对武之float你为什么要坍塌我的元素!!!

简介:
前言

事情还要回答一个月前,当时寒冬老师搞了一道position的面试题,我当时有幸给看到了,而且正是我要去外地的那天。

于是我那天上午便开始入魔了,写完了博客才急急忙忙上飞机:

各位周末结束后都累了吧,那我们一起来看看【寒冬】的面试题吧(据说阿里的哟)

当时只是草草的回答了那道题,却没想到今天会再拿出来说事!对的,我还是搞不懂为什么float会导致元素坍塌!!!!

近期状况

我CSS的名师是:张鑫旭(自认入门的)

最近引导者:寒冬

我CSS方面的东西除了之前的积累,基本来源于此两人,各位可以关注下。

多数知识来源于张鑫旭,寒冬让我把整个知识串了起来,虽然素不相识,在此谢过了。

引出问题

我最近一直在思考float实现的原理。
我最开始根据各种学习后产生了一个认识,float破坏了行内框inline boxes
从而导致块级元素坍塌,因为块级元素的高是line-height撑起来的,而line-height又来源于line boxes。
但是最近学习了BFC后,知道float触发了bfc,导致其独立了出来,所以元素被包裹了,这也是overflow清楚浮动的原理。
那么float到底做了些什么事情呢???

虽然我昨天病了,这个问题却在脑中挥之不去,所以今天搞完js后,觉得还是有必要深究一下。

不研究就算了,一研究又发现一个高手,好像是前端观察,只不过我不认识罢了。。。我这里也不管他是谁了,开始今天的学习吧。

clear:none=>闭合浮动

关于这个问题,我其实也必将迷糊的,因为我在用自己形成的CSS世界观解释问题时候一说到清楚浮动就感觉奇怪!

clear对应属性:left, right, both, none
按道理说clear: none才是清除浮动啦
所以我们这里为他取名闭合浮动较为合理。而且他也解释了为什么overflow可以导致坍陷消失。

haslayout与block formatting contexts

IE7以下特有的layout以及BFC再次光临了,我都不知道最近有多少次提到他了。

通过之前我们的学习(清除浮动的具体例子我这里就不管了),想要解决高度塌陷的问题无非两种方案:

① 在浮动元素末尾加上clear: both 属性,强制其闭合元素

② 设置overflow或者display: table属性触发BFC(这里寒冬老师有不同的认识,他认为对名词触发不合适),从而解决坍塌问题。

关于BFC(现在他换了个马甲叫做flow root),大家应该相对熟悉了。

我的理解是所有normal flow的元素皆处于同一BFC,float元素处于一个BFC,每个绝对定位单独一个BFC

PS:此处有误请提出来。

我们的BFC可以解决上外边距叠加,可以强制包含float元素,通俗点说:

BFC就是一个独立的盒子,里面的子元素不会再布局上影响外面元素,BFC依然属于普通流
overflow闭合浮动的真相便是:

父级元素拥有了新的BFC,具有BFC的块级元素可以包含浮动!

以上好像是官方定义了,再往下面挖就没意思了。

IE6/7中没有BFC这个概念,其自身实现的haslayout基本等同于BFC。

所以我们在IE6/7中闭合浮动时候要加上一句,zoom: 1的属性触发haslayout

真相到此为止?

以上就是追寻后得到的真相,虽然我还是不太满意,虽然我还有点迷迷糊糊但是暂时这样吧,在今后一段时间里面,我还会再回来回看这个问题。

届时,我希望自己能找到自己想要的答案。

意外之喜

此次找寻答案过程中虽然没有完全得到我想要的答案,却意外得到了其它东西,他的名字便是inline-block。

对的,你没有看错,我要说的就是inline-block!

其实我们还是很喜欢人云亦云的,比如说我就一直认为IE7之前没有inline-block这个属性,其实这是大错特错的!

复制代码
 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3     <title></title>
 4     <style type="text/css">
 5         span { height: 100px; border: 1px solid black; }
 6         .ib { display: inline-block; }
 7     </style>
 8 </head>
 9 <body>
10     <span class="ib">叶小钗</span> <span>叶小钗</span> <span class="ib">叶小钗</span>
11 </body>
12 </html>
复制代码


以上是标准浏览器,我们来看看我们的IE7:



大家看到了,虽然中间那块有问题,但是我们的inline-block是没有问题的!!!

其中中间那个家伙的底边没有了,大家知道是为什么的(layout)。

以上是行内元素,我们来看看块级元素的表现。

复制代码
 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3     <title></title>
 4     <style type="text/css">
 5         div { height: 100px; border: 1px solid black; *zoom: 1 }
 6         .ib { display: inline-block; }
 7     </style>
 8 </head>
 9 <body>
10     <div class="ib">
11         叶小钗</div>
12     <div class="ib">
13         叶小钗</div>
14     <div>
15         叶小钗</div>
16 </body>
17 </html>
复制代码


我们来看看IE7的表现:

这家伙直接没有理我啊!!!所以说,并不是inline-block没有,而只是对块级元素的支持有问题罢了,所以我们对于块级元素需要这么干:

复制代码
 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3     <title></title>
 4     <style type="text/css">
 5         div { height: 100px; border: 1px solid black;  }
 6         .ib { display: inline-block; *zoom: 1; *display: inline; }
 7     </style>
 8 </head>
 9 <body>
10     <div class="ib">
11         叶小钗</div>
12     <div class="ib">
13         叶小钗</div>
14     <div>
15         叶小钗</div>
16 </body>
17 </html>
复制代码


虽然他们之间的间隔却没有了,却达到了我们的目标。问题又来了:

inline-block为什么会有莫名的间隔?

注意看图的朋友应该看到了,inline-block元素在现代浏览器中有间隔,我搞了很久查询确实是有!

这是因为默认情况下inline元素之间就有间隔(IE7不会有间隔)!

复制代码
 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3     <title></title>
 4     <style type="text/css">
 5         div { height: 100px; border: 1px solid black; margin: 0; display: inline;  }
 6     </style>
 7 </head>
 8 <body>
 9     <div class="ib">
10         叶小钗</div>
11     <div class="ib">
12         叶小钗</div>
13     <div>
14         叶小钗</div>
15 </body>
16 </html>
复制代码

 



IE7

这个问题你抓破头发都不会知道原因!!!

因为块级元素搞成inline的时候,在编辑器中换号了,浏览器认为换行就是一个空格,所以将他们写到一起吧!囧
 

此处我不再纠结下去了,附上抄来的解决空隙的代码:

复制代码
 1 .dib-wrap {
 2     font-size:0;/* 所有浏览器 */
 3     *word-spacing:-1px;/* IE6、7 */
 4 }
 5 .dib-wrap .dib{
 6     font-size: 12px;
 7     letter-spacing: normal;
 8     word-spacing: normal;
 9     vertical-align:top;
10 }
11 @media screen and (-webkit-min-device-pixel-ratio:0){
12 /* firefox 中 letter-spacing 会导致脱离普通流的元素水平位移 */
13      .dib-wrap{
14             letter-spacing:-5px;/* Safari 等不支持字体大小为 0 的浏览器, N 根据父级字体调节*/
15     }
16 }
17 .dib {
18     display: inline-block;
19     *display:inline;
20     *zoom:1;
21 }
复制代码
结语

咳咳,其实我病了。。。我养伤去了,刚刚求妹子顶就有个兄弟踩了我下,现在求兄弟顶好吧。。。。



本文转自叶小钗博客园博客,原文链接http://www.cnblogs.com/yexiaochai/archive/2013/06/15/3137648.html如需转载请自行联系原作者
相关文章
|
3月前
|
前端开发 算法 Java
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
(CSS)使用Flex布局,帮助你快速了解各种基本的Flex布局属性以及帮你让元素快速达到布局中的指定位置!
156 0
|
3月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(六):全方面分析css的Flex布局,从纵、横两个坐标开始进行居中、两端等元素分布模式;刨析元素间隔、排序模式等
Flex 布局 布局的传统解决方案,基于盒状模型,依赖 display 属性 + position属性 + float属性。它对于那些特殊布局非常不方便,比如,垂直居中就不容易实现。 2009年,W3C 提出了一种新的方案----Flex 布局,可以简便、完整、响应式地实现各种页面布局。目前,它已经得到了所有浏览器的支持,这意味着,现在就能很安全地使用这项功能。 一、Flex 布局是什么? Flex 是 Flexible Box 的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。
312 1
|
3月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(四):元素盒子模型;详细分析边框属性、盒子外边距
盒模型 盒模型: 所谓盒模型,就是浏览器为页面中的每个HTML元素生成的矩形盒子。 这些盒子们都要按照可见板式模型在页面上排布。 可见的板式模型主要由三个属性控制:position 属性、display 属性和 float属性。 position属性控制页面上元素间的位置关系。 display属性控制元素是堆叠、并排或者不在页面上显示。 float属性提供控制的方法,以便于把元素组成成多栏布局。 盒模型讲解: 在默认的情况下,每个盒子的边框是不可见的,背景也是透明的。 所以我们 不能直接的看到页面中的盒
198 1
|
3月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(二):CSS伪类:UI伪类、结构化伪类;通过伪类获得子元素的第n个元素;创建一个伪元素展示在页面中;获得最后一个元素;处理聚焦元素的样式
伪类:伪类这个叫法源自于它们跟类相似,但实际上并没有类会附加到标记中的标签上。 伪类分为两种(以及新增的伪类选择器): UI伪类:会在HTML元素处于某种状态时(例如:鼠标指针位于连接上),为该元素应用CSS样式。 :hover 结构化伪类:会在标记中存在某种结构上的关系时 例如: 某元素是一组元素中的第一个或最后一个,为该元素应用CSS样式。 :not和:target(CSS3新增的两个特殊的伪类选择器)
212 1
|
3月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(五):背景属性;float浮动和position定位;详细分析相对、绝对、固定三种定位方式;使用浮动并清除浮动副作用
position定位(核心) 我们讲盒模型的时候,提到了3个属性可以用来控制页面排版。 三大属性:position属性,display属性,float属性。 position 属性控制页面上元素间的位置关系。 display 属性控制页面元素是否显示或者是堆叠还是并排显示。 float 属性提供控制方法。 通过float这种控制方法,可以实现多栏布局,导航菜单等等。 position属性是干嘛用的?怎么用?有哪些属性值? position属性控制页面上元素间的位置关系,也就是排版。 怎么用?要知道怎么用
452 1
|
3月前
|
前端开发 算法 Java
【CSS】前端三大件之一,如何学好?从基本用法开始吧!(三):元素继承关系、层叠样式规则、字体属性、文本属性;针对字体和文本作样式修改
继承 我们的CSS中很多的属性也是可以继承的,其中相当一部分是跟文字的相关的,比如说颜色、字体、字号。 当然还有一部分是不能继承的。 例如边框、内外边距。 层叠 层叠是CSS的核心机制。 层叠的工作机制: 当元素的同一个样式属性有多种样式值的时候,CSS就是靠层叠机制来决定最终应用哪种样式。 层叠规则: 层叠规则一:找到应用给每个元素和属性的声明。 说明:浏览器在加载每个页面时,都会据此查找到每条CSS规则, 并标识出所有受到影响的HTML元素。
145 0
|
11月前
|
前端开发 JavaScript
如何使用CSS过渡实现页面元素的淡入淡出效果?
如何使用CSS过渡实现页面元素的淡入淡出效果?
502 79
|
前端开发 JavaScript UED
CSS滚动效果和视差滚动的原理、应用及其对用户体验的影响。从平滑滚动到元素跟随,再到滚动触发动画
本文探讨了CSS滚动效果和视差滚动的原理、应用及其对用户体验的影响。从平滑滚动到元素跟随,再到滚动触发动画,这些效果增强了页面的吸引力和互动性。视差滚动通过不同层次元素的差异化移动,增加了页面的深度感和沉浸感。文章还讨论了实现方法、性能优化及案例分析,旨在为设计师和开发者提供实用指导。
359 7
|
存储 Java
百度搜索:蓝易云【Java语言之float、double内存存储方式】
由于使用IEEE 754标准进行存储,float和double类型可以表示非常大或非常小的浮点数,并且具有一定的精度。然而,由于浮点数的特性,它们在进行精确计算时可能会存在舍入误差。在编写Java程序时,需要注意使
264 0
|
存储 C语言
C 语言实例 - 计算 int, float, double 和 char 字节大小
C 语言实例 - 计算 int, float, double 和 char 字节大小。
226 1