作者: 她不美却常驻我心
博客地址: https://blog.csdn.net/qq_39506551
微信公众号:老王的前端分享
每篇文章纯属个人经验观点,如有错误疏漏欢迎指正。转载请附带作者信息及出处。

从零开始学前端 - 7. CSS盒模型 margin 和 padding 详解

  • 一、CSS盒模型
  • 二、外边距 margin
    • 1. margin-top 失效
    • 2. margin-bottom 与 margin-top 的冲突
    • 3. 内联元素 margin-top 与 margin-bottom 失效
  • 三、内边距 padding

一、CSS盒模型

  css 盒模型(Box Model),由元素内容(content)、内边距(padding)、边框(border)、外边距(margin)四个要素构成。每一个 HTML 元素都可以看成是一个盒子,里面填充各种各样的内容。
  盒模型分为两种,一种是 W3C 规定的标准盒模型,一种 IE 浏览器特有的怪异盒模型。目前的浏览器大部分都支持标准盒模型,与此同时也保留了对怪异盒模型的支持。
  可以使用 CSS 属性 box-sizing 来控制盒模型。设置 box-sizing: content-box;,浏览器选择使用标准盒模型方式来解析,设置 box-sizing: border-box,浏览器将采用怪异盒模型来解析。

盒模型示意图


例:

<div style="width:200px;height:200px;margin:25px;padding:25px;border:10px solid #000;box-sizing: content-box;">标准盒模型
</div>
<div style="width:200px;height:200px;margin:25px;padding:25px;border:10px solid #000;box-sizing: border-box;">怪异盒模型
</div>

浏览器显示结果:

  我们可以很明显的看出,标准盒模型比怪异盒模型所占据的面积要大很多,我们用 Chrome 浏览器的盒模型示意图来分析一下两个盒模型的区别:

  我们发现,标准盒模型的大小并不是我们设置的 200 * 200 ,而是 270 * 270;怪异盒模型的大小虽然是我们设置的 200*200,但实际内容的大小只有 130*130。而且两个模型在计算大小的时候,都没有计算 margin 的大小;实际上,两个元素在页面中占据的总宽度,还应该加上 margin 的数值,即:320 * 320250 * 250
  这是因为在标准盒模型下,设置的宽高就是实际可用的宽高,而边距和边框的大小,都没有计算在内;在怪异盒模型下,设置的宽高就是边框、内边距、元素实际可以宽高三者的总和。
  也就是说:

标准盒模型

  • 元素总宽 = margin + border + padding + width ;
  • 内容总宽:content = width ;

怪异盒模型

  • 元素总宽:总宽 = margin + width;
  • 内容总宽:content = width - boredr - padding;

  在我们实际工作中,一般都采用 怪异盒模型模式 对所有元素进行渲染,一方面是为了兼容 IE 的低版本浏览器,一方面也是因为计算起宽度来要更加的方便。初次使用的时候可能会不太习惯,但随着我们不断的学习和使用,我们会逐渐的习惯,也会喜欢上使用怪异盒模型。我们常用的大部分 UI 框架,也都是采用的怪异盒模型。
  实例: 要求实现一个左右布局,各占50%的宽度。
这很简单就能实现:

<div style="width: 50%;height: 100px;background-color: #f00;float: left;">我是左边</div>
<div style="width: 50%;height: 100px;background-color: #ff0;float: right;">我是右边</div>

  突然,一个新的需求出现了,要求左边要加上边框,你一想,这不简单么,立马给左边加上了一个边框。

<div style="width: 50%;height: 100px;background-color: #f00;float: left;border:5px solid #000;">我是左边</div>
<div style="width: 50%;height: 100px;background-color: #ff0;float: right;">我是右边</div>


  意外出现了,左边和右边的不相等了。因为左边加上了边框,在标准盒模型下,边框的宽度不会计算到设置的宽度里面,所以宽度溢出了,这样就导致两边不一致了。左边的实际宽度变为了 50% + 5px
  而使用怪异盒模型,这样的问题就迎刃而解。

