CSS中重要的BFC

html-css016

CSS中重要的BFC,第1张

CSS中有个重要的概念BFC,搞懂BFC可以让我们理解CSS中某些原本诡异(??)的地方。

在解释BFC之前,先说一下文档流。我们常说的文档流其实分为 定位流 浮动流 普通流 三种。而普通流其实就是指BFC中的FC。FC(Formatting Context),直译过来是格式化上下文,它是页面中的一块渲染区域,有一套渲染规则,决定了其子元素如何布局,以及和其他元素之间的关系和作用。常见的FC有BFC、IFC,还有GFC和FFC。

BFC (Block Formatting Context)块级格式化上下文,是用于布局块级盒子的一块渲染区域。[MDN上的解释]:BFC是Web页面 CSS 视觉渲染的一部分,用于决定块盒子的布局及浮动相互影响范围的一个区域。

注意:一个BFC的范围包含创建该上下文元素的所有子元素,但 不包括 创建了新BFC的子元素的内部元素。这从另一方角度说明,一个元素不能同时存在于两个BFC中。因为如果一个元素能够同时处于两个BFC中,那么就意味着这个元素能与两个BFC中的元素发生作用,就违反了BFC的隔离作用。

常规流(Normal flow)

浮动(Floats)

绝对定位(Absolute positioning)

注意: display:table也可以生成BFC的原因在于Table会默认生成一个匿名的table-cell,是这个匿名的table-cell生成了BFC。

浏览器对BFC区域的约束规则:

规则解读:

BFC是页面上的一个隔离的独立容器,容器里面的子元素不会影响到外面元素,反之亦然。我们可以利用BFC的这个特性来做很多事。

一个正常文档流的block元素可能被一个float元素覆盖,挤占正常文档流,因此可以设置一个元素的float、display、position值等方式触发BFC,以阻止被浮动盒子覆盖。

[使用BFC阻止元素被浮动元素覆盖]点击预览

通过改变包含浮动子元素的父盒子的属性值,触发BFC,以此来包含子元素的浮动盒子。

[使用BFC包含浮动元素]

注意,这里触发BFC并不能阻止其它形式的脱离文档流的元素覆盖正常流元素。

BFC内部其他形式脱离文档流(absolute fixed) 点击预览

有时候因为多列布局采用小数点位的width导致因为浏览器因为四舍五入造成的换行的情况,可以在最后一列触发BFC的形式来阻止换行的发生。比如下面栗子的特殊情况

使用BFC阻止多列布局最后一列换行 点击预览

属于同一个BFC的两个相邻块级子元素的上下margin会发生重叠,(设置writing-mode:tb-rl时,水平margin会发生重叠)。所以当两个相邻块级子元素分属于不同的BFC时可以阻止margin重叠。

这里给任一个相邻块级盒子的外面包一个div,通过改变此div的属性使两个原盒子分属于两个不同的BFC,以此来阻止margin重叠。

使用BFC阻止margin合并 点击预览

但是这里有个 疑问 点击预览 :

如果外面包一层div,设置能触发BFC的任何属性都能阻止相邻元素的margin合并。因为分属不同BFC不会发生margin合并。

而如果在外面不包一个div的话,当设置display为inline-block、inline-flex、table-captain,和position为absolute、fixed,float为left、right是可以阻止margin合并的。这里问题来了:

我们知道设置position和float会让元素脱离文档流并且又创建新的BFC,所以两个元素就不是相邻元素了,因此可以阻止相邻元素margin合并,但是inline-block、inline-flex、inline-grid、table-captain为什么可以呢?如果有人知道为什么,请告知~

应该熟练掌握的基础技能:

HTML4,HTML5语法、标签、语义

CSS2.1,CSS3规范,与HTML结合实现各种布局、效果

Ecma-262定义的javascript的语言核心,原生客户端javascript,DOM操作,HTML5新增功能

一个成熟的客户端javascript库,推荐jquery

一门服务器端语言:如果有服务器端开发经验,使用已经会的语言即可,如果没有服务器端开发经验,熟悉Java可以选择Servlet,不熟悉的可以选PHP,能实现简单登陆注册功能就足够支持前端开发了,后续可能需要继续学习,最基本要求是实现简单的功能模拟,

HTTP

在掌握以上基础技能之后,工作中遇到需要的技术也能快速学习。

