# CSS 盒子模型

在学习盒子模型之前,我们先来思考一个问题?网页布局的本质是什么?

  • 我们所看到的网页本质上就是由一个个矩形框拼凑而成,矩形框里放置相关的图片,文字,视频等内容。
  • 我们可以简单的把网页中的这种矩形框结构称为盒子模型。接下来我们站在专业的角度,来了解下盒子模型。
  • 如下图所示:

image-20220706172732919

# 一、盒子模型简介

TIP

  • 所有 HTML 标签都可以看成矩形盒子,具有 (盒子模型) 结构。
  • 盒模型由 4 个部分组成,分别是: contentpaddingbordermargin
  • 盒模型有 5 个属性width 宽 、height 高 、border 边框 、padding 内边距 、margin 外边距

image-20211107135225669

我们可以用现实生活中的相框类比:

image-20211127162519192

注:

widthheight 不是盒子的总宽度

  • 在标准盒子模型下,盒子模型的 content 部分就是元素的 width 和 height 属性组成的矩形部分。

简单盒子模型

<style>
  .box {
    /* 宽度 200px */
    width: 200px;
    /* 高度 200px */
    height: 200px;
    /* 边框 快捷键 bd */
    border: 10px solid red;
    /* 内边距 上右下左 30px */
    padding: 30px;
    /* 外边距 上右下左 30px */
    margin: 30px;
  }
</style>
<body>
  <div class="box">我就是div盒子的内容</div>
</body>

image-20220714155941608

# 二、盒模型的属性

包含内容:

  • width、height 属性(宽、高),border 属性(边框)
  • padding 属性(内边框),padding 的不同数值写法
  • margin 属性(外边距),margin 的不同数值写法,margin 塌陷,margin 负值
  • 去掉元素默认值,盒子水平居中,盒子模型占位计算

# 1、width 和 height 属性 - 宽和高

属性 单位 描述
width px 、移动端开发 (百分比、rem 等单位) 盒子内容的宽度
height px、移动端开发(百分比、rem 等单位) 盒子内容的高度

# ① width 属性

TIP

块级元素(div、h 系列、li 系列)没有设置 width 属性时,它将自动撑满,但并不意味着 width 可以继承

<style>
  /* box1 不设置width宽度,由于div是块级元素,能够自动撑满 */
  .box1 {
    height: 100px;
    background-color: skyblue;
  }
  /* 如果不是块级元素,设置或不设置宽度,都无法撑满 */
  a {
    height: 100px;
    background-color: red;
  }
</style>

<body>
  <h2>width 属性</h2>
  <p>
    当块级元素(div、h系列、li系列 ...... 等)没有设置 width
    属性时,它将自动撑满 ,但并不意味着 width 可以继承
  </p>

  <div class="box1"></div>

  <p>如果不是块级元素,设置或不设置宽度,都无法撑满</p>
  <a href="#">我是超级链接a标签</a>
</body>

image-20220714162243022

# ② height 属性

TIP

  • 盒子的 height 属性如果不设置,它将自动被其内容撑开
  • 如果没有内容,则 height 默认是 0
<style>
  /* 
  box2 如果不设置 height高度,默认是0。且没内容时,页面则不显示
  如果有内容,能够被内容自动撑起来  
  */
  .box2 {
    width: 200px;
    background-color: yellow;
  }
</style>

<body>
  <h2>height 属性</h2>
  <p>
    box2 如果不设置
    height高度,默认是0。且没内容时,页面则不显示。如果有内容,能够被内容自动撑起来
  </p>

  <div class="box2">我是内容内容内容内容内容内容内容内容内容内容</div>
</body>

image-20220714162449769

# ③ 总结:width 和 height 的特性

块级元素

  • 当块级元素(如:div,p,li,h1-h6 ......)等没有设置 width 属性时,盒子的宽度会自动撑满他的父元素。但并不意味着 width 可以继承,width 是无法继承的。
  • 高度在没有设置时,其高度为内容高,如果内容为空,则高度为 0
  • 支持宽高属性的设置

内联元素

  • 内联元素(如:a,span,b,strong ......)的宽高是由其内容决定,如果内容为空,则宽高默认为 0
  • 内联元素设置宽高属性无效
