这是我参与「第五届青训营 」伴学笔记创作活动的第2天
CSS是用来定义页面元素的样式
组成:选择器、声明 (属性、属性值)
在页面使用CSS的方法
- 外链
<link rel="stylesheet" href="/assets/style.css">
- 嵌入
<style>
li{margin:0;list-style:none;}
</style>
- 内联
<p style="margin:1em 0">
Example Content
</p>
选择器Selector
- 按照标签名、类名、id
- 按照属性
- 按照DOM树中的位置
通配选择器
*{}
标签选择器
h1{}
id选择器
唯一的id值
<h1 id="logo">
</h1>
<style>
#logo{}
</style>
类选择器
给多个标签设置同一类型样式
<ul>
<li class="done"></li>
<li class="done"></li>
</ul>
<style>
.done{
color:gray;
}
</style>
属性选择器
选择标签内的属性给该标签设置样式
<label>用户名:</label>
<input value="zhao" disabled />
<style>
[disabled] {
background:#eee;
}
</style>
<!-- 表示属性有disabled就会改变样式 -->
<label>密码:</label>
<input type="password" value="123456">
<style>
input[type="password"] {
border-color:red;
}
</style>
<!-- 表示Input标签有type="password"属性和属性值就会改变样式 -->
规则
| 选择器 | 说明 | |
|---|---|---|
| M[attr] | M元素选择指定为attr属性的集合 | |
| M[attr=value] | M元素选择指定为attr属性和value值的集合(完全匹配) | |
| M[attr*=value] | M元素选择指定为attr属性并且包含值为value的集合(部分匹配) | |
| M[attr^=value] | M元素选择指定为attr属性并且起始值为value的集合(起始匹配) | |
| M[attr$=value] | M元素选择指定为attr属性并且结束值为value的集合(结束匹配) | |
M[attr1][attr] | M元素选择满足多个属性的集合(组合匹配) | |
| [attr~=value] | 匹配带有一个名为 attr 的属性的元素 ,其值正为 value,或者匹配带有一个 attr 属性的元素,其值有一个或者更多,至少有一个和 value 匹配。 | |
| [attr | =value] | 匹配带有一个名为 attr 的属性的元素,其值可正为 value,或者开始为 value,后面紧随着一个连字符。 |
伪类选择器
CSS伪类用于向某些元素添加特殊的效果。一般用于初始样式添加不上的时候,用伪类来添加。
M:伪类{}
:link、:visited、:hover、:active
注:
-
link visited 只能给a标签加,hover和active可以给所有的标签加
-
如果四个伪类都生效,一定要注意顺序:L V H A.
-
一般网站只这样去设置:a{} a:hover{}。
:link 访问前的样式(只能添加给a标签)
:visited 访问后的样式(只能添加给a标签)
:hover 鼠标移入时的样式(可以添加给所有的标签)
:active 鼠标按下的样式(可以添加给所有的标签)
一般网站都只设置a{}(link visited active) a:hover{}
:after、:before 通过伪类的方式给元素添加一段文本内容,使用content属性
:checked、:disabled、:focus针对的是表单的元素
div:after{content:'world';color:red}
div:before{content:'world'}
:checked{background:red}针对的是有checked属性的表单
:focus:{}针对的是有光标显示的时候
组合
1.后代:M N{} 包括子的子
2.父子:M>N{} 只包括N不包括N的子
3.兄弟:M~N{} 当前M下面的所有兄弟N标签(不包括M)
4.相邻:M+N{} 当前M下面相邻的N标签(不包括M)
CSS文字样式
font-family:字体类型
多个字体类型的设置目的(多个字体用,隔开):备用字体
字体名称中有空格的话,需要加''使用
英文字体:Arial,'Times New Roman'
中文字体:微软雅黑,宋体
中文字体的英文名称
微软雅黑:'Microsoft YaHei'
宋体:SimSun
注:1.设置多字体的方式2.引号的问题
通用字体:
Serif衬线体 -> Georgia、宋体
Sans-Serif无衬线体 -> Arial、Helvetica、黑体、微软雅黑
Cursive手写体 -> Caflisch Script、楷体
Fantasy夸张体
Monospace等宽字体 -> Consolas、Courief、中文字体
注:1.通用字体设置在最后2.英文字体放在中文字体前
使用Web Fonts
<h1>
Web fonts are awesome!
</h1>
<style>
@font-face{
font-family:"Megrim";
src:
url(https://fonts.gstatic.com/s/megrim/v11/46kulbz5WjvLqJZVam_hVUdI1w.woff2)
format('woff2');
}
h1{
font-family:Megrim,Cursive;
}
</style>
会消耗资源,自动下载字体
font-size:字体大小(默认16px)
写法:number(px)
注:字体大小一般为偶数
font-weight:字体粗细
写法:单词(normal、bold) | number(100、200、...900,100到 500都是正常的,600到900都是加粗的)
font-style:字体样式
italic斜体 / normal正常
注:oblique也是表示斜体,用的比较少,一般了解即可
区别:1.italic 带有属性倾斜的字体的才可以设置倾斜 2.oblique 没有倾斜属性的字体也可以设置倾斜操作
CSS优先级
-
相同样式优先级
当设置相同样式时,后面的优先级较高,但不建议出现重复设置样式的情况
-
内部样式与外部样式
内部样式与外部样式优先级相同,如果都设置了相同的样式,那么后写的引入方式优先级高
-
单一样式的优先级
style行间>id>class>标签>*>继承
注:style行间 权重 1000
id 权重 100
class 权重 10
tag 权重 1
-
!important(写在{}里面 是个值)
提升样式优先级,非规范方式,不建议使用(不能针对继承的属性进行优先级的提升)
#elem{color:red !important;} -
标签+类与单类
标签+类>单类
div.box{} .box{} -
群组优先级
群组选择器与单一选择器的优先级相同,靠后写的优先级高
-
层次优先级
权重比较
ul li .box p input{} 1+1+10+1+1 .hello span #elem{} 10+1+100约分比较
ul li .box p input{} li p input{} .hello span #elem{} #elem{}
CSS样式继承
文字相关的样式可以被继承
布局相关的样式不能被继承(默认是不能继承的,但是可以设置继承属性 inherit值 )
<div>
<p></p>
</div>
p{border="inherit"} 继承div的border属性
CSS盒子模型
组成:content->padding->border->margin
物品 填充物 包装盒 盒子与盒子之间的间距
content:内容区域 width和height组成
padding:内边距(内填充)
只写一个值:30px(上下左右)
写两个值:30px 40px(上下、左右)
写四个值:30px 40px 50px 60px(上、右、下、左)
单一样式只能对应一个值:
padding-left
padding-right
padding-top
padding-bottom
margin:外边距(外填充 )
注:
- 背景色填充到margin以内(不包括margin区域)
- 文字在content区域添加
- padding不能为负数,而margin可以为负数
border:边框
border-style:边框样式
solid:实线
dashed:虚线
dotted:点线
border-width:边框大小
border-color:边框颜色
边框也可以针对某一边进行单独设置:border-right-style:中间是方向
案例:利用边框实现三角形
div{width:0px;height:0px;border-left:30px solid red}
颜色:透明颜色transparent
box-sizing
box-sizing属性允许你以特定的方式定义匹配某个区域的特定元素。取值为content-box(默认值) | border-box
盒尺寸,可以改变盒子模型的展示形态。
默认值:content-box: width、height-->content
border-box:width、height-->content padding border
使用场景:
- 不用再去计算一些值
- 解决一些100%的问题
标签分类
block(块):div、p、ul、li、h1...
1.独占一行
2.支持所有样式
3.不写宽的时候,跟父元素的宽相同
4.所占区域是一个矩形
inline(内联):span、a、em、strong、img(特殊)...
1.挨在一起的
2.有些样式不支持,例如:width、height、margin(不支持上下)
3.所占的区域不一定是矩形
4.不写宽的时候,宽度由内容决定
5.内联标签之间会有空隙,原因:代码换行产生的(body(元素父容器)设置样式font-size:0,子容器重新设置font-size)
inline-block(内联块):input、select...
1.挨在一起,支持宽高
2.所占区域是一个矩形
3.之间有空隙
注:布局一般用块标签,修饰文本一般用内联标签
Flex布局
| 作用在flex容器上 | 作用在flex子项上 |
|---|---|
| flex-direction | order |
| flex-wrap | flex-grow |
| flex-flow | flex-shrink |
| justify-content | flex-basis |
| align-items | flex |
| align-content | align-self |
flex-direction
flex-direction用来控制子项整体布局方向,是从左往右还是从右往左,是从上往下还是从上往下
| 取值 | 含义 |
|---|---|
| row | 默认值,显示为行。方向为当前文档水平流方向,默认情况下是从左往右 |
| row-reverse | 显示为行。当方向和row属性值是反的 |
| column | 显示为列 |
| column-reverse | 显示为列。当方向和column属性值是反的 |
flex-wrap
flex-wrap用来控制子项整体单行显示还是换行显示
| 取值 | 含义 |
|---|---|
| nowrap | 默认值,表示单行显示,不换行 |
| wrap | 宽度不足换行显示 |
| wrap-reverse | 宽度不足换行显示,但是是从下往上开始,也就是原本换行在下面的子项现在跑到上面 |
注:当子元素的整体宽度大于父容器的宽度时,会自行调节
宽度会改变,不会溢出,当宽度达到最小值之后才会移除
flex-flow
flex-flow属性是flex-direction和flex-wrap的缩写,表示flex布局的flow流动特性。第一个值表示方向,第二个值表示换行,中间用空格隔开
flex-flow:column wrap;
justify-content
justify-content属性决定了主轴方向上子项的对齐和分布方式
| 取值 | 含义 |
|---|---|
| flex-start | 默认值,表现为起始位置对齐 |
| flex-end | 表现为结束位置对齐 |
| center | 表现为居中对齐 |
| space-between | 表现为两端对齐。between是中间的意思,意思是多余的空白间距只在元素中间区域分分配 |
| space-around | around是环绕的意思,意思是每个flex子项两侧都环绕互不干扰的等宽的空白间距,最终视觉上边缘两侧的空白只有中间空白宽度一半 |
| space-evenly | evenly是匀称、平等的意思。也就是视觉上,每个flex子项两侧空白间距完全相等 |
align-items
align-items中的items指的就是flex子项们,因此align-items指的就是flex子项们相对于flex容器在侧轴方向上的对齐方式
| 取值 | 含义 |
|---|---|
| stretch | 默认值,flex子项拉伸 |
| flex-start | 表现为容器顶部对齐 |
| flex-end | 表现为容器底部对齐 |
| center | 表现为垂直居中对齐 |
align-content
align-content可以看成和justify-content是相似且对立的属性,如果所有flex子项只有一行,则align-content属性是没有任何效果的
| 取值 | 含义 |
|---|---|
| stretch | 默认值。每一行flex子元素都等比例拉伸。例如,如果共两行flex子元素,则每一行拉伸高度是50% |
| flex-start | 表现为起始位置对齐 |
| flex-end | 表现为结束位置对齐 |
| center | 表现为居中对齐 |
| space-between | 表现为两端对齐 |
| space-around | 每一行元素上下都享有独立不重叠的空白空间 |
| space-evenly | 每一行元素都完全上下等分 |
作用在flex子项上的css属性
| 取值 | 含义 |
|---|---|
| order | 可以通过设置order改变某一个flex子项的排序位置。所有flex子项的默认order属性值为0,值大往后 |
| flex-grow | 属性中的grow是扩展的意思,扩展的就是fle子项所占据的宽度,扩展所侵占的空间就是除去元素外的剩余的空间间隙。默认值为0,为1的话是剩余的空间全部沾满 |
| flex-shrink | 属性中的shrink是“收缩的意思”,flex-shrink主要处理当flex容器空间不足的时候,某个元素的收缩比例。默认值是1,0表示不收缩 |
| flex-basis | flex-basis定义了在分配剩余空间之前元素的默认大小 |
| flex | flex属性是flex-grow,flex-shrink和flex-basis的缩写 |
| align-self | align-self指控制单独某一个flex子项的垂直对齐方式 |
Grid网格布局
Grid布局是一个二维的布局方法,纵横两个方向总是同时存在
| 作用在grid容器上 | 作用在grid子项上 |
|---|---|
| grid-template-columns | grid-column-start |
| grid-template-rows | grid-column-end |
| grid-template-areas | grid-row-start |
| grid-template | grid-row-end |
| grid-row-gap | grid-row |
| grid-gap | grid-area |
| justify-items | justify-self |
| align-items | align-self |
| place-items | place-self |
| justify-content | |
| align-content | |
| place-content |
grid-template-columns和grid-template-rows
对网格进行横纵划分,形成二维布局。单位可以是像素,百分比,自适应以及fr单位(网格剩余空间比例单位)
有时候,我们网格的划分是很规律的,如果需要添加多个横纵网格时,可以利用repeat()语法进行简化操作
.box{width:300px;height:300px;border:1px gray dotted;display:grid;
grid-template-rows:1fr 1fr 1fr;
grid-template-columns:1fr 1fr 1fr;
}
或者
grid-template-rows:repeat(3,1fr);
grid-template-columns:repeat(3,1fr);
grid-template-areas和grid-template
area是区域的意思,grid-template-areas就是给我们的网格划分区域的。此时grid子项只要使用grid-area属性指定其隶属于那个区
grid-template是grid-template-rows,grid-template-columns和grid-template-areas属性的缩写
grid-column-gap和grid-row-gap
grid-column-gap和grid-row-gap属性用来定义网格中网格间隙的尺寸
CSS grid-gap属性是grid-column-gap和grid-row-gap属性的缩写
justify-items和align-items
justify-items指定了网格元素的水平呈现方式,是水平拉伸显示,还是左中右对齐。align-items指定了网格元素的垂直呈现方式,是垂直拉伸显示,还是上中下对齐。
place-items可以让align-items和justify-items属性写在单个声明中。
| 取值 | 含义 |
|---|---|
| stretch | 默认值,拉伸。表现为水平或垂直填充 |
| Start | 表现为容器左侧或顶部对齐 |
| end | 表现为容器右侧或底部对齐 |
| center | 表现为水平或垂直居中对齐 |
justify-content和align-content
justify-content指定了网格元素的水平分布方式。align-content指定了网格元素的垂直分布方式。place-content可以让align-content和justify-content属性写在一个CSS声明中。
| 取值 | 含义 |
|---|---|
| stretch | 默认值,拉伸。表现为水平或垂直填充 |
| start | 表现为容器左侧或顶部对齐 |
| end | 表现为容器右侧或底部对齐 |
| center | 表现为水平或垂直居中对齐 |
| space-between | 表现为两端对齐 |
| space-around | 享有独立不重叠的空白空间 |
| space-evenly | 平均分配空白空间 |
作用在grid子项上的css属性
| 取值 | 含义 |
|---|---|
| grid-column-start | 水平方向上占据的起始位置 |
| grid-column-end | 水平方向上占据的结束位置。(span属性) |
| grid-row-start | 垂直方向上占据的起始位置 |
| grid-row-end | 垂直方向上占据的结束位置。(span属性) |
| grid-column | grid-column-start+grid-column-end的缩写 |
| grid-row | grid-row-start+grid-row-end的缩写 |
| grid-area | 表示当前网格所占用的区域,名字和位置两种表示方法 |
| justify-self | 单个网格元素的水平对齐方式 |
| align-self | 单个网格元素的垂直对齐方式 |
| place-self | align-self和justify-self的缩写 |
总结
CSS样式比较多,学习的地方还需更多时间查找MDN和WC CSS规范学习