0


CSS盒子模型

  1. 在网页排版布局时,我们可以将网页的每一个区块看作一个个盒子,我们像拼拼图一样,将这些盒子一个个拼起来,来排版布局页面内容。

盒子模型的定义

  1. 盒子模型,实际上就是指标签的外边距、边框、内边距、内容所组成的思维模型,这个模型可以直观的展示标签的尺寸、间距。
  2. 盒子的实际大小:边框(border) + 内边距(padding) + 内容(文本/width/height)
  3. ![](https://i-blog.csdnimg.cn/direct/1698839321144d6d8c3a18c84b91b8af.png)
  4. 我们可以通过F12或者鼠标右击检查来观察盒子模型,其中,我们选中某个元素时显示蓝色的区域就是内容,橙色区域是外边距;在选中的元素范围内,蓝色区域以外的绿色区域是内边距。

盒子内容

  1. 可以通过设置盒子的宽度和高度来撑开盒子内容大小,记作:
  1. .box-1 {
  2. width: 100px;
  3. height: 100px;
  4. }
  1. 我们设置一个100px的正方形盒子,并设置背景颜色,便于观察,写入一些文本,我们点击检查,可以发现此时蓝色区域是100px的正方形,文本在蓝色区域的最上方。

边框

  1. 边框属性值border,是指元素内容与元素内边距以为的线,一个标签有四个边,每个边可以有大小、线条样式(实线、虚线、点线)、颜色组成,边框可以撑开盒子大小。
  2. 可以单独给每个样式进行设置,如下:
  1. .box-3 {
  2. border-width: 10px;
  3. border-style: solid;
  4. border-color: green;
  5. }
  1. 等价于以下的写法,也是边框的通常写法:
  1. border: 10px solid green;
  1. 还可以将边框按照方向拆分为四条边来写,记作:
  1. /* 上边框 */
  2. border-top: 100px solid blue;
  3. /* 右边框 */
  4. border-right: 100px solid blue;
  5. /* 下边框 */
  6. border-bottom: 100px solid blue;
  7. /* 左边框 */
  8. border-left: 100px solid blue;
  1. 还是用之前的盒子,我们加入边框,可以看到下面的形状。

  1. 点击检查,可以发现盒子变大了,此时是因为边框撑开了盒子的大小。

  1. 我们平时会使用边框,一般会设置一个较小的px值,作为盒子修饰的边,效果如下:

利用边框绘制三角形

  1. 在前面我们有一个100px的边框,100px的内容区域,内容区域为正方形,如下图,那么去掉这个正方形的内容区域(将盒子内容区域高度和宽度设为0),想象一下,在盒子内容区域失去宽度和高度,只剩下边框时,会怎么样呢?

  1. 答案如下图——盒子会变成只由边框组成的四个三角形。

  1. 这个三角形可以让我们绘制出许多图形,在需要一个三角形时,我们可以利用transparent属性值(设置颜色透明),来去掉其他的三角形,注意还需要去掉其他的背景颜色,代码如下:
  1. <body>
  2. <style>
  3. .box-1 {
  4. width: 0px;
  5. height: 0px;
  6. /* 上边框 */
  7. border-top: 100px solid blue;
  8. /* 右边框 */
  9. border-right: 100px solid transparent;
  10. /* 下边框 */
  11. border-bottom: 100px solid transparent;
  12. /* 左边框 */
  13. border-left: 100px solid transparent;
  14. }
  15. </style>
  16. <div class="box-1"></div>
  17. </body>
  1. 此时页面中只剩下一个三角形,效果如下:

  1. 注意此时其他的边框只是变为了透明色,并不是消失了,他们还占据空间,点击检查,可以看见内容区域还是四个边框围起来的正方形。

外边距

  1. 外边距属性值margin,外边距是元素作用于浏览器或其他元素、元素与元素之间的间距,不会撑开盒子大小。
  2. margin有四个值,分别为:
  1. margin-left:属性值;
  2. margin-right:属性值;
  3. margin-top:属性值;
  4. margin-bottom:属性值;
  1. 其中,属性值的正负不同,移动的方向也不同
  1. margin-left 正数往右边移动,负数往左边移动;margin-right反之
  2. margin-top 正数往下边移动,负数往上边移动;margin-bottom反之
  1. 也可以简记为一行,分别为上右下左,可以写作:
  1. margin:值1,值2,值3,值4;
  1. 我们可以设置两个盒子,代码如下:
  1. <body>
  2. <style>
  3. .box-1 {
  4. width: 100px;
  5. height: 100px;
  6. background-color: pink;
  7. }
  8. .box-2 {
  9. width: 100px;
  10. height: 100px;
  11. background-color: green;
  12. }
  13. </style>
  14. <div class="box-1"></div>
  15. <div class="box-2"></div>
  16. </body>
  1. 正常情况下,两个盒子的摆放如下图:

  1. 我们给他们设置外边距,给第一个加一行代码,
  1. .box-1 {
  2. width: 100px;
  3. height: 100px;
  4. background-color: pink;
  5. margin-bottom: 10px;
  6. }
  1. 两个元素之间产生了外边距,被隔开了,效果如图:

  1. 点击检查,可以看见橙色区域就是两个盒子的外边距。

外边距合并问题

  1. 垂直方向,并列关系的两个元素, 上边元素设置margin-bottom:值,下边元素设置margin-top:值,这两个元素的间距不会相加,而是取属性值较大一个间距。
  2. 也就是说,当同时给两个盒子设置与另一个盒子之间的外边距时,这两个外边距并不会相加,而是取较大值,出现外边距合并的问题。
  3. 我们给两个盒子同时设置与另一个盒子之间的外边距,也就是上方的盒子的margin-bottom和下方的盒子的margin-top,代码如下:
  1. .box-1 {
  2. width: 100px;
  3. height: 100px;
  4. background-color: pink;
  5. margin-bottom: 10px;
  6. }
  7. .box-2 {
  8. width: 100px;
  9. height: 100px;
  10. background-color: green;
  11. margin-top: 20px;
  12. }
  1. 此时浏览器会选择外边距较大的20px作为外边距,而不是将两个外边距的和加起来,变成30px,效果如图:

  1. 解决方案
  1. 1. 并列关系的两个元素,要么统一设置margin-top或者统一设置margin-bottom
  2. 2. 给并列关系的两个元素嵌套一个父元素,设置overflow:hidden (形成BFC)
  1. 第一种解决方案代码如下,同时给盒子设置margin-top,去掉其他属性,此时可以实现外边距30px的目的。
  1. .box-1 {
  2. width: 100px;
  3. height: 100px;
  4. background-color: pink;
  5. }
  6. .box-2 {
  7. width: 100px;
  8. height: 100px;
  9. background-color: green;
  10. margin-top: 30px;
  11. }
  1. 第二种解决方案代码如下,给两个盒子嵌套一个父盒子,并设置overflow:hidden,此时两个边距都能生效。
  1. <body>
  2. <style>
  3. .parent {
  4. overflow: hidden;
  5. }
  6. .box-1 {
  7. width: 100px;
  8. height: 100px;
  9. background-color: pink;
  10. margin-bottom: 10px;
  11. }
  12. .box-2 {
  13. width: 100px;
  14. height: 100px;
  15. background-color: green;
  16. margin-top: 30px;
  17. }
  18. </style>
  19. <div class="parent">
  20. <div class="box-1"></div>
  21. <div class="box-2"></div>
  22. </div>
  23. </body>

外边距塌陷问题

  1. 父子关系的盒子,如果直接给子盒子设置外边距,会带动父盒子一起走,导致外边距塌陷的问题。
  2. 我们先设置两个父子关系的盒子,代码如下:
  1. <body>
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. .parent {
  7. width: 200px;
  8. height: 200px;
  9. background-color: green;
  10. }
  11. .child {
  12. width: 100px;
  13. height: 100px;
  14. background-color: red;
  15. }
  16. </style>
  17. <div class="parent">
  18. <div class="child"></div>
  19. </div>
  20. </body>
  1. 此时这两个盒子位于浏览器最左上角,效果如图:

  1. 给子盒子设置一个外边距,加一行margin-top,其余代码不变,代码如下:
  1. .child {
  2. width: 100px;
  3. height: 100px;
  4. background-color: red;
  5. margin-top: 100px;
  6. }
  1. 此时可以发现父盒子也被带动向下走了,效果如下:

  1. 解决方案:把父元素设置成BFC(块级格式化上下文 、独立的渲染区域)
  1. 1. 给父元素设置overflow:hidden (形成BFC)
  2. 2. 给子盒子设置浮动属性,使其脱离文档流
  1. 第一种给父盒子设置overflow:hidden属性,其余不变,代码如下:
  1. .parent {
  2. width: 200px;
  3. height: 200px;
  4. background-color: green;
  5. overflow: hidden;
  6. }
  1. 效果如下:

  1. 也可以给子盒子设置浮动属性,使其脱离文档流
  1. .child {
  2. width: 100px;
  3. height: 100px;
  4. background-color: red;
  5. margin-top: 100px;
  6. float: left;
  7. }
  1. 效果如下:

  1. 第二种方法设置需要清除浮动,以免影响后续元素,清除浮动的方法在之前的文章有提及:http://t.csdnimg.cn/3wuk5

内边距

  1. 内边距属性值为padding,是作用于元素边框与元素内容之间的间距,内边距不会影响元素内容本身的大小,可以撑开盒子大小。
  2. padding有四个值,分别为:
  1. padding-left:属性值;
  2. padding-right:属性值;
  3. padding-top:属性值;
  4. padding-bottom:属性值;
  1. 其中,属性值的正负不同,移动的方向也不同
  1. padding-left 正数往右边移动,负数往左边移动;padding-right反之
  2. padding-top 正数往下边移动,负数往上边移动;padding-bottom反之
  1. 也可以简记为一行,分别为上右下左,可以写作:
  1. padding:值1,值2,值3,值4;
  1. 我们设置一个盒子,并设置一个较大的内边距撑开盒子的大小,代码如下:
  1. <body>
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. .parent {
  7. width: 20px;
  8. height: 20px;
  9. background-color: green;
  10. padding: 300px;
  11. }
  12. </style>
  13. <div class="parent"></div>
  14. </body>
  1. 蓝色区域是盒子的内容大小,蓝色区域外是内边距,内边距撑开了盒子的大小,效果如下:

盒子模型的大小计算

  1. 在一个盒子模型中,盒子实际大小的计算: 边框 +内边距 + 内容。
  2. 我们只设置盒子的边框,其余设置为0,可以发现盒子的大小是边框的大小,也就是前面绘制三角形的问题。

  1. 我们设置盒子较大的内边距,可以发现内边距撑开了盒子的大小。

  1. 我们设置一个较大的边框,去掉内容的大小,可以发现边框撑开了整个盒子。

  1. 于是,我们可以发现,盒子的大小与边框、内边距和内容三者均有关系,我们设置一个盒子来观察,代码如下:
  1. <body>
  2. <style>
  3. body {
  4. margin: 0;
  5. }
  6. .parent {
  7. width: 20px;
  8. height: 20px;
  9. background-color: green;
  10. padding: 100px;
  11. border: 20px solid red;
  12. }
  13. </style>
  14. <div class="parent"></div>
  15. </body>
  1. 效果如下:

  1. 点击检查,查看各个属性:

  1. 我们也可以在控制台的右侧查看这个盒子模型,可以看到每个属性以及属性值。

  1. 我们可以看到每个属性四个方向的值
  2. ![](https://i-blog.csdnimg.cn/direct/e16dbb9123854d8fba98ac6393e49b74.png)
标签: css 前端

本文转载自: https://blog.csdn.net/weixin_64294248/article/details/140729818
版权归原作者 在美团搬砖的小陈 所有, 如有侵权,请联系我们删除。

“CSS盒子模型”的评论:

还没有评论