<style>
  p {
    background-color: skyblue;
  }
  div {
    width: 400px;
    height: 50px;
    background-color: tomato;
  }
  span {
    width: 400px; /*不生效*/
    height: 50px; /*不生效*/
    background-color: yellow;
  }
</style>
<body>
  <p>p标签为块级元素,独占一行,默认宽度同父元素宽一样(内容宽)</p>
  <div>div是块级元素,我独占一行,同时支持宽高设置</div>
  <span>span元素,我是内联元素,我的宽高由内容决定,不支持宽高属性</span>
</body>

image-20220713111853172

# 2、border 属性 - 边框

border 属性的三要素

/* 
    1px 线宽度
    solid 线型
    red 线颜色
*/
border: 1px solid red;
常见线型值 描述
solid 实线
dashed 虚线
dotted 点状线
double 双边框
groove 定义 3D 凹槽边框。效果取决于 border-color 值
ridge 定义 3D 垄状边框。效果取决于 border-color 值
inset 3D inset 边框。其效果取决于 border-color 的值。
outset 3D outset 边框。其效果取决于 border-color 的值。
none 无边框
hidden 隐藏边框

image-20211130222312600

# ① 边框的三要素小属性

小属性 描述
border-width 线宽
border-style 线型
border-color 线颜色

注:

小属性是为了层叠大属性用的

<style>
  div {
    width: 50px;
    height: 50px;
    /* 2px 实线 灰色边框 */
    border: 2px solid #666;
  }
  .box {
    /* 单独定义边框颜色为红色 */
    border-color: red;
  }
</style>
<body>
  <div>1</div>
  <div class="box">2</div>
  <div>3</div>
</body>

image-20220706182731237

# ② 四个方向的边框

属性 描述
border-top 上边框
border-right 右边框
border-bottom 下边框
border-left 左边框
border-left: 1px solid red;
...

使用方法

<style>
  div {
    width: 100px;
    height: 100px;
    /* 上边框 */
    border-top: 5px solid red;
    /* 右边框 */
    border-right: 6px double blue;
    /* 下边框 */
    border-bottom: 6px dotted orange;
    /* 左边框 */
    border-left: 5px dashed skyblue;
  }
</style>
<body>
  <div></div>
</body>

image-20220706183436149

单独去掉某一边框线 border-top、border-bottom、border-right、border-left 的属性值设为 none

/* 去掉上边框线 */
border-top: none;
....

# ③ 四个方向的边框的三要素小属性

属性 描述
border-top-width 上边框宽度
border-top-style 上边框线型
border-top-color 上边框颜色
border-right-width 右边框宽度
border-right-style 右边框线型
border-right-color 右边框颜色
border-bottom-width 下边框宽度
border-bottom-style 下边框线型
border-bottom-color 下边框颜色
border-left-width 左边框宽度
border-left-style 左边框线型
border-left-color 左边框颜色
<style>
  div {
    width: 120px;
    height: 120px;
    border: 5px solid skyblue;
    float: left;
    margin: 10px;
  }

  /* 需要单独设置某个值是:使用小属性覆盖大属性 */
  .box {
    border-top-color: red;
    border-left-style: dashed;
    border-bottom-width: 10px;
  }
</style>

<body>
  <div></div>
  <div class="box"></div>
  <div></div>
</body>

image-20211130224238678

# ④ 去掉边框

border-left: none; 即:去掉左边框

/* 去掉右边框 */
border-right: none;

# ⑤ 边框应用场景 - 制作三角形

image-20211130225304565

<style>
  .box1 {
    width: 0;
    height: 0;
    /* transparent 是透明色 */
    border: 30px solid transparent;
    border-top-color: red;
  }

  .box2 {
    width: 0;
    height: 0;
    /* transparent 是透明色 */
    border: 30px solid transparent;
    border-right-color: red;
  }

  .box3 {
    width: 0;
    height: 0;
    /* transparent 是透明色 */
    border: 30px solid transparent;
    border-bottom-color: red;
  }

  .box4 {
    width: 0;
    height: 0;
    /* transparent 是透明色 */
    border: 30px solid transparent;
    border-left-color: red;
  }
