在很多布局中我们经常能够见到类似于margin:-10px;的用法,我们对正值的用法早已熟悉的不能再熟悉了,可是这负值到底有何用呢?听我给你吹。

负margin——普通文档流

普通文档流元素(不浮动,无绝对定位,无固定定位的元素)。如下图:
代码

 
图1

负边距会使这些文档流中的元素发生位置偏移,但不同于相对定位的偏移,相对定位的偏移会保留原来的位置,后面的元素不会去占据原有位置。负边距就恰恰相反,使用了负边距的元素不仅会去占别人的地方,自己的地方也会被别人霸占。对图1中box2设置
margin:-10px;,效果如下:

 
图2

box2左边好像嵌入了浏览器边框,上面盖住了box1,下面被box2盖住了。这就好像负margin改变了box2在文档流中占据的空间大小,使得后面的元素流动了上来。
还要注意的是,文档流只能是后面的流向前面的,即文档流只能向左或向上流动,不能向下或向右移动。
再举一个例子:
代码
父容器不设置高度,高度由子容器撑开,当子容器设置上下负margin时,父容器高度减小。
如图3是设置负margin前的效果:

 
图3

如图4是设置负margin后的效果:

 
图4

从审查元素中可以看出设置后父元素的高度减小了10px,而且子元素内容溢出来了。
这就说明:在文档流中,元素的最终边界是由margin决定的,margin为负的时候就相当于元素的边界向里收,文档流认的只是这个边界,不会管你实际的尺寸是多少。

负margin left/right——对宽度的影响

对于没有宽度的块级元素,设置负margin值,会使块级元素变宽。
举个例子:父容器div设置宽度300px,子元素div不设置宽度,默认宽度为父容器的100%,如图5
代码

 
图5

当为子元素设置margin-left:-100px;时,如图6,可以看出子元素伸出了父元素,宽度变成了400px。

 
图6

负margin——浮动元素

利用负margin值可以使因空间不够被挤到下一行的浮动元素重新上去。
举个例子:父容器宽度280px,包含三个设置了左浮动宽度都为100px的div,由于宽度不够第三个浮动元素只能在第二行显示,如图7

 
图7

为第二行元素设置margin-left:-20px;会使其重新上到第一行,但是会遮挡一部分巧克力色的元素,如图8所示。

 
图8

负边距对浮动元素的影响与负边距对文档流中元素的影响其实是差不多的。文档流中元素的位置由文档流的走向决定,浮动的元素也可以看成有一个“浮动流”存在,不过浮动流既可以向左,也可以向右。

负margin的具体应用

1. 圣杯布局和双飞翼布局

代码
这两种布局的具体实现就不再赘述,但是它们都是利用了负margin对浮动元素的影响这一特性实现的

 
图9

2. 元素等间距排列

效果如下图:
代码

 
图10

实现以上效果的步骤:

  1. 让li元素都浮动起来。这样li就会一个挨着一个排列了。
  2. 为每个li设置margin-right。这样每个li都会和右边的li有一个间距。
  3. 由于父容器的宽度是固定的,其宽度实际上是比3个li的宽度+2个margin-right的宽度,多以我们必须去掉最右边一列的所有li的宽度,才能使父容器一行刚好包裹3个li和2个空隙。我们可以给右边一列的所有li用选择器都去掉边框,但是这种方法很麻烦,而且如果遇到各个li是动态变化的时候,就更难处理了。这时,负边距就有用了。我们只需要为ul添加一个margin-right:-20px;,就完美解决问题。
    你可能会问负边距怎么把li的右边距变没了,其实并没有,只是负边距让ul变宽了。
    ul的width=3个li的宽度+3个margin-right=360px;
    wrapper的width=3个li的宽度+2个marign-right的宽度=340px;
    事实上ul是溢出wrapper的,溢出部分就是我们不需要的右边那列的右边距,我们只需要给wrapper加一个overflow:hidden就可以啦。

3. 负边距+绝对定位,实现水平垂直居中

代码
效果如下图:

 

作者:朱小维
链接:https://www.jianshu.com/p/487d131537b4
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

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

  1. 负margin的原理以及应用

    负margin在布局中往往起到意想不到的效果,比如在多栏等高布局中就是用该技巧. 虽说网络上关于负margin的实践有很多,但对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. Mybatis中example类的使用

    要使用example类,先要在项目中导入mybatis.mapper的jar包. Mapper接口中包含了单表的增删改查以及分页功能. 给出实例: CountryMappermapper = sqlS ...

  2. Linux平时常用命令_查看进程_监控日志等命令

    1.查进程     ps命令查找与进程相关的PID号:    ps a 显示现行终端机下的所有程序,包括其他用户的程序.    ps -A 显示所有程序.    ps c 列出程序时,显示每个程序真正 ...

  3. python 初始化init方法

  4. 【JZOJ4841】【NOIP2016提高A组集训第4场11.1】平衡的子集

    题目描述 夏令营有N个人,每个人的力气为M(i).请大家从这N个人中选出若干人,如果这些人可以分成两组且两组力气之和完全相等,则称为一个合法的选法,问有多少种合法的选法? 数据范围 40%的数据满足: ...

  5. [Java]ssh网上商城总结 标签: hibernatessh 2016-05-15 21:03 1099人阅读 评论(32)

    前几日敲完了ssh网上商城,虽然现在已经敲完了整个系统,却发现自己对于ssh,了解的一点都不多,什么是struts2,什么是spring,什么是hibernate,自己都是稀里糊涂,然后看了一下后面的 ...

  6. POJ-3026_Borg Maze

    Borg Maze Time Limit: 1000MS Memory Limit: 65536K Description The Borg is an immensely powerful race ...

  7. AtCoder Grand Contest 019 B - Reverse and Compare【思维】

    AtCoder Grand Contest 019 B - Reverse and Compare 题意:给定字符串,可以选定任意i.j且i<=j(当然i==j时没啥卵用),然后翻转i到j的字符 ...

  8. mysql 查询当天、昨天、本周、上周、本月、上月、今年、去年数据

    mysql查询今天.昨天.7天.近30天.本月.上一月 数据 今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 昨天 SELECT ...

  9. 2019-7-20-win10-uwp-使用-msbuild-命令行编译-UWP-程序

    title author date CreateTime categories win10 uwp 使用 msbuild 命令行编译 UWP 程序 lindexi 2019-07-20 21:56:2 ...

  10. LeetCode80 Remove Duplicates from Sorted Array II

    题目: Follow up for "Remove Duplicates":What if duplicates are allowed at most twice? (Mediu ...