一. 认识CSS
CSS提供了3种方法,可以将CSS样式应用到元素上
内联样式(inline style)
将样式直接写在元素的style属性上
CSS样式之间用分号;隔开,建议每条CSS样式后面都加上分号;
在很多国内外资料中,“CSS样式”与“ CSS属性”是同义词
样式名 -> 属性名
样式值 -> 属性值
1 | <body> |
文档样式表(document style sheet)
将样式写在head元素的style元素中
<style>元素的type属性值默认是text/css
1 | <style> |
外部样式表(external style sheet)
将样式写在单独的CSS文件中,然后在当前网页的head元素中用link元素引用
<link rel=”stylesheet”>元素的type属性值默认是text/css
在CSS文件中使用@charset指定文件编码,一般都是UTF-8
1 | <!-- link引入样式: rel="stylesheet" --> |
@import
可以在style元素或者CSS文件中使用@import导入其他的CSS文件
不建议使用@import导入CSS文件,它的效率比link元素低
HTML和CSS的编写准则
结构、样式分离
因此,不要使用HTML元素的属性来给元素添加样式
比如body的bgcolor、img的width\height等
1 | <style> |
设置网页图标
link元素除了可以用来引入CSS文件,还可以设置网页的图标(href的值是图标链接)
link元素的rel属性不能省略,用来指定文档与链接资源的关系
一般rel若确定,相应的type也会默认确定,所以可以省略type
网页图标支持的图片格式是ico、png,常用大小是16x16、24x24、32x32(单位:像素)
CSS官方文档
官方文档地址
https://www.w3.org/standards/techs/css
https://www.w3.org/TR/CSS22/
https://www.w3.org/TR/CSS22/propidx.html
由于浏览器版本、CSS版本等问题,有些CSS属性是无法使用的
可以到https://caniuse.com/查询CSS属性的可用性
二.选择器(selector)
通用选择器(universal selector)
元素选择器(type selectors)
类选择器(class selectors)
id选择器(id selectors)
属性选择器(attribute selectors)
组合(combinators)
伪类(pseudo-classes)
伪元素(pseudo-elements)
通用选择器(univeral selector)
所有元素 *
一般用来给所有元素做一些通用设置
比如:内边距、外边距
- 效率低,尽量不使用
1 | <style> |
元素选择器(type selectors)
或者叫做标签选择器
1 | <style> |
类选择器
一个元素可以有多个class值,每个class之间用空格隔开
class值如果由多个单词组成,单词之间可以用中划线-、下划线_连接,也可以使用驼峰标识
最好不要用标签名作为class值
1 | <style> |
id选择器
一个HTML文档里面的id值是唯一的,不能重复
id值如果由多个单词组成,单词之间可以用中划线-、下划线_连接,也可以使用驼峰标识
最好不要用标签名作为id值
1 | <style> |
三.常用CSS属性
文本:color、direction、letter-spacing、word-spacing、line-height、text-align、text-indent、text-transform、text-decoration、white-space
字体:font、font-family、font-style、font-size、font-variant、font-weight
背景:background、background-color、background-image、background-repeat、background-attachment、background-position
盒子模型:width、height、border、margin、padding
列表:list-style
表格:border-collapse
显示:display、visibility、overflow、opacity、filter
定位: vertical-align、position、left、top、right、bottom、float、clear
最常见CSS属性
CSS属性-background-color
用来决定背景色
CSS属性-color
用来设置文本内容的前景色(文字颜色)
包括文字、装饰线、边框、外轮廓等的颜色
CSS属性-width
宽度
CSS属性-height
高度
CSS属性-font-size
文字大小
1 | <style> |
颜色
基本颜色关键字
red:红色,black:黑色,yellow:黄色,blue:蓝色,purple:紫色,white:白色
只提供了上百种基本颜色的关键字
RGB颜色
通过R(Red)、G(Green)、B(Blue)三种颜色通道的变化、叠加产生各式各样的颜色
十六进制表示形式
#rrggbb,每一种颜色取值范围00~FF,大小写都可以
#ff0000:红色,#00ff00:绿色,#0000ff:蓝色,#000000:黑色,#ffffff:白色,#ffff00:黄色
十进制表示形式
rgb(red, green, blue),每一种颜色取值范围0~255
rgb(255, 0, 0):红色;rgb(0, 255, 0):绿色;rgb(0, 0, 255):蓝色;rgb(255, 255, 0):黄色;rgb(0, 0, 0):黑色;rgb(255,
255, 255):白色
建议:尽量使用#rgb取代#rrggbb,比如使用#345取代#334455
可以缩减CSS代码的体积,从而减小文件大小,节省用户流量,加快网页响应速度
RGBA颜色
RGBA颜色在RGB颜色的基础上加了个alpha,实现带有透明度的颜色
rgba(red, green, blue, alpha)
alpha取值范围是0.0~1.0
0代表完全透明,1代表完全不透明
- 关键字transparent等价于rgba(0, 0, 0, 0),完全透明
1 | <style> |
四.文本属性(text)
text-decoration
none:无任何装饰线(可以清除a元素的下划线)
underline:下划线
over line:上划线
line-through:中划线(删除线)
- u、ins元素默认就设置了text-decoration为underline
letter-spacing、word-spacing
letter子母间距
word单词间距
- 默认值是0,可以设置为负数
text-transform
用于设置文字的大小写转换
capitalize:将每个单词的首字母变为大写
uppercase:将每个单词的所有字符变为大写
lowercase:将每个单词的所有字符变为小写
none:没有影响
text-indent
用于设置第一行内容的缩进
text-indent:2em 刚好缩进两个文字
text-align
用于设置元素内容在元素中的水平对齐方式
- left:左对齐
- right:右对齐
- center:正中间
- justify:两端对齐
1 | /* justify */ |
五.文字属性(font)
font-size
决定文字大小
常用的设置
具体数值+单位
比如:100px
也可以使用em单位:1em代表100%,2em代表200%,0.5em代表50%
百分比
基于父元素的font-size计算,比如50%表示等于父元素font-size的一半
- 谷歌浏览器字体最小12px
font-family
用于设置文字的字体名称
可以设置一个或者多个字体名称(从左到右按顺序选择字体,直到找到可用的字体为止)
一般情况下,英文字体只适用于英文,中文字体同时适用于中文和英文
所以如果希望中英文使用不同字体,应该先将英文字体写在前面,中文字体写在后面
字体中存在空格的时候加上单引号`
font-weight
用于设置文字的粗细(重量)
100|200|300|400|500|600|700|800|900:每个数字表示一个重量
normal:等于400
bold:等于700
font-style
用于设置字体的常规、斜体显示
normal:常规显示
italic:用字体的斜体显示(前提是font-family这种字体本身是支持斜体的)
oblique:文本倾斜显示(让文字倾斜)
- em、i、cite、address、var、dfn等元素的font-style默认就是italic
font-varient
可以影响小写字母的显示形式
可以设置的值如下
normal:常规显示
small-caps:将小写字母替换为缩小过的大写字母
line-height
用于设置文本的最小行高
行高可以先简单理解为一行文字所占的高度
行高严格的定义是:两行文字基线(baseline)之间的间距
基线(baseline):与小写字母x最底部对齐的线
注意区分height和line-height的区别
- height:元素的整体高度
- line-height:元素中每一行文字所占据的高度
height=line-height时可以居中(有文本时line-height也可以)
font
font是一个缩写属性
font-style font-varient font-weight font-size/line-height font-family
font-style、font-varient、font-weight可以随意调换顺序,也可以省略
/line-height可以省略,如果不省略,就必须跟在font-size后面
font-size、font-family不可以调换顺序,不可以省略
1 | /* font-style font-varient font-weight font-size/line-height font-family */ |
六.更多选择器
属性选择器(attribute selectors)-[att]
[att]拥有title属性的元素
1 | [title]{ |
[att*=val]title属性值包含单词one的元素
1 | /* title中包含one单词 */ |
[att^=val]title属性值以one开头的元素
1 | /* title以one开头 */ |
[att$=val]title属性值以one结尾的元素
1 | /* title以one结尾 */ |
[att|=val]title属性值恰好等于one或者以单词one开头且后面紧跟着连字符的元素
- 一般是用在lang属性上面
1 | [title|="one"]{ |
[att~=val]title属性值包含单词one的元素(单词one与其他单词之间必须用空格隔开
1 | [title~="one"]{ |
后代选择器(descendant combinator)
div元素里面的span元素(包括直接、间接子元素)
1 | div span{ |
子选择器 (child combinator)
div元素里面的直接span子元素(不包含间接子元素)
1 | div>span{ |
兄弟选择器 (adjacent sibling combinator)
div元素后面紧挨着的p元素(且div、p元素必须是兄弟关系)
1 | div+p{ |
全兄弟选择器 (general sibling combinator)
div元素后面的p元素(且div、必须是兄弟关系)
1 | div~p{ |
交集选择器
同时符合2个条件 的元素:div元素、class值的有one
1 | div.one{ |
所有同时符合3个条件的元素:div、class值有one、title属性值等于text
1 | div.one[title="text"]{ |
并集选择器
所有的div元素+所有class值有one的元素+所有title属性值等于text的元素
1 | div,.one,[title]="text"{ |
七. 伪类(pseudo-classes)
动态伪类 (dynamic pseudo-classes)
a:link未访问的链接
a:visited已访问的链接
a:hover鼠标挪到链接上
a:active激活的链接(鼠标在链接上长按住未松开)
建议顺序:link、:visited 、:focus、:hover、:active(lvfha)
使用注意
- :hover必须放在:link和:visited后面才能生效
- :active必须放在:hover后面才能完全生效
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19/* 未访问状态 */
a:link {
color: red;
}
/* 已经访问过 */
a:visited {
color: green;
}
/* 手指(鼠标)放上去 */
a:hover {
color: blue;
}
/* 手指点下去, 未松手 */
a:active {
color: orange;
}
除了a元素:hover、:active也能用在其他元素上
1
2
3
4
5
6
7
8/* 2.hover/active应用到其他元素 */
strong:hover {
background-color: purple;
}
strong:active {
font-size: 40px;
}
a:focus指当前拥有输入焦点的元素(能接收键盘输入)也适用于a元素
去除a元素的默认的:focus效果
1 | /* 4.去掉a元素的焦点状态 */ |
直接给a元素设置样式,相当于给a元素的所有动态伪类都设置了
相当于a:link、a:visited、a:focus、a:hover、a:active的颜色都是red
1 | a{ |
结构伪类(structural pseudo-classes)
:nth-child(1)是父元素中的第一个子元素
1 | /* 1.第三个子元素 */ |
p:nth-child(3)1.必须是p元素 2.p元素是子元素中第三个元素
1 | /* 2.交集选择器: 1.必须是p元素 2.p元素是子元素中第三个元素 */ |
p span:nth-child(1)
区分有空格和没空格的区别
- 没空格为交集选择器、有空格为后代选择器
1 | /* |
:nth-child(2n)是父元素中的第偶数个子元素
- 和:nth-child(even)同义
1 | p:nth-child(2n) { |
:nth-child(2n+1)是父元素中的第奇数个子元素
- 和:nth-child(odd)同义
1 | /* 2.2n+1: 1, 3, 5, 7: 奇数 */ |
nth-last-child 从后向前数
1 | /* nth-child: 正着数(从前向后) */ |
:nth-of-type 相同类型,如果类型不同, 忽略
1 | p:nth-of-type(2n) { |
:nth-last-of-type从后向前数
1 | p:nth-last-of-type(3) { |
:first-child,等同于:nth-child(1)
:last-child,等同于:nth-last-child(1)
:first-of-type,等同于:nth-of-type(1)
:last-of-type,等同于:nth-last-of-type(1)
:only-child,是父元素中唯一的子元素
1 | /* 父元素中的唯一子元素 */ |
only-of-type,唯一该类型的子元素
1 | /* 2.only-of-type: 唯一该类型的子元素 */ |
:root,根元素,就是HTML元素
:empty,是父元素中唯一的这种类型的子元素
1 | :empty { |
否定伪类 (negation pseudo-class)
:not()的格式是:not(x)
元素选择器、通用选择器、属性选择器、类选择器、id选择器、伪类(除否定伪类)
1 | :not(html) :not(body):not(div) { |
目标伪类(target pseudo-classes)
:target
语言伪类language pseudo-classes)
lang()
元素状态伪类 (UI element states pseudo-classes)
:disabled
:enable
:checked
八. 伪元素(pseudo-elements)
建议: 使用两个冒号
为了区分伪元素和伪类,建议伪元素使用2个冒号,比如::first-line和::first-letter
:first-line
可以针对首行文本设置属性
只有下列属性可以应用在::first-line
- 字体属性、颜色属性、背景属性
- pword-spacing、letter-spacing、text-decoration、text-transform、line-height
1 | p::first-line { |
:first-letter
可以针对首字母设置属性
只有下列属性可以应用在::first-letter
- p字体属性、margin属性、padding属性、border属性、颜色属性、背景属性
- ptext-decoration、text-transform、letter-spacing、word-spacing(适当的时候)、line-height、float、vertical-align(只有当float是none时)
1 | p::first-letter { |
:before和:after
用来在一个元素的内容之前或之后插入其他内容(可以是文字、图片)
1 | /* 结论: 伪元素可以看成是行内元素 */ |
九.CSS特性
继承
一个元素如果没有设置某属性的值,就会跟随父元素的值
一个元素如果有设置某属性的值,就使用自己设置的值
比如color、font-size等属性都是可以继承的
并不是所有的属性都可以继承(文本相关属性, 更多的去查文档MDN )
不能继承的属性,一般可以使用inherit值强制继承
注意事项:CSS属性继承的是计算值,并不是当初编写属性时的指定值(字面值)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<style>
.box1 {
font-size: 60px;
}
.box2 {
font-size: 0.5em;//30px
}
p-> inherited from box2 {
font-size: 0.5em; //30px
}
</style>
<body>
<div class="box1">
<div class="box2">
<p>哈哈哈</p>
</div>
</div>
</body>
层叠
基本层叠: 选择器相同时, 后面的属性会层叠前面的属性
1 | /* |
优先级(权重)
!important: 10000
内联样式: 1000
id: 100
类/伪类/属性: 10
元素/伪元素: 1
- 优先比较优先级高的选择器
1 | /* 2.给第二个div设置样式 */ |
十.元素类型
块级元素和行内级元素
根据元素的显示(能不能在同一行显示)类型,HTML元素可以主要分为2大类
块级元素(block-level elements):独占父元素一行
比如div、p、pre、h1~h6、ul、ol、li、dl、dt、dd、table、form、article、aside、footer、header、hgroup、main、nav、section、blockquote、hr等
行内级元素(inline-level elements):多个行内级元素可以在父元素的同一行中显示
比如a、img、span、strong、code、iframe、label、input、button、canvas、embed、object、 video、audio等
1 | <!-- |
替换元素和非替换元素
根据元素的内容(是否浏览器会替换掉元素)类型,HTML元素可以主要分为2大类
替换元素(replaced elements):元素本身没有实际内容,浏览器根据元素的类型和属性,来决定元素的具体显示内容
比如img、input、iframe、video、embed、canvas、audio、object等
非替换元素(non-replaced elements)
和替换元素相反,元素本身是有实际内容的,浏览器会直接将其内容显示出来,而不需要根据元素类型和属性来判断到底显示什么内容
比如div、p、pre、h1~h6、ul、ol、li、dl、dt、dd、table、form、article、aside、footer、header、hgroup、main、nav、section、blockquote、hr、a、strong、span、code、label等
display属性
能修改元素的显示类型,有4个常用值
- block:让元素显示为块级元素
- inline:让元素显示为行内级元素
- none::隐藏元素
- inline-block:让元素同时具备行内级、块级元素的特征
可以让元素同时具备块级、行内级元素的特征
跟其他行内级元素在同一行显示
可以随意设置宽高
宽高默认由内容决定可以理解为
对外来说,它是一个行内级元素
对内来说,它是一个块级元素常见用途
让行内级非替换元素(比如a、span等)能够随时设置宽高
让块级元素(比如div、p等)能够跟其他元素在同一行显示
1 | /* |
邮箱练习
分页练习
display的以下取值,等同于某些HTML元素
- table:<table>,一个block-level表格
- inline-table:<table>,一个inline-level表格
table-row:<tr>
table-row-group:<tbody>
table-header-group:<thead>
table-footer-group:<tfoot>
table-cell:<td>、<th>,一个单元格
table-caption:<caption>,表格的标题
list-item:<li>
元素之间的空格
行内级元素(包括inline-block元素)的代码之间如果有空格,会被解析显示为空格
目前建议的解决方法
- 元素代码之间不要留空格
- 注释掉空格
- 设置父元素的font-size为0,然后在元素中重新设置自己需要的font-size(此方法在Safari不适用)
- (推荐)给元素加float
调色网站 https://flatuicolors.com/
块级元素、inline-block元素
一般情况下,可以包含其他任何元素(比如块级元素、行内级元素、inline-block元素)
- 特殊情况,p元素不能包含其他块级元素
行内元素(比如a、span、strong等)
- 一般情况下,只能包含行内元素
1 | <!-- |
visibility属性
能控制元素的可见性,有2个常用值
- visible:显示元素
- hidden:隐藏元素
visibility: hidden和 display: none 的区别
- visibility: hidden;虽然元素看不见了,但元素的框依旧还留着,还会占着原来的位置
- display: none;不仅元素看不见了,而且元素的框也会被移除,不会占着任何位置
1 | div { |
overflow属性
用于控制内容溢出时的行为
visible:溢出的内容照样可见
hidden:溢出的内容直接裁剪
scroll:溢出的内容被裁剪,但可以通过滚动机制查看,会一直显示滚动条区域,滚动条区域占用的空间属于width、height
auto:自动根据内容是否溢出来决定是否提供滚动机制还有overflow-x、overflow-y两个属性,可以分别设置水平垂直方向
(建议还是直接使用overflow,因为目前overflow-x、overflow-y还没有成为标准,浏览器可能不支持)
1 | .box { |
word-break属性
十一.盒子模型(Box Model)
HTML中的每一个元素都可以看做是一个盒子
1 | .box { |
内容(content)]
盒子里面装的东西
width:宽度
min-width:最小宽度,无论内容多少,宽度都大于或等于min-width
max-width:最大宽度,无论内容多少,宽度都小于或等于max-width
height:高度
min-height:最小高度,无论内容多少,高度都大于或等于min-height
max-height:最大高度,无论内容多少,高度都小于或等于max-height
1 | /* 1.设置宽度相关 */ |
内边距(padding)
盒子边缘和里面装的东西之间的间距(上右下左)
padding-top:上内边距
padding-right:右内边距
padding-bottom:下内边距
padding-left:左内边距
padding:是padding-top、padding-right、padding-bottom、padding-left的简写属性
1 | .box { |
外边距(margin)
盒子和其他盒子之间的间距
margin-top:上外边距
margin-right:右外边距
margin-bottom:下外边距
margin-left:左外边距
margin:是margin-top、margin-right、margin-bottom、margin-left的简写属性
1 | /* 1.margin的上下 */ |
margin的传递(左右不会传递)
margin-top传递
如果块级元素的顶部线和父元素的顶部线重叠
那么这个块级元素的margin-top值会传递给父元素
1 | /* 演示传递 */ |
margin-bottom传递
如果块级元素的底部线和父元素的底部线重叠,并且父元素的高度是auto
那么这个块级元素的margin-bottom值会传递给父元素
1 | /* 演示传递 */ |
- 如何防止出现传递问题?
- 给父元素设置padding-top\padding-bottom
- 给父元素设置border
- 触发BFC( block format context): 设置overflow为auto/hidden
- 建议
- margin一般是用来设置兄弟元素之间的间距
- padding一般是用来设置父子元素之间的间距
margin的折叠 (左右不会折叠)
垂直方向上相邻的2个margin(margin-top、margin-bottom)有可能会合并为1个margin
这种现象叫做collapse(折叠)
- 折叠后最终值的计算规则:两个值进行比较,取较大的值
- 如何防止margin collapse?只设置其中一个元素的margin
1 | div { |
边框(border)
就是盒子的边框,边缘部分
边框宽度border-width
是下面4个属性的简写属性
border-top-width
border-right-width
border-bottom-width
border-left-width
边框颜色border-color
是下面4个属性的简写属性
- border-top-color
- border-right-color
- border-bottom-color
- border-left-color
边框样式border-style
是下面4个属性的简写属性
- border-top-style
- border-right-style
- border-bottom-style
- border-left-style
- 边框颜色、宽度、样式的编写顺序任意
1 | .box { |
边框样式取值
none:没有边框,边框颜色、边框宽度会被忽略
dotted:边框是一系列的点
dashed:边框是一条虚线
solid:边框是一条实线
double:边框有两条实线。两条线宽和其中的空白的宽度之和等于border-width的值
groove:边框看上去好象是雕刻在画布之内
ridge:和grove相反,边框看上去好象是从画布中凸出来
inset:该边框使整个框看上去好象是嵌在画布中
outset:和inset相反,该边框使整个框看上去好象是从画布中凸出来
1 | .box { |
边框的形状
比如矩形、梯形、三角形等形状
1 | body { |
行内级元素margin设置
以下属性对行内非替换元素不起作用
width、height、margin-top、margin-bottom
1 | span { |
以下属性对行内非替换元素的效果比较特殊
padding-top、padding-bottom、上下方向的border
1 | span { |
CSS属性-border-*-*-radius
两个值分别是水平半径和垂直半径(如果不设置,就跟随水平半径的值)
还可以设置百分比,参考的是border-box的宽度
四个值依次是(顺时针方向)
- border-top-left-radius
- border-top-right-radius
- border-bottom-left-radius
- border-bottom-right-radius
- border-radius大于或等于50%时,就会变成一个圆
1 | .box1 { |
CSS属性-outline
- 可以调试网站
1 | div{ |
元素的外轮廓,不占用空间,默认显示在border的外面
- outline-width
- outline-style:取值跟border的样式一样,比如solid、dotted等
- outline-color
- outline:outline-width、outline-style、outline-color的简写属性,跟border用法类似
- 去除a元素、input元素的focus轮廓效果
1 | .box { |
CSS属性-box-shadow
可以设置一个或者多个阴影,每个阴影用<shadow>表示
多个阴影之间用逗号,隔开,从前到后叠加
<shadow>的常见格式如下:
<shadow>=inset?&&<length>{2,4}&&<color>?
第1个<length>:水平方向的偏移,正数往右偏移
第2个<length>:垂直方向的偏移,正数往下偏移
第3个<length>:模糊半径(blur radius)
第4个<length>:延伸距离
<color>:阴影的颜色,如果没有设置,就跟随color属性的颜色
inset:外框阴影变成内框阴影
1 | .box { |
阴影练习
可以设置多个阴影
模糊会向四周扩散
1 | .box { |
CSS属性-text-shadow
text-shadow用法类似于box-shadow,用于给文字添加阴影效果
text-shadow同样适用于::first-line、::first-letter
<shadow>=<length>{2,3}&&<color>
1 | .box { |
CSS属性 -box-sizing
用来设置盒子模型中宽高的行为
content-box
padding、border都布置在width、height外边元素的实际占用宽度 = border + padding + width
元素的实际占用高度 = border + padding + heightborder-box
padding、border都布置在width、height里边元素的实际占用宽度 = width
元素的实际占用高度 = height
1 | .box { |
不同类型方式的水平居中
行内级元素、inline-block元素
水平居中:在父元素中设置text-align: center块级元素
水平居中:margin: 0 auto
1 | .box { |
margin水平居中原理
1 | .box { |
十二. 背景图片(background)
background-image
用于设置元素的背景图片,会盖在(不是覆盖)background-color的上面
设置的第一张图片将显示在最上面,其他图片按顺序层叠在下面
- 注意:如果设置了背景图片后,元素没有具体的宽高,背景图片是不会显示出来的
1 | .box { |
background-repeat
用于设置背景图片是否要平铺
repeat:平铺
no-repeat:不平铺
repeat-x:只在水平方向平铺
repeat-y:只在垂直平方向平铺
1 | .box { |
background-size
用于设置背景图片的大小
- auto:以背景图本身大小显示
- cover:缩放背景图,以完全覆盖铺满元素
- contain:缩放背景图,宽度或者高度铺满元素,但是图片保持宽高比
- <percentage>:百分比,相对于背景区(background positioning area)
- length:具体的大小,比如100px
1 | .box { |
background-position
用于设置背景图片在水平、垂直方向上的具体位置
水平方向还可以设值:left、center、right
垂直方向还可以设值:top、center、bottom
如果只设置了1个方向,另一个方向默认是center
比如background-position: 80px; 等价于 background-position: 80px center;
1 | .box { |
CSS Sprite
使用CSS Sprite的好处
- 减少网页的http请求数量,加快网页响应速度,减轻服务器压力
- 减小图片总大小
- 解决了图片命名的困扰,只需要针对一张集合的图片命名
Sprite图片制作(雪碧图、精灵图)
方法1:Photoshop
方法2:https://www.toptal.com/developers/css/sprite-generator
京东练习
背景居中-梦幻西游
background-attachment
可以设置以下3个值
- scroll:背景图片跟随元素一起滚动(默认值)
- local:背景图片跟随元素以及元素内容一起滚动
- fixed:背景图片相对于浏览器窗口固定
1 | width: 200px; |
background
简写属性,常用格式是
image position/size repeat attachment color
background-size可以省略
如果不省略,/background-size必须紧跟在background-position的后面
其他属性也都可以省略,而且顺序任意
1 | .box { |
background-image和img的选择
- img,作为网页内容的重要组成部分,比如广告图片、LOGO图片、文章配图、产品图片
- background-image,可有可无。有,能让网页更加美观。无,也不影响用户获取完整的网页内容信息
CSS属性-cursor
设置鼠标指针(光标)在元素上面时的显示样式
cursor常见的设值有
- auto:浏览器根据上下文决定指针的显示样式,比如根据文本和非文本切换指针样式
- default:由操作系统决定,一般就是一个小箭头
- pointer:一只小手,鼠标指针挪动到链接上面默认就是这个样式
- text:一条竖线,鼠标指针挪动到文本输入框上面默认就是这个样式
- none:没有任何指针显示在元素上面
1 | .box { |
十三.定位(position)
标准流 (normal flow)
默认情况下,元素都是按照normal flow(标准流、常规流、正常流、文档流【document flow】)进行排布
从左到右、从上到下按顺序摆放好
默认情况下,互相之间不存在层叠现象
margin、padding定位
在标准流中,可以使用margin、padding对元素进行定位
其中margin还可以设置负数
比较明显的缺点是
设置一个元素的margin或者padding,通常会影响到标准流中其他元素的定位效果
不便于实现元素层叠的效果
CSS属性-position
可以对元素进行定位,常用取值有4个
static静态定位
position属性的默认值
元素按照normal flow布局
left 、right、top、bottom没有任何作用
relative相对定位
元素按照normal flow布局
可以通过left、right、top、bottom进行定位
- 定位参照对象是元素自己原来的位置
left、right、top、bottom用来设置元素的具体位置,对元素的作用如下图所示
相对定位的应用场景
在不影响其他元素位置的前提下,对当前元素位置进行微调
相对定位练习1
1 | sub, sup { |
相对定位练习2
1 | body { |
fixed固定定位
元素脱离normal flow(脱离标准流、脱标)
可以通过left、right、top、bottom进行定位
- 定位参照对象是视口(viewport)
当画布滚动时,固定不动
1 | div { |
脱离标准流元素的特点
- 可以随意设置宽高
- 宽高默认由内容决定
- 不再受标准流的约束
- 不再给父元素汇报宽高数据
1 | div { |
absolute绝对定位
元素脱离normal flow(脱离标准流、脱标)
可以通过left、right、top、bottom进行定位
- 定位参照对象是最邻近的定位祖先元素
- 如果找不到这样的祖先元素,参照对象是视口
定位元素(positioned element)
- position值不为static的元素,也就是position值为relative、absolute、fixed的元素
1 | .box1 { |
绝对定位练习一 手机考拉
1 | .beauty-left { |
绝对定位练习二 下拉二维码
1 | .phone { |
子绝父相
在绝大数情况下,子元素的绝对定位都是相对于父元素进行定位
如果希望子元素相对于父元素进行定位,又不希望父元素脱标,常用解决方案是:
父元素设置position: relative(让父元素成为定位元素,而且父元素不脱离标准流)
子元素设置position: absolute
绝对定位技巧
绝对定位元素(absolutely positioned element)
position值为absolute或者fixed的元素
对于绝对定位元素来说
定位参照对象的宽度 = left + right + margin-left + margin-right + 绝对定位元素的实际占用宽度
定位参照对象的高度 = top + bottom + margin-top + margin-bottom + 绝对定位元素的实际占用高度
如果希望绝对定位元素的宽高和定位参照对象一样,可以给绝对定位元素设置以下属性
left: 0、right: 0、top: 0、bottom: 0、margin:0如果希望绝对定位元素在定位参照对象中居中显示,可以给绝对定位元素设置以下属性
left: 0、right: 0、top: 0、bottom: 0、margin: auto
另外,还得设置具体的宽高值(宽高小于定位参照对象的宽高)
1 | .box { |
position总结
元素的层叠
标准元素: 标准流中的元素是不存在层叠
定位元素: 定位元素会层叠到标准流元素的上面
定位元素之间可以z-index
前提: 必须是定位元素 - 非static
CSS属性-z-index
用来设置定位元素的层叠顺序(仅对定位元素-非static)
取值可以是正整数、负整数、0
比较原则
如果是兄弟关系
z-index越大,层叠在越上面
z-index相等,写在后面的那个元素层叠在上面
如果不是兄弟关系
各自从元素自己以及祖先元素中,找出最邻近的2个定位元素进行比较
而且这2个定位元素必须有设置z-index的具体数值
1 | .box1 { |
十四.浮动(float)
定位方案(Position Schemes)
在CSS中,有3种常用的方法对元素进行定位、布局
- normal flow:标准流、常规流、文档流
- absolute positioning:绝对定位
- float:浮动
绝对定位、浮动都会让元素脱离标准流,以达到灵活布局的效果
CSS属性-float
让元素产生浮动效果,float的常用取值
- none:不浮动,默认值
- left:向左浮动
- right:向右浮动
浮动的规则一
元素一旦浮动后
脱离标准流
朝着向左或向右方向移动,直到自己的边界紧贴着包含块(一般是父元素)或者其他浮动元素的边界为止
定位元素会层叠在浮动元素上面
1 | .box { |
浮动的规则二
浮动元素不能与行内级内容层叠,行内级内容将会被浮动元素推出
比如行内级元素、inline-block元素、块级元素的文字内容
利用此特性,可以轻松实现文字环绕功能
1 | div { |
浮动的规则三
行内级元素、inline-block元素浮动后,其顶部将与所在行的顶部对齐
1 | .box { |
浮动前面规则的理解
1 | <!-- |
浮动的规则四
如果元素是向左(右)浮动,浮动元素的左(右)边界不能超出包含块的左(右)边界
1 | <style> |
浮动的规则五
浮动元素之间不能层叠
如果一个元素浮动,另一个浮动元素已经在那个位置了
后浮动的元素将紧贴着前一个浮动元素(左浮找左浮,右浮找右浮)
如果水平方向剩余的空间不够显示浮动元素,浮动元素将向下移动,直到有充足的空间为止
1 | <style> |
浮动的规则六
浮动元素的顶端不能超过包含块的顶端,也不能超过之前所有浮动元素的顶端
1 | <style> |
inline-block水平布局的缺陷
浮动的应用
浮动常用的场景
- 解决行内级元素、inline-block元素的水平间隙问题
- 布局
浮动的练习
京东案例
案例一 :左右分布
1 | <style> |
案例二 : 一行放5个item的案例
1 | <style> |
案例三: 左边两个大的item, 右边四个小的item
- 主要目的: 中间层加负margin(最优解)
1 | <style> |
考拉案例(边框的布局)
案例一 : 品牌布局
1 | <style> |
案例二: 热卖品牌
1 | <style> |
案例三:今日限时购
1 | <style> |
浮动存在的问题
由于浮动元素脱离了标准流,变成了脱标元素,所以不再向父元素汇报高度
父元素计算总高度时,就不会计算浮动子元素的高度,导致了高度坍塌的问题
解决父元素高度坍塌问题的过程,一般叫做清浮动(清理浮动、清除浮动)
清浮动的目的是
让父元素计算总高度的时候,把浮动子元素的高度算进去
清除浮动的常见方法
给父元素设置固定高度
扩展性不好(不推荐)在父元素最后增加一个空的块级子元素,并且让它设置clear: both
会增加很多无意义的空标签,维护麻烦
违反了结构与样式分离的原则(不推荐)在父元素最后增加一个br标签:
会增加很多无意义的空标签,维护麻烦
违反了结构与样式分离的原则(不推荐)给父元素增加::after伪元素
纯CSS样式解决,结构与样式分离(推荐)
CSS属性-clear
clear的常用取值
- left:要求元素的顶部低于之前生成的所有左浮动元素的底部
- right:要求元素的顶部低于之前生成的所有右浮动元素的底部
- both:要求元素的顶部低于之前生成的所有浮动元素的底部
- none:默认值,无特殊要求
一般就只用在非浮动元素上,可以让非浮动元素与浮动元素不层叠
1 | .clear-fix::after { |
定位方案对比
CSS属性-transform
允许你旋转,缩放,倾斜或平移给定元素。
常见的函数transform function有:
- 平移:translate(x, y)
- 缩放:scale(x, y)
- 旋转:rotate(deg)
- 倾斜:skew(deg, deg)
位移-translate
平移:translate(x, y)
一个值时,设置x轴上的位移
二个值时,设置x轴和y轴上的位移
值类型:
数字:100px
百分比:参照元素本身( refer to the size of bounding box )
1 | <style> |
缩放-scale
缩放:scale(x, y)
一个值时,设置x轴和y轴相同的缩放
二个值时,设置x轴和y轴上的缩放
值类型:
数字:
1:保持不变
2:放大一倍
0.5:缩小一半
百分比:不支持百分比
1 | <style> |
transform-origin
变形的原点:
一个值时,设置x轴的原点
两个值时,设置x轴和y轴的原点
必须是<length>,<percentage>,或 left, center, right, top, bottom关键字中的一个
left, center, right, top, bottom关键字
length:从左上角开始计算
百分比:参考元素本身大小
1 | <style> |
旋转-rotate
旋转:rotate(deg)
一个值时,表示旋转的角度
值类型:
deg:旋转的角度
正数为顺时针
负数为逆时针
注意:旋转的原点受transform-origin的影响
1 | <style> |
倾斜-skew
旋转:skew(x, y)
值个数
一个值时,表示x轴上的倾斜
二个值时,表示x轴和y轴上的倾斜
值类型:
deg:旋转的角度
正数为顺时针
负数为逆时针
注意:旋转的原点受transform-origin的影响
1 | <style> |
CSS属性-transition
transition过渡动画是以下四个属性的简写。
transition-property:指定应用过渡属性的名称
可以写all表示所有可动画的属性
属性是否支持动画查看文档transition-duration:指定过渡动画所需的时间
单位可以是秒(s)或毫秒(ms)
transition-timing-function:指定动画的变化曲线
https://developer.mozilla.org/zh-CN/docs/Web/CSS/transition-timing-function
transition-delay:指定过渡动画执行之前的等待时间
1 | <style> |
CSS属性-vertical-align
文本的baseline是字母x的下方
Inline-block默认的baseline是margin-bottom的底部(没有,就是盒子的底部)
Inline-block有文本时,baseline是最后一行文本的x的下方
vertical-align有四个取值
- baseline(默认值):基线对齐
- top:把行内级盒子的顶部跟line boxes顶部对齐
- middle:行内级盒子的中心点与父盒基线加上x-height一半的线对齐
- bottom:把行内级盒子的底部跟line box底部对齐
<percentage>:把行内级盒子提升或者下降一段距离(距离相对于line-height计算\元素高), 0%意味着同baseline一样
<length>:把行内级盒子提升或者下降一段距离,0cm意味着同baseline一样
十五. flex布局
3.1. flex-container:
- display: flex/inline-flex
- 开启flex布局
- flex-direction:
- 决定主轴的方向
- justify-content:
- 决定主轴上flex-items如何排布
- align-items:
- 决定flex-items在交叉轴上的对齐方式
- normal
- stretch
- flex-start
- flex-end
- center
- baseline
- flex-wrap:
- nowrap
- wrap
- flex-flow:
- flex-direction
- flex-wrap
3.2.flex-items:
- order
- align-self
- flex-grow
- flex-shrink
- flex-basis
- flex
flex布局
容器属性
display
布局display:flex/inline-flex
flex-direction
决定主轴方向flex-direction:row
默认值,主轴水平方向,起点在左端flex-direction:row-reverse
主轴水平方向,起点在右端flex-direction:column
主轴垂直方向,起点在上沿flex-direction:column-reverse
主轴垂直方向,起点在下沿flex-wrap
换行flex-wrap:nowrap
默认值,不换行flex-wrap:wrap
换行,第一行在上方flex-wrap:wrap-reverse
换行,第一行在下方flex-flow:<flex-direction>||<flex-wrap>
缩写属性justify-content
项目在主轴上的对齐方式align-items
项目在交叉轴上的对齐方式align-content
多根轴线的对齐方式
项目属性
order
项目的排列顺序,数值越小,排列越靠前,默认为0flex-grow
项目的放大比例,默认为0flex-shrink
项目的缩小比例,默认为1flex-basis
在分配多余空间之前,项目占据的主轴空间flex:<flex-grow><flex-shrink>?||<flex-basis>
简写属性align-self
允许单个项目有与其他项目不一样的对齐方式
将flex-direction
设置成了column
之后相应的justify-content
也将变为竖直方向
对于一行分布两边的布局
- 使用
justify-content:space-between
直接实现 - 还可以设置
margin-left:auto/margin-right:auto;
flex和grid布局
今天彻底完成了flex布局的,然后看了阮一峰的博客汲取到了很多有用的东西。
学到了很多在以后工作中会用到的知识。
接下来的抓紧时间掌握JavaScript、React,完成两个项目之后开始投简历面试。
flex布局结合nth-child一起使用效果更佳。
Grid
容器属性
display
布局display:grid/inline-grid
grid-template-columns
列宽grid-template-rows
行高宽度单位
百分比
repeat(2,100px 20px 80px)
auto-fill
自动填充fr
比例minmax(100px,1fr)
长度范围,不小于100px,不大于1frauto
自己决定
grid-row-gap
行间距grid-column-gap
列间距gird-gap:<grid-column-gap> <grid-row-gap>
简写属性grid-template-areas
区域1
2
3grid-template-areas:'a b c'
'd e f'
'g h i'grid-auto-flow
放置顺序grid-auto-flow:row
默认值,先行后列grid-auto-flow:row dense
先行后列,并且尽可能紧密填满grid-auto-flow:column
先列后行grid-auto-flow:column dense
先列后行,并且尽可能紧密填满justify-items
设置单元格内容的水平位置align-items
设置单元格内容的垂直位置place-items:<align-items> <justify-items>
简写属性justify-content
整个内容区域在容器里面的水平位置align-content
整个内容区域在容器里面的垂直位置place-content:<align-content> <justify-content>
简写属性grid-auto-columns
浏览器自动创建的多余网格的列宽grid-auto-rows
浏览器自动创建的多余网格的行高
项目属性
gird-column-start
左边框所在的垂直网格线gird-column-end
右边框所在的垂直网格线gird-row-start
上边框所在的垂直网格线gird-row-end
下边框所在的垂直网格线grid-column:<grid-column-start>/<grid-column-end>
简写形式grid-column:1/3
从第1根列线到第3根列线grid-column:1/span 2
从第1根列线跨越2个网格grid-row:<grid-row-start>/<grid-row-end>
简写形式grid-area:<row-start>/<column-start>/<row-end>/<column-end>
指定放在哪一个区域
justify-self
设置单元格内容的水平位置align-self
设置单元格内容的垂直位置place-self:<align-self><justify-self>
简写形式