<div style="width: 50%;height: 100px;background-color: #f00;float: left;border:5px solid #000;box-sizing: border-box;">我是左边</div>
<div style="width: 50%;height: 100px;background-color: #ff0;float: right;">我是右边</div>

二、外边距 margin

  前面我们已经简单介绍过了 margin 属性的意义和语法,接下来我们来介绍一下使用 margin 时会遇到的各种经典问题。

1. margin-top 失效

<div style="width: 100%;height: 100px;background-color: #000;"><div style="width: 50px;height: 50px;background-color: #f00;margin-top: 20px;"></div>
</div>

我们给子元素 添加了 margin-top: 20px;,希望它能向下移动 20px 的距离,但浏览器的显示如下:

  我们发现它并没有按照我们的想法进行,而是带着他的父级 div 一起向下移动了 20px。这是因为当两个块级元素嵌套时,如果内部的块设置有 margin-top 属性,而且父元素没有下边解决方法所述的特征,那么内部块的 margin-top 属性会绑架父元素。
  解决方案如下,应结合项目的实际情况,选择合适的方式:

  • 设置父元素或者自身的 display:inline-block;
  • 设置父元素的 border:1px aqua solid;
  • 设置父元素的 padding:1px;
  • 给父元素设置 overflow:hidden;
  • 给父元素或者自身设置 position:absolute;
  • 设置父元素非空,填充一定的内容;

2. margin-bottom 与 margin-top 的冲突

<div style="width: 100px;height: 100px;background-color: #f00;margin-bottom: 20px;">div1</div>
<div style="width: 100px;height: 100px;background-color: #ff0;margin-top: 20px;">div2</div>

  我们分别给两个元素设置了 上下边距,按照常理,两个元素之间的外边距应该是 20 + 20 = 40px ,浏览器显示效果如下:


  我们发现两个 div 之间的距离是 20px,而不是我们想要的 40px。这是因为:垂直方向上,块级元素的相邻外边距会重合

  外边距的取值分为三种情况:

  • 如果两个外边距都为正值,那么外边距的值取两个元素中最大的值;
  • 如果外边距中有负值,那么外边距的值等于 正值 - 负值的绝对值;
  • 如果外边距都为负值,那么外边距的值等于 0 - 最小负值的绝对值;

  当结果为正时:两个元素之间的距离为 计算的结果。
  当结果为负时:div2 会向上移动 计算结果 的距离。

3. 内联元素 margin-top 与 margin-bottom 失效

  内联元不允许设置 上下方向的 margin,即使设置了,也不会生效。

三、内边距 padding

例:

<span style="padding:20px;">这是一个内联元素</span>

浏览器显示:

  我们发现,padding-top 对内联元素并没有起作用,而且元素的 padding 部分也拥有背景颜色 。也就是说:

  • 对内联元素而言,padding-top 不会生效;
  • 元素添加的背景会从 padding 区开始;

种一棵树,最好的时间是十年前,其次是现在。人的一生,总的来时就是不断学习的一生。
蚕吐丝,蜂酿蜜。人不学,不如物。与其纠结学不学,学了有没有用,不如学了再说。
等你学会了之后,你才拥有资格说“啊,这个东西学了没用。”


每篇文章纯属个人经验观点,如有错误疏漏欢迎指正。转载请附带作者信息及出处。您的评论和关注是我更新的动力!

请大家关注我的微信公众号,我会定期更新前端的相关技术文章,欢迎大家前来讨论学习。
都看到这里了,三连一下呗~~~。点个收藏,少个 Bug 。

