深入CSS | 青训营笔记

85 阅读6分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第3天

选择器的优先级

如果两个选择器给同一个元素,这个元素的样式应该被哪个选择器控制?

  • 此时应该根据各个选择器的优先级决定优先使用哪个样式

image.png

    • !important内联样式优先级最高
    • 其次是内联样式
    • 最后 id选择器的数量 类/(伪类)选择器的数量 元素选择器的数量 优先级依次从高到低
  1. 从左往右依次比较 谁大 用谁的样式
  2. 注意,这个三位数不存在进位,1-0-0 比 0-11-0 大

继承

  • 某些属性会自动继承其父元素的计算值(默认继承)
  • 有些值默认不继承,于是我们可以显式地去让它继承,box-sizing: inherit

image.png

这样写的好处:让父亲盒子为某种box,其子代盒子就全部是content-box / border-box

初始值

  • CSS中,每个属性都有一个初始值
  • 对于继承属性,其初始值来自于继承
  • 对于非继承属性,其初始值
    • "background-color的初始值为transparent
    • margin-left的初始值为0
    • 可以使用initial关键字显式重置为初始值
    • background-color:initial

css求值过程

image.svg

计算值

developer.mozilla.org/zh-CN/docs/…

布局(Layout)

image.png

盒模型

  • 每一个元素都是一个盒子

image.png

width

  • 指定content box宽度
  • 取值为长度百分数auto
  • auto由浏览器根据其它属性确定
  • 百分数相对于容器的content box宽度

height

  • 指定content box高度
  • 取值为长度百分数auto
  • auto取值由内容计算得来
  • 百分数相对于容器的content box高度
  • 容器有指定的高度时,百分数才生效 (父容器需要有确定的高度)

padding 内边距

image.png

border

  • 设置边框的粗细 颜色 样式
.box {
  border-width: 50px;
  border-style: solid;
  border-color: #f35 transparent transparent transparent;

  margin: 1em auto;
}

这样就能得到一个三角形 直角向下

margin

  • 指定元素四个方向的外边距
  • 取值可以是长度百分数auto
  • 百分数相对于容器宽度
  • margin-left: auto && margin-right: auto 可以实现水平居中

margin collapse 外边距折叠

  • 两个相邻的上下盒子,上方的盒子添加margin-bottom,下方的盒子添加了margin-top,这两个外边距会取更大的值作为两者的间距,而不是两个margin值相加

box-sizing:border-box

  • 默认是content-box,你设置的宽高仅仅是 content
  • 可以指定为border-box, 你设置的宽高 为 border+padding+content image.png

overflow

  • 默认为visible 超出盒子的部分显示出来
  • hidden 超出盒子的部分被隐藏
  • scroll 超出盒子的部分可以通过滚动显示出来

块级&行级

比较

Block Level BoxInline Level Box
不和其他的盒子并列摆放和其它行级盒子一起放在一行或拆开成多行
适用所有的盒模型属性盒模型中的width、height不适用(由content撑开)

块级元素 与 行级元素

块级元素行级元素
生成块级盒子1.生成行级盒子
2.内容分散在多个行盒(line box)中
section、.h1-6、p、ul、Ii等body、article、div、main、span、em、strong、cite、code等
display:blockdisplay:inline

display 的属性

  1. block 块级盒子
  2. inline 行级盒子
  3. inline-block
    • 本身是行级,可以放在行盒中;
    • 可以设置宽高;
    • 作为一个整体不会被拆散成多行
    • 将对象呈现为inline对象,但是对象的内容将呈现为block对象
    • zhuanlan.zhihu.com/p/31856017
  4. none 排版时完全忽略

行级排版上下文(Inline Formatting Context)IFC

  • 只包含行级盒子的容器会创建一个IFC
    • inline 和 inline-block 都可

IFC的排版规则

1.盒子在一行内水平摆放
2.一行放不下时,换行显示
3.text-align决定一行内盒子的水平对齐
4.vertical--align决定一个盒子在行内的垂直对齐
5.避开浮动(float)元素*
  • overflow-wrap: break-word 设置过长的单词折断换行显示

块级排版上下文(Block Formatting Context)BFC

  • 某些容器会创建一个BFC
    • 根元素
    • 浮动、绝对定位、inline-block
    • Flex子项和Grid子项
    • overflow值不是visible的块盒
    • display:flow-root;它可以创建无副作用的 BFC。在父级块中使用即可以创建新的 BFC。

BFC排版规则

  • 盒子从上到下摆放
  • 垂直margin合并
  • BFC盒子中的margin不会与外部的合并
  • BFC不会和浮动元素重叠

Flex Box

什么是Flex Box?

  • 它可以控制子级盒子的:
    • 摆放的方向
    • 盒子的宽度和高度
    • 水平和垂直方向的对齐
    • 摆放顺序
    • 是否允许折行

摆放的方向 flex-direction(row为默认)

image.png

  • row 和 row-reverse 设定横向的主轴
  • column 和 column-reverse 设定竖直方向为主轴
  • display:flex的子级盒子会沿主轴方向依次排列 image.png

沿主轴方向的对齐 justify-content(flex-start为默认)

image.png

沿侧轴方向的对齐 align-items(flex-start为默认)

image.png

单独设置某个元素沿侧轴方向单独对齐 align-self

image.png

设置摆放的顺序 order

image.png

是否允许折行 flex-wrap

flex-wrap: wrap/no-wrap

Felxibility

用于设置子想的弹性,有剩余空间时,会伸展;空间不足时,会收缩。

flex-grow 存在剩余空间时的伸展能力(默认为0)

  • 计算规则:
  1. 当存在剩余空间时, 计算处剩余总空间 W
  2. 某个单独的一个子级元素设置的 flex-grow 为 g
  3. 所有子级元素设置的flex-grow 为 T
  4. 子元素的伸展空间为 W * (g/(T - g))

flex-shrink 容器空间不足时的收缩能力(默认为1)

  • 计算规则
  1. 当剩余空间不足时,计算溢出的总空间W
  2. 某个单独的一个子级元素设置的 flex-shrink 为s
  3. 某个单独的一个子级元素设置的 width/flex-basis 为b
  4. 计算出总权重X(每个子级元素的 s*b 相加)
  5. 最终缩小的空间值为 W*((s*b)/X)

然后就遇到了设置了padding之后不缩小的情况 然后就找到了这篇文章 大佬很厉害

flex-basis 没有上述两种情况时的基础长度(默认为auto)

此项属性优先级比width 要高 两者同时存在时,优先使用此属性

flex 简写

一般顺序如右flex: flex-grow flex-shrink flex-basis;
flex: 1flex-grow: 1
flex: 100pxflex-basis: 100px
flex: 2 1flex-grow: 2; flex-shrink: 1;
flex: 1 100pxflex-grow: 1; flex-basis: 100px;
flex: 2 0 100pxflex-grow: 2; flex-shrink: 0; flex-basis: 100px;
flex: autoflex: 1 1 auto
flex: noneflex: 0 0 auto

grid布局

  • 使用步骤
  1. image.png
  2. image.png
  3. image.png

grid-template

image.png

  • grid-template-columns 规定 每一列的长度
  • grid-template-rows 规定 每一行的长度
  • cdpn.io/webzhao/deb…

grid line 网格线

浮动

定位

position 属性

  • static 默认值,非定位元素
  • relative 相对自身原本位置偏移,不脱离文档流
  • image.png
  • absolute 绝对定位,相对非static祖先元素定位
  • image.png
  • fixed 相对于视口绝对定位
    点我进mdn