给 21FEer 准备例会时拟的大纲,感觉也算是 CSS 入门笔记了。于是抄送一份到博客。
Emmet 语法
一些缩写的快捷键,输入完需要按 tab。不需要死记硬背,输入你需要的属性的开头字母就好了
以下仅为一些示例,可以自己探索其他缩写及其组合
html
以 div 为例,其他元素同理
- div ->
<div></div>
- div+p ->
<div></div><p></p>
- div.app ->
<div class="app"></div>
- div#app ->
<div id="app></div>
- img[src=”./images/drop.jpg”] ->
<img src="./images/drop.jpg" alt="">
- div*8 ->生成 8 个 div
- div*8{文字} -> 生成 8 个内容为’文字’的 div
- div*8{$} -> 生成8个div,内容依次从1到8(
$
是自增符号) - div>li ->
<div><li></li></div>
css
- bgc ->
background-color:
- ti ->
text-indent:
- w100p ->
width:100%
- w100p+h100p ->
width:100%;height:100%;
- jcc ->
justify-content: center;
- aic ->
align-items: center;
- df ->
display: flex;
- poa ->
position: absolute;
标签语义化
- https://www.jianshu.com/p/8ffb01ce77e4
代码结构清晰,方便阅读,有利于团队合作开发;方便其他设备解析(如屏幕阅读器、盲人阅读器、移动设备)以语义的方式来渲染网页。
css 选择器
常见选择器
- class 选择器
由于 class 可以同时为多个元素命名,因此常用于设置重复样式
<style>
.demo {
/* css */
}
</style>
<div class="demo"></div>
- id 选择器
id仅能为一个元素命名。可以使用id来特殊标识某个模块,然后定位其后代元素来为其后代设置特别的样式
<style>
#demo div {
/* css */
}
</style>
<div id="demo">
<div></div>
</div>
- 通配符选择器*
通配符选择器用于选中所有元素,为之设置初始样式
因为不同浏览器对元素的默认样式设置有差别,所以会用*来重置元素的默认样式
<style>
* {
/* css */
}
</style>
<div class="demo"></div>
- 子元素选择器>
仅作用于最近一层的后代元素
<style>
.demo > div {
color: black;
}
</style>
<div class="demo">
<div>
color会作用在这一层
<div>样式不会在这层生效</div>
</div>
</div>
- 后代元素选择器
选中所有内层嵌套的元素
<style>
.demo div {
color: black;
}
</style>
<div class="demo">
<div>
color会作用在这一层
<div>样式在这层也生效</div>
</div>
</div>
伪类
锚伪类
- a:link 未访问的链接样式选择器
- a:visited 已访问的连接样式选择器
- a:hover 鼠标移动到链接时的样式选择器
- a:active 选定的链接的样式选择器
focus
:focus 用于选中获取焦点的表单元素
input:focus {
background-color: yellow;
}
结构伪类
结构伪类选择器主要根据文档结构来选择特定序号的子元素
- 常见结构伪类
选择符 E:first-child 若父元素中第一个子元素为类型 E,则匹配 E:last-child 若父元素中最后一个子元素为类型 E,则匹配 E:nth-child(n) 若父元素中第 n 个子元素为类型 E,则匹配 E:first-of-type 匹配父元素第一个类型为 E 的元素 E:last-of-type 匹配父元素最后一个类型为 E 的元素 E:nth-of-type(n) 匹配父元素第 n 个类型为 E 的元素
特别地,当n
为odd
时,选中排序为奇数的元素;当n
为even
时,选中排序为偶数的元素
- nth-of-type(n)和 nth-child(n)的区别
nth-of-type(n)
是将所有符合指定元素类别的子元素选出来,并选中其中的第 n 个nth-child(n)
是将所有子元素选出来并选中其中第 n 个子元素。若此子元素与指定元素类别不同,则不会选中该元素
<style>
#app div:nth-of-type(1) {
/* 会作用在第一个子代div上 */
color: red;
}
#app div:nth-child(1) {
/* 由于#app第一个子元素是p,所以该样式不生效 */
color: blue;
}
</style>
<div id="app">
<p>1</p>
<div>1</div>
<div>2</div>
<div>3</div>
</div>
伪元素(::before/::after)
伪元素选择器可以用 css 创建新标签元素,而不需要在 html 中额外添加标签,从而简化 html 结构;新创建的元素在文档树中找不到
::before 是在选中元素内容的前面插入内容
::after 是在选中元素内容的后面插入内容
需要注意的是,::before 和::after 必须添加 content 属性。如果不需要文字内容,可以直接content:''
<style>
div::before {
content: 'before';
}
div::after {
content: 'after';
}
</style>
<div>main</div>
<!-- 显示效果等同于<div>before main after</div> -->
css 三大特性
层叠性
当选择器相同时,两个选择器均设置同一样式,此时遵循后来居上的原则,靠后的样式覆盖靠前的样式
<style>
.app {
background-color: #fff;
}
.app {
/* 优先显示该样式 */
background-color: red;
}
</style>
<div class="app"></div>
继承性
子标签会继承父标签的某些样式,比如 text-/font-/line-开头的属性
<style>
.app {
font-size: 1.5rem;
}
</style>
<div class="app">
<!-- demo会继承1.5rem的字号 -->
<div class="demo"></div>
</div>
优先级
当同一文档元素被多个选择器指定,其中部分样式产生冲突,则由选择器优先级决定哪个样式生效
选择器权重相同,执行层叠性;选择器权重不同,权重高的选择器样式先生效
ps. vscode 里,鼠标悬停在 css 选择器上的时候会显示该选择器的 Selector Specificity,暂时记不住怎么算可以直接看那个
选择器 | 权重 |
---|---|
继承 | (0, 0, 0, 0) |
元素选择器 | (0, 0, 0, 1) |
类选择器/伪类选择器 | (0, 0, 1, 0) |
ID 选择器 | (0, 1, 0, 0) |
行内样式 | (1, 0, 0, 0) |
!important | ≈∞ |
Tips
- 继承的权重是 0。如果该元素没被直接选中,不管父元素选择器作用到父元素的权重多高,子元素继承的样式权重永远是(0, 0, 0, 0)
<style>
#father {
color: red !important;
}
p {
color: blue;
}
</style>
<div id="father">
<p>这里的颜色会显示blue而不是red</p>
</div>
- 复合选择器会有权重叠加,但不会进位
<style>
/* 11个class选择器叠加,权重为(0,0,11,0),不会进位为(0,1,1,0) */
.a.b.c.d.e.f.g.h.i.j.k {
color: red;
}
/* 1个id选择器,权重为(0,1,0,0) */
#app {
color: black;
}
</style>
<div class="a b c d e f g h i j k" id="app">
这里是id选择器指定的样式生效,显示的字体颜色为black
</div>
元素的显示模式
可以对元素设置display
属性值改变其显示模式
块级元素
对应 css 的display
属性值为block
- 特点
- 独占一行,宽度默认为父级元素宽度的 100%
- 可以控制
height
/width
/margin
/padding
- 部分块级元素列举
<h1>-<h6>
/<p>
/<div>
/<ul>
/<ol>
/<li>
行内元素
对应 css 的display
属性值为inline
- 特点
- 相邻行内/行内块元素排列在一行上,并不会独占一行,默认宽高按元素内容
- 不可以直接设置
height
/width
,除非将其display
属性设置为inline-block
或block
- 部分行内元素列举
<a>
/<strong>
/<b>
/<em>
/<i>
/<del>
/<s>
/<ins>
/<u>
/<span>
行内块元素
对应 css 的display
属性值为inline-block
- 特点
- 相邻行内/行内块元素排列在一行上,并不会独占一行,默认宽高按元素内容
- 可以控制
height
/width
/margin
/padding
- 部分行内块元素列举
<img/>
/<input/>
/<td>
盒子模型
content
为文字主体内容的空间大小
默认情况(即box-sizing:content-box;
)下,width
和height
均作用于content
padding
为文字主体内容与边框的间距,也称内间距
默认情况(即box-sizing:content-box;
)下,width
和height
不会将padding
的宽度算入
如果需要把padding
的宽度值计算入width
和height
,需要将该元素的box-sizing
的属性值变更为border-box
border
设置边框的样式
直接设置border
属性时,需要同时指定宽度、样式和颜色,比如1px solid #000
,否则边框样式不生效
默认情况(即box-sizing:content-box;
)下,width
和height
不会包括border
的宽度
如果需要把border
的宽度值计算入width
和height
,需要将该元素的box-sizing
的属性值变更为border-box
margin
设置元素边框外的部分与其他元素的间距,也称外间距,用于调整相邻元素之间的间距,也可以通过调整特定方向的外间距进行元素定位
定位
absolute
position
属性值为absolute
属性的元素会脱离文档流,覆盖其他元素或被其他元素覆盖
- 元素具有
top
/left
/right
/bottom
属性
该元素会以最近一级设置了定位的父元素为基准,设置其边界与定位父元素边界的距离 - 元素没有
top
/left
/right
/bottom
属性
该元素在文档中所处的位置,与原来没有设置absolute
属性时的文档位置相同。
此时如果想对元素位置进行偏移,可以利用margin-left
和margin-top
模拟left
和top
的偏移量
relative
通常与定位为absolute
的元素一起出现。一般会给设置了top
/bottom
/right
/left
的absolute
元素外面套一个定位属性为relative
的父元素,方便对absolute
元素进行定位
fixed
可以理解为父元素永远为根元素的absolute
元素,性质与absolute
相似,可以用于返回顶部
等需要将元素固定在页面某一处的场景
布局
现阶段需要会使用 flex 布局,并且建议更多地使用 rem/em/vh/vw/%作为单位。grid 和 float 布局可以作为了解
float
float
属性会使元素脱离文档流。常见用法是作用在img
上,使p
元素里的文字围绕图片进行摆放,形成文字环绕图片效果
因为float
会影响其他元素的布局,常在 float 布局区后添加一个属性值带有clear:both
的块级元素,用于清除float
带来的影响
rem / em / vh / vw / %单位的使用
- rem
rem 是相对于根元素字体大小的单位 - em
em 是相对于当前对象内文本的字体尺寸 - vh
1vh 指屏幕高度的百分之一 - vw
1vw 指屏幕宽度的百分之一
flex
flex 布局也称弹性布局,是当前比较主流的布局方式
<style>
/* 作用在父元素上的属性 */
#app {
/* 声明该容器布局为flex */
display: flex;
/* 进行一个布局方向的定义。默认值为row。row为按列正序排布,column为按行正序排布;row-reverse为按列逆序排布 */
flex-direction: column;
/* #app子元素整体在水平方向上的排布位置 */
justify-content: space-between;
/* #app所有子元素在各自空间范围内竖直方向上的排布方式 */
align-items: center;
}
/* 作用在子元素上的属性 */
#app > div:first-child {
/* 单独设置该元素在水平方向上的排布方式 */
justify-self: center;
/* 单独设置该元素在竖直方向上的排布方式 */
align-self: center;
}
</style>
<div id="app">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>
grid
grid 布局也称栅格布局,对 IE 的兼容不友好
主要思想是把父元素分成 mxn 的栅格,将子元素填入栅格进行布局
<style>
#app {
/* 声明该容器的布局方式为grid */
display: grid;
/* 设置该容器水平方向上的格子数,并且同时设置了每行格子的宽度 */
grid-template-columns: repeat(3, 100px);
/* 设置该容器竖直方向上的格子数,并且同时设置了每列格子的高度 */
grid-template-rows: repeat(2, 200px);
/* 设置栅格整体的对齐方式,与flex一样 */
justify-content: center;
/* 设置栅格所有内部元素在竖直方向上的对齐方式 */
align-items: center;
}
#app > div:first-child {
/* 设置该小栅格在水平方向上的位置范围,1/span 3是指“栅格从第一条线开始偏移三个格子”为该元素的位置 */
grid-column: 1 / span 3;
/* 设置该小栅格在竖直方向上的位置范围。2/3是指“栅格从第二条线到第三条线之间的格子”为该元素的位置 */
grid-row: 2/3;
/* 单独设置该元素在水平方向上的排布方式 */
justify-self: center;
/* 单独设置该元素在竖直方向上的排布方式 */
align-self: center;
}
</style>
<div id="app">
<div>1</div>
<div>2</div>
<div>3</div>
<div>4</div>
</div>