목차
产生问题
什么是clearfix
清除浮动 还是 闭合浮动 ?
文档流
BFC
创建
范围
特性
问题解决
为什么坍塌?
如何解决?
父元素上clear: both 不起作用?
推荐阅读
废话
웹 프론트엔드 HTML 튜토리얼 Float知多少_html/css_WEB-ITnose

Float知多少_html/css_WEB-ITnose

Jun 21, 2016 am 08:52 AM

产生问题

先从一个简单的例子说起:

<div class="parent">    <div class="child-left"></div>    <div class="child-right"></div></div>
로그인 후 복사

.parent { width: 200px; margin: 30px auto; border: solid 5px #3498db;}[class^='child'] { opacity: 0.8;}.child-left { float: left; height: 100px; width: 120px; background: #2ecc71;}.child-right { float: right; height: 100px; width: 80px; background: #e74c3c;}
로그인 후 복사

效果大概是这样:(设置透明度只是为了演示)

我们看到的效果是父元素并没有包裹住,两个 float 的子元素,并且它自身的高度为 0。

相信很多前端er都曾为此困惑不已,为什么子元素都 float 会导致父元素高度为 0?据说 clear:both 可以用来清除浮动,那为什么给父元素加上之后没有效果?google,百度一番之后找到了解药—clearfix。

什么是clearfix

.clearfix 可以说是很多前端开发者不可缺少的 补丁 。它可以用来闭合浮动,修复父元素高度坍塌的问题。

.clearfix:before,.clearfix:after { content: "";  display: table;}.clearfix:after { clear: both;}.clearfix { zoom: 1; /* ie 6/7 */}
로그인 후 복사

用法,还是使用上面的例子

<div class="parent clearfix">    <div class="child-left"></div>    <div class="child-right"></div></div>
로그인 후 복사

给父元素加上 clearfix 类名就搞定了。

喜欢折腾的同学肯定知道其实给父容器增加下列属性中的一个都能达到相同效果

overflow: auto;display: table;position: absolute;float: left;
로그인 후 복사

背后究竟发生了什么?带着问题,继续学习几个新名词。

清除浮动 还是 闭合浮动 ?

可能是由于 clear 属性命名的关系,我们经常只会说清除浮动,但是确切地说清除浮动对应的是 clear: left|right|both|none|inherit;而上面的例子,我们是想让浮动的元素闭合,减少浮动带来的影响,应该是属于闭合浮动的范围。

— 那些年我们一起清除过的浮动

文档流

从我接触前端开始,听到的都是文档流,文档流,但真正的称谓应该叫做普通流或常规流(英文为:normal flow )。我的理解是按照HTML标签的位置顺序把元素从上到小,从左到右逐行排版的过程。

在 css2.1 中提到的 w3c-定位方案 有三种:

>

  1. 普通流 ,包括对块级框的块格式,对行级框的行格式,对块级框和行级框的相对定位。
  2. 浮动 ,在浮动模型中,一个框先按照正常排版来摆放,再将它从排版流中取出并尽可能地向左或向右偏移。其它内容可以排在一个浮动的周围。
  3. 绝对定位 ,在绝对定位模型中,一个框会从排版流中完全脱离出来(它对后续的兄弟没有影响),并相对其包含块来指定其位置。(包括 absolute, fixed )

所以浮动也会脱离普通流,但属于一种比较‘特殊’的脱离,其他内容还会围绕在浮动元素周围,这时候父元素无法感知到它的存在。

BFC

BFC 全称为 Block Formatting Context,很多人直译叫它块格式化上下文。它是CSS2.1规范定义的,是页面 CSS 视觉渲染的一部分,用于决定块盒子的布局及浮动相互影响范围的一个区域。简单来说,BFC 就是一种属性,这种属性会影响着元素的定位以及与其兄弟元素之间的相互作用。

创建

下面的情况会产生新的BFC:

  • 根元素或其它包含它的元素
  • 浮动 (元素的 float 不为 none)
  • 绝对定位元素 (元素的 position 为 absolute 或 fixed)
  • 行内块 inline-blocks (元素的 display: inline-block)
  • 表格单元格 (元素的 display: table-cell,HTML表格单元格默认属性)
  • 表格标题 (元素的 display: table-caption, HTML表格标题默认属性)
  • overflow 的值不为 visible的元素
  • 弹性盒 flex boxes (元素的 display: flex 或 inline-flex)

范围

一个BFC包含创建该上下文元素的所有子元素,但不包括创建了新BFC的子元素的内部元素。

特性

BFC最显著的效果是建立一个隔离的空间,断绝空间内外元素相互的作用。当然,还有更多的特性:

  • 内部的盒会在垂直方向一个接一个排列(可以看作BFC中有一个的常规流); 处于同一个BFC中的元素相互影响,可能会发生margin collapse;
  • 每个元素的margin box的左边,与容器块border box的左边相接触(对于从左往右的格式化,否则相反)。即使存在浮动也是如此;
  • BFC就是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面的元素,反之亦然;
  • 计算BFC的高度时,考虑BFC所包含的所有元素,连浮动元素也参与计算;
  • 浮动盒区域不叠加到BFC上;

看到这里,再回头想想之前的几个小问题:

问题解决

为什么坍塌?

为什么会坍塌? float 脱离了普通流,并且创建了新的BFC,而父元素不具备产生 BFC 的条件,所以它的高度为0。

如何解决?

通过了解BFC的特性我们知道,BFC会把它包含的浮动元素高度也算在里面,也就是闭合浮动。拿 overflow: auto 举例:overflow: auto 并不会闭合浮动,而是 overflow: auto 会创建一个新的BFC,避免浮动的元素侵入其他元素。

父元素上clear: both 不起作用?

这应该算是语义理解错了,clear: both 是让两边都不能有浮动元素,清除上方元素“浮动导致高度坍塌”,所以在父元素上用是没有效果的,通常放在浮动元素的下方,同样也会引起父元素拉伸以包裹浮动元素。

推荐阅读

  • 那些年我们一起清除过的浮动
  • 学习块格式化上下文(BlockFormattingContext)
  • All About Floats
  • Stackoverflow what-does-the-css-rule-clear-both-do
  • Stackoverflow how-does-the-css-block-formatting-context-work
  • http://fuseinteractive.ca/blog/understanding-humble-clearfix#.VvjnPRJ94Wo
  • 详说 Block Formatting Contexts (块级格式化上下文)

废话

个人认为类似这类问题在 BAT 面试中属于必得分题,如果答不出来,那迎娶白富美就没你什么事了。

之前一直花心思在如何快速吃成胖子上,没有静下心来沉淀,这就是基础不扎实的表现。

补充:我写文章是为了方便自己复习,总结,也是推动自己学习的主要途径,还有练习写文档的能力,最后的最后才是跟别人分享~所以不建议大家看我们的文章,遇到问题,推荐去 google,翻 w3c 文档,或其他有保证的网站。快餐一时爽,可不能贪杯!

본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

& lt; Progress & Gt의 목적은 무엇입니까? 요소? & lt; Progress & Gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:34 PM

이 기사는 HTML & lt; Progress & Gt에 대해 설명합니다. 요소, 그 목적, 스타일 및 & lt; meter & gt의 차이; 요소. 주요 초점은 & lt; progress & gt; 작업 완료 및 & lt; meter & gt; Stati의 경우

& lt; datalist & gt의 목적은 무엇입니까? 요소? & lt; datalist & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:33 PM

이 기사는 HTML & LT; Datalist & GT에 대해 논의합니다. 자동 완성 제안을 제공하고, 사용자 경험을 향상시키고, 오류를 줄임으로써 양식을 향상시키는 요소. 문자 수 : 159

HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? HTML5의 크로스 브라우저 호환성에 대한 모범 사례는 무엇입니까? Mar 17, 2025 pm 12:20 PM

기사는 HTML5 크로스 브라우저 호환성을 보장하기위한 모범 사례에 대해 논의하고 기능 감지, 점진적 향상 및 테스트 방법에 중점을 둡니다.

& lt; meter & gt의 목적은 무엇입니까? 요소? & lt; meter & gt의 목적은 무엇입니까? 요소? Mar 21, 2025 pm 12:35 PM

이 기사는 HTML & lt; meter & gt에 대해 설명합니다. 범위 내에 스칼라 또는 분수 값을 표시하는 데 사용되는 요소 및 웹 개발의 일반적인 응용 프로그램. & lt; meter & gt; & lt; Progress & Gt; 그리고 Ex

html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? html5 & lt; time & gt; 의미 적으로 날짜와 시간을 나타내는 요소? Mar 12, 2025 pm 04:05 PM

이 기사는 html5 & lt; time & gt; 시맨틱 날짜/시간 표현 요소. 인간이 읽을 수있는 텍스트와 함께 기계 가독성 (ISO 8601 형식)에 대한 DateTime 속성의 중요성을 강조하여 Accessibilit를 향상시킵니다.

HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? HTML5 양식 유효성 검사 속성을 사용하여 사용자 입력을 유효성있게하려면 어떻게합니까? Mar 17, 2025 pm 12:27 PM

이 기사에서는 브라우저에서 직접 사용자 입력을 검증하기 위해 필요한, Pattern, Min, Max 및 Length 한계와 같은 HTML5 양식 검증 속성을 사용하는 것에 대해 설명합니다.

뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? 뷰포트 메타 태그는 무엇입니까? 반응 형 디자인에 중요한 이유는 무엇입니까? Mar 20, 2025 pm 05:56 PM

이 기사는 모바일 장치의 반응 형 웹 디자인에 필수적인 Viewport Meta Tag에 대해 설명합니다. 적절한 사용이 최적의 컨텐츠 스케일링 및 사용자 상호 작용을 보장하는 방법을 설명하는 반면, 오용은 설계 및 접근성 문제로 이어질 수 있습니다.

& lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? & lt; iframe & gt; 꼬리표? 보안을 사용할 때 보안 고려 사항은 무엇입니까? Mar 20, 2025 pm 06:05 PM

이 기사는 & lt; iframe & gt; 외부 컨텐츠를 웹 페이지, 공통 용도, 보안 위험 및 객체 태그 및 API와 같은 대안을 포함시키는 태그의 목적.

See all articles