用margin还是用padding这个问题是每个学习CSS进阶时的必经之路。

分类: Html/CSS | 转载请注明: 出自 海玉的博客 
本文地址: http://www.hicss.net/use-margin-or-padding/

CSS边距属性定义元素周围的空间。通过使用单独的属性,可以对上、右、下、左的外边距进行设置。也可以使用简写的外边距属性同时改变所有的外边距。——W3School
边界(margin):元素周围生成额外的空白区。“空白区”通常是指其他元素不能出现且父元素背景可见的区域。——CSS权威指南

padding称呼为内边距,其判断的依据即边框离内容正文的距离,而我喜欢CSS权威指南解释的“补白”(或者叫“留白”),因为他很形象。补白(padding):补白位于元素框的边界与内容区之间。很自然,用于影响这个区域的属性是padding。——CSS权威指南

关于什么时候用margin什么时候用padding,网上有许许多多的讨论,大多数似乎讨论到点上面,却又有些隔靴搔痒的感觉,总是答不到点上。而且margin和padding在许多地方往往效果都是一模一样,而且你也不能说这个一定得用margin那个一定要用padding,因为实际的效果都一样,你说margin用起来好他说padding用起来会更好,但往往争论无果。根据网上的总结归纳大致发现这几条还是比较靠谱的:

何时应当使用margin:
需要在border外侧添加空白时。
空白处不需要背景(色)时。
上下相连的两个盒子之间的空白,需要相互抵消时。如15px + 20px的margin,将得到20px的空白。

何时应当时用padding:
需要在border内测添加空白时。
空白处需要背景(色)时。
上下相连的两个盒子之间的空白,希望等于两者之和时。如15px + 20px的padding,将得到35px的空白。

个人认为:margin是用来隔开元素与元素的间距;padding是用来隔开元素与内容的间隔。margin用于布局分开元素使元素与元素互不相干;padding用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段“呼吸距离”。

