前言
前端三大法宝之一CSS,当掌握了以下知识,基本控制HTML的表现可就不会再出现各种莫名其妙的问题啦~
层叠样式表cascading style sheet
-
嵌入式样式
将style当做元素的属性, 将所有样式写在style中, 只对当前元素起作用, 不方便复用, 不推荐使用
-
内联样式
在内部引入style标签
-
外联样式
从外部引入style标签, 可以利用浏览器缓存加快用户访问速度, 最推荐使用, link原本的目的是用来链入外部文档,用rel(relation)表示当前文档与外部文档之间的关系
<link rel="stylesheet" type="text/css" href=""></link>
基本规则与定义
-
选择器
使用选择器语法选择相应的元素
-
声明块
使用
{}
, 为名值对结构, 不同声明使用;来分隔, 名值之间使用:来连接 -
元素类型
-
块元素
独占一行的元素, 无论内容多少都一定独占一行
如div, h1, h2…, p, br等
div没有语义, 仅仅为了设置一个块元素
-
内联元素
只占自身大小的元素, 不会占用一行
如span,a,img,iframe
span没有语义, 仅仅用来设置一个内联元素
-
-
一般情况下使用块布局, 使用内联元素修改样式并且使用块元素包含内联元素
-
a
元素可以包含任何元素但不能包含本身 -
p
元素不能包含任何块元素 -
元素之间的关系
父元素
子元素
祖先元素
后代元素
兄弟元素
选择器
-
CSS通过选择器来获取到HTML的指定DOM节点
-
基本选择器(适用于市面上所有浏览器)
- 通配符
*
- id选择器
#
- 类选择器
.
- 后代选择器
空格
- 元素选择器
元素名
- 分组
,
(结合符)
- 通配符
-
声明的优先级
选择器特殊性, 特殊性为4个部分
0,0,0,0
ID选择器特殊性为第三位
类选择器, 伪元素, 属性选择器特殊性为第二位
伪类与元素特殊性为第一位
通配符不增加特殊性
结合符对特殊性没有贡献
内联中的选择器特殊性为第四位
继承属性没有特殊性
-
重要声明
!important
添加在声明最后的分号之前
浏览器会将重要声明与非重要声明分为两组, 先解决每一组之间的冲突, 再解决两组之间的冲突, 但最终胜出的一定是重要声明
-
权重(由高到低)
读者的重要声明
创作者的重要声明
创作者的正常声明
读者的正常声明
用户代理的声明
-
计算声明优先级(由高到低)
按照来源排序
按照选择器特殊性排序
按照顺序排序
-
长度单位
- 像素 px 显示效果越好的显示屏, 像素越小
- 手机浏览器会自动将实际像素大小乘以4来显示
- 百分比 % 根据父元素的大小来计算样式, 当父元素属性发生变化时, 子元素也会发生改变
- 自适应时常用
- em 和百分比类似, 相对于当前元素字体大小来计算
- 1em = 1 font-size
颜色单位
- 直接使用单词表示
- red, blue
- RGB(红色浓度, 绿色浓度, 蓝色浓度)
- 可以是0-255的数字
- RGB(111,222,123)
- 可以是0%-100%的百分比
- RGB(50%,50%,50%)
- 使用16进制来表示, 三组两位来表示, 每一组为00-ff, 当两位相同时可以简写
- #0000ff /#00f
- 可以是0-255的数字
字体
-
字体颜色
color
- 指定字体颜色, 会继承给
border-color
- 指定字体颜色, 会继承给
-
字体大小
font-size
- 设置的不是字体本身大小, 而是一个看不见的框的高度, 字在这个框中, chrome最小就支持
12px
,可以设置为0使内联元素间的距离清除
- 设置的不是字体本身大小, 而是一个看不见的框的高度, 字在这个框中, chrome最小就支持
-
字体样式
font-style
normal
italic
斜体oblique
倾斜
大部分浏览器都不会区分这两者
-
字体粗细
font-weight
normal
bold
加粗
也可以指定100,200, … , 900等9种粗体, 但是用户电脑往往没有那么多字体所以可能达不到想要的效果
-
font-variant
设置小型大写字母normal
small-caps
所有字母用大写表示但是小写字母用比较小的大写字母显示
-
字体
font-family
- 指定字体, 当采用某种字体如果浏览器支持则使用指定字体, 否则使用默认字体
- 该样式可以同时指定多个字体, 优先显示排在前面的字体, 没有再使用下一个
- 浏览器使用的是计算机中的字体, 有则使用没有则不使用, 尽量不要使用奇怪的字体
font-family: arial, 微软雅黑
-
字体分类
- 在网页中将字体分为五大类, 浏览器自动选取属于这些类中的字体来显示, 一般将大分类指定为
font-family
的最后一种字体serif
衬线字体即有笔锋sans-serif
非衬线字体即无笔锋monospace
等宽字体即每个字一样宽cursive
草书字体fantasy
虚幻字体
- 在网页中将字体分为五大类, 浏览器自动选取属于这些类中的字体来显示, 一般将大分类指定为
-
可以使用
font
来设置所有与字体相关的样式, 不同样式之间用空格隔开斜体 加粗 小型大写字母
三者顺序可变且可不写- 文字大小和字体必须写, 不写就将字体样式全部应用默认值
- 性能较分开写更好
行间距
-
只能通过设置行高来间接设置行间距
-
行间距 = 行高 - 字体大小
-
line-height
- 使用大小表示
- 使用百分数表示
- 使用一个数值表示字体大小的倍数
-
文字会默认在行高中垂直居中显示
-
对于单行文本可以将行高设置与父元素高度一致使文本居中
-
可在
font
中设置行高, 行高值是字体大小加斜杠后设置font: 30px/30px "微软雅黑"
- 当使用
font
时其他在font
中未指定的值都会变成默认值, 因此其他与字体相关的属性都要写在font
之后
- 当使用
文本相关
-
text-transform
设置大小写none
capitalize
单词首字母大写, 用单词边界区分单词uppercase
全部大写lowercase
全部小写
-
text-decoration
定义文本的线条none
underline
下划线overline
上划线line-through
中线
超链接会默认设置下划线, 要去除时要用此属性
-
letter-spacing
字符间距- 中文也会起作用
-
word-spacing
单词间距- 本质是单纯设置空格的大小
-
text-align
文本对齐方式left
靠左对齐right
靠右对齐center
居中对齐justify
两端对齐(通过调整文本间大小来对齐)
-
text-indent
设置首行缩进(IE6,7中可能会让父元素一起缩进)- 设置正值向右缩进指定像素
- 设置负值向左缩进指定像素
text-indent: 2em;
- 可以用来隐藏一段文字
text-indent: -9999px;
CSS重难点概念
-
盒子模型
- 由内容区, 内边距, 边框, 外边距组成
-
设置边框
三种样式缺一不可
border-width
border-color
border-style
每种属性都可以通过写入不同数量的属性值来表示不同方向应用哪些属性
也可以使用类似如下语句来规定特定方向的属性
border-left-width
大部分浏览器边框宽度和颜色有默认值但是
style
默认值为none
所以只设置
style
时就有边框显示可以使用
border
统一设置, 没有顺序要求,border
只能指定4个边的样式都相同不能分别指定border: 10px blue solid;
可以使用
border-top
,border-bottom
等来分别设置 -
设置内边距
padding
可以一次性写明上下左右 -
设置外边距
- 不影响可见框的大小而是影响定位
margin
可以一次性写明上下左右- 左上的
margin
值影响元素本身的定位, 右下的margin
值影响相邻元素的位置 - 当值为负时, 元素向反方向移动
- 水平方向设置为
auto
时将会设置成最大值 - 垂直方向设置为
auto
时会设置成0 - 当
left
与right
都设置成auto
时, 两值会相同因此可这样设置使元素居中 -
垂直外边距的重叠
-
元素间相邻的垂直方向的外边距会取最大值而不是相加
- 兄弟之间
- 父子元素之间, 当子元素设置上边距时如果父子元素上边距相邻, 父元素会使用子元素的上边距, 可使用
padding
,border
等隔开使其不相邻而不生效
-
-
浏览器默认
浏览器为了在没有设置样式时也可读会给标签设置默认样式, 但是许多默认样式是不需要的
可以用
margin
,padding
赋值为0来覆盖 -
内联元素的盒模型
内联元素不能设置宽和高
可以设置内边距但垂直内边距不影响页面布局, 水平内边距会影响
可以设置边框但是垂直边框不影响布局, 水平会影响
可以设置水平外边距且不会重叠, 不能设置垂直外边距
-
将内联元素设置为块元素
display
inline
内联元素block
块元素inline-block
行内块元素, 可以使元素既可以设置宽高等且不会独占一行none
不显示元素且不占位与visibility:(visible/hidden)
相似, 但后者会占位
-
溢出
子元素理论上小于等于父元素的内容区但有时候会大于父元素的内容区, 此时叫溢出
可以使用
overflow
处理-
可选值
visible
默认值hidden
隐藏溢出内容scroll
滚动查看溢出内容, 无论是否溢出都会添加滚动条auto
根据需求是否添加滚动条
-
-
文档流
文档流在网页最底层, 表示页面的位置, 所创建的元素默认在文档流中
-
元素在文档流中的特点
-
块元素
- 在文档流中独占一行自上向下排列
- 块元素在文档流中默认宽度是100%, 宽度值是auto
- 块元素在文档流中的高度默认被内容区撑开
-
内联元素
- 内联元素在文档流中只占自身大小, 默认从左向右排列, 如果一行不够容纳则换到下一行继续自左向右
- 文档流中, 内联元素宽度和高度默认被内容撑开
-
-
-
浮动float
可以使用它来使块元素脱离文档流
-
使元素浮动后, 这个元素会向上浮动直到碰到父元素的边框或者其他浮动元素就会停止
-
如果浮动元素上面是没有设置浮动的块元素则浮动元素不会超过块元素
-
在IE6中上面元素如果是内联元素也不会超过那个内联元素
-
如果一行无法容纳浮动元素则会自动换行
-
浮动的元素不会超过它上边的兄弟浮动元素, 即处于其下方或平行
-
浮动的元素不会盖住文字, 文字会自动环绕在浮动元素周围
-
在文档流中元素宽度默认值是父元素的全部, 当浮动脱离文档流后高度和宽度默认由内容决定
-
内联元素脱离文档流后表现与块元素脱离后相同
-
可选值:
-
none 默认值, 不浮动
-
left 向左浮动
-
right 向右浮动
-
-
-
高度塌陷问题
在文档流中父元素默认被子元素撑开, 子元素多高, 父元素也多高
当给子元素设置浮动, 子元素会完全脱离文档流此时将会导致子元素无法撑起父元素的高度造成高度塌陷
-
最直接的解决高度塌陷方式
- 将高度写定, 但父元素无法适应子元素高度, 因此不推荐使用
-
-
高度塌陷的进阶办法
在页面中元素有隐藏属性block formatting context, 简称BFC, 该属性可以打开或关闭, 默认关闭
-
当开启BFC时元素有以下属性
- 父元素垂直外边距不会和子元素重叠
- 不会被浮动元素覆盖
- 可以包含浮动元素
-
开启BFC有如下方法
-
设置元素浮动
会导致父元素宽度丢失, 且之后的元素上移, 不推荐
- 设置绝对定位
-
设置为
inline-block
宽度会丢失, 不推荐使用
-
overflow
设置为非visible
值此元素内部的相对定位元素如果超出内容区会被隐藏
这些方法中将
overflow
设置为hidden
或者auto
副作用最小
-
IE6及以下不支持BFC, 因此使用此方式不兼容BFC
IE6有类似属性叫做hasLayout
-
开启此属性有以下方法
zoom: 1
将元素放大至原来的1倍min-height
/max-height
/min-width
/max-width
:(除none外的其他选项)- 绝对定位
基础篇中对这些内容讲解较少,详细规则可以参考进阶篇中的内容
-
清除浮动
有时希望其他元素浮动时对当前元素不产生影响, 使用
clear
样式-
clear
用来清除其他元素对当前元素的影响, 可选值none
默认值left
清除影响最大的左侧浮动元素的影响right
清除影响最大的右侧浮动元素的影响both
清除两边中影响最大的浮动元素的影响
-
-
常用的解决高度塌陷方式
使用清除浮动的方式解决高度塌陷, 在浮动元素后增加一个带有
clear
属性的空白块元素来撑起高度可使用伪类
.clearfix:after
来在不修改html结构的情况下解决问题(clearfix为浮动元素的父元素)IE6及以下不支持此伪类, 使用以下语句来兼容
.clearfix{ zoom: 1; }
table添加在子元素前时可以解决父子元素上外边距重叠问题, 为了不改变html结构使用以下语句可以同时解决上外边距重叠与高度塌陷问题
.clearfix:before, .clearfix:after{ content: ""; display: table; clear: both; }
清除浮动属于CSS中较困难的知识,此处有清除浮动练习可供参考
-
-
定位
position
作用是将元素移动到页面的指定位置
-
static
默认值, 没有开启定位 -
relative
相对定位开启元素相对定位不设置偏移量时页面不会产生任何变化
可以通过
left
,right
,top
,bottom
来设置元素偏移量如果没有开启定位会忽略以上属性
相对定位是元素相对原本在文档流中的位置进行定位
相对定位会使元素提升层级, 定位元素会盖住文档流中的元素
相对定位不会改变元素的性质, 块元素和内联元素这个性质不会变化
-
absolute
绝对定位开启此定位会使元素脱离文档流
开启此定位不设置偏移量元素的位置不会发生变化
绝对定位是相对于开启了定位的最近的祖先元素进行定位
如果所有祖先元素都没有开启定位则会相对于浏览器窗口进行定位(一般来说开启绝对定位都会开启父元素的相对定位)
绝对定位会提升元素的层级
开启绝对定位会使内联元素变成块元素, 宽度和高度默认被内容撑开
-
fixed
固定定位固定定位是绝对定位的一种, 不同点
永远只相对于页面窗口进行定位
IE6及以下不支持固定定位
-
-
元素层级
如果元素层级相同, 则结构上在下面的元素会覆盖上面的
可以通过
z-index
来指定层级, 层级越高越优先显示父元素层级再高也不会盖住子元素, 父元素调高层级, 子元素也会自动调高
-
透明
-
opacity
- 0-1之间的值, 0是完全透明
- IE8及以下不支持
-
filter: alpha(opacity=50)
- 在IE中使用此属性代替
- 0-100之间的值
-
元素背景
-
background-color: [color|transparent]
设置为
transparent
则背景透明,此元素从border-box
绘制 -
background-image: url(相对路径或者绝对路径)
- 元素大小默认为位图的大小
- 如果背景图片大于img元素, 则从左上角开始显示, 多出部分不显示
- 如果背景图片小于img元素则默认平铺来充满元素
- 可以同时指定背景图片与背景颜色, 此时背景颜色会充当底色
- 在IE6中对PNG24支持不高, 如果使用则透明效果无法正常使用, 使用png8来解决或者引入外部js文件处理
background-repeat
repeat
默认值, 双向平铺no-repeat
不平铺repeat-x
水平平铺repeat-y
垂直方向平铺
可以通过平铺来将1像素宽或高的图片填充各种元素的背景
-
background-position
对
background-image
中s设置的图片进行位置定位-
使用
left
,top
,right
,bottom
,center
中的两个值来确定图片位置如果只给出一个值第二值默认是
center
-
指定偏移量 第一个值为水平偏移量第二值为垂直偏移量, 偏移量为百分比时, 是指元素大小减去图片大小的百分比, 保留正负号
-
-
background-attachment
设置背景图片是否随页面滚动
scroll
默认值, 背景图片随窗口滚动fixed
背景图片固定, 不随页面滚动
当设置成
fixed
时, 背景图片的定位会变成相对于视图调整 不推荐使用此语句, 因为性能耗费严重, 建议使用固定定位代替 -
background
设置所有背景相关的属性, 没有顺序与数量要求, 不设置的值会有默认值
简单的兼容性问题
-
条件hack
编写在HTML中的hack语句
当只需要在某些IE浏览器中执行某些代码时使用
原理在于特定浏览器能识别这些代码而其他浏览器不能识别
-
例如
适用于IE9及以下
<!--[if IE]> <![endif]-->
-
基本语法
<!-- [if (keyword)? IE (version)?]> <![endif]-->
-
-
属性hack
编写在CSS中的hack语句
- 在样式前添加
_
, 使此条语句只在IE6生效
body {_background-color: black;}
- 在样式前添加
*
, 使此条语句只在IE7及以下生效
body {*background-color: pink;}
- 在样式前添加
-
IE6双倍边距bug
在IE6中如果给左浮动元素设置左外边距或者给右浮动元素设置右外边距会变成双倍外边距 给此浮动元素设置成
inline
可以解决
CSS性能优化的小tip
-
CSS-sprite
方法:
将多个图片整合成一个请求, 加快访问速度, 提升体验并且能够减少图片的总大小