深入理解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 清除浮动。

相关推荐
yngsqq5 分钟前
c#使用高版本8.0步骤
java·前端·c#
Myli_ing39 分钟前
考研倒计时-配色+1
前端·javascript·考研
余道各努力,千里自同风42 分钟前
前端 vue 如何区分开发环境
前端·javascript·vue.js
软件小伟1 小时前
Vue3+element-plus 实现中英文切换(Vue-i18n组件的使用)
前端·javascript·vue.js
醉の虾1 小时前
Vue3 使用v-for 渲染列表数据后更新
前端·javascript·vue.js
张小小大智慧1 小时前
TypeScript 的发展与基本语法
前端·javascript·typescript
hummhumm2 小时前
第 22 章 - Go语言 测试与基准测试
java·大数据·开发语言·前端·python·golang·log4j
asleep7012 小时前
第8章利用CSS制作导航菜单
前端·css
hummhumm2 小时前
第 28 章 - Go语言 Web 开发入门
java·开发语言·前端·python·sql·golang·前端框架
幼儿园的小霸王2 小时前
通过socket设置版本更新提示
前端·vue.js·webpack·typescript·前端框架·anti-design-vue