CSS 笔记 | 青训营笔记

98 阅读5分钟

CSS 笔记 | 查漏补缺

加入了字节的青训营,看到了一些课程的内容,然后自己看了一下前端一些入门的东西,想着夯实一下基础,结果发现真的还有挺多东西遗忘了或者不深刻,所以就有了这个笔记。主要记录自己不太会的内容,会的就不怎么记录了,如果有幸被人看到,也可以看看下面有没有你不会的,查漏补缺,欢迎评论纠错。

1.css 选择器

这里在伪类和伪元素的部分很多都知道,但是用的不多干脆就都写上了。

1.1 属性选择器

有以下几种形式进行属性选择

  • [attr] 用来选择带有 attr 属性的元素
  • [attr="xxx"] 用来选择 attr 属性等于 xxx 的元素,
  • [attr^="xxx"] 用来选择 attr 属性以 xxx 开头的元素
  • [attr$="xxx"] 用来选择 attr 属性以 xxx 结尾的元素
<style>
  a["class"]{
    color:green;
  }
  input[type="passoword"] {
    border-color: red;
    color: red;
  }
  a[href^='#']{
    color: #fff;
  }
  a[href$='.jpg']{
    color: deepskyblue;
  }
</style>

1.2 伪类选择器

1.2.1 标记状态的伪类

可以标记元素状态的伪类有以下几种,且顺序必须是 lvha。

伪类说语法明说明
linka:link未访问过的超链接的元素
visiteda:visited访问过的超链接的元素
hovera:hover选取鼠标悬停的元素
activea:active选取点中的元素
focusinput:focus选取获得焦点的元素

1.2.2 筛选功能的伪类

有些伪类也可以有筛选的功能,可以根据元素的特点或者索引来给特定的元素加上样式。这一类实在太多了,列举其中比较容易忘记的几种。

伪类说语法明说明
frist-child/last-childp:first-child选择父元素中的第一个元素或最后一个元素
nth-child/nth-last-child(an+b)p:nth-child(2)上一种选择器的扩展选取第 n 个子元素,这里的 an+b 是可以写成 2n+1 的形势,也就是 1、3、5、7、9
nth-of-type/nth-last-of-type(an+b)p:nth-of-type(2)属于父元素的特定类型的第 n 个子元素和倒数第 n 个子元素
only-childinput:focus选取元素唯一的子元素,如果元素的父元素只有它一个子元素就会生效
only-of-typeinput:focus选取唯一的某个元素类型。如果元素的父元素只有它一个当前类型的子元素就会生效

注:这里所有的 tag:xxx 的形势,均是 tag 的父元素的子元素,不是 tag 的子元素。其中 nth-child 和 nth-of-type 乍一看很相似,但其实是不同的,nth-child(n)是子元素所有里面的第 n 个,nth-of-type(n)是把子元素按照 tag 类型分类后排列,选出每个 tag 排列之后的第 n 个元素

1.3 组合选择器

名称语法说明示例
直接组合AB满足 A 同时满足 Binput:focus
后代组合A B选中 B,如果他是 A 的子孙nav a
亲子组合A>B选中 B,如果他是 A 的子元素section>p
兄弟选择器A~B选中 B,如果他和 A 同级并且在 A 的后面h2~p
相邻选择器A+B选中 B,如果他紧跟在 A 后面h2+p

2.html 中的换行符

在 html 中出现多个空格的时候,往往 html 会合并成一个空格,例如

<p class="text" white-space="pre">
  This is a paragraph. The text is splitted into two lines.
</p>

包括使用 prettier 的时候也是这样,会自动把我的空格合并。 p 标签有一个white-space属性

属性值说明
normal默认行为
nowrap强制不换行
pre保留所有,和原本的一样
pre-warp保留所有,该换行就换行
pre-line保留换行,但是空格合并

3.css 求值过程

css选择.png

css 求值过程:首先根据 DOM 树何样式规则筛选出能匹配到当前元素的值,找到他们对应的多个声明值,之后按照这些特性计算优先级,最终得到一个 Cascaded Value,即优先级最高的值。作为这个元素的 css 值。 当这个值为空值,再考虑继承或者初始值。至此一定有一个指定的值,但是这个值不一定能直接被用来作为浏览器使用的值,进一步对单位或者路径 resolving,得到计算值,最后通过进一步转换得到使用值,并将小数转换为整数,最终得到了实际值。 计算值是在 css 和 html 中得到的值,但是很多值需要结合浏览器实际宽度来计算,这部分的计算是在 formatting 中实现的。 当然有些样式可能会冲突,比如 max-width 与 width,这一部分的计算也会在 constraining 中计算。

4.inline 元素的 padding 与 margin

首先 html 元素可以分为替换元素与非替换元素,其中非替换元素是由用户代理(一般是浏览器)生成的,例如<p>this is a paragraph</p>。其内容直接是 p 标签中的'this is a paragraph'。而替换元素则是自己本身没有任何内容,指向文档外的内容,例如<img src='hello.png' />

要讨论的问题则要分成这两种情况来讨论。

4.1 非替换元素

5.grid 布局

5.1 grid-template-columns 和 grid-template-rows 属性

  • grid-template-columns,列上的划分
  • grid-template-rows,行上的划分
display: grid;
grid-template-columns: 100px 100px 200px;
grid-template-rows: 100px 100px;

css3 中有一个新单位 fr,代表分数,可以用grid-template-columns:1fr 1fr 2fr;实现相同的效果。

grid布局.png

5.2 grid-area

首先划分网格,网格与网格之间有很多线。

grid-line.png

将他们排列之后,则通过起始行/起始列/结束行/结束列来定义一个单元在 grid 布局中的占据的位置。

grid-area.png

例如:

.a {
  grid-row-start: 1;
  grid-column-start: 1;
  grid-row-end: 3;
  grid-column-end: 4;
}

grid-area-res.png

上述结果等同于

.a {
  grid-area: 1/1/3/4;
}