📏 第十章:现代单位与函数

掌握现代 CSS 单位和函数,实现更灵活的布局

10.1 视口单位

视口单位是相对于视口大小的单位,非常适合响应式设计。

传统视口单位

单位 描述 示例
vw 视口宽度的 1% width: 50vw;
vh 视口高度的 1% height: 100vh;
vmin 视口宽度和高度中较小值的 1% font-size: 5vmin;
vmax 视口宽度和高度中较大值的 1% font-size: 5vmax;

现代视口单位

解决移动端地址栏遮挡问题的新视口单位:

单位 描述 适用场景
svh 小视口高度(地址栏显示时) 始终使用最小高度
lvh 大视口高度(地址栏隐藏时) 始终使用最大高度
dvh 动态视口高度(根据地址栏状态调整) 大多数场景的最佳选择
.hero {
    height: 100dvh; /* 动态视口高度 */
    display: flex;
    align-items: center;
    justify-content: center;
}

10.2 逻辑属性

逻辑属性提供了与方向无关的样式设置,更好地支持 RTL(右至左)语言。

常用逻辑属性

传统属性 逻辑属性 描述
margin-left margin-inline-start 起始边距
margin-right margin-inline-end 结束边距
margin-top margin-block-start 上边距
margin-bottom margin-block-end 下边距
padding-left padding-inline-start 起始内边距
padding-right padding-inline-end 结束内边距
text-align: left text-align: start 文本起始对齐
text-align: right text-align: end 文本结束对齐
.card {
    margin-inline: auto; /* 水平居中 */
    padding-block: 20px; /* 垂直内边距 */
    padding-inline: 15px; /* 水平内边距 */
    text-align: start; /* 文本起始对齐 */
}

10.3 数学函数

CSS 数学函数让样式计算更加灵活,是实现流体排版和响应式设计的关键。

calc() 函数

执行数学计算,支持加减乘除运算。

.container {
    width: calc(100% - 40px); /* 100% 宽度减去 40px */
}

.sidebar {
    width: calc(30% - 20px);
}

.content {
    width: calc(70% - 20px);
}

min() 函数

返回多个值中的最小值。

.image {
    max-width: min(100%, 500px); /* 最大宽度为 100% 或 500px,取较小值 */
}

max() 函数

返回多个值中的最大值。

.font-size {
    font-size: max(16px, 4vw); /* 字体大小为 16px 或 4vw,取较大值 */
}

clamp() 函数

限制值在一个范围内,接受三个参数:最小值、首选值、最大值。

clamp() 流体排版示例

这是使用 clamp() 实现的流体排版,字体大小会根据视口大小自动调整。
.fluid-type {
    font-size: clamp(1rem, 2vw + 1rem, 2.5rem);
}

实战案例

流体排版

:root {
    --base-font-size: 16px;
}

h1 {
    font-size: clamp(2rem, 5vw + 1rem, 4rem);
}

h2 {
    font-size: clamp(1.5rem, 3vw + 0.5rem, 2.5rem);
}

p {
    font-size: clamp(1rem, 1vw + 0.5rem, 1.25rem);
}

响应式间距

.container {
    padding: clamp(1rem, 3vw, 2rem);
}

.card {
    margin-bottom: clamp(1rem, 2vw, 1.5rem);
}

居中布局

.centered {
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate(-50%, -50%);
}

.flex-centered {
    display: flex;
    align-items: center;
    justify-content: center;
    height: 100dvh;
}

动手练习

练习 1:视口单位

  1. 创建一个全屏英雄区域,使用 dvh 单位
  2. 为不同屏幕尺寸设置不同的字体大小,使用 vw 单位
  3. 测试在不同设备上的显示效果

练习 2:逻辑属性

  1. 创建一个支持 RTL 的布局
  2. 使用逻辑属性设置边距和内边距
  3. 测试 LTR 和 RTL 模式的显示效果

练习 3:数学函数

  1. 使用 calc() 创建一个两栏布局
  2. 使用 clamp() 实现流体排版
  3. 使用 min() 和 max() 限制元素大小