从零开始学前端 - 7. CSS盒模型 margin和padding详解相关推荐

  1. 从零开始学前端:弹性盒模型(flex布局) --- 今天你学习了吗?(CSS:Day19)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:字体图标的引入 - 今天你学习了吗?(CSS:Day18) 文章目录 从零开始学前端:程序猿小白也可以完全 ...

  2. 从零开始学前端:CSS盒子模型属性 --- 今天你学习了吗?(CSS:Day14)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:伪元素和盒子模型 - 今天你学习了吗?(Day13) 文章目录 从零开始学前端:程序猿小白也可以完全掌握! ...

  3. 从零开始学前端:CSS引入 --- 今天你学习了吗?(CSS:Day07)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:列表标签 - 今天你学习了吗?(CSS:Day06) 文章目录 从零开始学前端:程序猿小白也可以完全掌握! ...

  4. 从零开始学前端 - 5. CSS常用属性

    作者: 她不美却常驻我心 博客地址: https://blog.csdn.net/qq_39506551 微信公众号:老王的前端分享 每篇文章纯属个人经验观点,如有错误疏漏欢迎指正.转载请附带作者信息 ...

  5. 从零开始学前端:CSS复合选择器 --- 今天你学习了吗?(CSS:Day10)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:CSS背景颜色 - 今天你学习了吗?(CSS:Day09) 文章目录 从零开始学前端:程序猿小白也可以完全 ...

  6. 从零开始学前端:CSS背景颜色 --- 今天你学习了吗?(CSS:Day09)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:CSS字体属性和文本属性 - 今天你学习了吗?(CSS:Day08) 文章目录 从零开始学前端:程序猿小白 ...

  7. 从零开始学前端:CSS字体属性和文本属性 --- 今天你学习了吗?(CSS:Day08)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:CSS引入 - 今天你学习了吗?(CSS:Day07) 文章目录 从零开始学前端:程序猿小白也可以完全掌握 ...

  8. 从零开始学前端:CSS元素模式的转换和CSS三大特性 --- 今天你学习了吗?(CSS:Day12)

    从零开始学前端:程序猿小白也可以完全掌握!-今天你学习了吗?(CSS) 复习:从零开始学前端:复习课程 - 今天你学习了吗?(CSS:Day11) 文章目录 从零开始学前端:程序猿小白也可以完全掌握! ...

  9. 前端--关于CSS盒模型

    CSS样式规则的学习是很繁琐和枯燥的,因为它不像物理.数学或者其他编程语言一样有一些基本概念.有一些基本公理或者规则,其他所有的表现都是概念在这些公里或者规则之下的逻辑游戏,CSS是有一些基本概念,但 ...

最新文章

  1. SmartDispatcher 类
  2. Guass列主元消去法求解线性方程组
  3. 空函数有参函数调用参数的注意事项Swift 1.1语言
  4. 影像算法瓶颈突破 汽车ADAS再进化
  5. openssl passwd之openssl命令详解
  6. 考研常识:研究生单独考试是什么意思?
  7. window上远程访问linux上的neo4j的设置
  8. Flink 还是 Spark?阿里技术专家一语道破真相!
  9. 本地分发_2020年分发Python应用程序的12个热门途径
  10. fastadmin token 验证错误_用签名保护你的隐私(4)--token生成
  11. ApacheCN 未来发展方向(暂定)2019.8.2
  12. vivo X30系列发布会邀请函曝光:名副其实的“望远镜”
  13. C语言中与字符串有关函数讨论以及安全性能问题
  14. nuget的原理_从零开始学习 dotnet 编译过程和 Roslyn 源码分析
  15. IOS磁力下载软件,老司机必备品
  16. 多个图片如何批量转成文字版的Word
  17. 985,211,双一流,34所,C9,国防七子,五虎四小龙,五院四系,东南西北中傻傻分不清
  18. 仙人掌圆方树学习笔记
  19. excel表格如何把含有数字的单元格筛选出来?
  20. 【andriod】设备APP开发之数据就地Excel存储

热门文章

  1. MySQL-表连接的几种方式
  2. 用友u8服务器无法自动启动,u8服务有的没有启动,启动服务,没有反应-用友U8...
  3. 竞价推广方案怎么写,这些点你get到了吗?
  4. Intellij IDEA之mybatis-generator自动生成
  5. 中央电大计算机网络试题,2017电大统考计算机试题及答案
  6. linux切割日志方法,Linux下nginx生成日志自动切割的实现方法
  7. word2019 论文排版之论文中的图表跟随章节插入题注(转)
  8. QT关于iCCP警告去除
  9. 如何对镶嵌数据集进行色彩平衡
  10. 使用 logrotate 配置 supervisor 进行日志管理按天备份