基本开发工具

恰当的工具能有效提高学习效率,将重点放在知识本身,在出现问题时能快速定位并

解决问题,以下是个人觉得必备的前端开发工具:

文本编辑器:推荐Sublime Text,支持各种插件、主题、设置,使用方便

浏览器:推荐Google Chrome,更新快,对前端各种标准提供了非常好的支持

调试工具:推荐Chrome自带的Chrome develop tools,可以轻松查看DOM结构、样式,通过控制台输出调试信息,调试javascript,查看网络等

辅助工具:PhotoShop编辑图片、取色,fireworks量尺寸,AlloyDesigner对比尺寸,以及前面的到的Chrome develop tools,

FQ工具:lantern, 壁虎漫步

学习方法和学习目标

方法:

入门阶段反复阅读经典书籍的中文版,书籍中的每一个例子都动手实现并在浏览器中查看效果

在具备一定基础之后可以上网搜各种教程、demo,了解各种功能的实际用法和常见功能的实现方法

阅读HTML,CSS,Javascript标准全面完善知识点

阅读前端牛人的博客、文章提升对知识的理解

善用搜索引擎

目标:

熟记前面知识点部分的重要概念,结合学习经历得到自己的理解

熟悉常见功能的实现方法,如常见CSS布局,Tab控件等。

入门之路

以下是入门阶段不错的书籍和资料

HTML先看《HTML &CSS: Design and Build Websites》1-9章,然后《HTML5: The Missing Manual》1-4章。

CSS先看《CSS: The Missing Manual》,然后《CSS权威指南》

javascript先看《javascript高级程序设计》,然后《javascript权威指南》

HTTP看HTTP权威指南

在整个学习过程中HTML CSS JavaScript会有很多地方需要互相结合,实际工作中也是这样,一个简单的功能模块都需要三者结合才能实现。

动手是学习的重要组成部分,书籍重点讲解知识点,例子可能不是很充足,这就需要利用搜索引擎寻找一些简单教程,照着教程实现功能。以下是一些比较好的教程网址

可以搜索各大公司前端校招笔试面试题作为练习题或者他人总结的前端面试题还有个人总结的面试题(带参考答案)

http://code.tutsplus.com有各种各样的教程

MDN也有很多教程,更重要的是里面有详细的文档,需要查找某个功能时在Google搜索:xxx site:https://developer.mozilla.org

http://www.html5rocks.com/zh/也有很多优质教程

http://www.sitepoint.com/

http://alistapart.com/

原生javascript是需要重点掌握的技能,在掌握原生javascript的基础上推荐熟练掌握jQuery,在实际工作中用处很大,这方面的书籍有《Learning jQuery》或者去jQuery官网

建一个https://github.com/账号,保存平时学习中的各种代码和项目。

有了一定基础之后可以搭建一个个人博客,记录学习过程中遇到的问题和解决方法,方便自己查阅也为其他人提供了帮助。也可以去http://www.cnblogs.com/或者http://www.csdn.net/这样的网站注册账号,方便实用

经常实用Google搜索英文资料应该经常找到来自http://stackoverflow.com/的高质量答案,与到问题可以直接在这里搜索,如果有精力,注册一个账号为别人解答问题也能极大提高个人能力。

经典书籍熟读之后,可以打开前面必备基础技能部分的链接。认真读对应标准,全面掌握知识

继续提高

有了前面的基础之后,前端基本算是入门了,这时候可能每个人心中都有了一些学习方向,如果还是没有。

可以参考前面必备技能部分提到的那两个项目,从里面选一些进行发展学习。以下是一些不错的方面:

Grunt:前端自动化工具,提高工作效率

less css:优秀的CSS预处理器

bootstrap:优秀的CSS框架,对没有设计师的团队很不错,与less结合使用效果完美

requirejs:AMD规范的模块加载器,前端模块化趋势的必备工具

Node.js:JavaScript也可以做后台,前端工程师地位更上一步

AngularJS:做Single Page Application的好工具

移动端web开发:智能手机的普及让移动端的流量正在逐步赶超PC端

Javascript内存管理:SPA长期运行需要注意内存泄露的问题

High Performance JavaScript(Build Faster Web Application Interfaces)

Best Practices for Speeding Up Your Web Site:重要技能

####工具

chrome dev tools:前端开发调试利器,着重注意几个功能:

