前言
感谢
CSS简介和发展史
CSS简介
- CSS:Cascading Style Sheet 级联样式表
那么CSS是干什么的呢,简单来说是搞定样式的。
如果拿一座大楼来比较的话,HTML是建立框架,CSS就是内部涂装,精致装修。甚至可以说,CSS是雪中送炭的一件事情。
我们之后可以这样来进行:HTML只用来控制页面的层次布局,至于页面的样式和涂装都交给CSS
CSS的发展史
- CSS1.x:读者可以从其他地方去使用自己喜欢的设计样式去继承地使用样式
- CSS2.x:DIV+CSS,提出了HTML和CSS相分离,并且提出了更高级的语法比如浮动,定位等等
- CSS3.x:模块化的发展方向,并且提出了更多的高级用法
CSS基本语法
引入CSS的方式
- 行内样式
- 内部样式
- 外部样式
行内样式
- 直接在html代码中编写CSS样式
在这种情况下,这种情况下并不需要选择器,因为直接在行内代码中编写默认选择这个标签
1 |
|
内部样式
- 在
<head></head>
中的<style></style>
中编写代码
1 |
|
外部样式
- 首先需要一个.css文件
- 使用外部链接的形式导入
其实还有一个导入式的方式,但是已经过时了
- HTML页面,引入CSS文件
1 |
|
- CSS文件
1 | div{ |
三种方式的优先级:就近原则,谁越接近标签优先级越高
按照这种原则,那么行内样式肯定是最高优先级,其他两个谁离得近谁优先级就高
选择器
选择器,重中之重
基本选择器
标签(元素)选择器
简单来说,就是是用HTML标签作为选择器
比如说,HTML中有标签,比如div,h1-h6,p,img,….
1 | div{ |
类选择器
什么叫类选择器呢,在标签中可以有一个属性class=xxx
,那么在css中就可以使用.xxx的形式来进行选择
类选择器非常常用
1 |
|
1 | .cc{ |
高级选择器
层次选择器
后代选择器
选择器 | 类型 | 功能描述 |
---|---|---|
E F | 后代选择器 | 选择 E 下面的 所有F |
E > F | 子选择器 | 选择 E 下面的 直接F |
后代选择器和子选择器有不同
- 后代选择器是选择E下面的所有F,包括儿子,孙子,重孙子,….
- 子选择器是选择E下面的F,只是儿子
1 |
|
1 | body p{ |
1 |
|
1 | body>p{ |
兄弟选择器
选择器 | 类型 | 功能描述 |
---|---|---|
E + F | 相邻兄弟选择器 | 选择E平级的后面的一个F |
E ~ F | 通用兄弟选择器 | 选择和E平级的后面的所有F |
相邻兄弟选择器和通用兄弟选择器不同
- 首先兄弟选择器是平级之间的标签
- 相邻兄弟选择器是选择和E相邻的兄弟标签,只选择下面的一个
- 通用兄弟选择器是选择和E平级的、后面的所有兄弟标签
1 |
|
1 | .cc+div{ |
1 |
|
1 | .cc~div{ |
结构伪类选择器
伪类
选择器 | 说明 |
---|---|
E F:first-child | 父元素E的第一个F子元素 |
E F:last-child | 父元素的最后一个F子元素 |
E:nth-child(n) | E的父级元素的第n个子元素,odd匹配奇数行,even匹配偶数行 |
E:nth-of-type(n) | E的父元素内具有指定类型的第n个元素 |
E:first-of-type | E的父级元素的指定类型的第一个元素 |
E:last-of-type | E的父级元素内具有指定类型的最后一个元素 |
1 |
|
1 | ul li:first-child{ |
伪元素
伪元素 | 作用 |
---|---|
:after | 元素之前添加内容 |
:before | 元素之后添加内容 |
:hover | 鼠标移动的效果 |
:first-child | 第一个子类元素 |
:focus | 元素输入的焦点 |
属性选择器
选择器 | 说明 |
---|---|
E[attr] |
选择匹配具有attr的元素 |
E[attr=val] |
选择匹配具有属性attr且attr的值为val的元素,val区分大小写 |
E[attr^=val] |
匹配有属性attr,且属性值以val开头的元素 |
E[attr$=val] |
匹配有属性attr,且属性值以val结尾的元素 |
E[attr=*val] |
匹配有属性attr,且属性值包含val的元素 |
E[attr~=val] |
表示带有以 attr 命名的属性的元素,并且该属性是一个以空格作为分隔的值列表,其中至少有一个值为 val |
`E[attr | =val]` |
1 |
|
1 | p[id=p]{ |
并集选择器和全选择器
- 并集选择器:
选择器1,选择器2{}
- 全选择器:
*{}
1 |
|
1 | *{ |
属性
属性优先级
1、*!important*拥有最高优先级,只要被这个修饰,则忽略其他的改变。但也会被权重高的!important所覆盖(也就是第三条原则,就近原则)
2、选择器的范围越宽广,优先级越低,选择器的优先级越具体,优先级越高,比如class选择器的优先级低于id选择器,标签选择器低于class选择器
3、在选择器的优先级相同时,使用就近原则
但其实,他的原理是一个叫做权重的东西
1、标签选择器和伪类选择器:1
2、class选择器:10
3、ID选择器:权重:100
注意!就算标签选择器有10个1也是10个1,而不是1个10,就算有100个标签选择器也比不上一个class选择器
颜色
颜色分为三字节和四字节两种
三字节就是RGB(Red 红色,Green 绿色,Blue 蓝色),四字节就是RGBA(Red 红色,Green 绿色,Blue 蓝色,Alpha 透明度)
比如:
- color:#ffffff,或者color:#ffffffff
- color:rgb(255,255,255),或者rgb(255,255,255,1)
在Alpha中,假如要以16进制来进行表现,那么使用0-f。假如使用rgb函数来表示,那么就是0-255,但是透明度为0-1
字体
属性 | 说明 |
---|---|
font-family |
字体类型 |
font-size |
字体大小 |
font-style |
字体风格 |
font-weight |
字体粗细 |
font |
设置所有属性,默认是12px |
1、CSS在同时设置字体时,优先使用第一个,如果不认识第一个就切换到第二个,然后第三个,直到最后一个
比如我同时设置了A和B,第一种支持英文不支持中文,第二种支持中文和英文,所以英文切换成了A,中文切换成了B
假如我先设置了B然后是A,那么都是A字体
2、字体大小有单位
px
:像素,最常用,是一种逻辑的长度,你可以认为就是屏幕的一个像素点- em:相对于父级元素的字体大小进行缩放
- rem:相对于HTML根字体的大小进行缩放
- cm:厘米
- mm:毫米
- pt:point,单位,老版用法
- pc:pica,排版学,老版用法
3、字体风格
normal
:平常italic
:使用文字的斜体版oblique
:让没有斜体版的文字也可以倾斜
4、字体粗细
normal
:平常bold
:粗体bolder
:更粗lighter
:更细100、200、300、…..、900
:自定义,400为normal,700为bold这个和字体有关系,你的字体首先要支持多级粗细,它才会进行变化
5、字体
定义字体时,需要的顺序为:
字体风格 字体粗细 字体大小 字体类型
注意,在写字体的时候,尽量不要使用中文,即使使用中文也要使用中文对应的英文再来一次
文本
属性 | 说明 |
---|---|
color |
颜色 |
text-align |
设置元素水平对齐方式 |
text-indent |
首行缩进 |
line-height |
行高 |
text-decoration |
装饰 |
vertical-align |
垂直对齐 |
text-shadow |
文本阴影 |
color
:颜色
RGB:红绿蓝的配比,三者取值都为0-255,比如
rgb(0,0,0)
RGBA:红绿蓝透明度的配比,透明度为0-1,比如
rgba(0,0,0,0)
十六进制:#AABBCC:A为红,B为绿,C为蓝,取值为十六进制
十六进制,当红,绿,蓝各自相同时,可以缩写,比如
#000000可以缩写为#000,#001122可以缩写为#012
但是#010000不可缩写
text-align
:文本对齐
left
:左对齐right
:右对齐center
:中间对齐justify
:两端对齐
text-decoration
:文本装饰
none
:默认值underline
:下划线overline
:上划线line-througn
:中划线(删除线)
vertical-align
:垂直对齐
middle
:中间对齐top
:顶端对齐bottom
:底部对齐
text-shadow
:文本阴影
text-shadow:color x-offset y-offset blur-radius
color
:阴影颜色x-offset
:x偏移量y-offset
:y偏移量blur-radius
:模糊半径
超链接伪类
伪类 | 说明 |
---|---|
a:link |
未单击时的超链接样式 |
a:visited |
点击时的超链接样式 |
a:hover |
鼠标悬浮时的超链接样式 |
a:active |
鼠标单击未释放的超链接样式 |
1 |
|
1 | a:link{ |
列表样式
列表样式:list-style
样式 | 说明 |
---|---|
list-style-type |
列表样式 |
list-style-position |
列表位置 |
list-style-image |
列表图片 |
list-style-type
样式 | 说明 |
---|---|
none |
无标记符号 |
disc |
实心圆,默认 |
circle |
空心圆 |
square |
实心正方形 |
decimal |
数字 |
upper-roman |
大写罗马 |
lower-alpha |
小写英文字母 |
upper-alpha |
大写英文字母 |
完整版来自菜鸟教程 :
list-style-position
:位置
样式 | 说明 |
---|---|
inside |
文本内 |
outside |
默认,文本左侧 |
inherit |
从父元素继承 |
list-style-image
:指定图片
样式 | 说明 |
---|---|
url | 图片路径 |
none | 无图形被显示 |
inherit | 从父元素继承 |
背景
background-color:背景颜色
background-image:url(图片路径):背景指定为图片
background-repeat:重复方式
repeat
:沿水平和垂直两个方向重复no-repeat
:显示一次repeat-x
:沿水平重复repeat-y
:沿垂直平铺
background-position:属性
x y
:单位pxx% y%
:百分比关键字
- 水平:
left,center,right
- 垂直:
top,center,bottom
- 水平:
background:背景全写
顺序:
background: 颜色 图片 定位 重复
background-size:尺寸
- auto:默认,使用背景图片保持原样
- percentage:使用百分比则相对于元素的宽度计算
- cover:整个背景图片放大填充了整个元素
- contain:让背景图片保持本身的宽高,将背景图片缩放到宽度或者高度正好适应所定义背景的区域
渐变
线性渐变:从一段到另一端
linear-gradient(方向, 颜色1, 颜色2, ...);
to bottom
to top
to right
to left
to bottom right
角度
角度
径向渐变:从中心到四周
radial-gradient(形状,颜色1,颜色2,....)
盒子
盒子介绍
我们平时设置的height和width只是页面的元素的宽高,而内边距,边框和外边距是另外计算的
而我们可以使用box-sizing:border-box属性,一旦使用了这个属性,我们的height和width就会变为页面元素+内边距+边框的宽高,这样到页面元素到边框的长宽确定了,就会变为我们想要的结果
盒子大小
box-sizing: content-box | border-box | inherit
- content-box:默认值,盒子的总尺度
- border-box:元素内容的宽度或者高度
- inherit:继承父元素的盒子模式
box-shadow:盒子阴影
box-shadow: inset x-offset y-offset blur-radius color
- inset:阴影类型是内阴影
- x-offset:x偏移量
- y-offset:y偏移量
- blur-radius:模糊范围
- color:阴影颜色
vw和vh
在默认情况下,假如我们想要改变一个div盒子的宽度(比如改为屏幕的一半),只需要使用50%即可,但是假如我们要改变高度,那么50%是没有用的
1 | .test{ |
宽度为屏幕的一半,但是高度不变
这个时候我们可以使用vh来改变元素的高度,同理vw是宽度的单位
1 | .test{ |
宽度和高度都改变为了一半,vw和vh就是CSS3的自适应布局
1vw为视口宽度的1%,1vh为视口高度的1%
边框
- border-color:边框颜色
border-top-color:上边框颜色
border-right-color:右边框颜色
border-bottom-color:底部边框颜色
border-left-color:左边框颜色
border-color:全部边框颜色
- border-width:边框粗细
- thin:细
- medium:中等
- thick:厚
- 像素
- border-style:边框样式
- none:没有
- hidden:隐藏
- dotted:点
- dashed:虚线
- solid:实线
- double:双倍
- border
边框简写,只需要记住
border:1px solid red
就可以自由替换了
- border-radius:圆角
border-radius:10px 10px 10px 10px
- 这四个属性从上左,上右,下右,下左顺时针排列,50px基本上就是圆
- 或者也可以使用
border-radius: 10px
指定所有的位置- 可以使用百分比,比如:
border-radius: 50%
边距
内边距
padding-top/right/bottom/left
:边框的上/右/下/左内边距
外边距
margin-top/right/bottom/left
:边框的上/右/下/左外边距
使用外边距可以令网页居中对齐,但是需要两个条件
- 块元素
- 有固定宽度
然后就可以使用:margin: 0px auto
将元素对齐
浮动
行级元素和块级元素
- 行级元素:和其他元素可以共存一行,典型代表有
a,span
- 块级元素(内联元素):不可以和其他元素共存一行,前后带有换行符,典型代表有
h1-h6,div
display
值 | 说明 |
---|---|
block | 块级元素的默认值,可以折行,受CSS宽高的控制 |
inline | 行级元素,内联元素的默认值,不可以折行,不受CSS宽高的控制 |
inline-block | 行内块,具有行级元素和块级元素的特征:既不折行,又受CSS宽高的控制 |
none | 不会被显示 |
flex | 新版技能 |
display可以控制元素行块的转变,也可以display可以控制元素的显示和隐藏
float
值 | 说明 |
---|---|
left | 向左浮动 |
right | 向右浮动 |
none | 不浮动 |
1 |
|
1 | .left{ |
边框塌陷
1 |
|
1 | .left{ |
这种情况显然不是我们想要看到的,所以解决方法:
解决元素塌陷的情况
- clear
left:清除左侧浮动元素
right:清除右侧浮动元素
both:清除两侧浮动元素
none:不变
1 |
|
1 | .left{ |
- 设置父元素的高度,降低扩展性
1 |
|
- 父级元素添加overflow(溢出处理),下拉框不能用
属性 | 说明 |
---|---|
visible | 默认,什么也不变 |
hidden | 超出不可见 |
scroll | 出现滚动条 |
auto | 假如超出则出现滚动条 |
1 |
|
- 添加伪类after,复杂,但是没有副作用
1 |
|
1 | .clear{ |
- 打不过就加入,缺点很明显
1 |
|
- 在之后加一个div,会造成代码冗余
1 |
|
margin塌陷
1 |
|
想让子元素离开父元素,结果父元素却离开了上面,子元素没离开父元素,这种情况叫做margin塌陷
解决方式
- 父元素设置overflow
1 |
|
- 给父元素设置边框
1 |
|
定位
static定位
元素的默认定位,不会受到 top, bottom, left, right影响。
相对定位
相对于自己的初始位置定位
元素偏移之后,原来的位置会保留下来(它周围的元素会以它原来的位置进行定位)
层级提高,可以把标准文档流中的元素节浮动元素盖在下面
一般很少单独使用,都是配合绝对定位
- position:relative
- 偏移量设置:top,left,right,bottom
1 |
|
绝对定位
- 相对于父级的第一个不是static定位元素进行定位,假如没有设置定位父级则相对浏览器窗口定位
- 元素发生偏移之后,原来的位置不保留
- 层级提高,可以把标准文档流中的元素节浮动元素盖在下面
- 脱离文档流
- 一般用于下拉菜单,焦点图轮播,弹出数字气泡,特别花边等场景
position:absolute
1 |
|
固定定位
- 相对浏览器窗口定位
- 偏移量不会随着滚动条变化
position:fixed
1 |
|
z-index
- 调整元素层级关系,默认为0
- 设置了position时,可以设置各个元素之间的重叠关系
- 值大的层覆盖值小的层
1 |
|
Flex
基本概述
传统方式就是我们刚才讲的,盒状模型+display+position+float,来实现页面的总体布局,对于一些特殊的布局来讲,不太容易实现。
W3C提出了一项新的方案:Flex布局(弹性布局),依托于Flex布局,可以轻松实现各种响应式布局方案。
Flex布局分为两种:
- flex:用于块级元素
- inline-flex:用于行级元素
我们在使用时,只需要设置display属性即可
1 | .test{ |
设置Flex布局之后,子元素的float,clear,vertical-align都将会失效
实现原理
1、display设置为Flex布局的元素称为Flex容器:flex container,容器内部的子元素都称为Flex项目:flex item
2、容器中我们有两个轴,一条水平的轴为主轴:main axis,一条垂直的轴交叉轴:cross axis,主轴和交叉轴的方向我们都可以设置
3、项目默认按照主轴排列,单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size
Flex的属性
容器上有六个属性,项目上有六个属性
容器六大属性
flex-direction
决定主轴的方向(也就是默认的项目排列方向),可以设置为从左到右,从右到左,从上到下,从下到上四种类型
属性值 | 方向 |
---|---|
row(默认值) | 从左到右 |
row-reverse | 从右到左 |
column | 从上到下 |
column-reverse | 从下到上 |
我们只需要记住row和column即可,因为其他两个都是reverse之后的
flex-warp
容器内的项目排列都在一条线上,但是假如项目过多,就需要考虑到换行的问题,他有三种方式:不换行、换行、换行(但是第一行在下面)
属性值 | 换行方式 |
---|---|
nowrap | 不换行 |
wrap | 普通换行 |
wrap-reverse | 换行,但是第一行在下面 |
flex-flow
上面的flex-direction和flex-wrap可以使用一个属性来代替:flex-flow,它的默认值为 row nowrap,比如:
1 | .test{ |
justify-content
我们也可以对项目进行水平轴对齐方式的改变
属性值 | 对齐方式 |
---|---|
flex-start | 按照主轴的开始点对齐 |
flex-end | 按照主轴的结束点对齐 |
center | 居中 |
space-between | 两端对齐 |
space-around | 项目间隔相等 |
align-items
我们也可以设置项目在交叉轴上的对齐方式
属性值 | 对齐方式 |
---|---|
stretch | 如果项目未设置高度或设为auto,将占满整个容器的高度 |
flex-start | 交叉轴的起点对齐 |
flex-end | 交叉轴的终点对齐 |
center | 居中 |
baseline | 项目的第一行文字的基线对齐。 |
align-content
多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。也就是说项目在多个容器中该如何对齐
属性值 | 对齐方式 |
---|---|
stretch | 轴线占满整个交叉轴 |
flex-start | 与交叉轴的起点对齐 |
flex-end | 与交叉轴的终点对齐 |
center | 居中对齐 |
space-between | 与交叉轴两端对齐,轴线之间的间隔平均分布 |
space-around | 每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍 |
项目六大属性
order
定义项目的排列顺序。数值越小,排列越靠前,默认为0
flex-grow
定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大
假如有些项目为0,有些项目为1,那么为1的项目则均分剩下的空间
假如全部项目为1,那么它们将均分剩余的空间
假如有个项目为1,有个项目为2,那么剩余空间将会首先分割为1:2划分,2的占多
flex-shrink
定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。负值无效。
假如项目为0,那么不缩小。
flex-basis
定义了在分配多余空间之前,可以使用这个判断项目占据的主轴空间(main size),浏览器根据这个属性,计算主轴是否有多余空间然后进行分配
它的默认值为auto,即项目的本来大小,假如给一个固定值,那么项目将占据固定空间
flex
flex-grow、flex-shrink、flex-basis的简写,默认值为0 1 auto。后两个属性可选。
该属性有两个快捷值
- auto:1 1 auto
- none:0 0 auto
建议优先使用这个属性,而不是单独写三个分离的属性,因为浏览器会推算相关值
align-self
允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性
默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch
动画
CSS变形
- 位移
1 | <div style="height: 100px;width: 100px;background: red;transform: translate(0,50px);"></div> |
- 缩放
1 | <div style="margin: 10px;height: 100px;width: 100px;background: red;transform:scale(2,1)"></div> |
- 旋转
1 | <div style="margin: 10px;height: 100px;width: 100px;background: red;transform: rotate(40deg)"></div> |
- 倾斜
1 | <div style="height: 100px;width: 100px;background: red;transform: skew(30deg,30deg)"></div> |
CSS过渡
过渡,是一种动画转换的效果
transition: 过渡属性 过渡时间 过渡函数
- 过渡属性
- width,height,background-color,…..
- all
- 过渡时间,单位为秒(s)
- 过渡动画
- ease:快到慢
- linear:均衡
- ease-in:慢到快
- ease-in-out:慢到快到慢
1 |
|
1 | .animation{ |
动画可以通过伪类触发,通过JS触发,通过@media属性判断设备的尺寸,方向触发
CSS动画
- 需要关键帧
- 需要animation属性调用关键帧
1 |
|