深入理解CSS精简版 (上 : 基础部分)

一 层叠、优先级、继承

1. 概念

1.1 层叠是什么?层叠值是什么?

css 样式冲突时,一个属性只有一个样式能生效,决定哪个样式能生效的这一套规则,就叫做层叠。 通过层叠规则计算出来,最终能生效的那个值,就是层叠值

1.2 层叠规则

样式表的来源>!important>选择器的优先级>源码顺序

  • 样式表的来源 作者样式表(代码中的 css)>用户样式表(用户自定义)>用户代理样式(浏览器默认样式)

  • !important 添加了!important 的属性声明优先级更高

  • 选择器的优先级 行内样式 > ID 选择器 > 类选择器 > 标签选择器

    计算规则: 按不同选择器类型的数量用逗号分隔标记,如一个 ID 选择器 = "0,1,0,0"。从左往右比较,谁的数字大,谁的优先级更高。数字相同时,继续比较下一个,以此类推。

  • 源码顺序 选择器优先级一致的情况下,后面声明的样式会覆盖前面声明的样式。

1.3 继承

如果一个元素某些属性没有设置层叠值得话,可能会继承某个祖先元素的值。 常见的会默认继承的值:

  • 文本:color、font、font-family、font-size、font-weight、font-variant、font-style、line-height、letter-spacing、text-align、text-indent、text-transform、white-space 以及 word-spacing。
  • 列表:list-style、list-style-type、list-style-position、list-style-image。
  • 表格:border-collapse、border-collapse。

1.4 inherit 和 initial

  • inherit:一些属性不会默认继承父元素的值,使用 inherit 作为样式的值,就会继承父元素的值。
  • initial:元素某个样式设置了层叠值或者继承了父元素的值,可以使用 initial 重置。initial 是重置为样式属性的初始值,不是重置为该元素这个样式的初始值。

1.5 简写属性

  • 简写属性是同时给多个属性赋值。 如 padding = padding-top+padding-right+padding-bottom+padding-left。

  • 省略值覆盖详细属性 简写属性可以省略一些值,这些值有默认值,如果简写属性在详细属性后面编写的,那么即使没填可以省略的值,也会用默认值覆盖详细属性。

  • 简写属性常见顺序

    • 设置 4 个方向的值,顺序为逆时针 TRLB(上右下左)。
    • 设置水平和垂直方向的,顺序为先 X(水平)后 Y(垂直)。

二 相对单位

1. 概念

1.1 相对单位的好处和坏处

  • 好处:一个样式可以作用于多个网页,此外更改字号或缩放浏览器窗口都可以适应。
  • 坏处:直到内容和样式都完成了才能看到效果,需要计算,会增加设计流程增加复杂性。

2. 属性 & 单位

2.1 字体相对单位

  • em: 相对于 font-size 属性,1em = 继承自父容器的 font-size。相对于其他属性,1em = 元素自身的 font-size。
  • rem: 1rem = 根元素 font-size。

2.3 视口相对单位

  • vh: 视口高度的 1%
  • vw: 视口宽度的 1%
  • vmin: 视口宽高较小的一方的 1%
  • vmax: 视口宽高较大的一方的 1%

2.3 calc() 计算函数

calc()函数可以对长度单位进行加减乘除计算。运算符两边必须留有空格。

3. 其他

3.2 无单位的数值和行高

有些属性允许无单位的值:

  • line-height: 行高(默认 em)
  • z-index: 层级
  • font-weight: 字体粗细

任何长度单位都允许用不带单位的 0 , px、em、rem、vw、vh 等。 定义无单位的长度单位,子组件继承的是声明值,而使用有单位的长度时。继承的是计算值。

3.3 自定义属性

  • 定义自定义属性: 变量名前面必须有两个连字符(--),如 --my-var
  • 使用自定义属性: var(--my-var,备用值),变量未声明时使用备用值,备用值可以为空。
  • 自定义属性可以层叠和继承。

3.4 字体单位常用技巧

  • 大多情况下,使用情况下,rem 设置字号,px 设置边框,em 设置其他属性。
  • 通过媒体查询设置不同大小的屏幕的根 font-size 来实现响应式布局。
  • 实现组件 large、mini 等功能: 外层容器设置通过 large、mini 设置不同 font-size,其他属性以及子组件 font-size 使用 em

三 盒模型

1. 概念

1.1 盒模型

  • content-box
  • border-box

1.2 文档流

  • 行内元素: 跟随文字从左到右排列,到达容器边缘换行。
  • 块级元素: 占据完整的一行,前后都有换行。

2. 属性 & 单位

1.1 属性

  • box-sizing: 盒模型类型

    • content-box(默认值) / border-box
  • overflow: 当明确了容器高度|宽度,子元素在限定区域内放不下时,会发生溢出,overflow 属性可以控制溢出行为。

    • visible(默认值) / hidden / scroll / auto
  • minWidth: 元素最小宽度。

  • maxWidth: 元素最大宽度。

