CSS盒子模型

### 一、盒子模型

#### 1、看透网页布局本质

网页布局过程:

1. 先准备好相关的网页元素,网页元素基本都是盒子Box

2. 利用CSS设置好样式,然后摆到相应的位置上

3. 往盒子里装内容

#### 2、盒子模型(Box Model)组成

盒子模型就是把HTML页面中的布局元素看作是一个矩形的盒子,也就是一个装内容的容器

CSS模型本质上就是一个盒子,封装周围的HTML元素,

它包括:边框、外边距、内边距、实际内容

| 组成 | 说明 |

| ------- | --- |

| border | 边框 |

| content | 内容 |

| padding | 内边距 |

| margin | 外边距 |

#### 3、边框(border)

border 属性:可以设置元素的边框

边框有三部分组成:边框宽度(粗细) 边框样式 边框颜色

```CSS

border: border-width || border-style || border-color ;

```

| 属性 | 作用 |

| ------------ | ------------ |

| border-width | 定义边框粗细,单位是px |

| border-style | 边框的样式 |

| border-color | 边框的颜色 |

##### 1、border-style:边框的样式

| 参数 | 作用 |

| ------ | ---- |

| none | 无边框 |

| solid | 实线边框 |

| dashed | 虚线边框 |

| dotted | 点线边框 |

```HTML

<head>

......

    <style>

        div {

        /* 盒子的宽和高 */

            width: 300px;

            height: 200px;

            /* 盒子边框的粗细 */

            border-width: 5px;

            /* 盒子边框的样式 */

            border-style: solid;

            /* 盒子边框的颜色 */

          border-color: pink;

        }

    </style>

</head>

<body>

    <div> 盒子 </div>

</body>

```

##### 2、边框的复合写法

```CSS

border : 1px solid red;

/* 没有顺序 */

```

以下写法和上方写法效果完全相同

```CSS

<head>

......

    <style>

        div {

            width: 300px;

            height: 200px;

            border: 5px solid pink;

        }

    </style>

</head>

<body>

    <div> 盒子 </div>

</body>

```

##### 3、边框分开写法

```HTML

<head>

......

    <style>

        div {

            width: 300px;

            height: 200px;

            border-top: 5px solid pink;

            border-bottom: 15px solid red;

            border-left: 10px dashed purple;

            border-right: 20px dotted orange;

      }

    </style>

</head>

<body>

    <div> 盒子 </div>

</body>

```

可以给 border 后面添加不同的方位,便可以实现四周边框不同样式

如果只想让一边不同,则可以利用 CSS的层叠性 :

先对盒子边框设置统一的样式,而后对特殊方位的边框进行另外的设置

```HTML

<head>

......

    <style>

        div {

            width: 300px;

            height: 200px;

            border: 5px solid pink;

            border-right: 10px dotted orange;

        }

    </style>

</head>

<body>

    <div> 盒子 </div>

</body>

```

##### 4、表格细线边框

border-collapse 属性控制浏览器绘制表格边框的方式,它控制相邻单元格的边框

```CSS

border-collapse : collapse ;

```

collapse单词是合并的意思

border-collapse : collapse ; 表示相邻的边框合并在一起

常用于HTML表格边框的合并

##### 5、边框会影响盒子的实际大小

盒子实际的大小为(左边框+左内边距+盒子设置的宽+右内边距+右边框) * (上边框+上内边距+盒子设置的高+下内边距+下边框)

所以,边框会额外增加盒子的实际大小,

因此:

1. 测量盒子的时候,不量边框

2. 如果测量的时候包含了边框,则需要 width/height 减去边框宽度

#### 4、内边距(padding)

padding 属性:用于设置内边距,即边框与内容之间的距离

| 属性 | 作用 |

| -------------- | ---- |

| padding-left | 左内边距 |

| padding-right | 右内边距 |

| padding-top | 上内边距 |

| padding-bottom | 下内边距 |

```HTML

<head>

......

    <style>

        div {

            width: 200px;

            height: 200px;

            background-color: pink;

            padding-left: 50px;

        }

    </style>

</head>

<body>

    <div>

        盒子的内容是content盒子的内容是content

        盒子的内容是content盒子的内容是content

    </div>

</body>

```

##### 1、padding复合属性

padding属性(简写属性)可以有1~4个值

| 个数 | 表达意思 |

| ----------------------------- | ------------------------------------- |

| padding : 5px ; | 1个值,代表上下左右都有5像素内边距 |