</style>
<body>
  <div class="box1"></div>
  <div class="box2"></div>
  <div class="box3"></div>
  <div class="box4"></div>
</body>

# ⑥ 圆角 border-radius 属性

  • border-radius 属性的值通常为 px单位 ,表示圆角的半径
border-radius: 10px;

image-20211130232532181

<style>
  div {
    width: 100px;
    height: 100px;
    border: 1px solid #000;
    margin: 20px;
    float: left;
  }

  .box1 {
    border-radius: 10px;
  }

  .box2 {
    border-radius: 20px;
  }

  .box3 {
    /* 圆,正方形宽度的50% */
    border-radius: 50%;
  }

  .box4 {
    /* 圆:直接给数值,正方形宽度的一半即:圆的半径 */
    border-radius: 50px;
  }
</style>

<body>
  <div class="box1"></div>
  <div class="box2"></div>
  <div class="box3"></div>
  <div class="box4"></div>
</body>

单独设置四个圆角

/* 分别代表:上 右 下 左 四个值 */
border-radius: 10px 20px 30px 40px;

小属性

属性 描述
border-top-left-radius 左上角
border-top-right-radius 右上角
border-bottom-left-radius 左下角
border-bottom-right-radius 右下角
<style>
  .box {
    border-radius: 30px;
    /* 右下角 */
    border-bottom-right-radius: 0;
  }
</style>

<body>
  <div class="box"></div>
</body>

image-20211130233613322

以百分比为单位

  • border-radius 属性的值也可以用百分比做单位,表示圆角起始于每条边的哪里
  • 正方形盒子 设置border-radius: 50%; 为正圆形
  • 长方形盒子 设置 border-radius: 50%; 为椭圆形,不能用 px 为单位

# 3、padding 属性 - 内边距

TIP

  • padding 是盒子的内边距,即边框内壁到内容之间的距离
  • padding 有四个方向,可以分别设置
属性 描述
padding-top 上内边距
padding-right 右内边距
padding-bottom 下内边距
padding-left 左内边距
<style>
  .box1 {
    width: 200px;
    height: 100px;
    background-color: skyblue;
    /* 上内边距 */
    padding-top: 10px;
    /* 右内边距 */
    padding-right: 20px;
    /* 下内边距 */
    padding-bottom: 30px;
    /* 左内边距 */
    padding-left: 40px;
  }
</style>

<body>
  <div class="box1">
    内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容内容
  </div>
</body>

image-20220714164731669

# 4、padding 的不同数值写法

TIP

从不同数值写法中找规律,总结快速记忆的方法

# ① padding 的四数值写法

TIP

  • padding 属性如果用四个数值以空格隔开进行设置
  • 分别表示 (上、右、下、左)的 padding
  • padding: 上 右 下 左;
padding: 10px 20px 30px 40px;

快速记忆:

  • 按照顺时针方向:上右下左 即可

# ② padding 的三数值写法

TIP

  • padding 属性如果用三个数值以空格隔开进行设置
  • 分别表示 (上、左右,下)的 padding(内边距)
  • padding: 上 左右 下;
padding: 10px 20px 30px;

快速记忆:

  • 还是上右下左,左没有,就跟右一样,即:上 左右 下

# ③ padding 的二数值写法

TIP

  • padding 属性如果二个数值以空格隔开进行设置
  • 分别表示 (上下、左右)的 padding(内边距)
  • padding: 上下 左右;
padding: 10px 20px;

快速记忆:

  • 还是上右下左,下没有,就跟上一样,左没有,就跟右一样
  • 即:上下,左右

# ④ padding 的一数值写法

/* 上右下左内边距都是10px */
padding: 10px;

# ⑤ padding 属性应用场景

如果需要设置父子间间距,即给父元素添加内边距来实现

# ⑥ 快速灵活设置 padding 属性

/* padding: 上下30px 左右为0 */
padding: 30px 0;

/* padding: 上30px 左右10px 下20px */
padding: 30px 10px 20px;

/* padding: 上30px 左右10px 下0 */
padding: 30px 10px 0;