3. 其他

3.1 百分比高度问题

百分比是参考的父容器高度计算的,而父容器没有指定具体高度时,高度是通过子元素的高度决定的。这种情况下,浏览器没办法处理,因此会忽略这个声明。要使用百分比高度时,需要先确定父容器高度,或者使用 vh。

3.2 等高列实现方案

  • table 布局
  • flex 布局

3.3 垂直居中方案

  • 给容器加上上下相等的内边距。
  • 只有一行文字,设置一个大的行高
  • 容器和内容高度都确定,使用绝对定位内容
  • 不知道容器高度,使用绝对定位结合 transform
  • 对容器使用 display: table-cell 和 vertical-align: middle。(vertical-align 只针对行内元素和 table-cell 生效)
  • flex 布局,align-item:center

3.4 负外边距

外边距可以设置为负值,左 | 上 会把自身往相应方向移动。右 | 下 会将后面的元素拉过来。未设置宽高时,会填充宽高。

3.5. 外边距折叠

相邻的上下外边距,会折叠一起,取最大值作为边距,即使不是同一层级的元素,同样父子元素的上下边距也会折叠。左右外边距不会折叠。

以下几种方式可以防止上下外边距折叠:

  • 对容器使用 overflow:任何不为 visible 的值,防止父子元素上下边距折叠。
  • 容器使用 padding,防止父子元素上下边距折叠。
  • 设置容器为浮动元素、内联块、绝对定位、固定定位。
  • flex 布局内的元素之间不会发生外边距折叠。
  • table-cell 不具备外边距,所以不会折叠。

3.6. 容器内的元素间距

权衡使用猫头鹰选择器(_ + _),给非第一个元素增加外边距

四 理解浮动

1. 概念

1.1 浮动的设计初衷

将元素拉到一侧,使文档流包围它,如文字包围图片。

1.2 BFC

BFC 是块级格式化上下文,将内部的内容与外部的上下文隔离开,BFC 里的内容不会跟外部的元素重叠或相互影响。有以下作用:

  • 包含了内部所有元素的上下边距,不会根 BFC 外面的元素产生外边距折叠。
  • 包含了内部所有浮动元素。
  • 不会跟 BFC 外面的浮动元素重叠

给元素添加以下任意属性值都会创建 BFC:

  • float: left 或 right,不为 none 即可
  • overflow: hidden、auto、scroll,不为 visible。
  • display: inline-block、table-cell、table-caption、flex、inline-flex、grid、inline-grid。 -position: absolute、fixed

2. 属性 & 单位

2.1 属性

  • float: 定义浮动

    • none(默认值)/ left / right:
  • clear: 清除浮动

    • none(默认值) / left / right / both:

3. 其他

3.1 容器折叠和清除浮动

  • 容器折叠: 元素使用浮动后,它们的高度不会加到父元素上,当后面非浮动元素高度低于浮动元素时,浮动元素会超出父容器。
  • 清除浮动: 元素使用 clear:both(两侧)|left(左)|rigth(右),可以清除左右浮动元素带来的布局影响,解决折叠问题。浮动元素为最后一个或者第一个时,可以对父元素添加::before 或者::after,设置 clear:both 清除浮动。

3.2 网格系统

把网页构造成行和列实现网格系统。每行通常北划分为特定数量的列,一般为 12 个,每个子元素的宽度等于 1-12 个列的宽度。

用 float 实现网格布局。

html 复制代码
<div class="row">
  <div class="column-1"></div>
  <div class="column-1"></div>
  ...
</div>

<style>
  .row::after {
    clear: both;
    content: " ";
  }
  [class*="column-"] {
    float: left;
  }
  .column-1 {
    width: calc(100% / 12);
  }
</style>

3.3 浮动陷阱

当前面的元素高度大于后面的元素时,应该换行的元素不能正确换行,需要 clear:left 清除浮动。

相关推荐
程序员念姐2 分钟前
软件测试系统流程和常见面试题
测试工具·面试
zengyuhan50329 分钟前
Windows BLE 开发指南(Rust windows-rs)
前端·rust
Bro_cat29 分钟前
Java基础
java·开发语言·面试
醉方休32 分钟前
Webpack loader 的执行机制
前端·webpack·rust
前端老宋Running40 分钟前
一次从“卡顿地狱”到“丝般顺滑”的 React 搜索优化实战
前端·react.js·掘金日报
隔壁的大叔40 分钟前
如何自己构建一个Markdown增量渲染器
前端·javascript
用户44455436542643 分钟前
Android的自定义View
前端
WILLF43 分钟前
HTML iframe 标签
前端·javascript
枫,为落叶1 小时前
Axios使用教程(一)
前端
小章鱼学前端1 小时前
2025 年最新 Fabric.js 实战:一个完整可上线的图片选区标注组件(含全部源码).
前端·vue.js