探究负边距(negative margin)原理
W3C规范在介绍margin时有这样一句话:
Negative values for margin properties are allowed, but there may be implementation-specific limits.
于是,聪明的开发者们就发现了很多负边距的巧妙用法。
比如,他可以增加一个不定宽块框的宽度,他可以让一个框向上移动去覆盖另一个框,他可以让文字移动去覆盖文字,也可以让浮动框移动去覆盖另一个浮动框。
利用这些特点,我们可以实现圣杯布局和双飞翼布局、等高布局、多列布局等等实用的布局方式。
那么负边距到底是如何工作的呢?也就是说,这些现象要怎么解释?
我是这样理解的:
在可视化格式模型中,一切都是框。所有的框都处于流动状态。就像是一个个漂浮在水上的小木块儿,水会将他们往一个地方推。
而边距,就是用于截流。就像是将一条河截成两段之后,后一段的水流就无法影响到前一段水流中的小木块了儿。
普通流(normal flow):
普通流中有块级格式化上下文和行内级格式化上下文。
在块级格式化上下文中,块级框占满一行,从上到下依次排列。占满一行意味着,如果他没有被设置宽度的话,他就会横向填充满整个包含框。
所以,块级格式化上下文中的流应该是这样的:

所以,给第一个p元素设置margin-bottom:10px;的意思就是在第一个p元素的border-bottom边线下10px的位置,设置一条拦截线,阻止之后的框被水流冲过这条线。
而如果设置margin-bottom:-10px的话,拦截线就会被设置在第一段文字border-bottom边线上10px的位置,之后的框会从那里开始流动,也就是会覆盖住第一段文字10px。按照这个逻辑,在这个例子中,给第一段文字设置margin-bottom:-10px和给的二段文字设置margin-top:-10px的效果是相同的,因为他们都把拦截线设置在了同一个地方。

除了纵向的流外,这里还有两个横向的流,一个横向是块级框内部的,用于控制他的宽度,另一个是外部的,用于控制他的流向。给一个块级框设置margin-left: -10px;,那么他的左外边缘就会被设置在border-left左侧10px的位置,他就会去填满那10px空隙。而如果这时候他刚好没有被宽度限制的话,他的border-right就不会移动以保证他的宽度。
这也就是为什么给一个不定宽的块级框设置正边距会让他的宽度减小,设置负边距会让他的宽度增加。而给一个定宽的块级框设置左负边距会让他左移,设置右负边距对他没有影响。

上图,p1和p2都设置了margin-left: -10px,p2和p3设置了宽度为300px,p3设置了margin-right:-10px;
在行内级格式化上下文中,行级框在水平方向上依次排列,至于是从左到右还是从右到左,由direction属性决定。如果当前行盒剩余的空间不足以装下它,他就会折断,多余的部分换到下一行。纵向的margin值对于行内级框来说无效的,也就是说,行内级框只会受到一个横向流动的力。
所以,行内级格式化上下文中的流应该是这样的:

以direction:ltr为例,给第二个行内级框设置margin-left: -20px; margin-right: -20px,结果应该是,他和第三个行内级框向左流动20px后,第三个行内级框又向左移动20px

浮动:
浮动框的上边缘会去贴当前行盒的上边缘或是之前浮动框的下边缘,左浮动框的左边缘会去贴包含框的左边缘,或者他之前的左浮动框的右边缘。如果当前行剩余的空间容不下一个浮动框,他就会换行。(右浮动同理)
一句话描述就是,只要空间够且无阻碍,浮动框边缘一定是要挨着包含框content边缘的。
所以,浮动框的流应该是这样的:
(三个框都是左浮动,包含框做了清浮动处理,设置了宽度500px。第一个浮动宽为100%,第二个浮动宽为150px,第三个浮动宽为100px.)

浮动流的力量会推它去贴包含框的content边缘,也就是说,如果一个浮动边缘已经贴在包含框的content边缘,且没有margin的话,在那个方向上,他将不受流动的力量控制。上图中,第二个浮动的上边缘被第一个浮动挡住,第三个浮动的左边缘被第二个浮动挡住,上边缘被第一个浮动挡住。
如果给第二个浮动设置margin-left:-20px的话,他的左拦截线就会移动到第一个浮动的border-right左侧20px的位置:

如果他的margin-left的负值的绝对值大于他自身的宽度,就意味着他的上边缘不再受第一个浮动的约束,左拦截线也移动到了足以容纳他的位置,他就会上移一行,第三个浮动会被一直向左推,直到碰到包含框的左边缘:

这个时候第二个浮动的负margin绝对值的增大会让他继续往左移动,而第三个浮动将不受影响,因为它的左边缘已经贴在包含框的content左边缘,已经没有力量会让他左移动了,除非,给他设置一个负边距值,当这个值足够让他的上边界拜托第一个浮动的阻碍时,它也会上移:

绝对定位:
绝对定位的框完全脱离普通流,所以他对其他任何框都不会产生影响,也就意味着,他的margin-left和margin-top会让他左右和上下移动,而margin-right和margin-bottom则不会产生任何影响。
总结:
边距用于截流,边距的正负决定拦截线在对应边框线的哪一边(上下左右)。截流之后元素动不动,往哪里动,还是要看它本身处于哪一种流中。
探究负边距(negative margin)原理的更多相关文章
- (转)CSS布局-负边距-margin
css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果.很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的. ...
- css中的负边距
css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果.很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的. ...
- CSS布局奇淫巧计之-强大的负边距
css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果.很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的. ...
- CSS布局之-强大的负边距
css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果.很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的. ...
- CSS3与页面布局学习笔记(四)——页面布局大全(负边距、双飞翼、多栏、弹性、流式、瀑布流、响应式布局)
一.负边距与浮动布局 1.1.负边距 所谓的负边距就是margin取负值的情况,如margin:-100px,margin:-100%.当一个元素与另一个元素margin取负值时将拉近距离.常见的功能 ...
- margin 负边距 的知识点
本文介绍了css负边距在普通文档流中的作用和效果.左和右的css负边距对元素宽度的影响.css负边距对浮动元素的影响.css负边距对绝对定位元素的影响.懒人建站偶然浏览到这篇文章,感觉非常好,于是分享 ...
- IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常
标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...
- RB1001: IE6 IE7 IE8(Q) 负边距 (margin) 导致元素溢出 hasLayout 容器时显示异常
标准参考 根据W3C CSS2.1规范第8.3节中的描述,边距属性设置了一个框的边距区的宽度.'margin' 缩写属性设置所有四边的边距,而其它的边距属性( 'margin-top' ,'margi ...
- CSS负边距margin的应用
原文 简书原文:https://www.jianshu.com/p/75a178e65207 相关文章 CSS负margin的影响:https://www.cnblogs.com/shcrk/p/93 ...
随机推荐
- .NET基础拾遗(5)多线程开发基础
Index : (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理基础 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开 ...
- 【资源】.Net 入门@提高 - 逆天的高薪之路!
入门看视频,提高看书籍,飘升做项目.老练研开源,高手读外文,大牛讲低调~ 官方学习计划 http://www.cnblogs.com/dunitian/p/5667901.html ----- ...
- CentOS 7配置LNMP开发环境及配置文件管理
安装并配置MySQL 5.6 从CentOS从7.x开始默认使用MariaDB.MariaDB完全兼容MySQL,包括API和命令行.但是很多时候我们还是会想要安装MySQL,所以不能直接通过yum命 ...
- 15个关于Chrome的开发必备小技巧[译]
谷歌Chrome,是当前最流行且被众多web开发人员使用的浏览器.最快六周就更新发布一次以及伴随着它不断强大的开发组件,使得Chrome成为你必备的开发工具.例如,在线编辑CSS,console以及d ...
- ASP.NET从零开始学习EF的增删改查
ASP.NET从零开始学习EF的增删改查 最近辞职了,但是离真正的离职还有一段时间,趁着这段空档期,总想着写些东西,想来想去,也不是很明确到底想写个啥,但是闲着也是够 ...
- 应该是Angular2的一个bug?
为了应对未来的趋势,及时赶上下一趟互联网技术,我最近也在通过具体项目研究angular2,首先必须要吐槽的是,学习angular2的成本本身不高,但是一堆的工具.配置实在让人 很是焦灼,就像asp.n ...
- GIT笔记命令行(1)
Git简单易用,只要输入git就可以列出他的所有参数 C:\Users\spu>git usage: git [--version] [--help] [-C <path>] [-c ...
- Set up VLAN (802.1q) tagging on a network interface?
SOLUTION VERIFIED October 13 2015 KB39674 KB741413 environment Red Hat Enterprise Linux 4 Red Hat En ...
- hexo+github搭建个人博客
最近用hexo+github搭建了自己的个人博客-https://liuyfl.github.io,其中碰到了一些问题,记录下来,以便查阅. hexo+github在win7环境下搭建个人博客:hex ...
- TCP三次握手图解