/* 
	小属性层叠大属性
	padding: 上右下左为40px
	padding-bottom: 下为0
	或 padding: 40px 40px 40px 0; 

	更推荐(小属性层叠大属性)写法
*/
padding: 40px;
padding-bottom: 0;

padding 大小属性的最佳实践:

  • 小属性 padding-top/padding-right/padding-bottom/padding-left 用来层叠大属性 padding 来组合使用
  • 更推荐(小属性层叠大属性)写法
<style>
  .box {
    width: 50px;
    border: 1px solid red;
    /* 四个方向内边距都为10px */
    padding: 10px;
  }
  .box1 {
    /* 单独控制下内边距为0 */
    padding-bottom: 0;
  }
</style>
<body>
  <div class="box">文字内容文字</div>
  <div class="box">文字内容文字</div>
  <div class="box box1">文字内容文字</div>
</body>

image-20220706201354790

# 5、margin 属性 - 外边距

TIP

  • margin 是盒子的外边距
  • 即:盒子和其他盒子之间的距离

image-20211127181550704

# margin 有四个方向

属性 描述
margin-top 上外边距
margin-right 右外边距
margin-bottom 下外边距
margin-left 左外边距
<style>
  .box {
    width: 50px;
    height: 50px;
    background-color: skyblue;
  }
  .box1 {
    /* 上外边距 20px */
    margin-top: 20px;
    /* 左外边距 50px */
    margin-left: 50px;
    /* 下外边距 30px */
    margin-bottom: 30px;
  }
</style>
<body>
  <div class="box box1">box1</div>
  <div class="box box2">box2</div>
</body>

image-20220714224436271

# 6、margin 的不同数值写法

TIP

与 padding 的数值写法类同

# ① margin 的四数值写法

TIP

  • margin 属性如果用四个数值以空格隔开进行设置
  • 分别表示 (上、右、下、左)的 margin(外边距)
  • margin: 上 右 下 左;
margin: 10px 20px 30px 40px;

快速记忆:

  • 按照顺时针方向:上右下左 即可

# ② margin 的三数值写法

TIP

  • margin 属性如果用三个数值以空格隔开进行设置
  • 分别表示 (上、左右,下)的 margin(外边距)
  • margin: 上 左右 下;
margin: 10px 20px 30px;

快速记忆:

  • 还是上右下左,左没有,就跟右一样,即:上 左右 下

# ③ margin 的二数值写法

TIP

  • margin 属性如果二个数值以空格隔开进行设置
  • 分别表示 (上下、左右)的 margin(外边距)
  • margin: 上下 左右;
margin: 10px 20px;

快速记忆:

  • 还是上右下左,下没有,就跟上一样,左没有,就跟右一样
  • 即:上下,左右

# ④ margin 的一数值写法

/* 上右下左外边距都是10px */
margin: 10px;

# 7、margin 的塌陷

TIP

margin 塌陷也叫:外间距重叠 或 外边距合并 或 外边距穿透

# ① 兄弟元素之间 ,垂直方向:上下外边距出现塌陷

TIP

  • 垂直方向的 margin 有塌陷现象,第一个元素的下外边距与第二个元素的上外边距会发生合并
  • 小的 margin 会塌陷到大的 margin 中,从而 margin 不叠加,只以大值为准
  • 以下两盒子之间间距为 100px ,垂直方向的 margin 不叠加,以大数为准

image-20211127211251169

<style>
  .box {
    width: 200px;
    height: 100px;
  }
  .box1 {
    background-color: skyblue;
    /*下外边距 100px */
    margin-bottom: 100px;
  }
  .box2 {
    background-color: gold;
    /* 上外边距 50px */
    margin-top: 50px;
  }
</style>
<body>
  <div class="box box1"></div>
  <div class="box box2"></div>
</body>

解决办法:

  • 任何一个元素加上 display:inline-block;
  • 把外边距只加在其中一个元素上
  • 任意一个元素外边距换成对应的 padding

# ② margin 在水平方向:不会塌陷

TIP

  • margin 在水平方向 不会塌陷
  • margin 在垂直方向 出现塌陷
