课七:CSS中的单位及应用

掌握相对单位、绝对单位、视口单位的特性与应用场景

一、CSS单位分类与基础概念

CSS单位用于定义长度、尺寸、间距等数值类属性,主要分为三大类:相对单位、绝对单位、视口单位。

1.1 核心概念

  • 相对单位:基于其他元素的尺寸或字体大小,具有灵活性,适用于响应式设计
  • 绝对单位:固定尺寸,不随其他元素变化,适用于需要精确控制的场景
  • 视口单位:基于浏览器视口(可见区域)尺寸,适用于响应式布局

1.2 常用CSS单位汇总

单位类型 单位符号 名称 核心特性
相对单位em相对长度单位相对于当前元素的字体大小
rem根相对长度单位相对于根元素(html)的字体大小
%百分比相对于父元素的对应属性值
绝对单位px像素屏幕物理像素点
in英寸1in = 2.54cm = 96px
cm厘米1cm = 37.8px
pt1pt = 1/72in,适用于印刷
视口单位vw视口宽度单位1vw = 视口宽度的1%
vh视口高度单位1vh = 视口高度的1%
vmin视口最小单位1vmin = vw和vh中的较小值
vmax视口最大单位1vmax = vw和vh中的较大值

二、相对单位详解

相对单位的数值会随参考基准变化,是响应式设计的核心,常用单位包括em、rem、%。

2.1 em单位

定义:相对于当前元素的字体大小,默认1em = 16px。

em单位示例
父元素:font-size = 16px
1em = 16px
1.5em = 24px
2em = 32px
父元素:font-size = 20px
1em = 20px
1.5em = 30px
2em = 40px
.parent1 { font-size: 16px; }
.parent2 { font-size: 20px; }
.text-1em { font-size: 1em; }
.text-1-5em { font-size: 1.5em; }
.text-2em { font-size: 2em; }
                        

2.2 rem单位

定义:相对于根元素(<html>)的字体大小,避免嵌套继承问题。

rem单位示例
根元素(html):font-size = 16px(默认)
父元素:font-size = 20px(不影响rem计算)
1rem = 16px
1.5rem = 24px
2rem = 32px
根元素(html):font-size = 20px(自定义)
父元素:font-size = 30px(不影响rem计算)
1rem = 20px
1.5rem = 30px
2rem = 40px
html { font-size: 16px; }
html.custom { font-size: 20px; }
.parent { font-size: 30px; } /* 不影响rem */
.text-1rem { font-size: 1rem; }
                        

2.3 %百分比单位

定义:相对于父元素的对应属性值。

百分比单位示例
父元素:width = 400px, height = 200px
子元素:width = 50%(200px), height = 80%(160px)
父元素:font-size = 20px
150% = 30px
80% = 16px
.parent-box { width: 400px; height: 200px; }
.child-box { width: 50%; height: 80%; }
.parent-text { font-size: 20px; }
.text-150 { font-size: 150%; } /* 30px */
                        
实训实例:使用相对单位实现响应式文本布局

实现步骤:

  1. 创建"relative-units.html"文件
  2. 设置根元素字体大小为16px(默认)
  3. 使用rem单位定义标题和正文文本大小
  4. 使用em单位定义内边距和间距
  5. 使用百分比单位定义容器宽度
  6. 改变根元素字体大小,观察所有相对单位的变化效果
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>相对单位响应式布局示例</title>
    <style>
        html { font-size: 16px; }
        @media (max-width: 768px) { html { font-size: 14px; } }
        .container {
            width: 80%;
            margin: 0 auto;
            padding: 2rem;
        }
        h1 { font-size: 2.5rem; margin-bottom: 1em; }
        p { font-size: 1rem; line-height: 1.8em; }
        .btn {
            display: inline-block;
            padding: 0.8em 1.5em;
            background: #3498db;
            color: white;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>相对单位示例</h1>
        <p>文本使用rem,间距使用em,容器宽度使用%。</p>
        <a href="#" class="btn">按钮</a>
    </div>
</body>
</html>
                    

三、绝对单位详解

绝对单位是固定的长度单位,常用单位包括px、in、cm、pt。

3.1 px(像素)单位

定义:屏幕物理像素点,最常用绝对单位。

px单位示例
固定尺寸:200px × 100px
font-size: 16px
font-size: 20px

3.2 其他绝对单位

其他绝对单位对比
单位示例等价px值应用场景
inwidth: 1in;96px印刷设计
cmwidth: 1cm;37.8px印刷设计
mmwidth: 10mm;37.8px高精度印刷
ptfont-size: 12pt;16px印刷排版
实训实例:使用绝对单位创建固定尺寸组件

实现步骤:

  1. 创建"absolute-units.html"文件
  2. 使用px单位创建固定尺寸卡片
  3. 使用pt单位定义印刷友好文本
<!DOCTYPE html>
<html>
<head>
    <style>
        .card {
            width: 300px;
            height: 400px;
            border: 1px solid #ddd;
        }
        .card-title { font-size: 18px; }
        .print-text { font-size: 12pt; }
    </style>
</head>
<body>
    <div class="card">固定尺寸卡片</div>
    <p class="print-text">印刷友好文本</p>
</body>
</html>
                    

四、视口单位详解

视口单位基于浏览器视口尺寸:1vw = 视口宽度的1%,1vh = 视口高度的1%。

4.1 视口单位特性

  • vw/vh:随窗口大小变化
  • vmin:取vw和vh中的较小值
  • vmax:取vw和vh中的较大值
视口单位示例
宽度:50vw,高度:30vh,内边距:2vw
20vmin正方形
.viewport-box1 {
    width: 50vw;
    height: 30vh;
    padding: 2vw;
}
.viewport-box2 {
    width: 20vmin;
    height: 20vmin;
}
                        
实训实例:使用视口单位创建全屏响应式banner

实现步骤:

  1. 创建"viewport-units.html"文件
  2. 使用vw/vh单位创建全屏banner
  3. 使用vmin单位创建响应式图标
<!DOCTYPE html>
<html>
<head>
    <style>
        .banner {
            width: 100vw;
            height: 80vh;
            background: linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5)), url('...');
            background-size: cover;
        }
        .banner-title { font-size: 5vw; }
    </style>