| padding : 5px 10px ; | 2个值,代表上下内边距是5px,左右内边距是10px |

| padding : 5px 10px 20px; | 3个值,代表上内边距是5px,左右是10px,下边距是20px |

| padding : 5px 10px 20px 30px; | 4个值,代表上是5px,右是10px,下是20px,左是30px,为顺时针 |

##### 2、padding会影响盒子的实际大小

盒子实际的大小为(左边框+左内边距+盒子设置的宽+右内边距+右边框) * (上边框+上内边距+盒子设置的高+下内边距+下边框)

如果盒子已经有了长度和宽度,此时在添加内边距,会撑大盒子

即,padding会额外增加盒子的实际大小,

所以,为了保证盒子和效果图一致,则让 width/height 减去多出来的内边距大小即可

##### 3、padding不会影响盒子的实际大小的情况

如果盒子本身就没有指定 width/height 则此时padding就不会撑开盒子的大小

这时,当前盒子的宽度为其父元素继承给它的宽度

当padding的无论多大都不会超过其父亲的宽度

##### 4、内边距典型应用

当盒子中字数不一样多时,可以使用padding来统一设置内边距,从而使文字之间的距离保持相等

#### 5、外边距(margin)

margin 属性:用于设置外边距,即控制盒子和盒子间的距离

| 属性 | 作用 |

| ------------- | ---- |

| margin-left | 左外边距 |

| margin-right | 右外边距 |

| margin-top | 上外边距 |

| margin-bottom | 下外边距 |

```HTML

<head>

......

    <style>

        div {

            width: 200px;

            height: 200px;

            background-color: pink;

        }

        .div1 {

            margin-bottom: 20px;

        }

        /* .div2 {

            margin-top: 20px;

        } */

    </style>

</head>

<body>

    <div class="div1"> 盒子1 </div>

    <div class="div2"> 盒子2 </div>

</body>

```

##### 1、margin复合属性

margin(简写属性)可以有1~4个值

| 个数 | 表达意思 |

| ---------------------------- | ------------------------------------- |

| margin : 5px ; | 1个值,代表上下左右都有5像素外边距 |

| margin : 5px 10px ; | 2个值,代表上下外边距是5px,左右外边距是10px |

| margin : 5px 10px 20px; | 3个值,代表上外边距是5px,左右是10px,下边距是20px |

| margin : 5px 10px 20px 30px; | 4个值,代表上是5px,右是10px,下是20px,左是30px,为顺时针 |

##### 2、外边距典型应用-使块级盒子水平居中

外边距可以让 块级盒子 水平居中

但是必须满足以下条件:

1. 盒子必须指定宽度( width )

2. 盒子左右的外边距设置为 auto

auto为自动的意思,会自动调整其外边距

```CSS

.header {

width: 960px;

margin: 0 auto;

}

```

常见的写法有:

1. margin-left : auto ; margin-right : auto ;

2. margin : auto ;

3. margin : 0 auto ;

```HTML

<head>

......

    <style>

        .hesder {

            width: 900px;

            height: 200px;

            background-color: pink;

            margin: 0 auto;

        }

    </style>

</head>

<body>

    <div class="hesder"></div>

</body>

```

##### 3、行内元素和行内块元素水平居中

需要给其父亲添加:text-align : center 即可

text-align 属性用于设置元素内文本内容的水平对齐方式

```HTML

<head>

......

    <style>

        .hesder {

            width: 900px;

            height: 200px;

            background-color: pink;

            margin: 0 auto;

            text-align: center;

        }

    </style>

</head>

<body>

    <div class="hesder">  

        <span> 文字 </span>

    </div>

</body>

```

##### 4、外边距合并

使用margin定义块元素的垂直外边距时,可能会出现外边距的合并

###### 1、相邻块元素垂直外边距的合并

```HTML

<head>

......

    <style>

        div {

            width: 200px;

            height: 200px;

            background-color: pink;

        }

        .div1 {

            margin-bottom: 100px;

        }

        .div2 {

            margin-top: 200px;

        }

    </style>

</head>

<body>

    <div class="div1"> 盒子1 </div>

    <div class="div2"> 盒子2 </div>

</body>

```

当上下相邻的2个块元素(兄弟关系)相遇时

如果上面的元素有下边距margin-bottom;下面的元素有上边距margin-top

则它们之间的垂直距离不是margin-bottom和margin-top之和

