我知道你不知道的负Margin

现如今,负margin技术的应用可谓越来越广,任一个大型站点惊鸿一瞥之下都会有其身影所在。个人认为负margin技术是学习css路上必不可缺少的课题之一,许多高级应用及疑难杂症修复都可以使用负margin技术进行实现。

负margin理论:

在说明什么是负margin之前,你得清楚margin是个啥么玩意,如果还不清楚可以先阅读本人的前一篇文章《不要告诉我你懂margin》,预补下知识,回头再读这篇文章,相信俩篇文章都能给你带来不少的收获。

为了形象、易懂的解释负margin,我们将引入W3C上没有的参考线的说法。何谓参考线?参考线就是 margin移动的基准点,此基准点相对于box(自身)是静止的。而margin的数值,就是box相对于参考线的位移量。

一个完整的margin属性是这么写的margin: top right bottom left;(eg: margin:10px 20px 30px 40px)。在margin属性中一共有两类参考线,top和left的参考线属于一类,right和bottom的参考线属于另一类。top和left是以外元素为参考,right和bottom是以元素本身为参考。margin的位移方向是指margin数值为正值时候的情形,如果是负值则位移方向相反。

上面段文字和图片或许挺难理解,我们来看实际代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Margin参考线举例说明

example元素:margin参考线举例说明文字,请查看此元素由于margin的变化所移动的位移量。

一个普通的Box

来分析这段代码,example元素下方有一相邻元素normal(注:这里分析的是添加和删除margin后的example元素,normal元素仅作为example元素前后效果的参照)。

根据上文的参考线原理margin:-10px(top) 20px(right) -30px(bottom) 40px(left); 上-10px和左40px将以外元素为参考,所谓外元素就是本元素的边界元素(再白话点的解释就是元素的紧邻元素,这里涉及到containing block知识,可自行网上搜索)。example元素上边和左边的边界元素即为wrap父元素,wrap父元素为基准点,example的margin-top为-10px,想象下如果这里margin-top为+10px会什么情况,没错如果为+10px,example元素相对于wrap父元素边缘为基准,那么example元素会同wrap父元素10px产生间隙边距,那么反过来,margin-tip:-10px;还是与wrap父元素边缘为基准,反过来向上推10px的距离位置。example元素的margin-left为40px,这里就按照正常逻辑相隔40px边距,同理如果为-40px,那么就是反方向向左推进40px的距离位置。

再来看example元素的margin-right和margin-bottom,由上文得知这俩个值是以元素本身为参考。什么叫以元素本身为参考呢,确切含义是指以自身为参考来影响周围元素的位置(实质即为影响下边和右边相邻元素的参考线)。这里的margin-bottom为-30px,对于其自身位置没有任何变化,但是对于其下方元素normal元素产生了极大的影响,因为normal元素的上边界元素即为example元素,根据example元素边界来判定自身位置,想象下如果example元素margin-bottom为+30px,那么example元素将隔开下方的normal元素,反之为-30px,下方normal元素由于example参考线内凹,导致了normal元素自个儿身不由己的被“提”了上去了。这就是以自身为参考影响周围元素位置的含义。

这里梳理一下规律,当margin四个值都为正数值的话,那么margin按照正常逻辑同周围元素产生边距。当元素margin的top和left是负值时会引起元素的向上或向左位置移动。而当元素margin的bottom和right是负值时会影响右边和下边相邻元素的参考线。如果你再想深入了解参考线理论的话你也可访问由浅入深漫谈margin属性这篇文章。

负margin实战:

据我所知至今没有一套完整的关于负margin专题研究的文章。有也仅仅是偏理论或者偏实例,理论终究是理论,学以致用才是根本,而有了实例你还得知晓原理,授人鱼不如授人以渔。接下来我们将利用四个例子深入讲解负margin技术的应用领域。

负margin在Tab选项卡中的应用:

效果预览:

前端

实战

交互

优化

