前端开发之CSS原理详解


Posted in Javascript onMarch 11, 2017

前端开发之CSS原理详解

 从事Web前端开发的人都与CSS打交道很多,有的人也许不知道CSS是怎么去工作的,写出来的CSS浏览器是怎么样去解析的呢?当这个成为我们提高CSS水平的一个瓶颈时,是否应该多了解一下呢?

  一、浏览器的发展与CSS

网页浏览器主要通过 HTTP 协议连接网页服务器而取得网页, HTTP 容许网页浏览器送交资料到网页服务器并且获取网页。目前最常用的 HTTP 是 HTTP/1.1,这个协议在 RFC2616 中被完整定义。HTTP/1.1 有其一套 Internet Explorer 并不完全支援的标准,然而许多其他当代的网页浏览器则完全支援这些标准。网页的位置以 URL(统一资源定位符)指示,此乃网页的地址;以 http: 开首的便是通过 HTTP协议登陆。很多浏览器同时支援其他类型的 URL 及协议,例如 ftp: 是 FTP(档案传送协议)、gopher: 是 Gopher 及 https: 是 HTTPS(以SSL加密的HTTP)。

早期的网页浏览器只支援简易版本的HTML。专属软件的浏览器的迅速发展导致非标准的 HTML 代码的产生。但随着 HTML 的成长,为了满足设计师的要求,HTML 获得了很多显示功能。随着这些功能的增加外来定义样式的语言越来越没有意义了。

1994年哈坤·利提出了 CSS 的最初建议。伯特·波斯(BertBos)当时正在设计一个叫做 Argo 的浏览器,他们决定一起合作设计CSS。

当时已经有过一些样式表语言的建议了,但 CSS 是第一个含有“层叠”的主意的。在 CSS 中,一个文件的样式可以从其他的样式表中继承下来。读者在有些地方可以使用他自己更喜欢的样式,在其他地方则继承,或“层叠”作者的样式,这种层叠的方式使作者和读者都可以灵活地加入自己的设计,混合各人的爱好。

1997年初,W3C 内组织了专门管 CSS 的工作组,其负责人是克里斯·里雷。这个工作组开始讨论第一版中没有涉及到的问题,其结果是1998年5月出版的第二版要求。到2007年为止,第三版还未完备。

二、浏览器是如何渲染页面和加载页面

为什么有些网站打开的时候会加载会很慢,而且是整个页面同时显示的,而有些网站是从顶到下逐步显示出来的?要搞懂这个可以先从下面这个常规流程开始:

1. 浏览器下载的顺序是从上到下,渲染的顺序也是从上到下,下载和渲染是同时进行的。

2. 在渲染到页面的某一部分时,其上面的所有部分都已经下载完成(并不是说所有相关联的元素都已经下载完)。

3. 如果遇到语义解释性的标签嵌入文件(JS脚本,CSS样式),那么此时IE的下载过程会启用单独连接进行下载。

4. 并且在下载后进行解析,解析过程中,停止页面所有往下元素的下载。

5. 样式表在下载完成后,将和以前下载的所有样式表一起进行解析,解析完成后,将对此前所有元素(含以前已经渲染的)重新进行渲染。

6. JS、CSS中如有重定义,后定义函数将覆盖前定义函数。

这里关键的是第2-5这三点。渲染效率与下面三点有关:

1. CSS 选择器的查询定位效率

2. 浏览器的渲染模式和算法

3. 要进行渲染内容的大小

  三、什么是 CSS 以及 CSS 的优点

什么是 CSS?

  1. CSS 是 Cascading Style Sheets(层叠样式表)的简称。
  2. CSS 语言是一种标记语言,它不需要编译,可以直接由浏览器解释执行(属于浏览器解释型语言)。
  3. 在标准网页设计中 CSS 负责网页内容 (XHTML)的表现。
  4. CSS 文件也可以说是一个文本文件,它包含了一些 CSS 标记,CSS 文件必须使用 css 为文件名后缀。
  5. 可以通过简单的更改 CSS 文件,改变网页的整体表现形式,可以减少我们的工作量,所以它是每一个网页设计人员的必修课。
  6. CSS是由W3C的CSS工作组产生和维护的。

采用 CSS+DIV 进行网页重构,相对与传统的 TABLE 网页布局而具有以下3个显著优势:

1. 表现和内容相分离。将设计部分剥离出来放在一个独立样式文件中,HTML文件中只存放文本信息。这样的页面对搜索引擎更加友好。

2. 提高页面浏览速度。对于同一个页面视觉效果,采用 CSS+DIV 重构的页面容量要比 TABLE 编码的页面文件容量小得多,前者一般只有后者的1/2大小。浏览器就不用去编译大量冗长的标签。

3. 易于维护和改版。你只要简单的修改几个 CSS 文件就可以重新设计整个网站的页面。

四、浏览器对 CSS 的匹配原理

浏览器CSS匹配不是从左到右进行查找,而是从右到左进行查找。比如之前说的 DIV#divBox p span.red{color:red;},浏览器的查找顺序如下:先查找 html 中所有 class='red' 的 span 元素,找到后,再查找其父辈元素中是否有p元素,再判断p的父元素中是否有 id 为 divBox 的 div 元素,如果都存在,则 CSS 匹配上。

