负margin在布局中往往起到意想不到的效果,比如在多栏等高布局中就是用该技巧。

  虽说网络上关于负margin的实践有很多,但对margin负值为什么会出现这样的效果却没有多少讲解,本篇的目的就是阐述负margin

产生或者作用的原因。

  margin负值之所以可以修改元素在文档流中的位置,也可以改变元素的宽度,主要因为一个公式:

    BoxWidth =ChildMarginLeft + ChildBorderLeftWidth + ChildPaddingLeft + ChildWidth + ChildPaddingLeft + ChildBorderRightWidth + ChildMarginRightWidth;

  上述公式很容易理解,熟悉box模型的都应该明白。

  margin负值之所以起到了意想不到的作用,主要是因为该公式的各种计算导致了一些属性值的改变所引起。

  口说无凭,先举几个例子:

  ex1.

 1 .m-20{margin-bottom: -20px;}
2 .m-200{margin-bottom: -200px;}
3 .l{float:left;}
4 .h200{height:200px;}
5 .m-20{margin-bottom:-20px;}
6 .m-200{margin-bottom:-200px;}
7
8
9 <div class="l pct40 bg-gray mr20">
10 <div class="h200 m-20 bg-teal pct40"></div>
11 </div>
12 <div class="l pct40 bg-gray">
13 <div class="h200 m-200 bg-teal pct40"></div>
14 </div>

  

第一个父div的子元素margin-bottom设为-20px;根据上述公式,由于子元素的height是定值,为200px,padding为0,带入可得ParentHeight=180px;正如图显示。

第二个父div的子元素margin-bottom设为-200px,同理可得ParentHeight= 0px,图上并没有显示。

ex2.

.eqh{padding-bottom: 220px;margin-bottom: -200px;}
.ovh{overflow:hidden;}
.cl{clear:both;} <div class="cl w500 mt20 l ovh">
<div class="l w200 bg-silver mr20 eqh">
<p>这是一个测试题
这是一个测试题
这是一个测试题
这是一个测试题
</p>
</div>
<div class="l w200 bg-silver eqh">
<p>这是一个测试题
这是一个测试题
这是一个测试题
这是一个测试题
这是一个测试题
这是一个测试题
这是一个测试题
这是一个测试题这是一个测试题
这是一个测试题
这是一个测试题
这是一个测试题
</p>
</div>
</div>

  

这就是margin负值应用最多的场景,多栏等高布局,总共2个子div,第一个子div的padding-bottom撑开子div的高度--两行文字高度为38px,padding的高度为220px,所以第一个子元素高度为258px,在不考虑第二个子div存在的情况下,父div高度=258-200-0-0-0-0-0=58px;

再计算第二个div,同样的公式,只是带入的数值不同,此时第二个子div的高度为334px,在考虑margin-bottom为-200px的情况,计算出父div高度=334-200=134px;

此后将计算结果综合,父div高度取最大值,为134px,这就是最后的浏览器呈现给我们的视图。

有些人会发现当元素的width属性设置为auto,或者不设置width时,margin-left或者margin-right为负值可能改变元素的大小,这种说法不严谨。

老方法,还是根据上述万能公式,左右margin的值(不论正负),在其父元素宽度(即ParentWidth)给定的情况下,会根据margin值的改变,来响应改变元素的width值,有些类似所谓的控制变量法!

另,现比较另外一个属性,vertical-align:-2px 与margin-bottom:-2px的区别所在。

对于vertical-align,我们主要用来元素的居中显示,很少用具体的值。但是有些情况,vertical-align的负值会有出其不意的效果。

二话不说,先上个demo:

  .m-200{margin-bottom: -200px;}
  .v-200{vertical-align: -200px;}

 <div class="l pct40 bg-gray mr20">
<div class="h200 v-200 bg-teal pct40"></div>
</div>
<div class="l pct40 bg-gray">
<div class="h200 m-200 bg-teal pct40"></div>
</div>

  

第一个div中,蓝色子元素采用了vertical-align:-200px,父元素高度和子元素相同;

第二个div中,蓝色子元素采用margin-bottom: -200px,父元素高度为0;

现在改变变量,将数值改为-20px,再看看:

可以明显看到,第一个div,子元素和父元素高度仍然相同,第二个div,父子元素不同,但仍满足上面的万能公式。

由此可以看出,通过vertical-align负值设置子元素,其呈现的位置和设置margin-bottom负值相同,不同点在于父元素框。

通过vertical-align负值设置的子元素的父元素的大小会增加,切不满足万能公式,而通过margin-bottom负值设置的子元素的父元素高度满足万能公式。

一言以蔽之,vertical-align会撑开父元素,而margin-bottom相应的根据上述公式计算会减小其高度。