而是取2个值中的较大者

这样的现象称为相邻块元素垂直外边距的合并

解决方案:

1. 只给一个盒子添加margin值

###### 2、嵌套块元素垂直外边距的塌陷

```HTML

<head>

......

    <style>

        .father {

            width: 400px;

            height: 400px;

            background-color: purple;

            margin-top: 50px;

        }

        .son {

            width: 200px;

            height: 200px;

            background-color: pink;

            margin-top: 100px;

        }

    </style>

</head>

<body>

    <div class="father">

        <div class="son">  </div>

    </div>

</body>

```

当2个嵌套关系(父子关系)的块元素,父元素有上边距的同时子元素也有上边距

此时,父元素会塌陷较大的外边距值

解决方案:

1. 可以为父元素定义上边框

2. 可以为父元素定义上内边距

3. 可以为父元素添加 overflow : hidden

#### 6、清除内外边距

网页元素很多都带有默认的内外边距,而且不同的浏览器默认也不一致

因此我们在布局前,首先要清除一下网页元素的内外边距

```CSS

* {

padding: 0 ; /* 清除内边距 */

margin: 0 ; /* 清除外边距 */

}

```

这句话也是CSS代码的前几行

注意:

行内元素为了照顾兼容性,尽量只设置左右内外边距,不要设置上下内外边距

但是,当转换为块元素就可以了

### 二、CSS3新加盒子样式

#### 1、圆角边框

border-radius 属性用于设置元素的外边框圆角

```CSS

border-radius : length ;

```

radius 半径(圆的半径)原理:(椭)圆与边框交集形成圆角效果

使用:

1. 参数值可以为 数值 或 百分比 的形式

2. 如果是个正方形,想要设置一个圆,把数值修改为高度/宽度的一半即可:50%

```HTML

<head>

......

    <style>

        div {

            width: 100px;

            height: 100px;

            background-color: pink;          

            border-radius: 50px;

        }

    </style>

</head>

<body>

    <div></div>

</body>

```

3. 如果是个矩形,设置为高度的一半即可出现类似于跑道的形状

4. 该属性是一个简写属性,可以跟4个值,分别代表左上角、右上角、右下角、左下角

5. 分开写为:border-top-left-radius , border-top-right-radius , border-bottom-left-radius , border-bottom-right-radius

```HTML

<head>

......

    <style>

        div {

            width: 100px;

            height: 100px;

            background-color: pink;

            border-top-left-radius:20%;

            border-top-right-radius:40%;

            border-bottom-left-radius:60%;

            border-bottom-right-radius:80%;

        }

    </style>

</head>

<body>

    <div></div>

</body>

```

#### 2、盒子阴影

box-shadow 属性:为盒子添加阴影

```CSS

box-shadow : h-shadoe v-shadow blur spread color inset;

```

| 值 | 描述 |

| -------- | --------------- |

| h-shadoe | 必须,水平阴影的位置,允许负值 |

| v-shadow | 必须,垂直阴影的位置,允许负值 |

| blur | 模糊距离 |

| spread | 阴影的尺寸 |

| color | 阴影的颜色 |

| inset | 将外部阴影改为内部阴影 |

```HTML

<head>

......

    <style>

        div {

            width: 200px;

            height: 100px;

            background-color: pink;

            border-radius: 50px;

            box-shadow: 10px 10px 10px -4px black;

        }

    </style>

</head>

<body>

    <div></div>

</body>

```

注意:

1. 默认的是外阴影(outset),但是不可写,否则阴影无效

2. 盒子的阴影不占用空间,不会影响其他盒子排列

#### 3、文字阴影

text-shadow 属性:将阴影应用于文本

```CSS

text-shadow : h-shadoe v-shadow blur color;

```

| 值 | 描述 |

| -------- | --------------- |

| h-shadoe | 必须,水平阴影的位置,允许负值 |

| v-shadow | 必须,垂直阴影的位置,允许负值 |

| blur | 模糊距离 |

| color | 阴影的颜色 |

```HTML

<head>

......

    <style>

        div {

            font-size: 50px;

            color: pink;

            font-weight: 700;

        }

        div:hover {

            text-shadow:10px 10px 6px black            

        }

    </style>

</head>

<body>

    <div> 喜羊羊 </div>

</body>

```


CSS盒子模型
http://localhost:8090//archives/csshe-zi-mo-xing
作者
yangfengjie
发布于
2025年10月10日
许可协议