📦 第三章:盒模型与背景

理解 CSS 盒模型,掌握背景和边框的高级用法

3.1 盒模型详解

CSS 盒模型由四部分组成:
1. Content - 内容区域,显示文本和图像
2. Padding - 内边距,内容与边框之间的空间
3. Border - 边框,围绕内容和内边距的边界
4. Margin - 外边距,元素与其他元素之间的空间
Margin
Border
Padding
Content

盒模型示例

盒模型示例
.box-model-demo {
    width: 300px;
    height: 200px;
    background: #3498db;
    border: 5px solid #2c3e50;
    padding: 20px;
    margin: 20px;
}

3.2 box-sizing: border-box

为什么 box-sizing: border-box 是现代开发的标配?

默认情况下,CSS 的 width 和 height 属性只包括内容区域的尺寸,不包括 padding 和 border。这意味着当你设置 width: 100px 时,实际的元素宽度会是 100px + padding + border,这会导致布局计算变得复杂。

box-sizing 对比

属性 content-box(默认) border-box
width 计算 仅内容区域 内容 + padding + border
布局计算 复杂,需要考虑 padding 和 border 简单,width 就是最终宽度
响应式设计 容易出错 更可靠
/* 全局设置 box-sizing: border-box */
*,
*::before,
*::after {
    box-sizing: border-box;
}

3.3 外边距折叠 (Margin Collapsing)

当两个垂直相邻的元素都有外边距时,它们的外边距会折叠成一个,取较大的值。

外边距折叠示例

.box1 {
    margin-bottom: 30px;
}

.box2 {
    margin-top: 20px;
}

/* 实际间距:30px(取较大值)*/

外边距折叠的解决方法

3.4 背景属性进阶

背景图片

.hero {
    background-image: url('hero.jpg');
    background-position: center;
    background-size: cover;
    background-repeat: no-repeat;
    height: 100vh;
}

background-size 的取值

多重背景

.multiple-backgrounds {
    background: 
        linear-gradient(rgba(0,0,0,0.5), rgba(0,0,0,0.5)),
        url('background.jpg') center/cover no-repeat;
}

渐变

/* 线性渐变 */
.linear-gradient {
    background: linear-gradient(to right, #3498db, #2ecc71);
}

/* 径向渐变 */
.radial-gradient {
    background: radial-gradient(circle, #3498db, #2ecc71);
}

/* 锥形渐变 */
.conic-gradient {
    background: conic-gradient(#3498db, #2ecc71, #3498db);
}

3.5 边框与阴影

圆角 (border-radius)

.rounded {
    border-radius: 8px;
}

.circle {
    border-radius: 50%;
}

.pill {
    border-radius: 50px;
}

.custom-rounded {
    border-radius: 10px 20px 30px 40px;
}

盒阴影 (box-shadow)

.card {
    box-shadow: 0 4px 6px rgba(0,0,0,0.1);
}

.card-hover {
    box-shadow: 0 10px 20px rgba(0,0,0,0.2);
    transition: box-shadow 0.3s ease;
}

.card-hover:hover {
    box-shadow: 0 15px 30px rgba(0,0,0,0.3);
}

.inner-shadow {
    box-shadow: inset 0 0 10px rgba(0,0,0,0.2);
}

轮廓 (outline) 与 偏移 (outline-offset)

.focused {
    outline: 2px solid #3498db;
    outline-offset: 4px;
}

动手练习

练习 1:盒模型实践

  1. 创建一个元素,设置 width: 200px, height: 100px
  2. 添加 padding: 20px, border: 5px solid #3498db
  3. 观察默认情况下的实际宽度
  4. 添加 box-sizing: border-box,观察变化

练习 2:背景效果

  1. 创建一个卡片元素
  2. 为卡片添加背景图片,设置合适的 background-size
  3. 添加渐变叠加层,使文字更清晰
  4. 为卡片添加圆角和盒阴影,增强立体感

练习 3:外边距折叠

  1. 创建两个垂直相邻的 div 元素
  2. 分别设置 margin-bottom: 30px 和 margin-top: 20px
  3. 使用浏览器开发者工具检查实际间距
  4. 尝试使用不同的方法解决外边距折叠