<style>
  span {
    border: 1px solid red;
  }

  /* 
    margin在水平方向不会塌陷
    span标签之间的距离为: 两者之和 80px 
  */
  .span1 {
    margin-right: 30px;
  }
  .span2 {
    margin-left: 50px;
  }

  /* 
    margin在竖直方向出现塌陷
    box1,box2 两盒子之间间距为 100px
    竖直方向的margin不叠加,以大数为准 
  */
  .box1 {
    width: 200px;
    height: 100px;
    background-color: skyblue;
    margin-bottom: 100px;
  }

  .box2 {
    width: 200px;
    height: 100px;
    background-color: gold;
    margin-top: 50px;
  }
</style>

<body>
  <h1>margin 属性</h1>

  <h2>margin在水平方向:不会塌陷</h2>
  <span class="span1">我是span标签</span><span class="span2">我是span标签</span>

  <h2>margin在垂直方向:出现塌陷</h2>
  <div class="box1"></div>
  <div class="box2"></div>
</body>

image-20220714220940463

# ③ 父子元素之间,垂直方向:上外边距塌陷

TIP

当一个元素包含在另一个元素中时,如果父元素没有设置内边距或边框把外边距分隔开,它们的上外边距也会发生塌陷(合并)

<style>
  .box {
    width: 100px;
    height: 100px;
    background-color: gold;
    /* 父元素的上外边距 */
    margin-top: 20px;
  }
  .item {
    width: 50px;
    height: 50px;
    background-color: skyblue;
    /* 子元素的上外边距,此时父子元素的上边距发生塌陷(合并),最终上外边距的结果为 50px */
    margin-top: 50px;
  }
</style>
<body>
  <div class="box">
    <div class="item"></div>
  </div>
</body>

TIP

.itemmargin-top:50px; 发生了穿透现象(塌陷)

  • 穿透了父元素,并与父元素上外边距发生合并,合并后以最大的值为主。
  • 所以看到的间距并不 .item.box 的间距,而是 .box 与浏览器上面产生了 50px 的间距

image-20220714222036503

解决方案

  • 元素加上 overflow: hidden;
  • 元素添加 border 边框
  • 元素的 margin 改成 padding
  • 可以给父元添加对应的子元大小的 padding 值

还有更多方法,等我们后面学完浮动,定位之后再来讲解。

# 8、margin 负值

关于 margin 负值问题,我们留在 float 浮动 讲完后再学习

# 9、去掉元素的默认样式

TIP

网页中的元素为了展示元素本身的用途和结构,都会给元素添加默认的样式。

  • 一些元素都有默认的 margin,如下常见的默认样式
    • h、body、ul、p 标签,都添加了默认的 margin。
    • ul 添加了默认的 padding、list-style
    • a 标签添中了默认的颜色、下划线
    • 等等 ...... (后续在项目开发中还会深入所有标签的默认样式)
  • 我们在实际的网页开发中,要将这些默认的样式清除掉,也称之为 "CSS 样式的初始化"
  • * 通配符选择器,表示选择所有元素 (通配符有效率问题,实际工作中不使用)
/* 通配符选择器,表示选择所有元素 */
* {
  margin: 0;
  padding: 0;
}

/* 通配符有效率问题,应该使用并集选择器 */
body,
ul,
p {
  margin: 0;
  padding: 0;
}

a {
  /* 去掉下划线 */
  text-decoration: none;
  /* 颜色为黑色 */
  color: #000;
}

ul {
  /* 去掉圆点 */
  list-style: none;
}

# 10、盒子的水平居中

TIP

将盒子的左右两边的 margin 都设置为 auto ,盒子将水平居中。共有两种方法:

/* 方式一, margin: 上下0 ,左右自动 */
.box {
  margin: 0 auto;
}
/* 
	方式二,margin: 上10px 水平居中 下0px 
	第二种方法的应用场景在于,需要当前盒子距离顶部 10px, 水平居中对齐,距离底部0px 类似这样的需求时使用
*/
.box {
  margin: 10px auto 0;
}

盒子的垂直居中,需要使用绝对定位技术实现 (后边会讲到)

