css网页布局用Margin还是用Padding

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

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用于元素与内容之间的间隔,让内容(文字)与(包裹)元素之间有一段“呼吸距离”。

举个例子吧

 代码如下 复制代码

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

 


我是firstChild,我只是想和我的父元素隔开点距离,这样看起来舒服。
我是secondChild,我要和楼上隔开点的距离。恩,能与底边有点呼吸距离就更好了。
上面这个效果看起来很不错,达到了我们需要实现的目标。然而,我们细细查看下这个代码,对照下我们上文所说的规则,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,这篇文章内有详细介绍)。可见这个时候margin显然不是很好的选择。
我们来试着这么修改:

 代码如下 复制代码

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

 


我是firstChild,我只是想和我的父元素隔开点距离,这样看起来舒服
我是secondChild,我要和楼上隔开点的距离。恩,能与底边有点呼吸距离就更好了。
我们来看看这么写的好处吧:
1.外观依旧良好,结构清晰也没有破坏布局。
2.不会产生垂直外边距合并这样的问题。
3.书写规范、代码量减少、重用性好。
我们可以看到在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:

 代码如下 复制代码

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>用Margin还是用Padding</title>
<style>
.top{width:160px; height:50px; background:#ccf;}
.middle_3{width:160px; background:#cfc;}
.middle_3 .otherChild{font-weight:bold; font-style: italic;}
.middle_3 .secondChild{margin-top:10px;}
</style>
</head>
<body>
<div class="top"></div>
<div class="middle_3">

  <div class="otherChild">我是新来的otherChild,我也想和我的父元素隔开点距离,这样看起来舒服,咦?!为什么我是在顶部?</div>
  <div class="secondChild">我是secondChild,我要和楼上隔开点的距离。恩,能与底边有点呼吸距离就更好了。</div>
</div>
</body>
</html>

 


我是新来的otherChild,我也想和我的父元素隔开点距离,这样看起来舒服,咦?!为什么我是在顶部?
我是secondChild,我要和楼上隔开点的距离。恩,能与底边有点呼吸距离就更好了。

发现问题了么?如果你把原先的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,请在看看这个原则吧,或许你会有一个自己的答案

时间: 2024-10-11 09:46:17

css网页布局用Margin还是用Padding的相关文章

DIV+CSS网页布局中margin优化的一种思路

css|网页|优化 margin是我们在进行CSS布局中非常常用的属性之一,但如果运用不得当,往往会产生过多的垃圾代码,让我们的编码体积不断增加.今天我们介绍一种编码优化的小实例,通过此例希望大家能意识到代码优化的途径是多种多样的,也算是一个抛砖引玉的引子吧. 看XHTML代码: <div id="main">     <div id="body1">          <div id="content1"> 

CSS网页制作技巧:DIV+CSS网页布局常犯错误汇总

文章简介:随着CSS网页布局越来越普及,国内大部分网站已经采用CSS网页布局的制作方法.在应用DIV+CSS编码时很容易犯一些错误,这里列举一些常见的错误,帮助新手朋友更好的学习与进步. 随着CSS网页布局越来越普及,国内大部分网站已经采用CSS网页布局的制作方法.在应用DIV+CSS编码时很容易犯一些错误,这里列举一些常见的错误,帮助新手朋友更好的学习与进步. 一.检查HTML元素是否有拼写错误 是否忘记结束标记 即使是老手也经常会弄错div的嵌套关系.可以用dreamweaver的验证功能检

CSS网页布局错位:CSS宽度计算

文章简介:CSS网页布局错位. 为什么计算宽度计算网页像素宽度是为了CSS网页布局整齐与兼容.常见的我们布局左右结构网页或使用padding.margin布局的时候将计算整页宽度,如果不计算无论是宽度过大过小就会出现错位问题. 怎么计算CSS宽度例一:我们计算一个左右结构的布局样式.假如总宽度为400px,那么左右加起来就应当小于400px,那我们可能左边为300px,右边为100px正确代码: <!DOCTYPE html><head><meta http-equiv=&q

xhtml+css网页布局是否要注意CSS书写顺序?

css|xhtml|网页 我们运用xhtml+css网页布局,实现表现与结构的分离,表现部分的css文件非常重要,也比较繁杂,我们在书写CSS文件时有很多属性和值,我们就考虑到了书写顺序的问题. 有时候是先写了margin或color,然后再写width和height等等.我们有没有必要让我们的编码更加的工整,更加的科学呢?实践证明,书写工整.按一定的规则进行书写是很有好处的. 下面是Mozilla Firefox所建议的CSS书写顺序,对我们的代码书写很有参考价值: * mozilla.org

DIV CSS网页布局中对段落进行排版的方法

css|网页 margin div css布局中段落使用<p>标签,对于段落的上下左右的空白(缩进)可以使用margin标签定义样式.margin有上.下.左.右四个方向的定义,正常情况下,我们可以用一行来描述我们需要的样式. 例如:margin: 20px 8px 8px 20px; 此句分别表示了:margin-top:margin-right:margin-bottom:margin-left. 四个数值的顺序分别是:上.右.下.左.是依时12:00开始的顺时针方向. 如何上下的值一致,

DIV CSS网页布局需要掌握的八大技巧

  你对DIV CSS网页布局需要掌握的技巧是否熟悉,这里和大家分享一下,良好的习惯可能会使你的设计周期加倍缩短. DIV CSS网页布局需要掌握的技巧汇总 以下是进行CSS设计时的八个必要的小技巧,良好的习惯可能会使你的设计周期加倍缩短. 1.DIV CSS网页布局若有疑问立即检测 在出错时若能对原始代码做简单检测可以省去很多头痛问题.W3C对于XHTML与CSS都有检测工具可用,请见.请注意,在文件开头的错误,可能因为不当的结构等因素造成更多错误;我们建议先修正一些最明显的错误之后重新检测,

DIV CSS网页布局学习中容易出现的问题汇总

css|网页|问题 应用Div+CSS网页布局,制作符合web标准的网站,容易出现的一些问题.现在总结一下,以便大家能够看到明白问题出在那里. 一.CSS校验的问题 我们设计的网页,都希望符合XHTML标准,CSS通过W3C的校验.有些未通过CSS2.0校验,主要校验错误都是:"Line : 0 font-family: 建议你指定一个种类族科作为最后的选择"W3C建议字体定义的时候,最后以一个类别的字体结束,而不要以单独某个字体结束.例如"sans-serif"就

使用DIV+CSS网页布局在SEO优化的优势

css|seo|优化|网页布局 SEO主要就是通过对网站的结构,标签,排版等各方面的优化,使Google等搜索引擎更容易搜索网站的内容,并且让网站的各个网页在Google等搜索引擎中获得较高的评分,从而获得较好的排名.DIV+CSS网页布局对SEO有哪些影响呢? 一.精简网页代码 使用DIV+CSS布局,页面代码精简,这一点相信对XHTML有所了解的都知道. 代码精简所带来的直接好处有两点:一是提高Spider爬行效率,能在最短的时间内爬完整个页面,这样对收录质量有一定好处;二是由于能高效的爬行

CSS网页布局避免滥用div元素

文章简介:CSS网页布局应该避免滥用div元素一直是我们倡导的,以合适的HTML标签组织文档是CSS网页布局的基??/font> CSS网页布局应该避免滥用div元素一直是我们倡导的,以合适的HTML标签组织文档是CSS网页布局的基础. 页面中div与span元素的使用是一个新问题,我们也容易过多的使用它们.必要及合理的使用div可以明显的增强文档的结构性.这也是webjx.com一直提倡的. 如果你审视你的HTML文档,发现有着很多的div与span,那你就得换一个眼光来看问题了,是不是存在滥