《编写高质量代码--web前端开发修炼之道》笔记-CSS

此篇为本笔记的第二篇

标准模式与怪异模式(模拟老式浏览器的行为)

如果漏写了DTD声明,Firefox仍然会按照标准模式来解析网页,但在IE中(包括IE6,IE7,IE8)就会触发怪异模式

IE盒模型的解析

标准模式:网页元素的宽度有padding,border,width三者的宽度相加决定
怪异模式:width本身就包括了padding和border的宽度

组织CSS

base.css + common.css + page.css

base.css包括CSS reset、通用原子类

  • CSS reset:标签在浏览器里有默认的样式,不同浏览器的默认样式会有差别。例如:ul默认带有缩进的样式,在IE下,它的缩进是通过margin实现的,而在Firefox下,它的缩进却是由padding实现的。
  • 通用原子类:一系列常用的基本类,包括:文字,定位,宽高,边距
    文字:font-sizeline-heighttext-align
    定位:floatclearposition
    宽高:widthheight
    边距:marginmargin-topmargin-rightmargin-bottommargin-leftpaddingpadding-toppadding-rightpadding-bottompadding-left
CSS命名
  • 推荐使用英语,不要使用汉语拼音
  • 常见命名方法:驼峰命名、划线命名(可以结合两种方法,其中驼峰命名法用于区别不同单词,划线用于表明从属关系)
  • 不推荐轻易使用子选择符,多人合作时会有冲突
  • 为避免多人合作的冲突,可为page层的各工程师分配一个唯一的标识符,作为前缀
多用组合,少用继承

挂多个class实现最终样式

处理上下margin
  • 相邻的margin-left和margin-right是不会重合的
  • 相邻的margin-top和margin-bottom会产生重合
    所以上下相邻的模块最好统一使用margin-top或者margin-bottom,不要混用
低权重原则——避免滥用子选择器
  • CSS选择符权重的规则:
    标签——1
    class——10
    id——100
  • 如果CSS选择器权重相同,那么样式会遵循就近原则,哪个选择符最后定义(而不是class名字挂在最后),就采用哪个选择符的样式
    <span class="test test2"><span class="test2 test">没有区别
  • 使用子选择器,会增加CSS选择符的权重,CSS选择符的权重越高,样式就越不容易被覆盖,越容易对其他选择符产生影响
  • 为了保证样式容易被覆盖,提高可维护性,CSS选择符要保证权重尽可能低
CSS sprite(图片翻转技术)
  • 将网站的背景图片合到一张大图片上,减少网页的HTTP请求数,减少服务器压力
  • 合并的只能是用于背景的图片,对于<img src="">设置的图片不能合并
  • 大图中每个小图的坐标值都不可轻易改动
CSS hack
  • IE条件注释法
    <!--[if lte IE6]> <span></span> <![endif]-->
    <!--[if lt IE6]> <span></span> <![endif]-->
    <!--[if gte IE6]> <span></span> <![endif]-->
    <!--[if gt IE6]> <span></span> <![endif]-->
    <!--[if ! IE6]> <span></span> <![endif]-->
  • 选择符前缀法
    *html .test{width:60px;}/*IE6*/
    *+html .test{width:70px;}/*IE7*/
  • 样式属性前缀法
    .test{
    width:80px;
    *width:70px;/*IE6,IE7*/
    _width:60px;/*IE6*/
    }
a标签的4种状态排序

love hate原则:l(link)ov(visited)eh(hover)a(active)te

hasLayout

触发hasLayout解决IE bug
zoom:1;
zoom无效时,可以设置position:relative;,但会有副作用

块级元素和行内元素
块级行内
独占一行,默认情况下,其宽度自动填满其父元素宽度,即使设置了宽度,仍然独占一行不会独占一行,相邻元素排列在同一行里,直到一行排不下,才会换行,其宽度随元素的内容而变化
可以正常设置margin和padding水平方向的margin和padding会产生效果,竖直方向的margin和padding不产生边距效果
display:inline-block和hasLayout
  • 为了兼容IE,display能用的类型只有inline,block,none。IE6和IE7不支持display:inline-block;
  • inline-block:可以设置长宽,可以设置margin和padding值,但却不是独占一行
  • 如果对行内元素触发hasLayout,就可以模拟display:inline-block的效果
    行内元素{display:inline-block;}即可触发hasLayout
    只能对行内元素实现

img标签和button标签都具有display:inline-block;的特性,可以设置长宽但不独占一行

relative,absolute和float

这个我之前写过一篇博客,列了一个表格进行了对比,传送门

补充一个position各个值的描述
position: static;

  • position的默认值,元素将定位到它的正常位置,其实也就相当于没有定位
  • 元素在页面中占据位置
  • 不能使用top,right,bottom,left移动元素位置

position: relative;

  • 相对定位,相对于元素的正常位置来进行定位
  • 元素在页面中占据位置
  • 可以使用top,right,bottom,left移动元素位置

position: absolute;

  • 绝对定位,相对于最近一级的、定位不是static的父元素来进行定位
  • 元素在页面中不占据位置
  • 可以使用top,right,bottom,left移动元素位置

position: fixed;

  • 绝对定位,相对于浏览器窗口进行定位,其余和absolute一样,相当于一种特殊的absolute

position: inherit;

  • 从父元素继承position属性的值
居中

