CSS(层叠样式表,Cascading Style Sheet)
1. 浏览器
Browser | Rendering Engine |
---|---|
Chrome | Webkit / Blink |
Safari | Webkit |
Firefox | Gecko |
IE | Trident |
Opera | Presto / Webkit / Blink |
2. CSS 插入方式
内联样式/行内样式:在标签内部通过
style
属性设置元素样式问题:样式只对一个标签生效,不方便维护(开发时绝对不要使用)
内联样式表:在
head
标签中的style
标签中编写样式,通过CSS
选择器选中元素并为其设置各种样式问题:内部样式表只用于当前页面
外部样式表:在外部 CSS 文件中编写样式,通过
link
标签引入外部 CSS 文件(最佳实践)优势:外部 CSS 文件中的样式可以在多个页面中复用,同时可以利用浏览器的缓存机制,提高加载速度
3. CSS 基本语法:选择器、声明块
- 选择器:通过选择器选中页面中的指定元素
- 声明块:通过声明块指定元素的样式,由多个声明组成,一个声明就是一个名值对(样式名:样式值;)
3.1 选择器
元素选择器:根据标签名选中相应的元素
标签名 {声明块}
id
选择器:根据元素的id
属性值选中相应的元素(id
属性值不能重复)#id属性值 {声明块}
类选择器:根据元素的
class
属性值选中相应的元素(class
属性值可以重复,一个元素可以设置多个class
属性,使用空格隔开).class属性值 {声明块}
通配选择器:选中页面中的所有元素
* {声明块}
复合选择器
交集选择器:选中同时符合多个条件的元素
选择器1选择器2···选择器n {声明块}
并集选择器:同时选中多个选择器对应的元素
选择器1, 选择器2, ···, 选择器n {声明块}
关系选择器
- 父元素:直接包含子元素的元素
- 子元素:直接被父元素包含的元素
- 祖先元素:直接或间接包含后代元素的元素
- 后代元素:直接或间接被祖先元素包含的元素
- 兄弟元素:被相同父元素包含的元素
子元素选择器:选中父元素内所有符合条件的子元素
父元素 > 子元素 {声明块}
后代元素选择器:选中元素内所有符合条件的后代元素(注意:交集选择器和后代元素选择器的区别)
祖先元素 后代元素 {声明块}
兄弟元素选择器:
选中元素之后第一个符合条件的兄弟元素
选择器1 + 选择器2 {声明块}
选中元素之后所有符合条件的兄弟元素
选择器1 ~ 选择器2 {声明块}
属性选择器
[属性名]:选择带有指定属性的所有元素
/* 选择带有 target 属性的所有元素 */ [target] {声明块}
[属性名=属性值]:选择带有指定属性且属性值等于指定值的所有元素(属性值可不加引号,只在其中包含符号或者空格时必须加引号)
/* 选择带有 target 属性且 target 属性等于 _blank 的所有元素 */ [target=_blank] {声明块}
[属性名~=属性值]:选择带有指定属性和且属性值包含指定值这一单词的所有元素
/* 选择带有 title 属性且 title 属性包含 title 这一单词的所有元素 选择 title="article title",不选择 title="article-title" 和 title="articletitle" */ [title~=title] {声明块}
[属性名|=属性值]:选择带有指定属性且属性值等于指定值或以指定值开头并与短横线相连的所有元素
/* 选择带有 title 属性且 title 属性等于 article 或以 article 开头并与短横线相连的所有元素 选择 title="article"、title="article-" 和 title="article-title" 不选择 title="articletitle" 和 title="article title" */ [title|=article] {声明块}
[属性名^=属性值]:选择带有指定属性且属性值以指定值开头的所有元素
/* 选择带有 title 属性且 title 属性以 article 开头的所有元素 选择 title="article title" 、 title="article-title" 和 title="articletitle" */ [title^=article] {声明块}
[属性名$=属性值]:选择带有指定属性且属性值以指定值结尾的所有元素
/* 选择带有 src 属性且属性值以 .jpeg 结尾的所有元素 */ [src$=".jpeg"] {声明块}
[属性名*=属性值]:选择带有指定属性且属性值中出现指定值的所有元素
/* 选择带有 title 属性且 title 属性值中出现 ticle 的所有元素 */ [title*=ticle] {声明块}
伪类选择器:伪类用于描述一个元素的特殊状态
:first-child
-> 选择属于父元素第一个子元素的所有元素:last-child
-> 选择属于父元素最后一个子元素的所有元素:nth-child(n)
-> 选择属于父元素第n
个子元素的所有元素:nth-last-child(n)
-> 选择属于父元素倒数第n
个子元素的所有元素:nth-child(2n)
/:nth-child(even)
-> 选择属于父元素偶数位子元素的所有元素:nth-child(2n+1)
/:nth-child(odd)
-> 选择属于父元素奇数位子元素的所有元素:only-child
-> 选择属于父元素唯一子元素的所有元素:first-of-type
-> 选择其父元素第一个指定子元素:last-of-type
-> 选择其父元素最后一个指定子元素:nth-of-type(n)
-> 选择其父元素第n
个指定子元素:nth-last-of-type(n)
-> 选择其父元素倒数第n
个指定子元素:only-of-type
-> 选择属于父元素唯一指定子元素的所有元素:not(选择器)
-> 选择不符合条件的所有元素a:link
-> 正常的链接(未访问的链接)a:visited
-> 已访问的链接(只能修改链接颜色,一般不用):hover
-> 选择鼠标移入的元素,用于设置鼠标移入后的效果:active
-> 选择鼠标点击的元素,用于设置鼠标点击后的效果:focus
-> 选择获取焦点的元素:root
-> 选择文档的根元素,即html
元素:empty
-> 选择没有子元素的所有元素
- 伪元素选择器:伪元素用于描述特殊的并不真实存在于
DOM
树中的元素(特殊的位置)
::first-letter
-> 第一个字母::first-line
-> 第一行::selection
-> 选中的内容::before
-> 在元素的内容前添加::after
-> 在元素的内容后添加
注意:::before
和::after
需要结合CSS
的content
属性使用(CSS3
规定伪元素选择器使用双冒号,只需兼容 Webkit、Firefox 和 Opera 等浏览器时使用双冒号,要兼容IE时,建议使用CSS2
的单冒号写法)
3.2 声明块
- 声明块放在大括号内
- 样式名和样式值通过冒号对应
- 每一个样式之后必须使用分号进行结束,否则回影响之后的样式
- 使用错误的样式名或样式值不会影响其他样式
- 可以随意添加空格,空格不影响样式,但会占用空间
4. 样式的继承和冲突
4.1 样式的继承
- 子元素将会继承父元素的样式
- 继承的样式没有权重
4.2 样式的冲突
通过不同的设置方式或选择器对同一元素的同一样式设置了不同的值就会产生优先级权重问题。
- 发生冲突时样式由优先级权重决定
内联样式1,0,0,0
>id
选择器0,1,0,0
> 属性、类和伪类选择器0,0,1,0
> 元素和伪元素选择器0,0,0,1
> 通配选择器0,0,0,0
> 继承的样式(没有权重) - 比较权重时需要将所有的选择器权重相加后进行比较(多个选择器权重相加和不会超过其中的最大数量级)
- 选择器权重相加结果相同时,优先使用样式表中最后出现的样式
- 可以在样式之后添加
!important
,将该样式设为最高优先级,且无法进行修改(慎用)
5. 元素的长度
- 像素(
px
) - 百分比(子元素大小会随父元素大小改变)
em
:相对于当前元素字体尺寸的长度单位 ->1
em
=1
font-size
,font-size
默认为16px
rem
:相对于根元素字体尺寸的长度单位
6. 盒子模型(Box Model)
CSS 将页面中的元素都设置为矩形的盒子,对页面的布局变成将不同的盒子摆放到不同的位置。
6.1 盒子的组成
外边距(
margin
):盒子和其它元素之间的距离margin
可以为负值,表示向相反方向移动默认情况下设置
margin-right
不会产生效果边框(
border
)(边框属于盒子边缘,边框会影响整个盒子大小)边框宽度
border-width
(默认为3px
)四个值(上 右 下 左)、三个值(上 左右 下)、两个值(上下 左右)、一个值(上下左右)或者单独指定某个边的宽度
border-top-width
/border-bottom-width
/border-left-width
/border-right-width
- 边框颜色
border-color
(默认为黑色) - 边框样式
border-style
(默认为none
,可选值包括dotted
/dashed
/solid
/double
/groove
/ridge
/inset
/outset
) - 简写:
border: width color style;
或者border-top
/border-bottom
/border-left
/border-right: width color style
(空格隔开,没有顺序要求)
- 内边距(
padding
):内容区和边框之间的距离(内边距会影响整个盒子大小) - 内容区(
content
):元素中的子元素和文本内容都在内容区中排列,大小由width
和height
两个属性或者子元素和文本内容的大小决定
注意:盒子的大小或盒子可见框的大小由边框、内边距和内容区决定,盒子占用空间大小由外边距、边框、内边距和内容区决定
6.2 元素的水平位置
一个元素在其父元素中的水平方向位置由margin-left
、border-left
、padding-left
、width
、padding-right
、border-right
和margin-right
共同决定
一个元素在其父元素中的水平布局满足以下等式:
margin-left
+ border-left
+ padding-left
+ width
+ padding-right
+ border-right
+ margin-right
= 其父元素内容区宽度
- 若相加结果不满足,称为过度约束
- 若所有值均不为
auto
,则自动调整margin-right
的值(可以为负值) - 若
margin-left
、width
和margin-right
中的某个值为auto
,则自动调整为auto
的值 - 若
width
的值为auto
时,margin-left
和margin-right
中存在值为auto
,则width
的值设置为最大,另外的值为auto
的属性值设置为0
- 若
margin-left
和margin-right
的值均为auto
,则将margin-left
和margin-right
设置为相同的值(用于设置一个元素在其父元素中居中)
注意:width
默认为auto
6.3 盒子的尺寸
box-sizing
属性:用于设置盒子大小的计算方式(width
和height
的作用):
content-box
-> 默认值,width
和height
分别表示内容区的宽和高border-box
->width
和height
分别表示盒子可见框的宽和高(边框、内边距和内容区总的宽和高)
注意:IE 盒子模型和 W3C 标准盒子模型的区别在于,IE 盒子模型的width
和height
分别表示盒子可见框的宽和高(box-sizing
属性默认为border-box
),W3C 标准盒子模型的width
和height
分别表示内容区的宽和高(box-sizing
属性默认为content-box
)。
6.4 内容溢出
overflow
属性:用于设置内容超出内容区所占位置时溢出内容的处理方式
visible
-> 溢出hidden
-> 隐藏scroll
-> 生成横向纵向滚动条auto
-> 自动生成所需方向滚动条
6.5 垂直外边距的重叠
相邻元素的垂直方向外边距会发生重叠
- 兄弟元素间的垂直外边距取较大值(特殊情况:一正一负则取和,两个负值则取绝对值较大值)
子元素的上外边距会传递给父元素(影响开发,需要进行处理)
.top { height: 100px; background: lightgreen; } .outer { width: 200px; height: 200px; background: skyblue; /* 父元素 margin-top 较小 */ margin-top: 20px; } .inner { width: 100px; height: 100px; background: lightpink; /* 子元素 margin-top j */ margin-top: 50px; }
6.6 行内元素的盒子模型
- 行内元素不支持设置宽度和高度
- 行内元素支持设置
padding
、border
和margin
,但不会影响垂直方向布局
6.7 盒子的显示
display
属性:用于设置元素显示方式
inline
-> 将元素设置为行内元素block
-> 将元素设置为块元素inline-block
-> 将元素设置为行内块元素(可以设置宽高但不会独占一行,慎用)table
-> 将元素设置为表格none
-> 隐藏元素,不占用位置
visibility
属性:用于设置元素可见性
visible
-> 默认值,元素正常显示hidden
-> 隐藏元素,但依然占用位置
6.8 元素的轮廓、阴影和圆角
outline
属性:用于设置元素的轮廓线,用法同border
属性,区别在于轮廓不会影响可见框的大小和页面的布局
box-shadow
属性:用于设置元素的阴影效果(不影响页面的布局)
box-shadow: 水平偏移量 垂直偏移量 阴影模糊半径(可选) 阴影颜色
border-radius
属性:用于设置元素圆角
border-top-left-radius
border-top-right-radius
border-bottom-left-radius
border-bottom-right-right
-> 一个值-圆角半径;两个值-椭圆长半径和短半径border-radius
-> 一个值:四个圆角半径;四个值:左上、右上、右下和左下圆角半径;两个值以"/"分隔-椭圆长半径/短半径border-radius: 50%;
:将元素设置为圆形
7. 浏览器默认样式
浏览器会为元素设置一些默认样式,默认样式的存在会影响页面的布局,在开发时需要先去除默认样式
去除默认样式的方法:引入重置样式表
reset.css
-> 直接去除浏览器的默认样式normalize.css
-> 对默认样式进行统一
8. 布局
8.1 浮动布局
float
属性:用于设置元素的浮动,使元素向其父元素的某一侧浮动
none
-> 默认值,元素不移动left
-> 元素向左浮动right
-> 元素向右移动
浮动的特点
- 文档流:网页是多层结构,用户只能看到最顶上的一层,最底下的一层称为文档流,文档流是网页的基础,所创建的元素默认都在文档流中排列
元素的两个状态:
在文档流中
- 块元素在页面中独占一行,默认宽度是父元素的
100%
,默认高度由内容决定 - 行内元素只占自身大小,在页面中水平排列并自动换行,默认宽度和高度有内容决定
- 块元素在页面中独占一行,默认宽度是父元素的
- 不在文档流中(脱离文档流)
浮动的特点:
- 浮动元素会完全脱离文档流,不再占用文档流中的位置,其后的元素会自动上移,可能被浮动元素覆盖
- 浮动元素会向父元素的某一侧移动
- 浮动元素在父元素的
content-box
内 - 浮动元素向父元素的某一侧移动时,不会超过之前的浮动元素
- 浮动元素不会超过其之前的浮动的兄弟元素
- 浮动元素不会盖住文字,文字会自动环绕在浮动元素周围
从文档流中脱离之后,元素的某些性质会发生改变
- 块元素不再独占一行
- 块元素的默认宽度和高度由内容决定
- 行内元素变成块元素,特点和块元素相同
简而言之,不再区分行内元素和块元素
浮动的问题:高度塌陷
- 高度塌陷:父元素的高度设置为
auto
时,其高度由子元素决定,子元素设置float
属性后将会脱离文档流,导致父元素高度丢失 解决方案:
BFC
(Block Formatting Context
,块级格式化上下文)clear
属性:使当前元素的左侧/右侧/两侧不允许出现浮动元素(移动当前元素以达到效果)可选值:
left
/right
/both
-> 清除左侧/右侧/两侧中较大一侧元素浮动对当前元素产生的影响解决方案:利用伪元素在当前元素下加一个没有内容但设置了
clear
属性的块元素(该伪元素位置会随子元素高度变化,父元素需要包括该伪元素,故父元素高度会随子元素高度变化)
完美解决外边距重叠和高度塌陷的方案:clear-fix
类
.clear-fix::before,
.clear-fix::after{
content: '';
/* table元素没有内容时不显示,且不占用布局 */
display: table;
}
.clear-fix::after {
clear: both;
}
或者
.clear-fix::after {
content: '';
display: block;
height: 0;
line-height: 0;
visibility: hidden;
clear: both;
}
8.2 定位布局
position
属性;利用position
属性可以将元素放到页面的任意位置
static
-> 默认值,不开启定位,元素静止relative
-> 开启元素相对定位absolute
-> 开启元素绝对定位fixed
-> 开启元素固定定位sticky
-> 开启元素粘滞定位
相对定位
- 相对定位:参照元素在文档流中的位置进行定位
特点:
- 开启相对定位后,若未设置偏移量则元素不会发生任何变化
- 开启相对定位后会提升元素层级(将覆盖文档流中的其他元素)
- 开启相对定位的元素不会脱离文档流(元素依然占据文档流中的位置)
开启相对定位不会改变元素的性质(不会改变行内元素或块元素)
偏移量(
offset
):定位元素与定位位置间的距离,可通过top
/bottom
/left
/right
四个属性进行设置top
/bottom
属性 -> 用于设置定位元素上边/下边和定位位置间的距离,控制定位元素垂直方向的位置(只用一个)left
/right
属性 -> 用于设置定位元素左边/右边和定位位置间的距离,控制定位元素水平方向的距离(只用一个)
绝对定位
绝对定位:参照元素包含块进行定位
- 包含块:一般情况下是指元素最近的祖先块元素;对于开启了绝对定位的元素,包含块指其最近的开启了定位(非
static
)的祖先块元素(html
元素,又称为初始包含块)
- 包含块:一般情况下是指元素最近的祖先块元素;对于开启了绝对定位的元素,包含块指其最近的开启了定位(非
特点:
- 开启绝对定位后,若未设置偏移量则元素位置不会发生变化
- 开启绝对定位后,元素脱离文档流
- 开启绝对定位后,行内元素变成块元素,高度和宽度由内容决定
- 开启绝对定位会提升元素层级(会覆盖文档流中的其他元素)
开启绝对定位的元素在其包含块中的水平布局满足等式:
left
+margin-left
+border-left
+padding-left
+width
+padding-right
+border-right
+margin-right
+right
= 包含块的内容区宽度若过度约束:
- 若所有值均不为
auto
,则自动调整margin-right
的值(可以为负值) - 若
left
、margin-left
、width
、margin-right
和right
中的某个值为auto
,则自动调整设置为auto
的属性的值 - 若
margin-left
和margin-right
中的某个值和width
的值为auto
,则width
设置为最大,设置为auto
的属性设置为0
- 若
left
和right
中的某个值和width
的值为auto
,则width
由内容决定,自动调整设置为auto
的属性 - 若
left
和right
的值均为auto
,则将left
和right
设置为0
- 若五个值均为
auto
,则width
由内容决定,其余四个值都设置为0
- 若所有值均不为
开启绝对定位的元素在其包含块中的垂直布局满足等式:
top
+margin-top
+border-top
+padding-top
+height
+padding-bottom
+border-bottom
+margin-bottom
+bottom
= 包含块的内容区高度若过度约束:调整类似水平布局
固定定位
- 固定定位:参照浏览器的视口进行定位(浏览器视口-浏览器的可视区域),固定定位属于绝对定位,大部分性质同绝对定位
- 特点:开启固定定位的元素不会随浏览器滚动条滚动
粘滞定位
粘滞定位:在到达包含块指定位置前随浏览器滚动条滚动,达到之后不再随滚动条滚动(兼容性较差,一般不用)
对同级元素设置粘性定位,则之后的元素会覆盖之前的元素
第一节
第二节
对非同级元素设置粘性定位,则之后的元素会挤掉之前的元素
第一节
段落二
第二节
段落一
z-index
属性 -> 整数值,用于设置元素的层级,数值越大层级越高(注意:祖先元素不会覆盖后代元素)
9. 文本
9.1 字体
字体设置
font-family
属性:可以直接指定多个字体样式或字体族,用逗号分隔,浏览器按先后顺序选择可用的字体样式或字体族(必须使用通用字体,避免出现电脑中没有指定字体的情况)
字体族(字体样式的类别,不是具体的样式):
serif
-> 衬线字体sans-serif
-> 非衬线字体monospace
-> 等宽字体
@font-face
样式:用于下载并引入外部的字体(会影响加载速度)
@font-face{
/* 指定字体名称 */
font-family: '';
/* 字体的路径 */
src: url('');
}
图标字体:通过图片引入图标十分不灵活,因此可以将图标设置为字体,通过@font-face
样式进行引入
颜色
color
属性:前景色(通常用于设置字体颜色)
字号
font-size
属性:字体大小
xx-small
|x-small
|small
|medium
|large
|x-large
|xx-large
- 像素值(
px
) - 百分数(当前元素字体大小相对于其父元素字体大小)
em
(等同于使用百分数)
行高
line-height
属性:行高,即文字占据的实际高度
- 行高可以指定大小(单位
px
或em
),也可以指定一个整数,表示字体大小的倍数(行高默认为字体大小的1.33
倍) - 行高会在字体框的上下平均分配(字体框:字体存在的格子)
- 行间距 = 行高 - 字体大小
字重
font-weight
属性:用于设置字重(加粗)
normal
-> 默认值,不加粗bold
-> 加粗bolder
-> 比加粗更粗lighter
-> 比默认值更细- 100~900 -> 九个级别,400对应
normal
,700对应bold
(一般不用)
字体风格
font-style
属性:用于设置字体风格
normal
-> 默认值,正常italic
-> 斜体
组合设置
font
属性:用于设置字体的相关属性(字体设置和字体大小是必选值)
font: 字重 字体风格 字体大小/行高 字体族
9.2 文本
font-variant
属性:用于设置小型大写字母
text-transform
属性:用于设置文本大小写
none
-> 默认值,不修改大小写capitalize
-> 首字母大写uppercase
-> 全部大写lowercase
-> 全部小写
text-decoration
属性:用于设置下划线、删除线和上划线
none
-> 默认值,不添加underline
-> 添加下划线line-through
-> 添加删除线overline
-> 添加上划线
text-shadow
属性:用于设置文本阴影
text-shadow: 颜色 水平偏移 垂直偏移 模糊度
white-space
属性:用于设置文本中的空白
normal
-> 默认值,忽略空白pre
-> 保留文本中的所有空白,不自动换行(类似于pre
标签nowrap
-> 文本不自动换行pre-wrap
-> 保留文本中的所有空白,自动换行pre-line
-> 只保留文本中的换行符,忽略其他空白
overflow-wrap
属性:用于设置文本溢出时的换行原则
normal
:默认值,单词中间不断开break-word
:文本溢出时单词中间可断开
text-overflow
属性:用于设置文本溢出时的隐藏原则
clip
-> 隐藏超出部分ellipsis
-> 超出部分用省略号表示- 自定义字符串 -> 超出部分用自定义字符串表示
9.3 段落
text-indent
属性:用于设置段落首行缩进,可选值为长度值或百分比
text-align
属性:用于设置文本的水平对齐
left
-> 左对齐right
-> 右对齐center
-> 居中justify
-> /两端对齐
vertical-align
属性:用于设置文本的垂直对齐
baseline
-> 默认值,基线对齐sub
-> 垂直对齐文本的下标super
-> 垂直对齐文本的上标top
-> 元素顶端与行中最高元素顶端对齐text-top
-> 元素顶端与父元素字体顶端对齐bottom
-> 元素顶端与行中最低元素顶端对齐text-bottom
-> 元素底端与父元素字体底端对齐middle
-> 居中(子元素中线和父元素中线对齐,并不是严格的居中)- 长度值或百分比 -> 设置对齐的位置
注意:图片默认是基线对齐的,与外边框间有空白,布局时需要进行修改
word-spacing
属性:用于设置单词间距
letter-spacing
属性:用于设置字符间距
writing-mode
属性:用于设置排版模式
horizontal-tb
-> 左对齐则内容自左向右,右对齐则相反,下一行位于上一行下方vertical-rl
-> 左对齐则内容自上而下,下一行位于上一行左侧,右对齐则相反vertical-lr
-> 左对齐则内容自上而下,下一行位于上一行右侧,右对齐则相反
10. 背景
10.1 背景
背景颜色
background-color
属性:用于设置背景颜色
背景图片
background-image
属性:用于设置背景图片
- 同时设置背景图片和背景颜色,则背景颜色会变成图片背景色
- 背景图片小于元素,则自动平铺显示;背景图片大于元素,则无法完全显示
背景裁切
background-clip
属性:用于设置背景范围
border-box
-> 默认值,背景显示范围包括边框、内边距和内容区padding-box
-> 背景显示范围包括内边距和内容区content-box
-> 背景显示范围只包括内容区text
-> 背景裁剪成文字前景色
背景重复
background-repeat
属性:用于设置背景图片重复方式
repeat
-> 默认值,背景图片重复显示repeat-x
-> 仅沿x
轴方向重复显示repeat-y
-> 仅沿y
轴方向重复显示no-repeat
-> 不重复显示
背景位置
background-position
属性:用于设置背景图片显示位置
- 通过
top
/bottom
/left
/right
/center
几个位置的组合设置背景图片的位置(只写一个则默认第二个为center
) - 或者通过垂直偏移量和水平偏移量设置背景图片的位置
background-origin
属性:用于设置背景图片显示位置偏移量的原点(注意:若background-attachment
属性设置为fixed
,则这一属性不生效)
border-box
-> 偏移量从边框开始计算padding-box
-> 默认值,偏移量从内边距开始计算content-box
-> 偏移量从内容区开始计算
背景尺寸
background-size
属性:用于设置背景图片的尺寸
- 两个值 -> 宽度和高度(其中一个为
auto
则保持图片比例不变,只写一个则第二个默认为auto
) cover
-> 图片比例不变,背景图片铺满元素contain
-> 图片比例不变,在元素中完整显示背景图片
背景滚动
background-attachment
属性:用于设置背景图片是否随元素移动
scroll
-> 默认值,背景图片随元素移动fixed
-> 背景图片固定,不随元素移动
多个背景
注意:后设置的背景置于底层
background-image: url(image1.png), url(image2.png);
或者
background: url(image1.png) left 50% no-repeat,
url(image2.png) right 100% no-repeat red;
组合设置
background
属性:用于设置背景图片的所有属性
background: red url(image.png) no-repeat right 50% fixed;
注意:没有顺序要求,但是background-size
属性必须写在background-position
属性之后,并用"/"隔开,background-clip
属性必须写在background-origin
属性之后
10.2 渐变
线性渐变(linear-gradient
属性):颜色沿一条直线发生变化
linear-gradient(方向, 颜色)
方向:to top
/to bottom
/to left
/to right
;整数deg
(度数);小数(圈)
颜色:可以指定多个,以逗号隔开;默认情况下多个颜色平均分布,可以指定颜色和占比,以空格隔开,指定颜色开始颜色开始渐变的位置repeat-linear-gradient
(重复显示的线性渐变)
径向渐变(radial-gradient
属性):颜色沿中心向四周发生变化
radial-gradient(尺寸 at 位置, 颜色)
尺寸:默认由元素形状决定;circle
/ellipse
-> 圆形/椭圆;closest-side
/farthest-side
/closest-circle
/farthest-circle
-> 近边/远边/近角/远角
位置:top
/bottom
/left
/right
/center
10.3 技巧:CSS-Sprite(雪碧图)
将页面中的多个图标放在一张图中,为background-position
属性设置不同的值以显示不同的图标
- 问题:对于按钮点击效果,初始、鼠标移入和鼠标点击时对应着多张不同的图片,多分别加载则会出现闪烁影像显示效果
- 解决方案:将多张小图片合并成一张大图片,在初始、鼠标移入和点击时分别为
background-position
属性设置不同的值,以显示每个小图片 - 优点:节省空间,只需一次加载,同时可以防止出现闪烁
11. BFC(Block Formatting Context,块级格式化上下文)
BFC(Block Formatting Context)直译为块级格式化上下文,是一个只有Block-level Box
参与的独立渲染区域,规定了内部的元素的布局方式,同时,BFC 内部的元素与外部元素不会互相影响。
Box
是 CSS 布局的对象和基本单位。一个页面是由多个Box
组成的,元素的类型和display
属性决定了其Box
类型,不同类型的Box
会参与不同的格式化上下文(Formatting Context),而不同格式化上下文中的Box
内的元素也会以不同的方式渲染。
Block-level Box
:display
属性为block
、list-item
或者table
的元素,会生成Block-level Box
,并参与 Block Formatting Context。Inline-level Box
:display
属性为inline
、inline-block
或者inline-table
的元素,会生成Inline-level Box
,并参与 Inline Formatting Context。
Formatting Context 是 CSS2.1 规范中的概念,是页面中的一块渲染区域,并且有一套渲染规则,决定了其中子元素如何定位以及和其他元素关系和相互作用
11.1 BFC 的布局规则
- BFC 内部的
Box
会在垂直方向依次放置;Box
垂直方向的距离由margin
决定。同一个 BFC 内的两个相邻Box
的垂直方向margin
会发生重叠; - 每个
Box
的margin box
的左边,与包含块的border box
的左边接触(即使存在浮动); - BFC 在页面上是一个独立的区域,它内部的元素的布局不会和外部元素的布局产生相互影响;
- 开启 BFC 的元素不会与
float box
重叠; - 开启 BFC 的元素,可以包含浮动的子元素,计算高度时,浮动元素也参与计算。
11.2 产生 BFC
- 根元素或其他包含它的元素
overflow
属性设置为不是visible
的元素- 浮动元素,元素的
float
属性不是none
- 绝对定位元素,元素的
position
属性不是static
或者relative
- 内联块元素,元素的
display
属性为inline-block
; - 弹性元素,元素的
display
属性为flex
或者inline-flex
; - 网格元素,元素的
display
属性为grid
或者inline-grid
; - 流式布局根元素,元素的
display
属性为flow-root
; - HTML 默认的某些表格元素。
11.3 BFC 的应用场景
避免
margin
重叠根据布局规则第二点,两个
p
元素垂直方向margin
会发生重叠,将第二个p
元素放置于一个新的 BFC 中,可以避免margin
发生重叠。margin 重叠
看看我的 margin 是多少
看看我的 margin 又是多少
解决方案
看看我的 margin 是多少
看看我的 margin 又是多少
.problem p { width: 200px; color: deeppink; background-color: skyblue; line-height: 100px; text-align: center; margin: 30px; } .solution p { width: 200px; color: deeppink; background-color: skyblue; line-height: 100px; text-align: center; margin: 30px; } .solution div { overflow: hidden; }
自适应两栏布局
根据布局规则的第三点和第四点,使用浮动的两栏布局会发生覆盖,将右侧
div
成为单独的 BFC,可以避免覆盖,实现自适应两栏布局。LEFTRIGHTLEFTRIGHT.box { margin: 20px; } .problem-left { width: 100px; height: 150px; float: left; background: pink; text-align: center; line-height: 150px; font-size: 20px; } .problem-right { height: 300px; background: skyblue; text-align: center; line-height: 300px; font-size: 40px; } .solution-left { width: 100px; height: 150px; float: left; background: pink; text-align: center; line-height: 150px; font-size: 20px; } .solution-right { height: 300px; background: skyblue; text-align: center; line-height: 300px; font-size: 40px; overflow: hidden; }
- 避免高度塌陷
在没有给父元素设置高度同时将子元素设置为浮动时,会出现高度塌陷。根据布局规则第六点可以利用BFC清除浮动,避免高度塌陷。
.parent {
border: 5px solid rgb(91, 243, 30);
width: 300px;
}
.problem {
margin-bottom: 200px;
}
.solution {
overflow: hidden;
}
.child {
border: 5px solid rgb(233, 250, 84);
width: 100px;
height: 100px;
float: left;
}