【前端(七)】CSS3 核心属性笔记:单位、背景、盒子模型与文本换行

文章目录

  • [1. CSS3 长度单位汇总](#1. CSS3 长度单位汇总)
    • [1.1 基础单位回顾](#1.1 基础单位回顾)
    • [1.2 视口单位:vw、vh、vmax、vmin](#1.2 视口单位:vw、vh、vmax、vmin)
    • [1.3 常见问题:vw / vh 的继承规则](#1.3 常见问题:vw / vh 的继承规则)
  • [2. 背景属性(Background)](#2. 背景属性(Background))
    • [2.1 基础属性回顾](#2.1 基础属性回顾)
    • [2.2 实践思考:一张大图做背景会遇到什么问题?](#2.2 实践思考:一张大图做背景会遇到什么问题?)
    • [2.3 背景图片的三个属性](#2.3 背景图片的三个属性)
      • [2.3.1 背景图片的起始点------background-origin](#2.3.1 背景图片的起始点——background-origin)
      • [2.3.2 背景裁剪区域(向外裁剪)------background-clip](#2.3.2 背景裁剪区域(向外裁剪)——background-clip)
      • [2.3.3 背景图片尺寸------background-size](#2.3.3 背景图片尺寸——background-size)
      • [2.3.4 属性的本质和区别](#2.3.4 属性的本质和区别)
    • [2.4 复合background](#2.4 复合background)
  • [3. 盒子模型相关属性](#3. 盒子模型相关属性)
    • [3.1 怪异盒模型------box-sizing](#3.1 怪异盒模型——box-sizing)
    • [3.2 调整盒子大小------resize](#3.2 调整盒子大小——resize)
    • [3.3 设置盒子阴影------box-shadow](#3.3 设置盒子阴影——box-shadow)
    • [3.4 设置不透明度------opacity](#3.4 设置不透明度——opacity)
    • [3.5 设置圆角------ border-radius](#3.5 设置圆角—— border-radius)
  • [4. 文本属性](#4. 文本属性)
    • 4.1文字阴影------text-shadow
    • [4.2 控制换行与空白------white-space](#4.2 控制换行与空白——white-space)
    • [4.3 溢出文本处理------text-overflow](#4.3 溢出文本处理——text-overflow)
  • [5. 补充小知识](#5. 补充小知识)
    • [5.1 CSS3 私有前缀](#5.1 CSS3 私有前缀)
    • [5.2 CSS 像素 px 与系统缩放的关系](#5.2 CSS 像素 px 与系统缩放的关系)

1. CSS3 长度单位汇总

回顾 :之前我们学习过 px、em、rem、%,并了解到 em、rem、% 继承的是计算后的数值,而非相对关系本身。
详细可参考【前端(三)】CSS 属性梳理:从字体文本到背景表格
本小节介绍新增:vw、vh、vmax、vmin。

1.1 基础单位回顾

单位 说明 实际运用场景
px CSS 逻辑像素,浏览器根据设备像素比DPR决定用几个物理像素显示 1 个 px。 最常用,适合固定尺寸。
em 相对当前元素 的 font-size。若用于 font-size 本身,则相对父元素的 font-size。 适合需要根据当前字号缩进的场景(如段落首行缩进 2em)。
rem 相对根元素(<html>)的 font-size。 移动端响应式常用,统一控制全局缩放比例。
% 相对父元素对应属性 的百分比。例如 width:50% 相对父元素内容区宽度; 注意:line-height:150% 相对当前元素的 font-size。 流式布局、自适应高度/宽度。

1.2 视口单位:vw、vh、vmax、vmin

单位 相对于 实际运用场景
vw 视口宽度的百分之多少 全屏宽度元素、大标题随视口缩放
vh 视口高度的百分之多少 全屏高度容器、弹窗居中
vmax max(视口宽, 视口高) 的 百分之多少 -
vmin min(视口宽, 视口高) 的 百分之多少 -

注意事项:

  • vw / vh 是长度单位,代表长度结果分别相对于视口的宽或者高,并不意味着它们只限于只是宽属性或者只是高属性。例如:vw可以用于width也可以用于height;font-size: 4vw 也可以让文字随视口宽度变化。
  • vw 在移动端更常用,因为移动端布局通常依赖视口宽度;PC 端使用 vw 可能导致超大屏幕下元素过度放大,通常结合 max-width 限制。
  • vmin和vmax可以了解,很少会使用。

1.3 常见问题:vw / vh 的继承规则

问题 : vw、vh 继承时是只继承数值还是保持相对关系?
答案 :无论是 em、rem、vw、vh 还是 %,所有相对单位被继承时,子元素得到的都是计算后的绝对数值(像素值),而不是原来的相对单位。

例如:父元素 width: 50vw; font-size: 2rem; 子元素获得的是计算出的实际像素值,而不是 50vw 这个相对单位。假设视口宽度为 1000px,根字体 16px,父元素的width就是500px,子元素得到的也是500px,而不是50vw;父元素的font-size为32px,子元素得到的也是32px,而不是2rem。


2. 背景属性(Background)

2.1 基础属性回顾

CSS 属性 功能 常用值
background-color 背景颜色 颜色值 / transparent (默认)
background-image 背景图片 url(...)
background-repeat 重复方式 repeat(默认)、no-repeat、repeat-x、repeat-y
background-size 图片尺寸 cover、contain、长度、百分比
background-position 图片位置 关键字(left top)、坐标值(10px 20px)
background 复合属性 可简写多个值

2.2 实践思考:一张大图做背景会遇到什么问题?

有一张如图所示的 1024×1024 的图片,想把它作为 333×444 盒子的背景,默认会怎样?如何控制?
初始代码如下

html 复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>背景实践</title>
    <style>
        div {
            width: 333px;
            height: 444px;
            padding: 10px;
            border: 10px dotted brown;
            background-color: pink;
            background-image: url(./小羊piano.jpeg);
        }
    </style>
</head>
<body>
    <div></div>
</body>
</html>


初始默认表现

  • 虚线边框区域也有背景图片 :background-clip 默认为 border-box → 背景图会被绘制到边框区域,包括虚线部分;同时 background-repeat 默认为 repeat → 图片在边框区域也会平铺,所以上下左右虚线都能看到图片碎片。
  • 图片只显示了左上角的一部分 :background-size 默认为 auto → 使用图片原始尺寸远大于盒子内容区;background-position 默认为 0% 0%(左上角)→ 只显示了图片的左上角区域。
  • 图片开始显示位置 :默认从 padding 区域左上角开始,background-origin默认为 padding-box

所以我们需要解决三个问题

问题 对应控制属性
① 虚线边框上也有图片 → 让边框干净 background-clip
② 图片只显示一部分 → 让完整图片适配盒子 background-size
③ 图片起始位置不对 → 调整显示起点 background-origin

2.3 背景图片的三个属性

2.3.1 背景图片的起始点------background-origin

  • padding-box默认):从 padding 区域左上角开始显示
  • border-box:从 border 区域左上角开始显示
  • content-box:从 content 区域左上角开始显示

2.3.2 背景裁剪区域(向外裁剪)------background-clip

  • border-box默认): 从 border 区域开始向外裁剪背景。
  • padding-box : 从 padding 区域开始向外裁剪背景。
  • content-box : 从 content 区域开始向外裁剪背景。

2.3.3 背景图片尺寸------background-size

  1. 用长度值指定背景图片大小,不允许负值。
  2. 用百分比指定背景图片大小,不允许负值。
  3. auto默认):背景图片的真实大小。
  4. contain : 将背景图片等比缩放,直到图片完整显示在容器内,可能留白。
  5. cover推荐):将背景图片等比缩放,直到完全覆盖容器,可能显示不完整。

如图所示是contain

如图所示是cover

2.3.4 属性的本质和区别

问题 1 :position的设置也影响图片的起始位置啊?和origin的区别是?到底谁决定位置?
答案:共同决定,origin 定原点,position 给偏移

  • background-origin 决定坐标原点的位置,即 (0,0) 这个点放在元素的哪个区域。
  • background-position 决定图片左上角相对于原点的偏移量

解释 :origin 不直接决定图片显示位置,它决定的是坐标原点。因为 position 默认是 0 0,所以图片左上角会正好落在原点上。

此时看起来像是 origin 决定了图片的起点。

但是,一旦你改了 position,图片就会相对于原点进行偏移,不再贴在 origin 区域的左上角。所以position和origin相关联,即position的参考系是谁提供的?是 origin 提供的。
示例:(此刻选中的蓝色区域是content,便于观察)

  • 如图是没有设置origin和position的默认情况,即padding-box和0 0。
  • 如图是设置了origin为conten-box,position仍为默认0 0 的情况。
  • 如图是设置了origin为conten-box,position为默认10px 10px 的情况。

    所以origin 定原点,position 给偏移,position的偏移是相对于原点来说的。

当又尝试no-repeat,随之而来的可能有如下疑惑
问题 2 :那不就是origin定义显示范围,position定义具体的显示位置,cilp不是也影响图片显示范围?
答案:问题本身答案已经呼之欲出了。origin改变的是位置,不会影响到图片是否显示范围的问题,只是no-repeat后通过调整位置,视觉看起来我们边框或者padding不显示图片;clip不会改变位置,而是把超出部分隐藏,从而限制了显示范围。

示例:(此刻选中的蓝色区域是content,便于观察)

  • 如图是设置了origin为conten-box的情况。
  • 如图是设置了clip为content-box的情况。

2.4 复合background

语法

css 复制代码
background: [color] [image] [repeat] [position] / [size] [origin] [clip];

关键规则:

  • size 必须紧跟在 position 后面,用 / 分隔。想写 size 就得有斜杠,斜杠前可以空(位置默认 0 0)但是不可以不写斜杠直接写数值会被认成position。
css 复制代码
/* ✅ 只写 size,位置使用默认值 (0% 0%) */
.box {
  background: url(bg.png) / cover no-repeat;
}

/* ✅ 同样效果,显式写位置 0 0 */
.box {
  background: url(bg.png) 0 0 / cover no-repeat;
}
/* ❌ 缺少斜杠:cover 会被当成 position,然后报错或忽略 */
.box {
  background: url(bg.png) cover no-repeat;
}
  • 没写的属性使用默认值。
  • 可以添加多背景设置相关属性(background-color 只能有一个,它属于最底层,推荐单独设置),用逗号分隔,第一个背景图在上层。

注意:可以分开写属性达到复合的多个背景图的效果,但是要么只用简写,要么只用分离属性,不要混用 。如果混用,把简写写在前面 ,分离属性写在后面(因为简写其余属性使用默认值,样式冲突后面的会覆盖前面的)。

css 复制代码
 /* 简写 */
.box {
  background: url(top.png) no-repeat top left / 50px,
              url(bottom.png) repeat-x bottom / auto,
              linear-gradient(red, blue);
}
/* 分离属性(等价) */
.box {
  background-image: url(top.png), url(bottom.png), linear-gradient(red, blue);
  background-repeat: no-repeat, repeat-x, no-repeat;   /* 第三层默认 repeat,这里显式写 */
  background-position: top left, bottom, 0% 0%;
  background-size: 50px, auto, auto;
}

3. 盒子模型相关属性

3.1 怪异盒模型------box-sizing

含义 宽度计算
content-box(默认) width 只设置内容区宽度 总宽度 = width + padding + border 每次加 padding / border,需要重新计算 width,否则盒子会变大。
border-box width 设置盒子总宽度 总宽度 = width(内含 padding 和 border) 加 padding / border 不会撑破父容器

实际开发中,很多项目会做全局重置,让所有元素使用 border-box,避免手动计算宽度溢出。

css 复制代码
* {
  box-sizing: border-box;
}

3.2 调整盒子大小------resize

效果
none 不可调整(默认)
both 可调宽高
horizontal 仅调宽
vertical 仅调高

实际运用场景: 文本输入框、自定义可拖拽面板。

重要限制:
resize 生效的前提是 overflow 不为 visible

原因:resize 改变元素尺寸 → 可能引发内容溢出 → 但 overflow:visible 对溢出内容的行为是"放任不管"。这两者放在一起,会让浏览器无法决定到底该怎么表现。这样会导致页面布局被破坏,内容乱飞。为了让 resize 行为可控、可预测,设计者规定:只有当 overflow 不是 visible 时,resize 才生效。

3.3 设置盒子阴影------box-shadow

语法:

css 复制代码
box-shadow: h-shadow v-shadow blur spread color inset;
参数 含义 负值 默认
h-shadow 必选,水平偏移(正→右,负→左) 0
v-shadow 必选,垂直偏移(正→下,负→上) 0
blur 可选,模糊半径(越大越模糊、越淡) 0
spread 可选,扩展半径(正→扩大,负→缩小) 0(与盒子同大)
color 可选,阴影颜色 - 黑色半透明(通常)
inset 可选,关键字:内阴影 - 无(默认外阴影)

注意:如果只写三个数值,就会按顺序识别对应参数,如果想设置外延值(扩展半径)可以用0来占位模糊半径。

核心特性:阴影不占布局空间,不影响盒模型。 其他盒子可以覆盖阴影,阴影不参与布局排列。

常见应用:

  • 外阴影:卡片悬浮效果
  • 内阴影:模拟边框压暗效果

加入 inset 后,各参数的行为变化

参数 外阴影(默认) 内阴影(inset)
h-shadow 正→阴影右移 正→阴影向右移动(但方向可能视觉上相反,因为阴影在内部)
v-shadow 正→阴影下移 正→阴影向下移动
blur 向外模糊 向内模糊(边缘向中心渐变)
spread 正→阴影向外扩大;负→阴影向内缩小 正→阴影向 扩大(更靠近中心);负→阴影向缩小(更靠近边缘)

所以可以理解inset 与负 spread 的区别:

inset 改变阴影的位置(内部 vs 外部)会影响内部显示;负外延只改变阴影的大小,依然在外部,影响的是外部显示,不会对内部显示有任何的影响。

3.4 设置不透明度------opacity

opacity 属性能为整个元素添加透明效果,值是 0 到 1 之间的小数, 0 是完全透明,1 表示完全不透明。

opacity 与 rgba 的区别

属性 作用范围 是否影响子元素
opacity 整个元素(包括所有子元素) 是(所有内容都透明)
rgba / hsla 仅当前颜色 否(只影响该颜色属性)

示例

css 复制代码
/* 整个盒子半透明,文字也半透明 */
.box { opacity: 0.5; }

/* 背景半透明,文字不透明 */
.box { background-color: rgba(0,0,0,0.5); }

3.5 设置圆角------ border-radius

常用实现 代码
四个角一样 border-radius: 10px;
圆形 border-radius: 50%;
椭圆 border-radius: 50% / 20%;

也可以设置四个角不同的值

  • 单独设置四个角:border-top-left-radius 等
  • 简写语法:border-radius: 左上 右上 右下 左下 / 左上y 右上y 右下y 左下y

4. 文本属性

4.1文字阴影------text-shadow

语法:

css 复制代码
text-shadow: h-shadow v-shadow blur color;
  • 与 box-shadow 相比:没有 spread、没有 inset,不能内阴影。
  • 可叠加多个阴影,用逗号分隔。

4.2 控制换行与空白------white-space

自动换行 合并空白 保留换行符 典型场景
normal ✅ 是 ✅ 是 ❌ 否 普通段落(默认)
nowrap ❌ 否 ✅ 是 ❌ 否 单行标题、导航栏
pre ❌ 否 ❌ 否 ✅ 是 代码块(需配合滚动)
pre-wrap ✅ 是 ❌ 否 ✅ 是 保留格式的长文本(聊天记录)
pre-line ✅ 是 ✅ 是* ✅ 是 诗歌、地址(保留换行,忽略多余空格)

*pre-line 的"合并空白"是指连续空格合并为一个,且忽略行首行尾空格。

示例

  • normal 文本超出边界自动换行,文本中的多个连续空格和换行被识别为一个空白(默认值)
  • nowrap 强制不换行,文本中多个连续空格和换行也被识别为一个空白。
  • pre 原样输出不会换行。会识别书写代码中的空白,会保留全部空白和换行。
  • pre-wrap 在 pre 效果的基础上,超出元素边界自动换行。同样会识别书写代码中的空白,会保留全部空白和换行。
  • pre-line在 pre 效果的基础上,超出元素边界自动换行,且只识别文本中的换行和空白,文本前后端的空格不识别,会忽略。

4.3 溢出文本处理------text-overflow

当文本内容超出块级容器的尺寸时,决定溢出部分如何显示

效果 说明
clip 直接裁剪溢出部分 默认值,无省略号,简单粗暴
ellipsis 显示省略号 ... 在溢出位置替换为 ... ,只是视觉上被替换成 ...,实际内容完整,复制粘贴仍能得到完整文本

⚠️ text-overflow 生效的前提条件

css 复制代码
/* 必须同时满足以下两点,text-overflow 才会生效 */
selector {
  width: 200px;               
  overflow: hidden;           /* 1. overflow 不是 visible(常用 hidden / auto / scroll) */
  white-space: nowrap;        /* 2. 强制文本在一行内显示 */
}
  1. 为什么必须是 white-space: nowrap?
    因为如果文本自动换行(normal),溢出的情况通常不会发生(会自动折行),text-overflow 也就没有机会触发。只有强制不换行,文本才会真正溢出盒子。
  2. 为什么必须设置overflow?
    我们要设置overflow为非visible值,这样我们就可以设置文本溢出的隐藏效果是全部裁掉还是替换成...不然visible就没有意义。原理同resize。

实际运用: 新闻标题列表、商品名称单行截断等,适合列表项。


5. 补充小知识

5.1 CSS3 私有前缀

知识点 核心结论
HTML5 兼容性 IE9+ 大部分支持,IE8 及以下需采取一些措施
CSS3 兼容性 CSS3 是模块化的,不同属性在不同浏览器上的兼容性各不相同

查询 CSS3 兼容性的网站:https://caniuse.com/

  • 历史原因 :当W3C标准提出某个CSS特性时,在被当前浏览器正式支持之前,会根据浏览器内核使用私有前缀来测试这个css特性,测试之后该浏览器支持了这个特性后,就不需要私有前缀了。即:浏览器在标准未定稿时,用私有前缀实验新特性。
  • 常见前缀
    • -webkit-:Chrome、Safari、Edge
    • -moz-:Firefox
  • 如今现代项目通常借助构建工具自动添加,无需手动记忆,并且常用的 CSS3 新特性,主流浏览器都是支持的。

5.2 CSS 像素 px 与系统缩放的关系

公式: 显示的物理像素数 = CSS 像素值 × DPR × 系统缩放 × 浏览器缩放。

  1. CSS 中声明的 px 数值本身不会改变 (例如 width:200px 始终是逻辑 200)。
  2. 系统缩放(如 Windows 显示设置 125%)会改变系统缩放改变的是"1个CSS逻辑像素对应多少个物理像素"的映射关系 ,从而产生视觉上的放大/缩小效果。但是 CSS 中声明的 px 数值本身不会改变,它始终是 200(逻辑像素)。

以上为个人学习总结,旨在梳理个人理解。如有疏漏或不当之处,欢迎指正与交流。

相关推荐
xiebingsuccess2 小时前
ThingsPanel IoT Platform 学习笔记
笔记·学习
雾岛听蓝2 小时前
Qt 输入与多元素控件详解
开发语言·经验分享·笔记·qt
踩着两条虫2 小时前
VTJ:技术架构概述
前端·架构·ai编程
超级无敌攻城狮2 小时前
Agent 到底是怎么跑起来的
前端·后端·架构
吴声子夜歌2 小时前
Vue3——过度和动画效果
前端·vue.js·es6
Via_Neo2 小时前
字符串类型的相互转换
前端
zopple3 小时前
前端三剑客 vs Vue.js:核心区别解析
前端·javascript·vue.js
hsjcjh3 小时前
窗口函数-详细讲解分析
java·服务器·前端
CDN3603 小时前
【踩坑实录】前端开发必看:一次由CSS缓存引发的线上事故与SEO反思
前端·css·缓存