这是第四个选项卡的内容,据我所知至今没有一套完整的关于负margin专题研究的文章。有也仅仅是偏理论或者偏实例,理论终究是理论,学以致用才是根本,而有了实例你还得知道其原理,授人鱼不如授人以渔。这些都是文字文字文字文字文字。

核心分析:

如上面的这个Tab选项卡效果,最核心的就是下方俩行高亮部分代码,第二行的margin-bottom:-1px;使下方的正文部分向上“提”了1px的距离,从而达到了鼠标上移后选项卡白色遮住下方黑色边框的效果(注:由于IE不是符合W3C标准,所以当鼠标移到选项卡上时需要添加一个额外属性position:relative;来修复IE不覆盖下方边框的这个Bug)。第四行的margin-left:-1px;的目的是让四个选项卡向左移动1px的距离,达到左右都只有一条分割线的效果。

CSS代码:

1

2

3

4

5

6

7

8

9

.demoTab{width:400px; font:14px/1.5 Microsoft YaHei,verdana,Helvetica,Arial,sans-serif;}

.demoTab .demoTabHd{margin-bottom:-1px; border:1px solid #6C92AD; border-bottom:none; background:#EAF0FD;}

.demoTab .demoTabNav{height:28px; overflow:hidden; *zoom:1;}

.demoTab .demoTabList{float:left; margin-left:-1px;  padding:0 22px; line-height:28px; border-left:1px solid #6C92AD; border-right:1px solid #6C92AD;  font-weight:bold; color:#005590; text-align:center; cursor:pointer;}

.demoTab .demoTabList.current{position:relative; background:#fff;}

.demoTab .demoTabBd{border:1px solid #6C92AD;}

.demoTab .demoTabBd .roundBox{padding:15px;}

.demoTab .demoTabContent{display:none;}

.demoTab .demoTabContent.current{display:block;}

HTML代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

  • 前端
  • 实战
  • 交互
  • 优化

这是第一个选项卡的内容。

这是第二个选项卡的内容。

这是第三个选项卡的内容。

这是第四个选项卡的内容。

负margin负位移技术应用:

效果预览:

核心分析:

上面那个类似于商城热销商品邮戳效果其实也是由负margin实现的,把以往使用的relative/absolute这样的“危险”属性代替为相对“温和”的margin属性。核心在于小的邮戳图片利用负margin-top向上移动,达到类似absolute的叠加效果。

CSS代码:

1

2

3

4

.demoSpecItem{width:212px; min-height:178px; _height:178px;}

.demoSpecItem .demoItemPic{display:block; text-align:center;}

.demoSpecItem .demoItemPic img{padding:5px; border:1px solid #ccc;}

.demoSpecItem .demoIcon{display:block; margin:-185px 0 0 150px;}

HTML代码:

1

2

3

4

5

6

利用负margin制作鳞片式导航:

效果预览:

鳞片导航

前端开发

用户体验

实战为主

核心分析:

鳞片式导航可以说是使用负margin技术最佳场合之一。如上方的例子,试着想象不使用负margin,单纯的使用图片来制作这类鳞片式导航,想象下切图、定位、点击后图片切换、中间接壤部分的遮罩、维护开发的工作量,光想想这些就不寒而栗。而利用负margin这里仅仅添加一个margin-left即可达到前后遮盖的效果。

CSS代码:

1

2

3

4

5

6

.demoNav .demoList{float:left; width:154px; height:53px; margin:0 0 0 -20px;}

.demoNav .demoList.firstList{margin:0;}

.demoNav .demoList a{display:block; line-height:53px; padding:0 0 0 25px; color:#005590; background:url("flakeNavTab.png") left top no-repeat; font-weight:bold; text-decoration:none;}

.demoNav .demoList a:hover{background:url("flakeNavTabHover.png") left top no-repeat;}

.demoNav .demoList.current a{background:url("flakeNavTabCurrent.png") left top no-repeat;}

.demoNav .demoList.current a:hover{background:url("flakeNavTabCurrent.png") left top no-repeat;}/* fix ie6 hover issue */

HTML代码:

1

2

3

4

5

6

7

8

  • 鳞片导航
  • 前端开发
  • 用户体验
  • 实战为主

利用负margin制作自适应左右布局:

效果预览:

负margin能够替代float浮动布局,进行左右布局规划,并且拥有float所没有的自适应效果。你可以尝试点击变宽和变窄按钮来查看本例。现如今,负margin技术的应用可谓越来越广,任一个大型站点惊鸿一瞥之下都会有其身影所在。

核心分析:

如上例这类布局效果(左边一个固定图片,右边为内容),负margin能够替代float浮动布局,进行左右布局规划,并且拥有float所没有的自适应效果。你可以尝试点击变宽和变窄按钮来查看本例。你或许也发现了第三个“不设置最小宽度”按钮,这个是做什么用的呢?你可以使用标准浏览器查看上方例子,依次点击变宽按钮至宽度最大,再点击不设置最小宽度按钮,你会发现出现了一个Bug。负margin用作布局效果的确有其独到之处,但自身也有一个小的缺陷,即如果内部最后一个子元素使用负margin上移后,由于父元素是其边距元素,其实际高度由于内部子元素上移也会跟着变小。解决方式就是设置一个最小高度,最小高度值为较小的固定元素高度(此例即为左边固定的图片高度),就可彻底解决负margin上移影响父元素高度Bug。

CSS代码:

1

2

3

4

5

.demoLayout{width:500px; border:1px solid #aaa; background:#EEEEEE;}

.demoLayout .roundBox{padding:10px; min-height:170px; _height:170px;}

.demoLayout .demoShowPic img{padding:1px; border:1px solid #DAA520;}

.demoText{margin:-170px 0 0 215px;}

.demoLayoutBtn{margin:15px 0 0 0;}

HTML代码:

1

2

3

4

5

6

利用负margin制作自适应左右布局

结论:

根据上面的几个实例,相信你已经对负margin技术有了一个比较完整的理解。负margin不但可以做出一般CSS属性所不能达到的效果还能够化繁为简、化腐朽为神奇之奇效,当然负margin用到的地方不仅仅是这些,还有许多效果都是需要负margin技术来实现的,只要你耐心的去实践去探索,相信你会发现更多负margin用到得场合。

现如今,负margin技术的应用可谓越来越广,任一个大型站点惊鸿一瞥之下都会有其身影所在。个人认为负margin技术是学习css路上必不可缺少的课题之一,许多高级应用及疑难杂症修复都可以使用负margin技术进行实现。

负margin理论:

在说明什么是负margin之前,你得清楚margin是个啥么玩意,如果还不清楚可以先阅读本人的前一篇文章《不要告诉我你懂margin》,预补下知识,回头再读这篇文章,相信俩篇文章都能给你带来不少的收获。

为了形象、易懂的解释负margin,我们将引入W3C上没有的参考线的说法。何谓参考线?参考线就是 margin移动的基准点,此基准点相对于box(自身)是静止的。而margin的数值,就是box相对于参考线的位移量。

一个完整的margin属性是这么写的margin: top right bottom left;(eg: margin:10px 20px 30px 40px)。在margin属性中一共有两类参考线,top和left的参考线属于一类,right和bottom的参考线属于另一类。top和left是以外元素为参考,right和bottom是以元素本身为参考。margin的位移方向是指margin数值为正值时候的情形,如果是负值则位移方向相反。

上面段文字和图片或许挺难理解,我们来看实际代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

Margin参考线举例说明

example元素:margin参考线举例说明文字,请查看此元素由于margin的变化所移动的位移量。

一个普通的Box

来分析这段代码,example元素下方有一相邻元素normal(注:这里分析的是添加和删除margin后的example元素,normal元素仅作为example元素前后效果的参照)。

根据上文的参考线原理margin:-10px(top) 20px(right) -30px(bottom) 40px(left); 上-10px和左40px将以外元素为参考,所谓外元素就是本元素的边界元素(再白话点的解释就是元素的紧邻元素,这里涉及到containing block知识,可自行网上搜索)。example元素上边和左边的边界元素即为wrap父元素,wrap父元素为基准点,example的margin-top为-10px,想象下如果这里margin-top为+10px会什么情况,没错如果为+10px,example元素相对于wrap父元素边缘为基准,那么example元素会同wrap父元素10px产生间隙边距,那么反过来,margin-tip:-10px;还是与wrap父元素边缘为基准,反过来向上推10px的距离位置。example元素的margin-left为40px,这里就按照正常逻辑相隔40px边距,同理如果为-40px,那么就是反方向向左推进40px的距离位置。

再来看example元素的margin-right和margin-bottom,由上文得知这俩个值是以元素本身为参考。什么叫以元素本身为参考呢,确切含义是指以自身为参考来影响周围元素的位置(实质即为影响下边和右边相邻元素的参考线)。这里的margin-bottom为-30px,对于其自身位置没有任何变化,但是对于其下方元素normal元素产生了极大的影响,因为normal元素的上边界元素即为example元素,根据example元素边界来判定自身位置,想象下如果example元素margin-bottom为+30px,那么example元素将隔开下方的normal元素,反之为-30px,下方normal元素由于example参考线内凹,导致了normal元素自个儿身不由己的被“提”了上去了。这就是以自身为参考影响周围元素位置的含义。

这里梳理一下规律,当margin四个值都为正数值的话,那么margin按照正常逻辑同周围元素产生边距。当元素margin的top和left是负值时会引起元素的向上或向左位置移动。而当元素margin的bottom和right是负值时会影响右边和下边相邻元素的参考线。如果你再想深入了解参考线理论的话你也可访问由浅入深漫谈margin属性这篇文章。

负margin实战:

据我所知至今没有一套完整的关于负margin专题研究的文章。有也仅仅是偏理论或者偏实例,理论终究是理论,学以致用才是根本,而有了实例你还得知晓原理,授人鱼不如授人以渔。接下来我们将利用四个例子深入讲解负margin技术的应用领域。

负margin在Tab选项卡中的应用:

效果预览:

前端

实战

交互

优化

这是第四个选项卡的内容,据我所知至今没有一套完整的关于负margin专题研究的文章。有也仅仅是偏理论或者偏实例,理论终究是理论,学以致用才是根本,而有了实例你还得知道其原理,授人鱼不如授人以渔。这些都是文字文字文字文字文字。

核心分析:

如上面的这个Tab选项卡效果,最核心的就是下方俩行高亮部分代码,第二行的margin-bottom:-1px;使下方的正文部分向上“提”了1px的距离,从而达到了鼠标上移后选项卡白色遮住下方黑色边框的效果(注:由于IE不是符合W3C标准,所以当鼠标移到选项卡上时需要添加一个额外属性position:relative;来修复IE不覆盖下方边框的这个Bug)。第四行的margin-left:-1px;的目的是让四个选项卡向左移动1px的距离,达到左右都只有一条分割线的效果。

CSS代码:

1

2

3

4

5

6

7

8

9

.demoTab{width:400px; font:14px/1.5 Microsoft YaHei,verdana,Helvetica,Arial,sans-serif;}

.demoTab .demoTabHd{margin-bottom:-1px; border:1px solid #6C92AD; border-bottom:none; background:#EAF0FD;}

.demoTab .demoTabNav{height:28px; overflow:hidden; *zoom:1;}

.demoTab .demoTabList{float:left; margin-left:-1px;  padding:0 22px; line-height:28px; border-left:1px solid #6C92AD; border-right:1px solid #6C92AD;  font-weight:bold; color:#005590; text-align:center; cursor:pointer;}

.demoTab .demoTabList.current{position:relative; background:#fff;}

.demoTab .demoTabBd{border:1px solid #6C92AD;}

.demoTab .demoTabBd .roundBox{padding:15px;}

.demoTab .demoTabContent{display:none;}

.demoTab .demoTabContent.current{display:block;}

HTML代码:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

  • 前端
  • 实战
  • 交互
  • 优化

这是第一个选项卡的内容。

这是第二个选项卡的内容。

这是第三个选项卡的内容。

这是第四个选项卡的内容。

负margin负位移技术应用:

效果预览:

核心分析:

上面那个类似于商城热销商品邮戳效果其实也是由负margin实现的,把以往使用的relative/absolute这样的“危险”属性代替为相对“温和”的margin属性。核心在于小的邮戳图片利用负margin-top向上移动,达到类似absolute的叠加效果。

CSS代码:

1

2

3

4

.demoSpecItem{width:212px; min-height:178px; _height:178px;}

.demoSpecItem .demoItemPic{display:block; text-align:center;}

.demoSpecItem .demoItemPic img{padding:5px; border:1px solid #ccc;}

.demoSpecItem .demoIcon{display:block; margin:-185px 0 0 150px;}

HTML代码:

1

2

3

4

5

6

利用负margin制作鳞片式导航:

效果预览:

鳞片导航

前端开发

用户体验

实战为主

核心分析:

鳞片式导航可以说是使用负margin技术最佳场合之一。如上方的例子,试着想象不使用负margin,单纯的使用图片来制作这类鳞片式导航,想象下切图、定位、点击后图片切换、中间接壤部分的遮罩、维护开发的工作量,光想想这些就不寒而栗。而利用负margin这里仅仅添加一个margin-left即可达到前后遮盖的效果。

CSS代码:

1

2

3

4

5

6

.demoNav .demoList{float:left; width:154px; height:53px; margin:0 0 0 -20px;}

.demoNav .demoList.firstList{margin:0;}

.demoNav .demoList a{display:block; line-height:53px; padding:0 0 0 25px; color:#005590; background:url("flakeNavTab.png") left top no-repeat; font-weight:bold; text-decoration:none;}

.demoNav .demoList a:hover{background:url("flakeNavTabHover.png") left top no-repeat;}

.demoNav .demoList.current a{background:url("flakeNavTabCurrent.png") left top no-repeat;}

.demoNav .demoList.current a:hover{background:url("flakeNavTabCurrent.png") left top no-repeat;}/* fix ie6 hover issue */

HTML代码:

1

2

3

4

5

6

7

8

  • 鳞片导航
  • 前端开发
  • 用户体验
  • 实战为主

利用负margin制作自适应左右布局:

效果预览:

负margin能够替代float浮动布局,进行左右布局规划,并且拥有float所没有的自适应效果。你可以尝试点击变宽和变窄按钮来查看本例。现如今,负margin技术的应用可谓越来越广,任一个大型站点惊鸿一瞥之下都会有其身影所在。

核心分析:

如上例这类布局效果(左边一个固定图片,右边为内容),负margin能够替代float浮动布局,进行左右布局规划,并且拥有float所没有的自适应效果。你可以尝试点击变宽和变窄按钮来查看本例。你或许也发现了第三个“不设置最小宽度”按钮,这个是做什么用的呢?你可以使用标准浏览器查看上方例子,依次点击变宽按钮至宽度最大,再点击不设置最小宽度按钮,你会发现出现了一个Bug。负margin用作布局效果的确有其独到之处,但自身也有一个小的缺陷,即如果内部最后一个子元素使用负margin上移后,由于父元素是其边距元素,其实际高度由于内部子元素上移也会跟着变小。解决方式就是设置一个最小高度,最小高度值为较小的固定元素高度(此例即为左边固定的图片高度),就可彻底解决负margin上移影响父元素高度Bug。

CSS代码:

1

2

3

4

5

.demoLayout{width:500px; border:1px solid #aaa; background:#EEEEEE;}

.demoLayout .roundBox{padding:10px; min-height:170px; _height:170px;}

.demoLayout .demoShowPic img{padding:1px; border:1px solid #DAA520;}

.demoText{margin:-170px 0 0 215px;}

.demoLayoutBtn{margin:15px 0 0 0;}

HTML代码:

1

2

3

4

5

6

利用负margin制作自适应左右布局

结论:

根据上面的几个实例,相信你已经对负margin技术有了一个比较完整的理解。负margin不但可以做出一般CSS属性所不能达到的效果还能够化繁为简、化腐朽为神奇之奇效,当然负margin用到的地方不仅仅是这些,还有许多效果都是需要负margin技术来实现的,只要你耐心的去实践去探索,相信你会发现更多负margin用到得场合。


相关内容

  • 如何给现有的PDF文件添加页码
  • 如何给现有的PDF 文件添加页码 之前我写了如何打印PDF 文件,有人qq 问我怎样在打印时给PDF 文件添加页码,的确,给PDF 文件添加页码,可以帮助我们区分纸质档的PDF 文件页面的先后顺序,方便我们对它的阅读与管理.今天我就分享一下如何给PDF 文件添加页码的方法,该方法照例使用的是之前使用 ...

  • 4个你以为是中国祖传,其实是山寨外国的传说故事 
  • ? 图片来自网络 壹读微信号:yiduiread ortant; word-wrap: break-word !important; margin: 0px; padding: 0px;"> 在没有电视广播以前,更不要说互联网了,大部分人该怎么娱乐呢?答案就是"听故事&qu ...

  • ACCA 考点解析 - 财务报表分析
  • ACCA 考点解析 | 财务报表分析 财务报表分析 财务报表分析是F7的一个考点,F7考生不仅需要学会编报表,还要学会翻译报表.大部分同学对编报表和计算指标没什么问题,但对翻译报表还是有些问题的.一些考生在考试中只会解释指标是如何变化的,却不会去discuss 指标变化的背后的原因.这篇文章就是帮助 ...

  • 内联元素和块级元素
  • 一.行内元素与块级元素的基本概念 1. 块元素(block element): 块级元素生成一个元素框,(默认地)它会填充其父级元素的内容,旁边不能有其他元素.换句话说,他在元素框之前和之后生成了"分隔"符.我们最熟悉的HTML 元素是p 和div. 2. 内联元素(inline ...

  • 网页设计,旅游网站
  • 华东交通大学理工学院 课 程 设 计 报 告 书 所属课程名称 网页设计与制作课程设计 题 目 网站首页 分 院 电 信 分 院 专业班级 学 号 学生姓名 指导教师 程志平 2014年 1月 4日 目 录 第一章 绪论 ....................................... ...

  • 天猫费用明细英文版T-mall charge detail
  • Taobao mall charging standards Margin and charges 1. The margin Store on Taobao have to pay the margin, the margin is used for ensure the rule the sta ...

  • 网页设计总结
  • 用户名 密码 左边右对齐 右边左对齐 Html: 用户名: 密码: Css: dl{width:310px; margin-left:auto; margin-right:auto; } dt{margin:0px; width:100px; font-size:blod; 1.0 Transiti ...

  • 宽度自适应实现方法(转)
  • 宽度自适应实现方法(转) Posted on 2010-08-04 14:27 Kamfper 阅读(80) 评论(0)编辑收藏所属分类: (X )HTML+CSS 一.前言 在如今各个分辨率显示器N 足鼎立的时期,页面采用流动性布局(亦可称自适应布局)不失为一个好选择.当然,具体实现不是那么容易, ...

  • 天涯观察第258期:限购二三线城市房子,又一项蛮拧政策
  • 点击:2354  回复:34 作者:解传喜  发表日期:2011-7-16 14:04:00 回复 .ztpage {BORDER-RIGHT: #82a6c9 3px solid; PADDING-RIGHT: 5px; BORDER-TOP: #82a6c9 3px solid; PADDING ...