还有几天就到国庆中秋了,快要放假了,先祝你们节日快乐!以前写过js的写做建议和技巧,那么今天就来聊聊css吧!说到css,每个网页都离不开css,可是对于css,不少开发者的想法就是,css只要能用来布局,把效果图排出来就能够了,其它的细节或者优化,不须要怎么考虑。可是我以为css可不仅是把页面的布局完成就是完事的,还须要考虑不少细节有优化,更不会像你们想得那么简单,在学习当中,若是发现什么技巧或者优化的点,我也会学以至用!那么今天,就分享下我总结的css写做建议和性能优化的一些问题!但愿能帮让你们对神奇的css有一个新认识,固然,若是你们以为还有什么其它的建议。欢迎指点!css
首选,关于css渲染的规则,你们可能都知道,是从右到左的渲染!以下栗子html
.nav h3 a{font-size: 14px;}
渲染过程大概是:首先找到全部的a
,沿着a
的父元素查找h3
,而后再沿着h3
,查找.nav
。中途找到了符合匹配规则的节点就加入结果集。若是找到根元素html
都没有匹配,则再也不遍历这条路径,从下一个a
开始重复这个查找匹配(只要页面上有多个最右节点为a
)。
参考:CSS选择器从右向左的匹配规则html5
通常状况下,元素的嵌套层级不能超过3级,过分的嵌套会致使代码变得臃肿,沉余,复杂。致使css文件体积变大,形成性能浪费,影响渲染的速度!并且过于依赖HTML文档结构。这样的css样式,维护起来,极度麻烦,若是之后要修改样式,可能要使用!important
覆盖。webpack
这个我目前保持中立意见,由于看着网上的文章,有些人支持使用样式重置,有些人不支持使用,谁也说服不了谁。我本身的状况,我有使用样式重置,可是是比较简单的一个总结,代码以下!css3
body,dl,dd,h1,h2,h3,h4,h5,h6,p,form,ol,ul { margin: 0; padding: 0; } h1, h2, h3, h4, h5, h6 { font-weight: normal; } ol, ul { list-style: none; } h1{ font-size: 24px; } h2{ font-size: 20px; } h3{ font-size: 18px; } h4 { font-size: 16px; } h5{ font-size: 14px; } h6{ font-size: 12px; }
首先,css样式级别整理以下web
!important>行内样式 >id样式>class样式>标签名样式。
而后有一点要提一下就是,组合选择器使用权值会叠加的。好比id的权值是100,class是10,标签名是1(其它不清楚了)!那么div.test-class
权值就是11,div#test
就是101gulp
好比有一个div移动web开发
<div id="test" class="test-class" style="color:green;"></div>
那么样式权值方面就是浏览器
div {color: red !improtant;}
(大于下面的一切)<div id="test" class="test-class" style="color:black;"></div>
(大于111)div#test.test-class
(111)#id.test-class
(110)div#test
(101)#test
(100)div.test-class
(11).test-class
(10)div
(1)*
(小于1)缓存
不解释,看图
上面几个p
元素margin
和padding
都为0,可是还有边距。这个的解决方案有两种
1.删除代码以前的空行空格
带display:inline-block
的元素以前的空行都删除掉,以下写法
2.父元素font-size设置为0,这个直接看图
若是页面有使用img标签,那么img很建议设置width和height。目的是为了在网速差或者其它缘由加载不出图片的时候,保证布局不会乱。
以下栗子,一个很普通的布局。
可是万一出现什么状况,图片加载不出来的话,建议的处理方式是第一种,显示一张默认图片,即便不显示默认图片,也让图片有一个占位的做用,保证布局不会乱!
若是图片加载不出,img又没有设置width和height的话,就会像下面这样,布局乱了!
关于设置width
和height
,我顺便说几点
1.PC站,建议在img标签的属性设置width
和height
。这样避免加载不出css而错位
2.手机站,建议用css设置img
的width
和height
,由于手机站要作适配,在属性设置width
和height
不灵活,好比使用rem布局,在属性那里设置不了width
和height
。
3.若是图片不固定,可是有一个max-width
和max-height
,那么建议在img的父元素设置width和height。img根据父元素的width
和height
设置max-width
和max-height
。
这里只放图,不解释
这个方式不推荐使用,由于这个写法,.div2
的宽高必需要设置,不然就是100%;好比设置了top:0;bottom:0;
效果和设置height:100%;
是同样的。若是想要避免,就必需要设置height
。
这里说的预加载,不是懒加载。首先根据我我的理解科普下,懒加载和预加载的区别。
懒加载:页面加载的时候,先加载一部份内容(通常是先加载首屏内容),其它内容等到须要加载的时候再进行加载!
预加载:页面加载的时候,先加载一部份内容(通常是先加载首屏内容),其它内容等到先加载的一部份内容(通常是首屏内容)加载完了,再进行加载。
两种方式,都是为了减小用户进入网站的时候,更快的看到首屏的内容!
下面栗子,将这#preloader
这个元素加入到到html中,就能够实现经过CSS的background
属性将图片预加载到屏幕外的背景上。只要这些图片的路径保持不变,当它们在web页面的其余地方被调用时,浏览器就会在渲染过程当中使用预加载(缓存)的图片。简单、高效,不须要任何JavaScript。
#preloader { /*须要预加载的图片*/ background: url(image1.jpg) no-repeat,url(image2.jpg) no-repeat,url(image3.jpg) no-repeat; width: 0px; height: 0px; display: inline; }
可是这样会有一个问题,由于#preloader
预加载的图片,会和页面上的其余内容一块儿加载,增长了页面的总体加载时间。因此须要用js控制
function preloader(urlArr,obj) { var bgText=''; for(var i=0,len=urlArr.length;i<len;i++){ bgText+='url('+urlArr[i]+') no-repeat,'; } obj.style.background=bgText.substr(0,bgText.length-1); } window.onload = function() { preloader(['image1.jpg','image2.jpg','image3.jpg'],document.getElementById('preloader')); }
原理也很简单,就是先让首屏的图片加载完,而后再加载其它的图片。经过给#preloader
设置背景图片,加载所须要的图片,而后页面上须要加载这些图片的时候,就直接从缓存里面拿图片,不须要经过http请求获取图片,这样加载就很快。
在作网页的时候常常会使用下面两种方式重置样式,以此来消除标签的默认布局和不一样浏览器对于同一个标签的渲染。
*{margin:0;padding:0;}
上面这种方式,代码少,可是性能差,由于渲染的时候,要匹配页面上全部的元素!不少基础样式没有margin
和padding
的元素,好比div
,li
等。都被匹配,彻底不必!
下面看另外一种方式。
body,dl,dd,h1,h2,h3,h4,h5,h6,p,form,ol,ul{margin:0;padding:0;}
这种方式,代码稍微多,可是性能比上面的方式好,在渲染的时候,只匹配body,dl,dd,h1,h2,h3,h4,h5,h6,p,form,ol,ul
这里面的元素,这些元素带有margin
和padding
,须要重置!
再看例子:
.test * {color: red;}
匹配文档中全部的元素,而后分别向上逐级匹配class为test的元素,直到文档的根节点
.test a {color: red;}
匹配文档中全部a的元素,而后分别向上逐级匹配class为test的元素,直到文档的根节点
两种方式,哪一种更好不言而喻,因此在开发的时候,建议避免使用通配选择器。
这个没什么好解释的,就是压缩和合并css。
首先压缩css,除了使用工具,好比gulp,webpack等把代码压缩,把空格和换行都去掉。还有一个建议就是属性简写。
好比
margin-top:0; margin-right:10px; margin-bottom:10px; margin-left:10px; background-image: url('test.jpg'); background-position: top center; background-repeat: no-repeat; border-width:1px; border-style:solid; border-color:#000; color:#0099FF;
能够换成下面的
margin:0 10px 10px 10px; background: url('test.jpg') no-repeat top center; border:1px solid #000; color:#09F;
至于合并的时候,我按照本身的开发习惯给几个建议:
1.合并公用的样式,好比项目的头部,底部,侧边栏这些,通常都是公用的,这些能够写在一个公用样式表上,好比main.css
。
2.上面所说的main.css是每个页面都须要引入,而样式重置表reset.css
也是每个页面都须要用到的,那么建议main.css和reset.css合并成一个文件,给页面引入!减小请求!
3.每一个页面对应的样式为独立的文件,好比首页对应的是index.css
。产品列表页对应的样式是product-list.css
。那么index.css
就只在首页引入,其它页面不引入,由于引入纯属浪费请求资源!其余页面对应的样式也是这个处理方式!index.css
,product-list.css
等其它页面的样式就保留单独的文件,不做合并处理!
浏览器在全部的 stylesheets 加载完成以后,才会开始渲染整个页面,在此以前,浏览器不会渲染页面里的任何内容,页面会一直呈现空白。这也是为何要把 stylesheet 放在头部的缘由。若是放在 HTML 页面底部,页面渲染就不只仅是在等待 stylesheet 的加载,还要等待 html 内容加载完成,这样一来,用户看到页面的时间会更晚。
css样式文件有两种引入方式,一种是link
元素,另外一种是@import
。在这里,我建议就是避免使用@import
。由于@import
会影响浏览器的并行下载,使得页面在加载时增长额外的延迟,增添了额外的往返耗时。并且多个@import
可能会致使下载顺序紊乱。好比一个css文件index.css
包含了如下内容:@import url("reset.css")
。那么浏览器就必须先把index.css
下载、解析和执行后,才下载、解析和执行第二个文件reset.css。简单的解决方法是使用<link>
替代@import
。
接到效果图,先不用着急切图,先看下psd文件。思考下怎么排版,那些模块能够作成公用的模块,模块应该怎么命名,写样式等!
当咱们拿到设计师给的PSD时,首先不要急于写CSS代码,首先对整个页面进行分析,先思考下面几点:
(1)分析页面有哪些模块是公用的,常见公用模块有头部,底部,菜单栏,悬浮按钮等等
(2)分析模块有什么样式,把公用的样式提取出来,公用样式包括公用的状态样式,好比按钮,输入框,下拉框等公用的选中状态,禁用状态的样式等等。
一个网站,确定会有不少个小图标,对于这些小图标,目前的解决方案有两个,cssSprite(雪碧图),字体图标,把图片转成base64。下面对比一下这两种方式!
cssSprite:把全部icon图片合成一张png图片,使用的是在,对节点设置宽高,加上bacgroud-position。以背景图方式显展现须要的icon,若是一个网站有20图标,那么就要请求20次,使用cssSprite,只须要请求一次,大大的减小了http请求。缺点就是管理不灵活,若是须要新增一个图标,都须要改合并图片的源文件,图标定位也要规范,否则容易干扰图片之间的定位!
字体图标:简单粗暴的理解就是把全部的图标当成一个字体处理!这样不用去请求图片。通常是使用class来定义图标,要替换图标时,只需更换样式名,管理方便,语意明确,灵活放大缩小,而且不会形成失真。可是只支持单色的图片。
base64:另外一种方案就是把小的icon图片转成base64编码,这样能够不用去请求图片,把base64编码直接整合到js或者css里面,能够防止由于一些相对路径,或者图片被不小删除了等问题致使图片404错误。可是找个方式会生成一大串的base64编码。通常来讲,8K如下的图片才转换成base64编码。若是把一张50K的图片转成base64编码,那么会生成超过65000个字符的base64编码,字符的大小就已是将近70K了!建议就是:8K如下的图片才转换成base64编码。
1.ID在页面上原本就是惟一的并且人家权值那么大,前方嵌套(.content #test
)彻底是浪费性能。以及多写一些没有意义的代码!这个虽然是一句话,可是仍是有人犯这样的错!
2.除了嵌套,在id的前面也不须要加标签或者其它选择器。好比 div#test
或者.test#test
。这两种方式彻底是多余的,理由就是ID在页面就是惟一的。前面加任何东西都是多余的!
把长段相一样式提取出来做为公用样式使用,好比经常使用的清除浮动,单行超出显示省略号,多行超出省略号等等。
以下栗子
/*超出省略号*/ /*<p class='text-ellipsis'></p>*/ .text-ellipsis{ overflow: hidden; white-space: nowrap; text-overflow: ellipsis; } /*清除浮动*/ /*<div class='clearfix'></div>*/ .clearfix:after { display: block; content: ''; clear: both; height:0; }
在我以前一篇文章(移动web开发问题和优化小结),也有写过关于这个的优化建议,以前说的两个建议是:
1.CSS3动画或者过渡尽可能使用transform
和opacity
来实现动画,不要使用left
和top
。
2.动画和过渡能用css3
解决的,就不要使用js
。若是是复杂的动画可使用css3+js
(或者html5+css3+js
)配合开发,效果只有想不到,没有作不到。
下面补充一个:动画不宜过多,尤为是手机网站,不然会出现性能的问题,好比cpu一会儿就被占用满了,掉帧等。并且,不建议给每个元素都使用硬件加速。
参考连接:
CSS Animation性能优化
css3动画性能优化
CSS动画之硬件加速
Web动画
这个是在PC站会出现的问题,应该你们都知道。下面简单说一下!
好比下面的栗子,一个网站,页面内容宽度是1200px。看着很正常,没什么特别
若是这个时候,把页面窗口缩小。小于1200px,页面出现滚动条,而后把滚动条拖到最右边
这样是否是就发现,顶部的图片和背景有一部分是断层了!解决这个问题也很简单,就是给body
加上min-width
。值就是页面宽度的值。body{min-width:1200px;}
重复上一步操做,不管怎么改变浏览器窗口大小,都是正常的
之因此会出现这样的问题,是由于,好比窗口缩小到900px的时候,小于内容宽度的1200px。就是出现横向的滚动条,可是body
的宽度是900px。这个时候,若是有元素(好比图片的灰色区域和粉红色的图片)是相对body
的width
设置100%,那么实际上这些元素的宽度也就是900px。因此会出现断层那些的视觉!解决方式就是给body
加上min-width
。让body
的宽度最小不会小于内容的宽度!
关于我对css写做建议和性能优化的一个总结,就到这里了。css,绝对不是那种只要能用就行,或者只要能用css把布局弄好就行的一门语言。css给个人感受,就是上手很简单,可是若是想用好css,仍是得花时间去研究。css或者css3,可以优化的东西还有不少,用好css或者css3可以少写不少js代码,作出来的东西也是很神奇,你们仍是得继续学习当中的知识!
若是你们以为我文章有哪一个地方写得很差,写错了,欢迎指正。若是有什么其它的建议,欢迎指点,让你们互相交流,互相学习,一块儿进步!最后,祝你们节日快乐!
-------------------------华丽的分割线--------------------
想了解更多,关注关注个人微信公众号:守候书阁