CSS 知识点总结
期末也要抽空学,给我卷!
所有学习笔记已开源上传至 github,欢迎Star和PR!
样式表和选择器
Cascading Style Sheet,层叠样式表,用于给 HTML 页面标签添加各种样式,定义网页的显示效果
CSS 将网页内容和显示样式进行分离,增强了显示功能。
HTML 的缺陷
- 不能够适应多种设备
- 要求浏览器必须智能化足够庞大
- 数据和显示没有分开
- 功能不够强大
CSS 优点
- 使数据和显示分开
- 降低网络流量
- 使整个网站视觉效果一致
- 使开发效率提高了
CSS 语法
1 | 选择器 { |
CSS 和 HTML 结合的方式
行内样式:某个特定标签内使用 style 属性
内嵌样式表:在页面的 head 里采用 style 标签
引入外部 css 文件的方式
- 采用 link 标签
- 采用 import
两种引入方式的区别:外部样式表中不能写 link 标签,但是可以写 import 语句
CSS 选择器
指定 CSS 作用的标签
选择器总共两大类:基本选择器和扩展选择器
常用的三种器的区别
- 标签选择器针对的是页面上的一类标签
- ID 选择器针对特定的一个标签
- 类选择器可以被多种标签使用
基本选择器
标签选择器
选择所有某种类型的标签,用于描述共性
- 所有的标签,都可以是选择器
- 选择的是所有,而不是一个
1 | p{ font-size:14px; } |
p 标签内的文字都是 14px
ID 选择器
针对某一个特定的标签来使用,以#
来定义
1 | #mytitle{ border:3px dashed green;} |
任何的 HTML 标签都可以有 id 属性。表示这个标签的名字。
这个标签的名字,可以任取,但是:
- 只能有字母、数字、下划线
- 必须以字母开头
- 不能和标签同名
- HTML 页面不能出现相同的 ID
一个标签可以被多个 css 选择器选择,共同作用
类选择器
用.
来定义某一个类的标签
1 | .eat{ |
- 不要试图用一个类写完所有标签的样式,多写几个类
- 每一个类尽可能小,有公共的概念,让更多的标签使用
- 到底用 id 还是 class?
- 尽可能用 class
- 因为 id 是给 js 使用的,js 通过 id 来获取标签,所以 css 层面尽可能不用 id
- 另一方面,我们认为一个有 id 的元素,有动态效果
- 类上样式,id 上行为
通用选择器
*
,匹配任何标签,效率低,不使用
CSS 的高级选择器
后代选择器
如果选择的是E F
,表示所有属于 E 元素的后代的 F 元素
1 | div p{ |
交集选择器
两个选择器紧密相连,以标签名开头
如果后一个是类选择器,就写成div.food
,如果后一个是 id 选择器,就写成div#food
1 | div.food{ |
并集选择器
简单来说就是多选
1 | p, |
CSS3 的一些选择器
子代选择器
>
,只有是儿子的时候才能被选择
1 | div > p { |
只能选择
1 | <div> |
不能选择
1 | <div> |
序选择器
设置无序列表<ul>
中的第一个<li>
为红色:
1 | ul li:first-child { |
设置无序列表<ul>
中的最后一个<li>
为红色:
1 | ul li:last-child { |
下一个兄弟选择器
+
表示选择下一个兄弟
把 h3 元素后面的一个 p 标签变成红色
1 | h3 + p{ |
单位
HTML 的单位只有一种,即像素px
,所以单位可省略
CSS中必须要写单位,因为没有默认单位
绝对单位
in
:英寸Inches (1 英寸 = 2.54 厘米)cm
:厘米Centimetersmm
:毫米Millimeterspt
:点Points,或者叫英镑 (1点 = 1/72英寸)pc
:皮卡Picas (1 皮卡 = 12 点)
换算规则
1 in
= 2.54 cm
= 25.4 mm
= 72 pt
= 6 pc
相对单位
px
:像素em
:印刷单位相当于12个点%
:百分比,相对周围的文字的大小
字体属性
常见字体属性
1 | p{ |
为了严格保证字在行里面居中,我们的工程师有一个约定: 行高、字号,一般都是偶数。这样可以保证,它们的差一定偶数,就能够被2整除。
如何让单行文本居中
如果文本只有一行,那么将行高和盒子高设置成一样大,就可以保证单行文本垂直居中。
如果需要多行文本居中就需要根据总行高自己算 top-margin
也可以使用vertical-algin
属性来使指定行内元素(inline)、行内块元素(inline-block)、表格的单元格(table-cell)的垂直对齐方式。主要是用于图片、表格、文本的对齐。
1 | vertical-align: middle; /*指定行级元素的垂直对齐方式。*/ |
字号 行高 字体
1 | font-size: 14px; |
一般将英文字体放在最前面,这样做到中英文字体分离
1 | font-family: "Times New Roman","微软雅黑","宋体"; |
文本属性
letter-spacing: 0.5cm ;
单个字母之间的间距word-spacing: 1cm;
单词之间的间距text-decoration: none;
字体修饰:none 去掉下划线、underline 下划线、line-through 中划线、overline 上划线text-transform: lowercase;
单词字体大小写。uppercase大写、lowercase小写color:red;
字体颜色text-align: center;
在当前容器中的对齐方式。属性值可以是:left、right、center(居中)、justifytext-transform: lowercase;
单词的字体大小写。属性值可以是:uppercase
(单词大写)、lowercase
(单词小写)、capitalize
(每个单词的首字母大写)
列表属性
1 | ul li{ |
overflow 属性
用来处理超出范围的内容
overflow
属性的属性值可以是:
visible
:默认值。多余的内容不剪切也不添加滚动条,会全部显示出来。hidden
:不显示超过对象尺寸的内容。auto
:如果内容不超出,则不显示滚动条;如果内容超出,则显示滚动条。scroll
:Windows 平台下,无论内容是否超出,总是显示滚动条。Mac 平台下,和auto
属性相同。
1 |
|
背景属性
background-color 背景颜色
css2.1 中的三种表示方法
- 单词
- RGB 表示法
- 16进制表示法
1 | background-color: red; |
css3 中新增的颜色表示方法
- RGBA 表示法
- 红 绿 蓝 透明度
- HSLA 表示法
- 色调 饱和度 亮度 透明度
1 | background-color: rgba(0, 0, 255, 0.3); |
background-repeat
repeat
默认值,平铺满no-repeat
(不要平铺)repeat-x
(横向平铺)repeat-y
(纵向平铺)
background-position
- 背景定位
用像素描述
1
background-position:向右偏移量 向下偏移量;
用单词描述
1
background-position: 描述左右的词 描述上下的词;
background-attachment
- 控制背景是否固定
- fixed 固定
- scroll 不固定
1 | background-attachment:fixed; |
background 综合属性
1 | background:red url(1.jpg) no-repeat 100px 100px fixed; |
等价于
1 | background-color:red; |
background-size
1 | /* 宽、高的具体数值 */ |
background-origin
控制从什么位置开始显示背景
1 |
|
background-clip
设置元素的背景是否延伸到边框下面
border-box
超出 border-box 的部分,将裁剪掉padding-box
超出 padding-box 的部分,将裁剪掉content-box
超出 content-box 的部分,将裁剪掉
background-image
- 线性渐变:沿着某条直线朝一个方向产生渐变效果。
- 径向渐变:从一个中心点开始沿着四周产生渐变效果。
- 重复渐变
线性渐变
1 | background-image: linear-gradient(方向, 起始颜色, 终止颜色); |
径向渐变
1 | background-image: radial-gradient(辐射的半径大小, 中心的位置, 起始颜色, 终止颜色); |
Clip-path
clip-path
属性可以创建一个只有元素的部分区域可以显示的剪切区域。区域内的部分显示,区域外的隐藏。
鼠标悬停放大图片
1 | .div1 { |
伪类选择器
伪类是用来添加一些选择器的特殊效果。
比如 div 是属于 box 类的,这很明确,但是 a 属于什么类是不明确的,需要看用户点击前的状态和点击后的状态。
静态伪类和动态伪类
静态伪类
只能用于超链接的样式
:link
超链接点击之前:visited
链接被访问过之后
动态伪类
针对所有标签都适用的样式
:hover
“悬停”:鼠标放到标签上的时候:active
“激活”: 鼠标点击标签,但是不松手时。:focus
是某个标签获得焦点时的样式(比如某个输入框获得焦点)
a 标签
超链接的四种状态
:link
“链接”:超链接点击之前:visited
“访问过的”:链接被访问过之后:hover
“悬停”:鼠标放到标签上的时候:active
“激活”: 鼠标点击标签,但是不松手时。
在 CSS 中,这四种状态必须按照固定的顺序写
1 | a:link { |
制作一个导航
1 | <body> |
1 | nav { |
标准写法是 link,visited 和 hover 这三个伪类都需要写。
一般开发的时候 a:link, a:visited
都可以省略,简写在 a
标签里。
动态伪类
:hover
悬停:active
激活:focus
获得焦点
1 | <body> |
1 | div:hover { |
CSS 继承性和层叠性
CSS 的继承性
- 关于文字样式的属性,都具有继承性。
- 这些属性包括:color、 text-开头的、line-开头的、font-开头的。
- 关于盒子、定位、布局的属性,都不能继承。
CSS 的层叠性
当多个选择器,选择了某个元素的时候,要按照如下顺序统计权重:
- id 选择器
- 类选择器、属性选择器、伪类选择器
- 标签选择器、伪元素选择器
计算权重
统计各个选择器的数量,优先级高的胜出,图中的 p 标签是红色
权重相同时
就近原则,以后一个样式为准
尝试实现
1
2
3
4
5
6
7
8
9
10
11
12
13<body>
<div class="sr">
<ul>
<li class="ssr">word</li>
<li>word</li>
<li>word</li>
<li>word</li>
<li>word</li>
<li>word</li>
<li>word</li>
</ul>
</div>
</body>错误写法
1
2
3
4
5
6
7.sr ul li{
color: blue;
}
.ssr{
color: red;
}这样写的话第一个的选择器的权重为 0 1 2,第二个选择器的权重为 0 1 0
正确写法
1
2
3
4
5
6
7.sr ul li{
color: blue;
}
.sr ul li.ssr{
color: red;
}继承性的说明
如果不能直接选中某个元素,通过继承性影响的计算的权重为0,最后显示的颜色为 blue
1
2
3
4
5
6
7<body>
<div class="sr">
<div class="ssr">
<p>666</p>
</div>
</div>
</body>1
2
3
4
5
6
7
8
9
10
11
12
13
14p {
/* 权重0,0,1 */
color: blue;
}
.ssr {
/* 权重0,0,0 */
color: red;
}
.sr {
/* 权重0,0,0 */
color: green;
}
层叠性权重计算总结
- 对于相同权重的选择器,其排序为:行级样式 > 内嵌样式表 > 外部样式表
- 对于相同类型的样式表,其选择器排序为:ID选择器 > 类选择器 > 标签选择器
- 外部样式表的 ID 选择器 > 内嵌样式表的标签选择
!important 标记
1 | font-size:60px ; |
!important
提升的是一个属性,不是选择器!important
无法提升继承的权重,该是0还是0!important
无法影响就近原则
尽量不要用
盒模型
包括 div, span, a
一个盒子的五个主要属性
- width和height:内容的宽度、高度(不是盒子的宽度、高度)
- padding:内边距
- border:边框
- margin:外边距
上面这个盒子实际上是 302*202,因为有边框
padding
padding 就是内边距,padding 实际上也会有背景颜色
有四个方向的 padding
1 | padding-top: 30px; |
综合属性的写法是:上 右 下 左
1 | padding:30px 20px 40px 100px; |
如果只写三个值,顺序是:上 右 下 // 左和右相等
如果只写了两个值:顺序是:上 右 // 下和上相等,左和右相等
border
border 本身是一个综合属性
1 | border:1px solid red; |
两种拆的方式
按三要素拆
1
2
3border-width:10px; //边框宽度
border-style:solid; //线型
border-color:red; //颜色。按方向拆
1
2
3
4border-top:10px solid red;
border-right:10px solid red;
border-bottom:10px solid red;
border-left:10px solid red;当然也可以全部拆开,写成12行
利用 border 画一个🔺
1 | div { |
浮动
标准文档流
特性
空白折叠现象
无论多少空格,换行,都会折叠成一个空格。
高矮不齐,底边对齐
自动换行,一行写不满,换行写
行内元素和块级元素
标签分为两种等级
- 行内元素
- 块级元素
两者区别
- 行内元素
- 与其他行内元素并排
- 不能设置宽、高,默认宽度就是文字的宽度
- 块级元素
- 霸占一行,不能与其他元素并列
- 能设置宽、高,如果不设置宽度,宽度默认是父类的100%
两者分类
HTML 角度
- 文本级标签:p、span、a、b、i、u、em
- 容器级标签:div、h系列、li、dt、dd
CSS 角度
行内元素:span、a、b、i、u、em
块级元素:p、div、h系列、li、dt、dd
只有 p 变了个位置
行内和块级的转换
1 | display: inline; |
实现浮动
css 里布局用的最多的属性
div 本身是一个块级元素
1 | .ssr{ |
但是加上浮动之后就可以并排了
1 | .ssr { |
浮动的元素脱离标准流
一旦一个元素浮动了,就能够并排和设置宽高了,所有标签浮动之后不区分行内和块级
浮动的元素互相贴靠
当改变窗口的时候,设置浮动的元素会根据次序和空间自动贴近,如果贴不下就换到下一行去
浮动的元素周围的字会像水一样
标准流中的文字不会被浮动的盒子遮挡住
永远不是一个东西单独浮动,浮动都是一起浮动
收缩
一个浮动的元素如果没有设置width,将自动收缩为内容的宽度
作业
1 |
|
1 | header { |
清除浮动
指清除浮动和浮动之间的影响
加高法
给浮动元素的祖先元素增加高度
1
2
3
4
5
6
7
8
9
10
11<div> //设置height
<p></p>
<p></p>
<p></p>
</div>
<div> //设置height
<p></p>
<p></p>
<p></p>
</div>给父类加个
clear:both
1
2
3
4
5
6
7
8
9
10
11<div>
<p></p>
<p></p>
<p></p>
</div>
<div> //clear:both;
<p></p>
<p></p>
<p></p>
</div>隔墙法
在两个浮动元素中间建一个墙(内墙可以让父类自动被撑高)
1
2
3
4
5
6
7
8
9
10
11
12<div>
<p></p>
<p></p>
<p></p>
<div class="cl h10"></div>
</div>
<div>
<p></p>
<p></p>
<p></p>
</div>overflow:hidden
针对每个需要撑高的元素加上该属性
margin
margin 塌陷
标准文档流中,竖直方向的 margin 不叠加,取最大值
盒子居中
将 margin 的值设为 auto,表示自动。
当 left, right 都是 auto 的时候,盒子就居中了
1 | margin-left: auto; |
简写为
1 | margin:0 auto; |
注意点
- 只有标准流的盒子才能使用这个居中方法
- 使用
margin: 0 auto;
的盒子,必须有 width,否则相当于霸占了一行 margin: 0 auto;
只是让盒子居中,文本居中需要使用text-align: center;
善用外层的 padding 而不是里层的margin
定位属性
1 | position: absolute; <!-- 绝对定位 --> |
相对定位
可以用于盒子的位置的微调
left:盒子右移
right:盒子左移
top:盒子下移
bottom:盒子上移
1 | position: relative; |
相对定位不脱离标准文档流,因此不会被其他元素挤掉
用途
- 微调元素
- 做绝对定位的参考
绝对定位
定义横纵坐标,原点在父容器的左上角或左下角。横坐标用left表示,纵坐标用top或者bottom表示。
1 | position: absolute; /*绝对定位*/ |
绝对定位脱离了标准文档流,所以它可以直接设置宽和高
参考点
- 如果用 top 描述,那么参考点就是页面的左上角,不是浏览器的左上角
- 如果用 bottom 描述,参考点就是浏览器首屏尺寸对应的左下角
子绝父相(子元素是绝对定位,父元素是相对定位)是有意义的,可以保证父亲没有脱标,儿子脱标在父亲的范围内移动。
工程上会让父亲浮动,相对定位,0偏移,让儿子使用绝对定位
绝对定位的儿子会忽略父类盒子的padding
固定定位
相对浏览器窗口进行定位,无论页面如何滚动,这个盒子显示的位置不变
- 返回到顶部
- 顶部导航栏
z-index
定位后的元素可以使用的图层位置,值越大越上层
CSS3 选择器
渐进增强策略
让低版本浏览器能正常访问页面,高版本的浏览器用户体验更好
1 | div 标签选择器 |
属性选择器
属性选择器的标志性符号是[]
1 | E[属性名=值] |
E[title]
选中页面的E元素,并且E存在 title 属性即可。E[title="abc"]
选中页面的E元素,并且E需要带有title属性,且属性值完全等于abc。E[attr~=val]
选择具有 att 属性且属性值为:用空格分隔的字词列表,其中一个等于 val 的E元素。E[attr|=val]
表示要么是一个单独的属性值,要么这个属性值是以“-”分隔的。E[title^="abc"]
选中页面的E元素,并且E需要带有 title 属性,属性值以 abc 开头。E[title$="abc"]
选中页面的E元素,并且E需要带有 title 属性,属性值以 abc 结尾。E[title*="abc"]
选中页面的E元素,并且E需要带有 title 属性,属性值任意位置包含abc。
结构伪类选择器
CSS 中已经有的动态伪类选择器
:link
、:active
、:visited
、:hover
CSS3 新增了其他的伪类选择器,其中有通过结构来进行筛选的选择器
E:first-child
匹配父元素的第一个子元素E。E:last-child
匹配父元素的最后一个子元素E。E:nth-child(n)
匹配父元素的第n个子元素E。注意,盒子的编号是从
1
开始算起,不是从0
开始算起。E:nth-child(odd)
匹配奇数E:nth-child(even)
匹配偶数E:nth-last-child(n)
匹配父元素的倒数第n个子元素E。
E:first-of-type
匹配同类型中的第一个同级兄弟元素E。E:last-of-type
匹配同类型中的最后一个同级兄弟元素E。E:nth-of-type(n)
匹配同类型中的第n个同级兄弟元素E。E:nth-last-of-type(n)
匹配同类型中的倒数第n个同级兄弟元素E。
E:empty
匹配没有任何子节点(包括空格等text节点)的元素E。E:target
匹配相关URL指向的E元素。要配合锚点使用。
伪元素选择器
伪元素选择器的标志性符号是 ::
E:after
、E:before
在旧版本里是伪类。CSS3 里,E:after
、E:before
会被自动识别为E::after
、E::before
,按伪元素来对待,这样做的目的是用来做兼容处理。
E::before
设置在 元素E 前面(依据对象树的逻辑结构)的内容,配合content属性一起使用。E::after
设置在 元素E 后面(依据对象树的逻辑结构)的内容,配合content属性一起使用。
使用伪元素选择器,可以添加出类似 span 标签的效果,同时这两个属性添加伪元素是行内元素,需要转换成块元素才能设置宽高。
E::first-letter
设置元素 E 里面的第一个字符的样式。E::first-line
设置元素 E 里面的第一行的样式。E::selection
设置元素 E 里面被鼠标选中的区域的样式(一般设置颜色和背景色)。
CSS3 属性
文本
text-shadow:设置文本的阴影
1 | text-shadow: 20px 27px 22px pink; |
水平位移 垂直位移 模糊程度 阴影颜色
box-sizing
外加模式
1 | box-sizing: content-box; |
此时设置的 width 和 height 是内容区域的宽高,盒子实际的宽度 = width + padding + border
内减模式
1 | box-sizing: border-box; |
此时设置的 width 和 height 是盒子的总宽高,盒子实际的宽度 = width
私有前缀
如果直接这么写,浏览器是不会显示的 🙅
1 | background: linear-gradient(left, green, yellow); |
需要根据浏览器的不同添加前缀
1 | background: -webkit-linear-gradient(left, green, yellow); |
边框
边框圆角
四个角
1 | border-radius: 60px; |
单个属性写法
1 | border-top-left-radius: 60px 120px; //参数解释:水平半径 垂直半径 |
画圆形的两个方式
1 | /*画圆形的方式一*/ |
边框阴影
1 | box-shadow: 水平偏移 垂直偏移 模糊程度 阴影大小 阴影颜色 |
水平偏移:正值向右 负值向左。
垂直偏移:正值向下 负值向上。
模糊程度:不能为负值。
边框图片
单独写
1 | /* 边框图片的路径*/ |
综合属性
1 | border-image: url("images/border.png") 27/20px round; |
CSS3 动画
过渡
transition-property: all;
如果希望所有的属性都发生过渡,就使用all。transition-duration: 1s;
过渡的持续时间。transition-timing-function: linear;
运动曲线。属性值可以是:linear
线性ease
减速ease-in
加速ease-out
减速ease-in-out
先加速后减速
transition-delay: 1s;
过渡延迟。多长时间后再执行这个过渡动画。
综合属性
1 | transition: 让哪些属性进行过度 过渡的持续时间 运动曲线 延迟时间; |
2D转换
缩放scale
1 | transform: scale(x, y); |
参数解释: x:表示水平方向的缩放倍数。y:表示垂直方向的缩放倍数。如果只写一个值就是等比例缩放。y大于1表示放大,小于1表示缩小。
位移translate
1 | transform: translate(水平位移, 垂直位移); |
参数为百分比,相对于自身移动。
正值:向右和向下。 负值:向左和向上。
位移的应用:让绝对定位中的盒子在父亲里居中
1 | div { |
旋转
1 | transform: rotate(角度); |
参数解释:正值 顺时针;负值:逆时针。
3D 旋转
1 | transform: rotateX(360deg); //绕 X 轴旋转360度 |
项目实战
还原了半个豆瓣首页,纯HTML+CSS,代码还很不成熟。