浏览器从右到左进行查找的好处是为了尽早过滤掉一些无关的样式规则和元素。Firefox 称这种查找方式为 keyselector(关键字查询),所谓的关键字就是样式规则中最后(最右边)的规则,上面的 key 就是 span.red。

  五、优化你的 CSS

所谓高效的 CSS 就是让浏览器在查找 style 匹配的元素的时候尽量进行少的查找,下面列出一些我们常见的写 CSS 犯一些低效错误:

1、不要在ID选择器前使用标签名

一般写法:DIV#divBox

更好写法:#divBox

解释:因为ID选择器是唯一的,加上div反而增加不必要的 CSS 匹配。

2、不要在 class 选择器前使用标签名

一般写法:span.red

更好写法:.red

解释:同第一条,但如果你定义了多个.red,而且在不同的元素下是样式不一样,则不能去掉,比如你css文件中定义如下:

 p.red{color:red;}
span.red{color:#ff00ff}

如果是这样定义的就不要去掉,去掉后就会混淆,不过建议最好不要这样写

3、尽量少使用层级关系

一般写法:#divBoxp.red{color:red;}

更好写法:.red{..}

4、使用 class 代替层级关系

一般写法:#divBox ul li a{display:block;}

更好写法:.block{display:block;}

5、在 CSS 渲染效率中 id 和 class 的效率是基本相当的

class 会在第一次载入中被缓存,在层叠中会有更加好的效果,在根部元素采用id会具有更加好(id有微妙的速度优势)。

       感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

Javascript 相关文章推荐
js获得鼠标的坐标值的方法
Mar 13 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 Javascript
js快速排序的实现代码
Dec 08 Javascript
js获取url中的参数且参数为中文时通过js解码
Mar 19 Javascript
jQuery源码解读之hasClass()方法分析
Feb 20 Javascript
readonly和disabled属性的区别
Jul 26 Javascript
js调出上下文菜单的实例
Dec 17 Javascript
vue实现简单实时汇率计算功能
Jan 15 Javascript
基于jquery日历价格、库存等设置插件
Jul 05 jQuery
jQuery菜单实例(全选,反选,取消)
Aug 28 jQuery
vue2.0移除或更改的一些东西(移除index key)
Aug 28 Javascript
基于node.js的fs核心模块读写文件操作(实例讲解)
Sep 10 Javascript
JS实现简易刻度时钟示例代码
Mar 11 #Javascript
js鼠标跟随运动效果
Mar 11 #Javascript
详解微信开发中snsapi_base和snsapi_userinfo及静默授权的实现
Mar 11 #Javascript
基于Node.js的WebSocket通信实现
Mar 11 #Javascript
js原生Ajax的封装和原理详解
Mar 11 #Javascript
ThinkPHP+jquery实现“加载更多”功能代码
Mar 11 #Javascript
Bootstrap的Carousel配合dropload.js实现移动端滑动切换图片
Mar 10 #Javascript
You might like
PHP读写文件的方法(生成HTML)
2006/11/27 PHP
php 判断字符串中是否包含html标签
2014/02/17 PHP
一段非常简单的让图片自动切换js代码
2006/11/10 Javascript
javascript textarea光标定位方法(兼容IE和FF)
2011/03/12 Javascript
jQuery Tools tab使用介绍
2012/07/14 Javascript
instanceof和typeof运算符的区别详解
2014/01/06 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
使用JavaScript脚本判断页面是否在微信中被打开
2016/03/06 Javascript
原生JS实现平滑回到顶部组件
2016/03/16 Javascript
AngularJS基础 ng-mouseover 指令简单示例
2016/08/02 Javascript
jQuery ui autocomplete选择列表被Bootstrap模态窗遮挡的完美解决方法
2016/09/23 Javascript
详解Javascript中的原型OOP
2016/10/12 Javascript
Vue.js实现简单动态数据处理
2017/02/13 Javascript
Vue中的v-cloak使用解读
2017/03/27 Javascript
underscore之Collections_动力节点Java学院整理
2017/07/10 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
深入探讨JavaScript的最基本部分之执行上下文
2019/02/12 Javascript
jquery实现两个div中的元素相互拖动的方法分析
2020/04/05 jQuery
深入浅析python继承问题
2016/05/29 Python
详解python中executemany和序列的使用方法
2017/08/12 Python
windows10下python3.5 pip3安装图文教程
2018/04/02 Python
把pandas转换int型为str型的方法
2019/01/29 Python
Python面向对象程序设计类变量与成员变量、类方法与成员方法用法分析
2019/04/12 Python
将Python字符串生成PDF的实例代码详解
2019/05/17 Python
TensorFlow基于MNIST数据集实现车牌识别(初步演示版)
2019/08/05 Python
Python打包模块wheel的使用方法与将python包发布到PyPI的方法详解
2020/02/12 Python
Windows下pycharm安装第三方库失败(通用解决方案)
2020/09/17 Python
Pytorch之扩充tensor的操作
2021/03/04 Python
管理学专业个人求职信范文
2013/12/13 职场文书
幼儿园安全教育随笔
2015/08/14 职场文书
美甲店的创业计划书模板
2019/08/23 职场文书
导游词之清晏园
2019/11/22 职场文书
为什么不建议在go项目中使用init()
2021/04/12 Golang
在pycharm中无法import所安装的库解决方案
2021/05/31 Python
Nginx+Windows搭建域名访问环境的操作方法
2022/03/17 Servers
微信小程序 WeUI扩展组件库的入门教程
2022/04/21 Javascript