<style>
  section {
    width: 300px;
    height: 200px;
    background-color: salmon;
    /* 盒子水平居中 */
    /* margin: 0 auto; */
    /* margin: 上150px 水平居中对齐 下0px */
    margin: 150px auto 0;
    /* 文本内容水平居中 */
    text-align: center;
    /* 文本内容垂直居中 */
    line-height: 200px;
  }
</style>

<body>
  <section>我是文档区域标签</section>
</body>

image-20220714235749577

注:

  • margin: auto 20px; 这样写,并不会垂直居中
  • 文字水平、图片水平居中:text-align: center;
  • div 块级元素水平居中,是给元素自身加上margin: 0 auto;

# 11、盒子模型占位计算

TIP

盒模型的内容区大小,可视宽高,盒模型实际占位宽度

# ① 盒模型的内容区大小

在标准盒子模型中

content 内容区,也就是盒子里面能留给子元素的宽度和高度大小,也就意味着盒子里面的内容的最大面积就是 width 和 height 形成的矩形面积。

  • 如果只有一个子元素,子元素的宽度超过父元素,就会溢出
  • 如果有多个子元素,子元素(行内元素,行内块元素)的宽度加起来超过了父元素,那么超过的那些子元就会换行显示
<style>
  div {
    /* 盒模型内容区大小 */
    width: 200px;
    height: 200px;
    background-color: gold;
    /* 边框 */
    border: 20px solid skyblue;
    /* 内边距 */
    padding: 50px;
    /* 外边距 */
    margin: 30px;
  }
</style>
<body>
  <div class="box">
    内容区,内容区内容区,内容区内容区,内容区内容区,内容区
  </div>
</body>

image-20220715023749843

# ② 盒模型可视宽高

TIP

  • 可视区宽 = 宽度 + 左右内边距 + 左右边框宽
  • 可视区高 = 高度 + 上下内边距 + 上下边框宽

# ③ 盒模型实际占位宽度

TIP

  • 实际占位宽 = 宽度 + 左右内边距 + 左右边框宽 + 左右外边距
  • 实际占位高 = 高度 + 上下内边距 + 上下边框宽 + 上下外边距
<style>
  .box {
    /* 内容区宽 */
    width: 100px;
    /* 内容区高 */
    height: 150px;
    /* 边框线 */
    border: 2px dashed #333;
    /* 内边距 */
    padding: 10px;
  }
  .box1 {
    /* 内容区宽 */
    width: 70px;
    /* 内容区高 */
    height: 120px;
    /* 边框线 */
    border: 5px solid skyblue;
    /* 内边距 */
    padding: 10px;
    /* 背景色 */
    background-color: gold;
  }
</style>
<body>
  <div class="box">
    <div class="box1"></div>
  </div>
</body>

image-20220715030129395

如果 box1 计算得到的占位宽超过了你元素的内容区宽,就会达不到我们相要的布局效果

提示:

  • 盒模型的内容区大小:决定了父元中的子元素能占据的最大的宽和高度
  • 可视区占位:我们看到的这个元素在页面层现的效果的区域
  • 实际占位宽度:决定了这个元素在父元素中的占据面积(宽和高)

# 三、box-sizing 怪异盒模型

TIP

在 CSS3 中新增了怪异盒子模型(IE 盒子模型)

# 1、box-sizing 是什么 ?

TIP

  • 将盒子添加 box-sizing: border-box;属性, 盒子的 width、height 数字就表示盒子实际占有的宽度 (不含 margin)
  • 即 padding、border 变为 内缩 的,不再 外扩
  • box-sizing 属性 大量应用于移动网页制作中 ,因为它结合百分比布局、弹性布局等非常好用,在 PC 页面开发中使用较少
  • box-sizing 属性兼容到 IE9
<style>
  .box {
    width: 200px;
    height: 200px;
    border: 10px solid skyblue;
    padding: 10px;
    margin: 100px auto;
    /* 
        添加 box-sizing 之前,box是外扩的,总宽度=240px
        添加 box-sizing 之后,变成内缩,总宽度=200px */
    box-sizing: border-box;
  }
</style>

<body>
  <div class="box"></div>
</body>

添加 box-sizing: border-box; 之前

