产生问题
先从一个简单的例子说起:
<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-定位方案 有三种:
>
- 普通流 ,包括对块级框的块格式,对行级框的行格式,对块级框和行级框的相对定位。
- 浮动 ,在浮动模型中,一个框先按照正常排版来摆放,再将它从排版流中取出并尽可能地向左或向右偏移。其它内容可以排在一个浮动的周围。
- 绝对定位 ,在绝对定位模型中,一个框会从排版流中完全脱离出来(它对后续的兄弟没有影响),并相对其包含块来指定其位置。(包括 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 文档,或其他有保证的网站。快餐一时爽,可不能贪杯!

"Code"는 "Code"BroadlyIncludeLugageslikeJavaScriptandPyThonforFunctureS (htMlisAspecificTypeofCodeFocudecturecturingWebContent)

HTML, CSS 및 JavaScript는 웹 개발의 세 가지 기둥입니다. 1. HTML은 웹 페이지 구조를 정의하고 등과 같은 태그를 사용합니다. 2. CSS는 색상, 글꼴 크기 등과 같은 선택기 및 속성을 사용하여 웹 페이지 스타일을 제어합니다.

HTML은 웹 구조를 정의하고 CSS는 스타일과 레이아웃을 담당하며 JavaScript는 동적 상호 작용을 제공합니다. 세 사람은 웹 개발에서 의무를 수행하고 화려한 웹 사이트를 공동으로 구축합니다.

HTML은 간단하고 배우기 쉽고 결과를 빠르게 볼 수 있기 때문에 초보자에게 적합합니다. 1) HTML의 학습 곡선은 매끄럽고 시작하기 쉽습니다. 2) 기본 태그를 마스터하여 웹 페이지를 만들기 시작하십시오. 3) 유연성이 높고 CSS 및 JavaScript와 함께 사용할 수 있습니다. 4) 풍부한 학습 리소스와 현대 도구는 학습 과정을 지원합니다.

anexampleStartingtaginhtmlis, whithbeginsaparagraph.startingtagsareessentialinhtmlastheyinitiate rements, definetheirtypes, andarecrucialforstructurituringwebpages 및 smanstlingthedom.

메뉴에서 점선 분할 효과를 설계하는 방법은 무엇입니까? 메뉴를 설계 할 때는 일반적으로 접시 이름과 가격 사이에 왼쪽과 오른쪽을 정렬하는 것이 어렵지 않지만 점선 또는 중간의 점은 어떻습니까?

웹 코드 편집기의 HTML 요소 분석 많은 온라인 코드 편집기를 사용하면 사용자가 HTML, CSS 및 JavaScript 코드를 입력 할 수 있습니다. 최근에 누군가가 제안했습니다 ...

React-App-Lerewired를 사용하여 정적 페이지를 구축 할 때 코드 압축을 피하는 방법에 대해 많은 개발자가 제공하고 싶어합니다.


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

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

Atom Editor Mac 버전 다운로드
가장 인기 있는 오픈 소스 편집기

SublimeText3 영어 버전
권장 사항: Win 버전, 코드 프롬프트 지원!

메모장++7.3.1
사용하기 쉬운 무료 코드 편집기

뜨거운 주제