举个例子吧

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 4 <title>用Margin还是用Padding</title>
 5 <style>
 6 .top{width:160px; height:50px; background:#ccf;}
 7 .middle{width:160px; background:#cfc; border-top:1px solid #ccc;}
 8 .middle .firstChild{margin-top:20px;}
 9 .middle .secondChild{margin-top:15px;}
10 </style>
11 </head>
12 <body>
13 <div class="top"></div>
14 <div class="middle">
15   <div class="firstChild">我是firstChild,我只是想和我的父元素隔开点距离,这样看起来舒服。</div>
16   <div class="secondChild">我要和楼上隔开点的距离。恩,能与底边有点呼吸距离就更好了。</div>
17 </div>
18 </body>
19 </html>

上面这个效果看起来很不错,达到了我们需要实现的目标。然而,我们细细查看下这个代码,对照下我们上文所说的规则,firstChild用了margin-top:20px来隔开父元素与他的距离,secondChild也用margin-top:15来隔开他与firstChild的距离,咋看之下挺符合我们所说的margin是用来隔开元素与元素的间距。但是他符合我们所说的margin用于布局分开元素使元素与元素互不相干吗?

这里我想说的是NO,firstChild同middle属于一种父子元素关系,又是一种包裹元素与内容的关系,他们之间从拟人化的角度来讲,不应该是老死不相干的局面。我们再来看我们为什么要让firstChild与他的父元素隔开的距离,从表现的角度上来看,文字与边靠的太近,肯定不好看。让文字与元素边隔开的距离,既美观,又使得文字有了足够的“呼吸空间”,方便阅读,这恰恰符合padding用于元素与内容之间的间隔让内容(文字)与(包裹)元素之间有个“呼吸距离”。

我们再来看,firstChild使用margin-top引发了垂直外边距合并的隐患,middle如果不加一个类似border-top:1px solid #ccc的话标准浏览器下就会呈现子元素顶了父元素margin隐患(这是个垂直外边距合并问题,可以查看不要告诉我你懂margin,这篇文章内有详细介绍)。(也就是去掉父元素.middle中的border-top后,子元素的margin-top会导致.middle父元素与其它元素之间产生间距)可见这个时候margin显然不是很好的选择。

我们来试着这么修改:

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 4 <title>用Margin还是用Padding</title>
 5 <style>
 6 .top{width:160px; height:50px; background:#ccf;}
 7 .middle_2{width:160px; background:#cfc; padding:20px 0px;}
 8 .middle_2 .firstChild{}
 9 .middle_2 .secondChild{margin-top:15px;}
10 </style>
11 </head>
12 <body>
13 <div class="top"></div>
14 <div class="middle_2">
15   <div class="firstChild">我是firstChild,我只是想和我的父元素隔开点距离,这样看起来舒服</div>
16   <div class="secondChild">我是secondChild,我要和楼上隔开点的距离。恩,能与底边有点呼吸距离就更好了。</div>
17 </div>
18 </body>
19 </html>

我们来看看这么写的好处吧:
1.外观依旧良好,结构清晰也没有破坏布局。
2.不会产生垂直外边距合并这样的问题。
3.书写规范、代码量减少、重用性好。

但是同样也会带来不利:如果.middle元素设置了固定的高度,padding的改动就会影响其高度,所以建议让子元素使用padding,详见CSS设计模式之三权分立模式篇一文

我们可以看到在middle_2中去除了不需要的border-top,改为更为实用的padding:20px 0,让middle_2中的内容有了足够的“呼吸空间”,以后还可以随时随地修改这个padding,让内容文字的“呼吸空间”增大或者缩小,随时随地只修改一个middle_2的padding就能搞定所有包裹元素与内部内容的规划。

请注意这里是父元素应用padding,使得与其内容产生间隙,这是符合我们翻译为“补白”精髓(所以我一直喜欢称padding为“补白”而不是内边距),而padding也恰恰是在这儿最能体检他的价值。这个例子把第一个元素的margin-top去除,在父元素中应用padding。反过来,你会想,既然margin-top不好用,那么我第一个元素用padding-top不是也能达到效果么。恭喜你,你已经前进了一步了,的确使用padding-top即让第一元素与外包裹元素产生了呼吸距离,而且也不会出现所谓的垂直外边距重叠问题, 但是我依旧不推荐你这么做。为什么呢?我们来设想这么一个情况吧,假如有一天,你这个模块要产生变动,新需求要删除这个firstChild,替换为otherChild,会怎么样呢?

新的需求要求我们新加一个otherChild,替换原来的firstChild:

 1 <html xmlns="http://www.w3.org/1999/xhtml">
 2 <head>
 3 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 4 <title>用Margin还是用Padding</title>
 5 <style>
 6 .top{width:160px; height:50px; background:#ccf;}
 7 .middle_3{width:160px; background:#cfc;}
 8 .middle_3 .otherChild{font-weight:bold; font-style: italic;}
 9 .middle_3 .secondChild{margin-top:10px;}
10 </style>
11 </head>
12 <body>
13 <div class="top"></div>
14 <div class="middle_3">
15   <div class="otherChild">我是新来的otherChild,我也想和我的父元素隔开点距离,这样看起来舒服,咦?!为什么我是在顶部?</div>
16   <div class="secondChild">我是secondChild,我要和楼上隔开点的距离。恩,能与底边有点呼吸距离就更好了。</div>
17 </div>
18 </body>
19 </html>

发现问题了么?如果你把原先的firstChild给删除掉了,新来的元素根本就没有定义上边距或者上补白,那么他就会自然顶在头部,不是理想的效果。的确,你可以为了他新写一个css来让他距离头部多一点空隙,但是你该怎么写?直接改otherChild吗?如果其他页面里面也有otherChild那么你会把其他地方的otherChild布局打乱。恩,那么我用.middle_3 .otherChild{padding-top:10px;}怎么样可以吧。恩,可以可以,可是你不觉得这么累吗?每次修改,都要增加这一个多余的代码就为了简简单单的隔开点距离,久而久之,你的css文件代码会臃肿不堪,可移植性大大削弱。

每次开发的时候我一直对自己讲,你写的代码总有一天会被别的开发人员所替换、修改、更新。而一个优秀的前端写出的css不但在现在结构坚固并且还能为日后的开发人员提供方便。修改我的代码,改前改后的式样位置都一样,让之后的开发人员根本上避免接触到再次“修复”开发的机会,那才是一名真正前端的追求。这里你把包裹的div类似“封装”好一个环境,而且这个div内已经留有足够的内容的“呼吸空间”,你只需要改内容,内容所要考虑到得位置边距问题,外包的div元素早已经帮你预留好了,你用起来方便,今后改起来也方便,直接找到middle修改padding即可。

To margin or to be padding, that is the question.

所谓大道万千,运用之妙存乎一心。该用margin的时候就大胆的用他,该用padding也不用退缩不前,实战中累积出来的经验往往是最有用的,而当你不确定是用margin好还是用padding,请在看看这个原则吧,或许你会有一个自己的答案。

转载于:https://www.cnblogs.com/xiaozhumaopao/p/4744341.html

用margin还是用padding相关推荐

  1. WPF:Margin属性和Padding属性

    WPF:Margin属性和Padding属性的介绍 1.在进行界面设计时,Margin 和Padding都是对边距进行限制的,其区别在于"一个主外,一个主内". Margin (边 ...

  2. css盒子模型、边框border、外边距margin、填充padding、轮廓outline

    盒子模型:盒子默认的宽度为容器的宽度,也可以自省设定宽度,高度根据内容适应,也可以自行设定高度.min-height设定最小高度 一个盒子包括外边距.边框.内边距和实际内容 Margin(外边距):清 ...

  3. CSS 外补白(Margin) 内补白(Padding) 边框属性 定位(positioning)属性 布局(layout)属性

    CSS 布局(Layout) Properties 属性 CSS Version 版本 Inherit From Parent 继承性 Description 简介 display CSS1/CSS2 ...

  4. [css] 解释下为什么css的reset不建议直接这么写:*{ margin:0; padding:0;}?

    [css] 解释下为什么css的reset不建议直接这么写:*{ margin:0; padding:0;}? 1.*为通配符,使用通配符,即全局范围遍历,耗费浏览器效率,增大负荷: 2.会影响后面的 ...

  5. android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值

    http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...

  6. 让div margin属性消失_margin 和 padding

    CSS的边距属性是用来设置页面中的一个元素所占空间的边缘到相邻元素之间的距离. 主要有两个属性:margin(外边距)和 padding(内边距). margin 在一个声明中设置当前所有或者指定元素 ...

  7. 图解CSS的padding,margin,border属性

    图解CSS的padding,margin,border属性(详细介绍及举例说明) 图解CSS的padding,margin,border属性 W3C 组织建议把所有网页上的对像都放在一个盒(box)中 ...

  8. html标签默认属性值之margin;padding值

    一.h1~h6标签:有默认margin(top,bottom且相同)值,没有默认padding值. 在chrome中:16,15,14,16,17,19; 在firefox中:16,15,14,16, ...

  9. 知方可补不足~CSS中margin,padding,border-style有几种书写规范

    参考文章: http://www.w3school.com.cn 在我们使用CSS时,经常看到margin:0 0,margin:0 5px,padding:0 5px 10px;而它们研究是什么含义 ...

最新文章

  1. Android 屏幕适配从未如斯简单(8月10日最终更新版)
  2. linux下的nodejs安装
  3. (转)OpenNLP进行中文命名实体识别(下:载入模型识别实体)
  4. hdu2102(bfs)
  5. pyspark union代码示例
  6. rfid6-写成platform驱动
  7. 操作系统之计算机系统概述:4、操作系统的运行机制(内核态用户态、特权指令非特权指令、内核程序应用程序)
  8. 聊聊flink的FsStateBackend
  9. Go基础学习记录 - 编写Web应用程 - 完善Blog Model
  10. 赛门铁克第三财季运营业绩稳步增长
  11. 本地修改PHP修改文件,PHP脚本批量修改本地文件名
  12. 几种常见开源软件授权协议
  13. 点击或长按复制打开微信H5落地页如何制作?
  14. 常见荧光染料修饰多种基团及其激发和 发射波长数据一览数据
  15. 2018 IDEA Intellij 和 DataGrip的激活方式(至10月)
  16. 算法——归并和归并排序
  17. 数据库作业6——嵌套查询
  18. 考虑交通网络流量的电动汽车充电站规划matlab 采用matlab软件参照相关资料完成电动汽车程序
  19. 智能制造并非只是自动化
  20. 经常用电脑辐射大怎么办?这5个习惯可以防辐射

热门文章

  1. 轻松解决Windows7声卡驱动不全问题
  2. 【C语言运算符大全】快速学会C语言运算符
  3. Kotlin 学习笔记(八)—— Kotlin类与对象之接口
  4. 挨踢项目求生法则-战略篇
  5. [Angular 2] @ngrx/devtools demo
  6. VC CListCtrl 第一列列宽自适应
  7. PhpCms V9调用指定栏目子栏目文章的方法
  8. 选美大赛示例 你会选谁
  9. c# 字符串是否相等
  10. 实现超长焦梦想的捷径——试用适马150-500毫米F5-6.3 OS镜头