image-20211128000749414

添加 box-sizing: border-box; 之后

image-20211128000824590

# 2、为什么 div 和 button 按钮的大小有差别 ?

<style>
  .box1 {
    width: 100px;
    height: 30px;
    background-color: skyblue;
    padding: 10px;
    border: 5px solid gold;
  }

  button {
    width: 100px;
    height: 30px;
    background-color: skyblue;
    padding: 10px;
    border: 5px solid gold;
  }
</style>

<body>
  <div class="box1"></div>
  <button></button>
</body>

同样的代码,在 Google 浏览中为什么显示却有差异

image-20211128002708428

原因:

  • button 按钮默认是 怪异盒模型
  • 即:自带box-sizing: box-border;属性
  • button 是 内缩 的 ,div 是 外扩

# 3、盒模型分为两种类型

标准盒模型

  • box-sizing: content-box; 盒子的大小会因为设置的内外边距和边框而变化
  • 即:外扩

image-20211128003805440

怪异盒模型

  • box-sizing: box-border;盒子会的实际大小是设置的大小,不会因为内外边距和边框的大小而变化,
  • 即:内缩

image-20211128003936738

# 4、标准盒模型与怪异盒模型区别

区别

标准盒模型IE 盒模型的区别在于设置 widthheight 属性时,所对应的范围不同:

  • 标准盒模型的 width 和 height 属性的范围只包含了 content 内容区
  • IE 盒模型(怪异盒模型)的 width 和 height 属性的范围包含了 border、padding 和 content
  • 尺寸计算公式:
    • width = border + padding + 内容的宽度
    • height = border + padding + 内容的高度
  • button 标签,是典型的怪异盒模型

# 5、盒模型转换

TIP

我们通过 box-sizing 属性来切换标准盒子模型与怪异盒子模型

  • box-sizing:content-box 是默认值,盒子以标准盒子模型特性来渲染
  • box-sizing: border-box 盒子以怪异盒子模型特性来渲染
<style>
  .box {
    width: 100px;
    height: 150px;
    padding: 20px;
    border: 10px;
    margin: 50px;
    /*box-sizing:borde-box;*/
  }
</style>
<body>
  <div class="box"></div>
</body>

以上代码,在两种盒子模型下渲染的效果如下

标准盒子模型 怪异盒子模型(box-sizing:borde-box;)
16549198837318-16549216262352 16549204799174
标准盒模型下的width:100px; height:150px;
只包含了 content 部分,所以 content 的宽高为 100px 和 150px;
怪异盒子模型:width:100px; height:150px;
包含了 border、padding、content 三部分,则通过计算得出 content 内容区的
高为:150px - 20px*2 - 10px*2 = 90px
宽为:100px - 20px*2 - 10px*2 = 40px

应用场景:

  • 如果我们期望不管内容区边框内边距大小如何变化,元素的可视宽高始终不变时,就可以给元素添加 box-sizing:border-box;属性,以怪异盒模型来渲染。
  • 不管元素的占位宽如何变化,始终保持边框和内边距不变,希望通过改变内容区大小来达到目的。
  • 常见的响应式开发中、栅格系统等。

# 四、前端切图工具

TIP

接下来我们会用 4 种相关 psd 设计稿或图片测量和切图工具,不同的工具有不同的优点

软件名称 功能 描述 官网下载地址
Snipaste 截图+贴图 个人模仿他人效果选可用 https://zh.snipaste.com/ (opens new window)
PxCook 标注+代码生成(psd) 是一款连接设计师到开发者之间的协作工具 https://www.fancynode.com.cn/pxcook/ (opens new window)
Photoshop(简称 PS) 专业的图片软件处理工具 实际企业开发设计软件 https://www.adobe.com/cn/products/photoshop.html (opens new window)
蓝湖 产品设计协作平台 实际企业团队开发协作 https://lanhuapp.com/ (opens new window)

# 1、Photoshop 设计软件

TIP

Photoshop 软件是付费版的,有版权,如果大家破解版,可以去助理老师哪获取。