水平居中

  • 行内元素的水平居中
    给父元素设置text-align: center;
  • 确定宽度的块级元素的水平居中
    设置margin-left: auto;margin-right: auto;
  • 不确定宽度的块级元素的水平居中
    1. 将元素包含在table标签内,对table设置margin-left: auto;margin-right: auto;
      增加了无语义标签,加深了标签的嵌套层数
      (table本身不是块级元素,如果不设置其宽度,它的宽度由内部元素的宽度撑起)
    2. 改变块级元素的display为inline类型,然后使用text-align: center;来实现居中。但存在副作用
    3. 给父元素设置float,然后父元素设置position: relative;left: 50%;,子元素设置position: relative;left: -50%;来实现水平居中。但存在副作用

竖直居中

  • 父元素高度不确定的文本、图片、块级元素的竖直居中
    通过给父容器设置相同的上下内边距实现(padding-toppadding-bottom
  • 父元素高度确定的单行文本的竖直居中
    通过给父元素设置line-height来实现,line-height值和父元素的高度值相同
  • 父元素高度确定的多行文本、图片、块级元素的竖直居中
    1. vertical-align: middle;但只有当父元素为td和th时,才会生效
      在Firefox和IE8下,可以设置块级元素的display类型为table-cell来激活vertical-align
      IE6和IE7并不支持display: table-cell;
      所以可以直接使用table,td,默认情况下已经隐式的设置了vertical-align: middle;
    2. 使用hack
      在不支持display: table-cell;的IE6和IE7下,通过给父子两层元素分别设置top: 50%;top: -50%;来实现居中
      设置了position: relative;position: absolute;会有副作用
z-index
  • 激活z-index属性后,如果不设置其值,那么默认为0,但仍然浮于body之上
  • 如果多个元素的z-index值相同,那么HTML标签中后出现的元素,会浮在先出现的元素之上

负边距——并未激活z-index,但仍然让元素的位置发生了重叠

浏览器解析页面时,会先判断元素的类型,如果是窗口类型的,会优先于非窗口类型的元素,显示在页面的最顶端,如果同属非窗口类型的,才会判断z-index的大小(select元素在IE6下是以窗口形式显示的)

IE6下png图片透明的地方会显示为浅蓝色
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
kindle高清文字版,可在电脑上用clearview电子书阅读软件阅读。 第1章 从网站重构说起 1.1 糟糕的页面实现,头疼的维护工作 1.2 Web标准——结构、样式和行为的分离 1.3 前端的现状 1.4 打造高品质的前端代码,提高代码的可维护性——精简、重用、有序 第2章 团队合作 2.1 揭秘前端开发工程师 2.2 欲精一行,必先通十行 2.3 增加代码可读性——注释 2.4 提高重用性——公共组件和私有组件的维护 2.5 冗余和精简的矛盾——选择集中还是选择分散 2.6 磨刀不误砍柴工——前期的构思很重要 2.7 制订规范 2.8 团队合作的最大难度不是技术,是人 第3章 高质量的HTML 3.1 标签的语义 3.2 为什么要使用语义化标签 3.3 如何确定你的标签是否语义良好 3.4 常见模块你真的很了解吗 3.4.1 标题和内容 3.4.2 表单 3.4.3 表格 3.4.4 语义化标签应注意的一些其他问题 第4章 高质量CSS 4.1 怪异模式和DTD 4.2 如何组织CSS 4.3 推荐的base.css 4.4 模块化CSS——在CSS中引入面向对象编程思想 4.4.1 如何划分模块——单一职责 4.4.2 CSS的命名——命名空间的概念 4.4.3 挂多个class还是新建class——多用组合,少用继承 4.4.4 如何处理上下margin 4.5 低权重原则——避免滥用子选择器 4.6 CSS sprite 4.7 CSS的常见问题 4.7.1 CSS的编码风格 4.7.2 id和class 4.7.3 CSS hack 4.7.4 解决超链接访问后hover样式不出现的问题 4.7.5 hasLayout 4.7.6 块级元素和行内元素的区别 4.7.7 display:inline-block和hasLayout 4.7.8 relative、absolute和float 4.7.9 居中 4.7.10 网格布局 4.7.11 z-index的相关问题以及Flash和IE 6下的select元素 4.7.12 插入png图片 4.7.13 多版本IE并存方案——CSS的调试利器IETester 第5章 高质量的JavaScript 5.1 养成良好的编程习惯 5.1.1 团队合作——如何避免JS冲突 5.1.2 给程序一个统一的入口——window.onload和DOMReady 5.1.3 CSS放在页头,JavaScript放在页尾 5.1.4 引入编译的概念——文件压缩 5.2 JavaScript的分层概念和JavaScript库 5.2.1 JavaScript如何分层 5.2.2 base层 5.2.3 common层 5.2.4 page层 5.2.5 JavaScript库 5.3 编程实用技巧 5.3.1 弹性 5.3.2 getElementById、getElementsByTagName和getElements-ByClassName 5.3.3 可复用性 5.3.4 避免产生副作用 5.3.5 通过传参实现定制 5.3.6 控制this关键字的指向 5.3.7 预留回调接口 5.3.8 编程中的DRY规则 5.3.9 用hash对象传参 5.4 面向对象编程 5.4.1 面向过程编程和面向对象编程 5.4.2 JavaScript的面向对象编程 5.4.3 用面向对象方式重写代码 5.5 其他问题 5.5.1 prototype和内置类 5.5.2 标签的自定义属性 5.5.3 标签的内联事件和event对象 5.5.4 利用事件冒泡机制 5.5.5 改变DOM样式的三种方式 附录A 写在规则前面的话 附录B 命名规则 附录C 分工安排 附录D 注释规则 附录E HTML规范 附录F CSS规范 附录G JavaScript规范
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值