css样式的权值(权重)
权值等级的定义
第一等:代表内联样式,如: style=””,权值为1000。
第二等:代表ID选择器,如:#content,权值为100。
第三等:代表类,伪类和属性选择器,如.content,权值为10。
第四等:代表类型选择器和伪元素选择器,如div p,权值为1。
Ps:通用选择器(*),子选择器(>)和相邻同胞选择器(+)并不在这四个等级中,所以他们的权值都为0,!important 优先级最高,万不得已的情况下才用。
权重计算
#content div#main-content h2=2*100+2*1=202
#content #main-content>h2=2*100+1=201
body #content div[id="main-content"] h2=1*100+1*10+3*1=113
#main-content div.paragraph h2=1*100+1*10+2*1=112
#main-content [class="paragraph"] h2=1*100+1*10+1*1=111
div#main-content div.paragraph h2.first=1*100+2*10+3*1=123
优先规则
权值大的样式会覆盖权值小的样式,上面例子的样式会采用权值最大201的样式,当你乱用!important,特别是后期修改样式的时候,是不是有种心力憔悴电费感觉?
当css前后样式项的权值一样,后面的样式会覆盖前面的样式。
Css规范
命名风格规范
1 css文件命名:统一为小写的英文字母(尽量少用拼音),如:index.css。
当名字需要组合拼写时,可以在单词间加中杠线(不要用下划线:容易写错)。如:member-report.css。(推荐)
或者统一为驼峰式拼写。如:MemberReport.css (项目启动前统一风格)。
2 样式名(html的class名):在让人看懂的前提下,尽量语义化或简写。尽量少用拼音,和无语义的缩写 .bt .bd 等; 风格可以统一为小写字母,如:content。当名字需要组合时,可以采用css文件名的规范。
样式的继承
文本样式
color,font-family, font-size, font-style,
font-variant, font-weight, font, letter-spacing,
line-height,text-align, text-indent, texttransform,word-spacing
列表相关属性
list-style-image, list-style-position,
list-style-type, list-style,
css优化
渲染
就是浏览器把HTML代码以css定义的规则显示在浏览器窗口的过程
浏览器对页面呈现的处理流程
用户输入网址(假设是个html页面,并且是第一次访问),浏览器向服务器发出请求,服务器返回html文件;
浏览器开始载入html代码,发现<head>标签内有一个<link>标签引用外部CSS文件;
浏览器又发出CSS文件的请求,服务器返回这个CSS文件;
浏览器继续载入html中<body>部分的代码,并且CSS文件已经拿到手了,可以开始渲染页面了;
浏览器在代码中发现一个<img>标签引用了一张图片,向服务器发出请求。此时浏览器不会等到图片下载完,而是继续渲染后面的代码;
服务器返回图片文件,由于图片占用了一定面积,影响了后面段落的排布,因此浏览器要回过头来重新渲染这部分代码;
浏览器发现了一个包含一行Javascript代码的<script>标签,赶快运行它;
Javascript脚本执行了这条语句,它命令浏览器隐藏掉代码中的某个<div> (style.display=”none”)。杯具啊,突然就少了这么一个元素,浏览器不得不重新渲染这部分代码;
终于等到了</html>的到来,浏览器泪流满面……
等等,还没完,用户点了一下界面中的“换肤”按钮,Javascript让浏览器换了一下<link>标签的CSS路径;
浏览器召集了在座的各位<div><span><ul><li>们,“大伙儿收拾收拾行李,咱得重新来过……”,浏览器向服务器请求了新的CSS文件,重新渲染页面。
回流
当页面的布局发生变化时,浏览器会回过头来重新渲染,这就是页面为什么会慢的一个原因,当一个点的变 化影响了布局,这就会使得要倒回去重新渲染,这个倒回去的过程称为 reflow(回流)。
当页面布局和几何属性改变时就需要回流。下述情况会发生浏览器回流
1、添加或者删除可见的DOM元素;
2、元素位置改变和计算(offsetWidth 和 offsetHeight)
3、元素尺寸改变——边距、填充、边框、宽度和高度
4、内容改变——比如文本改变或者图片大小改变,字体的改变而引起的计算值宽度和高度改变;
5、页面渲染初始化
6、浏览器窗口尺寸改变——resize事件发生时;
7、操作 class 属性,脚本操作 DOM,设置 style 属性的值,激活 CSS 伪类
var s = document.body.style;
s.padding = "2px"; // 回流+重绘
s.border = "1px solid red"; // 再一次 回流+重绘
s.color = "blue"; // 再一次重绘
s.backgroundColor = "#ccc"; // 再一次 重绘
s.fontSize = "14px"; // 再一次 回流+重绘
// 添加node,再一次 回流+重绘
document.body.appendChild(document.createTextNode('abc!'));
回流比重绘的代价要更高,回流的花销跟render tree有多少节点需要重新构建有关系,假设你直接操作body,比如在body最前面插入1个元素,会导致整个render tree回流,这样代价当然会比较高,但如果是指body后面插入1个元素,则不会影响前面元素的回流。
reflow问题也是可以优化的,减少reflow是很有必要的,比如给图片设定好宽度和高度,这样就可以把图片的占位面积预定好。
重绘
一些元素需要更新属性,而这些属性只是影响元素的外观,风格(景颜色,文字颜色,边框颜色)而不会影响布局,浏览器就会repaint。repaint的速度明显比reflow的速度快。
高消耗样式
高消耗属性在绘制前需要浏览器进行大量计算:
box-shadows
border-radius
transparency
transforms
CSS filters(性能杀手)
常见的重排元素:
width
height
padding
margin
display
border-width
position
top
left
right
bottom
font-size
float
text-align
overflow-y
font-weight
overflow
font-family
line-height
vertical-align
clear
white-space
min-height
减少回流、重绘
1、正确使用 Display 的属性,Display 属性会影响页面的渲染,请合理使用。
display: inline后不应该再使用 width、height、margin、padding 以及 float;
display: inline-block 后不应该再使用 float;
display: block 后不应该再使用 vertical-align;
display: table-* 后不应该再使用 margin 或者 float;
2、不滥用 Float
Float在渲染时计算量比较大,尽量减少使用。
3、直接改变className,如果动态改变样式,则使用cssText(考虑没有优化的浏览器)
// 不好的写法
var left = 1;
var top = 1;
el.style.left = left + "px";
el.style.top = top + "px";// 比较好的写法
el.className += " className1";
// 比较好的写法
el.style.cssText += ";
left: " + left + "px;
top: " + top + "px;";
4、不要经常访问会引起浏览器flush队列的属性,如果你确实要访问,利用缓存
// 别这样写,大哥
for(循环) {
el.style.left = el.offsetLeft + 5 + "px";
el.style.top = el.offsetTop + 5 + "px";
}
// 这样写好点
var left = el.offsetLeft,
top = el.offsetTop,
s = el.style;
for (循环) {
left += 10;
top += 10;
s.left = left + "px";
s.top = top + "px";
}
5、让元素脱离动画流,减少回流的Render Tree的规模
$("#block1").animate({left:50});
$("#block2").animate({marginLeft:50});
6、动画效果应用到position属性为absolute或fixed的元素上
动画效果应用到position属性为absolute或fixed的元素上,它们不影响其他元素的布局,
所它他们只会导致重新绘制,而不是一个完整回流。这样消耗会更低
7、避免使用table布局
避免使用table布局。可能您需要其它些避免使用table的理由,在布局完全建立之前,
table经常需要多个关口,因为table是个和罕见的可以影响在它们之前已经进入的DOM元素的显示的元素。
想象一下,因为表格最后一个单元格的内容过宽而导致纵列大小完全改变。
这就是为什么所有的浏览器都逐步地不支持table表格的渲染(感谢Bill Scott提供)。
然而有另外一个原因为什么表格布局时很糟糕的主意,根据Mozilla,
即使一些小的变化将导致表格(table)中的所有其他节点回流。
8、避免使用CSS的JavaScript表达式
这项规则较过时,但确实是个好的主意。主要的原因,这些表现是如此昂贵,是因为他们每次重新计算文档,
或部分文档、回流。正如我们从所有的很多事情看到的:引发回流,它可以每秒产生成千上万次。当心!
9、优化选择器
减少浏览器匹配选择器和文档元素时的开销去优化
CSS 选择器匹配的机制 :从右到左进行规则匹配
css选择器的执行效率高低排序
1.id选择器(#myid)
2.类选择器(.myclassname)
3.标签选择器(div,h1,p)
4.相邻选择器(h1+p)
5.子选择器(ul < li)
6.后代选择器(li a)
7.通配符选择器(*)
8.属性选择器(a[rel="external"])
9.伪类选择器(a:hover, li:nth-child)
根据「选择器匹配」与「选择器执行效率」原则,我们可以通过避免不恰当的使用,提升 CSS 选择器性能。
1、避免使用通用选择器 .content * {color: red;}
2、避免使用标签或 class 选择器限制 id 选择器 .menu-left#newMenuIcon {…}
3、避免使用标签限制 class 选择器 div.indented {…}
4、避免使用多层标签选择器。使用 class 选择器替换,减少css查找 treeitem[mailfolder="true"] > treerow > treecell {…}
5、避免使用子选择器treehead treerow treecell {…}
或 treehead > treerow > treecell {…}
6、使用继承.bookmarkMenuItem > .menu-left { list-style-image: url(blah) }----------(no)
.bookmarkMenuItem { list-style-image: url(blah) }-----------------------(yes)