安装教程

  • 获取到软件压缩包后,解压(联系助理老师获取即可)。
  • 一定要断网安装 ,断网后,直接点击 Set-up.exe 就可以进入安装,安装过程不需要做任何操作,等待 5-10 分钟左右就自动安装好。
  • 安装好后,在电脑左下解的image-20220713192107246这里找到image-20220713192225541,双击就可以运行了。
  • ps 软件打开后,把对应的 psd 设计稿拖动到软件区域就可以了。

# 2、PxCook 像素大厨

TIP

PxCook(像素大厨) 是一款连接设计师到开发者之间的协作工具。

  • 使用 PxCook,设计师可以免去繁琐的标注功能,而前端工程师也可以更加直观的查看设计稿中的元素的内容,间距,尺寸和样式等。
  • 同时, PxCook 可以为工程师直接呈现选中元素的多平台样式代码和素材切图。

# ① 工具的安装

进入 PxCook 像素大厨的官网

网址:https://www.fancynode.com.cn/pxcook/ (opens new window),点击立即下载

image-20220713191311338

下载好的压缩包直接双击安装就可以了

# ② 工具的使用

官方教程

地址:https://www.fancynode.com.cn/pxcook/docs?ids=qa/pay (opens new window)

  • (1)如何新建项目
  • (2)代码生成
  • (3)自动标注
  • (4)智能标注
  • (5)单位换算

# 3、PS 与 PxCook 配合

切图的标记与尺寸制定

  • 设计师用 PS 设计稿设计好 PSD 的效果图后,接下来的工作就是交给程序员来开发成网页。
  • 首先程序员需要把 PSD 设计稿按开发的需求来标记切图,导出需要的图片素材

# ① 标记切图

TIP

  • 在 Photoshop 的右侧边栏,找到PxCook-切图面板。
  • 选中想要切图的图层 或者 图层组 ,然后点击切图面板上的 标记为切图 按钮。
  • 当被标记为切图后,将在图层前面增加 p:: 作为标记。如果要取消切图,点击 取消标记 即可。

img

# ② 自定义切图的尺寸

TIP

  • 需要确保被标记的图层为 图层组 ,如果不是图层组的话,需要将指定的图层进行打组(选中图层,按快捷键 ctrl+G 来为当前图层创建图层组)。
  • 之后我们在组内创建一个名为 @bounds# 的图层,通过 矩形工具,在该图层内绘制一个矩形来描述要切出切片的范围,如下所示:

img

这样,上图中的 heart_icon 图层组即会按照组内的 @bounds 图层的范围来进行切图了。

# 五、针对性案例训练(作业)

利用学过的知识来开发以下效果

要求:利用 PS 与 PxCook 结合,将以下 PSD 设计稿用代码以 1:1 还原成网页

# 1、商品卡片布局

image-20220713121306584

点击查看源代码
<style>
  body,
  p {
    margin: 0;
  }
  a {
    text-decoration: none;
  }
  .goods {
    border: 1px solid #666;
    width: 150px;
    padding: 10px;
    margin: 20px auto 0;
  }
  .goods .title {
    color: #666;
    font-size: 12px;
    line-height: 20px;
    height: 40px;
  }
  .goods .price {
    margin-top: 6px;
    color: #e1251b;
    font-weight: 700;
  }
  .goods .price i {
    font-size: 12px;
    font-style: normal;
  }
  .goods .price span {
    font-size: 12px;
    font-weight: 400;
  }
  .img {
    /* 去掉图片与下面标题的空隙-下节课程中会讲到 */
    display: block;
  }
</style>
<body>
  <div class="goods">
    <a href="">
      <img src="./images/img1.webp" alt="" />
      <p class="title">iSeeJplus山茶花智能眼部按摩器护眼仪</p>
      <p class="price"><i></i>679.<span>00</span></p>
    </a>
  </div>
</body>

# 2、利用 CSS 绘制小三角形(视频)


1-165711662423215
点击查看完整版视频讲解

# 3、利用 CSS 开发新闻列表(视频)


2-165711672763918
点击查看完整版视频讲解
上次更新时间: 6/8/2023, 9:23:17 PM

大厂最新技术学习分享群

大厂最新技术学习分享群

微信扫一扫进群,获取资料

X