zoukankan      html  css  js  c++  java
  • 『编写高质量代码Web前端开发修炼手册』读书笔记--高质量的CSS

    1、怪异模式和DTD

    标准模式:浏览器根据规范表现页面

    怪异模式:模拟老浏览器行为防止老站点无法工作(为了兼容老式浏览器的代码),如果漏写DTD(Document Type Definition文档定义类型)声明,firefox会按照标准模式来解析网页,但在IE中就会触发怪异模式。

    两种模式的差异比较大,比较典型的是IE对盒模型的解析;在标准模式中,网页元素的宽度是由padding、border、width三者的宽度相加决定的,而在怪异模式中,width本身就包括了padding和border的宽度

    2、如何组织CSS?

    按功能划分:font.css color.css layout.css 等

    按区块划分:head.css foot.css sidebar.css main.css等

    作者建议:base.css + common.css +page.css

    base层提供CSS reset功能(覆盖浏览器默认样式)和通用原子类(文字、定位、长宽、边距),具有高度可移植性

    common层是网站级的,不同的网站有不同的common层,同一个网站只有一个common层;网站中高度重要的模块,称之为组件

    page层位于最高层,提供页面级的样式

    3、模块化CSS

    拆分模块的技巧:

    ①模块与模块之间尽量不要包含相同的部分,如果有相同部分,应将他们提取出来,拆分成一个独立的模块

    ②模块应该在保证数量尽可能少的原则下,做到尽可能简单,以提高重用性

    CSS命名规则

    ①推荐使用英语

    ②驼峰命名法 用于区别不同的单词,划线用于表明从属关系

    ③如何避免多人合作时命名冲突?可以使用姓名首字母缩写做为标识符,比如zzl-timeList-lastItem

    多用组合,少用继承 

    如何处理上下margin?

    margin是个有点特殊的样式,相邻的margin-left和margin-right是不会重合的,但相邻的margin-top和margin-booton会产生重合;

    所以最好统一使用margin-top或者margin-bottom,不要混合使用

    总结:如果不确定模块的上下margin特别稳定,最好不要讲它写到模块的类里,而是使用类的组合,单独为上下margin挂用于边距的原子类(例如:mt10、mb20),

    模块最好不要混动margin-top或者margin-booton,统一使用margin-top或margin-bootom

    4、低权重原则--避免滥用子选择器

    CSS的选择符是有权重的,当不同选择符的样式设置有冲突时,会采用权重高的选择符设置的样式。权重规则:HTML标签权重是1,class权重是10,id的权重是100,

    例如:p的权重是1,『div em』的权重是1+1=2,『strong.demo』的权重是1+10=11,『#test.red』的权重是100+10=110

    如果CSS权重符相同,那么样式会遵循就近原则(选择符定义的先后顺序,而不是class名的先后顺序,<span class="test test2">和<span class="test2 test">是一样的),哪个选择符最后定义,就采用哪个选择符的样式

    使用子选择器,会增加CSS选择符的权重,CSS选择符的权重越高,样式越不容易被覆盖,越容易对其他选择符产生影响。

    为了保证样式容易被覆盖,提高可维护性,CSS选择符需要保证权重尽可能低

    5、CSS sprite

    最大好处是减轻服务器的压力,对于流量不大的网站来说,CSS sprite带来的好处并不明显;所以是否使用CSS sprite主要取决于网站流量

    将网站的背景图 合到一张大图片上。对于流量大的网站来说,改技术很有价值

    ①能合并的只能是用于背景的图片,对于<img src=""/>设置的图片,是不能合并到CSS sprite大图中的,会影响页面可读性

    ②对于横向和纵向都平铺的图片,也不能使用CSS sprite;如果是横向平铺的,只能讲所有横向平铺的图片合并成一张大图,只能竖直排列

    6、CSS的常见问题

    6.1 编码风格 

    多行式

    .test{

    100px;

    height:50px;

    color:#ccc;

    }

    一行式

    .test{100px;height:50px;color:#ccc}

    随着前端调试工具的日益强大,一行式编码风格成为了主流。

    6.2 id和class

    ①同一个网页,相同的id只能出现一次,不可重复;class可以出现多次

    ②id的CSS选择符权重为100,而class的选择符权重为10

    ③原生JS 提供getElementById()方法,支持通过id对应到相关的HTMLElement,但原生JS不支持通过class得到HTMLElement

    所以一般情况下,建议尽量使用class,少用id

    6.3 CSS hack

    ①IE条件注释法

     1 针对不同IE版本分别导入样式
     2 
     3 <!--[ if IE 6]>
     4 <link type="text/CSS" href="ie6.css" rel="stylesheet">
     5 <![endif]-->
     6 
     7 <!--[ if IE 7]>
     8 <link type="text/CSS" href="ie7.css" rel="stylesheet">
     9 <![endif]-->
    10 
    11 <!--[ if IE 8]>
    12 <link type="text/CSS" href="ie8.css" rel="stylesheet">
    13 <![endif]-->

    虽然向后兼容性是最好的,缺点也很明显:将同一CSS选择符样式 分散到了三个文件中去控制,增加了开发和维护成本

    ②选择符前缀法

    原理是在CSS选择符前加一些只有特定浏览器才能识别的前缀,从而让某些样式只能在特定浏览器生效。例如 "*html"前缀只对IE6生效,『*+html』前缀只对IE7生效

    1 选择前缀法不能用于内联样式表;在向后兼容性存在一点风险
    2 
    3 <style type="text/CSS">
    4 .test{width:80px;}
    5 *html .test{width:60px}
    6 *+html .test{width:70px}
    7 </style>

    ③样式属性前缀法

    在样式的属性名前加前缀,只在特定浏览器下生效。例如『_』只在IE6下生效,『*』在IE 6和IE 7下生效

    1 相比选择符前缀法聚合程度更高,代码更精简,可维护性很强,但在向后兼容上存在风险;
    2 可以用在内联样式上
    3 
    4 <style type="text/CSS">
    5 .test{width:80px;*width:70px;_width:60px}
    6 </style>

    6.4解决超链接访问后hover样式不出现的问题

    关于a标签的四种状态排序问题,有个love hate原则,即l(link)ov(visited)e h(hover)a(activate)te

    6.5 hasLayout

    hasLayout是IE浏览器专有的一个属性,用于CSS的解析引擎。有些时候IE下一些复杂的CSS设置解析起来会出现bug,原因可能与hasLayout没有被自动触发有关,我们可以手动触发来解决bug

    zoom是最常用、最安全、成本最小的触发hasLayout的方式;在『zoom:1』无效的情况下,可以通过设置『position:relative』来触发hasLayout

    6.6块级元素 和 行内元素的区别

    常见的块级元素有div、p、form、ul、ol、li等,块级元素会独占一行,默认情况下,其宽度自动填满其父元素宽度;块级元素可以设置width、height属性;块级元素可以设置margin、padding属性

    常见的行内元素有span、strong、em等;行内元素不会独占一行,相邻的行内元素会排列在同一行里,知道一行排不下,才会换行;行内元素设置width、height属性无效;行内元素设置有问题,具体是:水平方向的padding-left/right,marigin-left/right都会产生边距效果,但竖直方向的padding-top/bottom,margin-top/bottom却不会产生边距效果

    块级元素和行内元素的CSS相关属性是display,其中块级元素对应于display:bolck;行内元素对应于display:inline

    6.7 display:inline-block和hasLayout

    6.8 relative、absolute、float

    6.9 居中

    6.9.1、水平居中

    ①文本、图片等行内元素的水平居中

    text-align:center

    ②确定宽度的块级元素的水平居中

    通过设置margin-left:auto和margin-right:auto来实现

    ③不确定宽度的块级元素的水平居中

    方法1:table标签结合margin-left:auto和margin-right:auto来实现

    方法2:改变块级元素的display为inline类型,然后使用text-align:center来实现

    方法3:给父元素设置float,然后父元素设置postion:relative和left:50%;子元素设置postion:relative和left:-50%来实现水平居中

    6.9.2、垂直居中

    ①父元素高度不确定的文本、图片、块级元素的竖直居中

    给父容器设置相同的上下边距来实现

    ②父元素高度确定的单行文本的竖直居中

    通过给父元素设置line-height和height的属性为同一个值来实现

    ③父元素高度确定的多行文本、图片、块级元素的竖直居中

    方法1:table(td的vertical-align默认是middle)

    方法2:对支持display:table-cell的IE8 和 FireFox用display:table-cell和vertical-align:middle来实现居中;对不支持display:table-cell的IE6和IE7,设置positon来实现

    6.9.10 网格布局

  • 相关阅读:
    JavaWeb学习笔记(9)
    JavaWeb学习笔记(8)
    JavaWeb学习笔记(7)
    JavaWeb学习笔记(6)
    JavaWeb学习笔记(5)
    JavaWeb学习笔记(4)
    Plans(Real-Time Update)
    CSP-J2 2020 题解(Updating)
    Lcez#111 yist
    洛谷P1104 生日
  • 原文地址:https://www.cnblogs.com/kunyashaw/p/5286014.html
Copyright © 2011-2022 走看看