负margin的原理以及应用的更多相关文章

  1. 负margin的原理及应用

    在很多布局中我们经常能够见到类似于margin:-10px;的用法,我们对正值的用法早已熟悉的不能再熟悉了,可是这负值到底有何用呢?听我给你吹. 负margin——普通文档流 普通文档流元素(不浮动, ...

  2. [转]关于负margin在页面中布局的应用

    本文转载自:http://www.cnblogs.com/jscode/archive/2012/08/28/2660078.html. 今天再写一个布局的时候用到一个margin-top是负值的情况 ...

  3. 负值之美:负margin在页面布局中的应用

    本文转载自:http://www.topcss.org/?p=94,有修改. 负数给人总是一种消极.否定.拒绝之感,不过有时利用负margin可以达到奇妙的效果,今天就表一表负值在页面布局中的应用.这 ...

  4. 负margin在页面布局中的应用

    关于负margin的原理建议大家看看这篇文章:http://www.cnblogs.com/2050/archive/2012/08/13/2636467.html#2457812 一. 左右列固定, ...

  5. 探究负边距(negative margin)原理

    W3C规范在介绍margin时有这样一句话: Negative values for margin properties are allowed, but there may be implement ...

  6. 负margin使用权威指南

    自CSS2早在1998年,推荐表的使用已经慢慢褪色成背景和历史书中.正因为如此,CSS布局从那时起一直编码优雅的代名词. 的所有CSS概念设计师所使用,奖项可能需要给负margin的使用是最至少谈论的 ...

  7. 负margin新解

    第一篇 我知道你不知道的负Margin 分类: Html/CSS | 转载请注明: 出自 海玉的博客 本文地址: http://www.hicss.net/i-know-you-do-not-know ...

  8. 我知道你不知道的负Margin

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

  9. 负margin应用案例几则(转载+总结)

    (一)自适应布局——左栏改右栏 这里先写个一列固定列宽,另一列自适应的两列布局,效果图: 侧栏移至右边,效果图: 其HTML <div class="wrap"> &l ...

随机推荐

  1. 关于i和j

    算法课无聊随手写了段c代码,发现了个问题,就要下课了,先记一下 for(int i = 0; i < 100; i ++) for(int j = 0; j < 100000; j ++) ...

  2. js,css控制网页内容不让选中和复制

    ---恢复内容开始--- JS, CSS控制网页内容不让选择和复制 CSS 控制: <style> body{ -moz-user-select:none;//针对火狐浏览器,谷歌则-we ...

  3. Smart3D系列教程4之 《案例实战演练1——小物件的照片三维重建》

    一.前言 Wish3D出品的Smart3D系列教程已经推出3讲了,分别是关于倾斜摄影三维建模原理应用.照片采集技巧.Smart3D各个功能模块的作用,它们都是围绕Smart3D建模软件进行的讲解.那么 ...

  4. C# 开源组件--Word操作组件DocX

    使用模版生成简历 读写表格数据 合并单元格 工具源代码下载 学习使用 使用模版生成简历 下面将以一个简历实例来讲解DocX对表格的操作,先看看生成的效果 private static void Cre ...

  5. 如何让用户只能访问特定的数据库(MSSQL)

    背景 客户的SQL Server实例上有多个厂商的数据库,每个数据库由各自的进行厂进行商维护, 为了限定不同厂商的维护人员只能访问自己的数据库,现需要给各个厂商限定权限,让他们登录SQL Server ...

  6. 在Visual Studio上开发Node.js程序(2)——远程调试及发布到Azure

    [题外话] 上次介绍了VS上开发Node.js的插件Node.js Tools for Visual Studio(NTVS),其提供了非常方便的开发和调试功能,当然很多情况下由于平台限制等原因需要在 ...

  7. Android APK是否需要预解压

    今天在逛论坛的时候,发现有一个朋友问的问题.其主要目的,是想实现 玩家首次进入游戏的时候,或者新安装了版本的时候,对APK进行解压,写入SD卡.这样游戏运行过程中,将不会再从APK中读取资源. 以提高 ...

  8. 为jQuery添加Webkit的触摸方法支持

    前些日子收到邮件,之前兼职的一个项目被转给了其他人,跟进的人来问我相关代码的版权问题. 我就呵呵了. 这段代码是我在做13年一份兼职的时候无聊加上去的,为jQuery添加触摸事件的支持.因为做得有点无 ...

  9. ASP.NET MVC 5 - 控制器

    MVC代表: 模型-视图-控制器 .MVC是一个架构良好并且易于测试和易于维护的开发模式.基于MVC模式的应用程序包含: · Models: 表示该应用程序的数据并使用验证逻辑来强制实施业务规则的数据 ...

  10. SSH实战 · SSH项目中怎么玩验证码

    大致思路与之前servlet中玩验证码类似,生成随机数,产生干扰线,画到图片上,保存到session中. 本人习惯用的时候专门写一个验证码的action:CheckImgAction. step1: ...