负margin的原理及应用
在很多布局中我们经常能够见到类似于margin:-10px;的用法,我们对正值的用法早已熟悉的不能再熟悉了,可是这负值到底有何用呢?听我给你吹。
负margin——普通文档流
普通文档流元素(不浮动,无绝对定位,无固定定位的元素)。如下图:
代码

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

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

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

从审查元素中可以看出设置后父元素的高度减小了10px,而且子元素内容溢出来了。
这就说明:在文档流中,元素的最终边界是由margin决定的,margin为负的时候就相当于元素的边界向里收,文档流认的只是这个边界,不会管你实际的尺寸是多少。
负margin left/right——对宽度的影响
对于没有宽度的块级元素,设置负margin值,会使块级元素变宽。
举个例子:父容器div设置宽度300px,子元素div不设置宽度,默认宽度为父容器的100%,如图5
代码

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

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

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

负边距对浮动元素的影响与负边距对文档流中元素的影响其实是差不多的。文档流中元素的位置由文档流的走向决定,浮动的元素也可以看成有一个“浮动流”存在,不过浮动流既可以向左,也可以向右。
负margin的具体应用
1. 圣杯布局和双飞翼布局
代码
这两种布局的具体实现就不再赘述,但是它们都是利用了负margin对浮动元素的影响这一特性实现的

2. 元素等间距排列
效果如下图:
代码

实现以上效果的步骤:
- 让li元素都浮动起来。这样li就会一个挨着一个排列了。
- 为每个li设置margin-right。这样每个li都会和右边的li有一个间距。
- 由于父容器的宽度是固定的,其宽度实际上是比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的原理及应用的更多相关文章
- 负margin的原理以及应用
负margin在布局中往往起到意想不到的效果,比如在多栏等高布局中就是用该技巧. 虽说网络上关于负margin的实践有很多,但对margin负值为什么会出现这样的效果却没有多少讲解,本篇的目的就是阐述 ...
- [转]关于负margin在页面中布局的应用
本文转载自:http://www.cnblogs.com/jscode/archive/2012/08/28/2660078.html. 今天再写一个布局的时候用到一个margin-top是负值的情况 ...
- 负值之美:负margin在页面布局中的应用
本文转载自:http://www.topcss.org/?p=94,有修改. 负数给人总是一种消极.否定.拒绝之感,不过有时利用负margin可以达到奇妙的效果,今天就表一表负值在页面布局中的应用.这 ...
- 负margin在页面布局中的应用
关于负margin的原理建议大家看看这篇文章:http://www.cnblogs.com/2050/archive/2012/08/13/2636467.html#2457812 一. 左右列固定, ...
- 探究负边距(negative margin)原理
W3C规范在介绍margin时有这样一句话: Negative values for margin properties are allowed, but there may be implement ...
- 负margin使用权威指南
自CSS2早在1998年,推荐表的使用已经慢慢褪色成背景和历史书中.正因为如此,CSS布局从那时起一直编码优雅的代名词. 的所有CSS概念设计师所使用,奖项可能需要给负margin的使用是最至少谈论的 ...
- 负margin新解
第一篇 我知道你不知道的负Margin 分类: Html/CSS | 转载请注明: 出自 海玉的博客 本文地址: http://www.hicss.net/i-know-you-do-not-know ...
- 我知道你不知道的负Margin
现如今,负margin技术的应用可谓越来越广,任一个大型站点惊鸿一瞥之下都会有其身影所在.个人认为负margin技术是学习css路上必不可缺少的课题之一,许多高级应用及疑难杂症修复都可以使用负marg ...
- 负margin应用案例几则(转载+总结)
(一)自适应布局——左栏改右栏 这里先写个一列固定列宽,另一列自适应的两列布局,效果图: 侧栏移至右边,效果图: 其HTML <div class="wrap"> &l ...
随机推荐
- oralce触发器
n 触发器的分类 DML(insert,delete,update)触发器 DDL(create table ,create view...drop...)触发器 系统触发器(与系统相关的触发器,比 ...
- QT语言翻译
QT中多语言的实现方式: 1.代码中tr运用 2.使用工具生成ts文件 3.翻译ts文件 4.生成qm文件 5.程序加载 以下内容程序加载时放入即可. QString appPath = QCoreA ...
- Chef 安装
http://www.tuicool.com/articles/RnAVn2 三个角色: chef server, chef workstation, chef nodes(chef clients) ...
- Hbuilder的使用技巧
/*注:本教程针对HBuilder5.0.0,制作日期2014-12-31*/创建HTML结构: h 8 (敲h激活代码块列表,按8选择第8个项目,即HTML代码块,或者敲h t Enter)中途换行 ...
- Implement strStr() 字符串匹配
Implement strStr(). Returns the index of the first occurrence of needle in haystack, or -1 if needle ...
- celery琐碎笔记
-l 指定日志等级 -n 指定任务名称 -Q 指定任务执行队列 -c 指定启动celery的cpu数量 --logfile 指定日志输出到文件,会输出任务函数里的print,而控制台不会,用于调试. ...
- Linux 中 grep 命令的 12 个实践例子
2017-10-17 Linux小管家 你是否遇到过需要在文件中查找一个特定的字符串或者样式,但是不知道从哪儿开始?那么,就请grep来帮你吧. grep是每个Linux发行版都预装的一个强有力的文件 ...
- jmeter循环和计数器
- 日志 5.27 关于AssetBundle
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zxsean/article/details/27228783 大概日志就这么写的吧.没什么太专业的东 ...
- python selenium 测试 LOG
1.首先在根目录中新建一个Logs文件夹,写入文件 2.在framework文件夹中写入logger.py 3.在testsuits文件夹中写入test_log.py logger.py # _*_ ...