</head>
<body>
    <div class="banner">
        <h1 class="banner-title">全屏响应式banner</h1>
    </div>
</body>
</html>
                    

五、单位应用场景与最佳实践

5.1 不同单位的适用场景

单位类型推荐应用场景不推荐场景最佳实践
px边框宽度、固定尺寸元素响应式布局的宽高细节控制
em内边距、间距多层嵌套尺寸相对于当前字体大小
rem响应式字体、全局尺寸局部调整配合媒体查询调整根字体
%容器宽度、图片自适应字体大小比例关系
vw/vh全屏布局、banner小尺寸元素结合max-width限制

5.2 最佳实践原则

  • 根元素字体大小用px,全局尺寸用rem,局部间距用em,容器比例用%,全屏布局用vw/vh。
  • 优先使用相对单位和视口单位,提高响应式适配性。
  • 设置根元素font-size: 16px,便于rem计算。
  • 使用max-width、min-width等限制极端尺寸。
实训实例:多单位结合实现复杂响应式页面

实现步骤:

  1. 创建"multi-units.html"文件
  2. 综合运用rem、em、%、vw/vh、px设计响应式页面
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>多单位结合示例</title>
    <style>
        html { font-size: 16px; }
        @media (max-width: 768px) { html { font-size: 14px; } }
        .container { width: 90%; max-width: 1200px; margin: 0 auto; }
        .header { background: #2c3e50; color: white; padding: 1.5rem 0; }
        .nav { display: flex; gap: 2rem; }
        .banner {
            width: 100vw;
            height: 70vh;
            background: linear-gradient(rgba(0,0,0,0.6), rgba(0,0,0,0.6)), url('...');
            background-size: cover;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        .banner-title { font-size: 4vw; }
        .card {
            width: 100%;
            padding: 1.5rem;
            border: 1px solid #ddd;
            border-radius: 8px;
        }
        .card-img { width: 100%; height: 180px; object-fit: cover; }
        .card-title { font-size: 1.3rem; margin-bottom: 0.8em; }
        .footer { background: #2c3e50; color: white; padding: 2rem 0; }
    </style>
</head>
<body>
    <header class="header">
        <div class="container">
            <div class="logo">多单位示例</div>
            <nav class="nav">
                <a href="#">首页</a>
                <a href="#">产品</a>
                <a href="#">关于</a>
            </nav>
        </div>
    </header>
    <section class="banner">
        <h1 class="banner-title">多单位结合响应式设计</h1>
    </section>
    <section class="container">
        <div class="card">
            <img src="https://picsum.photos/400/300" class="card-img">
            <h3 class="card-title">产品卡片</h3>
        </div>
    </section>
    <footer class="footer">
        <div class="container">版权所有</div>
    </footer>
</body>
</html>
                    

六、综合实训任务:响应式企业官网首页

实训要求:综合运用CSS各种单位,创建完整的响应式企业官网首页,适配桌面、平板、手机。

实现要求:

  1. 包含头部导航、全屏banner、产品展示、服务介绍、关于我们、联系信息、页脚。
  2. 根字体用px(媒体查询调整),全局文本用rem,局部间距用em,容器宽度用%,banner用vw/vh,边框等用px。
<!-- 详细代码见实训任务完整示例(篇幅限制,此处为结构概览) -->
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <style>
        /* 响应式根字体 */
        html { font-size: 16px; }
        @media (max-width: 1199px) { html { font-size: 15px; } }
        @media (max-width: 991px) { html { font-size: 14px; } }
        @media (max-width: 767px) { html { font-size: 13px; } }
        /* 全局容器 */
        .container { width: 92%; max-width: 1200px; margin: 0 auto; }
        /* 导航、banner、卡片等使用rem、em、vw/vh、px混合 */
        .header { padding: 1rem 0; }
        .nav a { font-size: 1rem; padding: 0.5em 1em; }
        .banner { width: 100vw; height: 80vh; }
        .banner-title { font-size: 4vw; }
        .card { border: 1px solid #ddd; border-radius: 8px; padding: 1.5rem; }
        .card-title { font-size: 1.4rem; margin-bottom: 0.8em; }
        .card-img { width: 100%; height: 200px; }
        .footer { background: #2c3e50; color: white; padding: 2rem 0; }
    </style>
</head>
<body>
    <!-- 实际页面结构 -->
    <header>...</header>
    <section class="banner">...</section>
    <section class="product">...</section>
    <footer>...</footer>
</body>
</html>