liveload: 修改页面后自动刷新,不用按F5

dimensions:直接在页面上测量的利器

livestyle:css样式修改后自动起效果,不需要刷新,elements修改后也能同步到代码中

image tool:测量,取色

UC二维码:移动端调试扫码必备

pagespeed,YSlow:页面性能分析和优化插件

马克飞象:优秀的在线markdown编辑器,快速写周报,做记录

watch expression:通过表达式查看当前内存中的值

call stack:查看调用栈,开启async,可以看异步调用栈(这个非常有用,尤其是ajax调试的时候)

scope variables:作用域链上的变量,非常有用

console(废话)

elements:元素样式调整,很常用

sources:代码中添加断点,单步调试,以及单步调试过程中查看内存中的对象

network:抓包查看每个请求,非常重要,前后端联调必备

timeline:分析渲染、js执行等等各个阶段,性能优化利器

emulation:模拟移动端环境,mobile页面开发必备

一些插件:

sublime text2:编码方便,插件多,速度快,性能好

emmet:提升html编码速度必备

sublimelinter + 各种语言的lint和hint:代码纠错

一些snippets:自动补全,提升开发效率

Intellij IDEA和WebStorm:集成开发环境,集成了各种功能,开发比sublime要方便,但会比较吃性能

Mark Men:测量、取色、标注利器,拿到视觉稿之后第一个打开的软件

GFW Fucker:我用红杏,可以的话买个虚拟服务器当梯子

iHosts:非常优秀的hosts管理软件,轻松修改hosts,开发调试必备

Charles:Mac 平台最好用的抓包分析工具

Rythem:AlloyTeam出品的代理抓包软件,非常轻量,安装简单,移动端(真机)开发调试很好用

Wunderlist:一个非常不错的Todo List,任务、需求多的时候管理起来很方便

####技能

前端的技能其实除了JavaScript(包括NodeJS)、HTML、CSS以外,还有很多。其实前端的技能树很大,这里只能列一些我开发中见到的说一说

#####语言基础

JavaScript:

作用域链、闭包、运行时上下文、this

原型链、继承

NodeJS基础和常用API

CSS:

选择器

浏览器兼容性及常见的hack处理

CSS布局的方式和原理(盒子模型、BFC、IFC等等)

CSS 3,如animation、gradient、等等

HTML:

语义化标签

#####进阶

JavaScript:

异步控制(Promise、ES6 generator、Async)

模块化的开发方式(AMD、CMD、KMD等等)

JavaScript解释器的一些相关知识

异步IO实现

垃圾回收

事件队列

常用框架使用及其原理

jQuery:基于选择器的框架,但个人认为不能叫框架,应该算工具库,因为不具备模块加载机制,其中源码很适合阅读钻研

AngularJS/Avalon等MVVM框架:着重理解MVVM模式本身的理念和双向绑定的实现,如何解耦

underscore:优秀的工具库,方便的理解常用工具代码片段的实现

polymer/React: 组件化开发,面向未来,理解组件化开发的原理

CSS和HTML:主要是CSS3的特性和HTML5的特性,以及浏览器处理的流程和绘制原理

DOM树、CSSOM树、渲染树的构建流程及页面渲染的过程

解析HTML、CSS、JavaScript时造成的阻塞

HTML5相关

SVG及矢量图原理

Canvas开发及动画原理(帧动画)

Video和Audio

flex box布局方式

icon fonts的使用

常用NodeJs的package:

koa

express

underscore

async

gulp

grunt

connect

request

一些理念:

响应式Web

优雅降级、渐进增强

dont make me think

网页可用性、可访问性、其中的意义

SEO搜索引擎优化,了解搜索引擎的原理

SPA的好处和问题

性能优化:

减少请求数量(sprite、combo)

善用缓存(application cache、http缓存、CDN、localstorage、sessionstorage,备忘录模式)

减少选择器消耗(从右到左),减少DOM操作(DOM和JavaScript解释器的分离)

CSS的回流与重绘

生态系统

npm

bower

spm

搭建一个属于自己的博客

git pages

hexo

jekyll

#####未来

Web Componets:面向未来的组件化开发方式

HTML模板

Shadow DOM

Custom Elements

HTML Import

移动端Native开发:这也是需要了解的,以后前端工程师会经常地和webview打交道,也要了解native开发