负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 ...
随机推荐
- Directx11教程(43) 纹理映射(13)-动态纹理映射
原文:Directx11教程(43) 纹理映射(13)-动态纹理映射 本篇教程中,我们将在前面基于光照的地形与水面程序里面加上纹理映射,而且我们会基于时间动态改变水面的纹理坐标,实现水面纹理 ...
- python之浮点型类型
浮点型:float 如3.14,2.88 class float(object): """ float(x) -> floating point number Co ...
- Oracle SQL——如何用一个表的数据更新另一个表中的数据
背景 一次处理数据的过程中,需要将表A(源表)的数据更新到表B(目标表)中 前提 两张表一定要有关联字段 使用关联字段联查两张表时,两张表关系必须满足条件:目标表和源表的表间关系一定是多对一或者一对一 ...
- nodeJs学习-09 模板引擎 jade、ejs
模板引擎: jade -破坏式.侵入式,强依赖:用了之后不能随便用别的引擎 ejs - 温和.非侵入时.弱依赖 jade使用 const jade = require('jade'); var str ...
- iOS小技巧:用runtime 解决UIButton 重复点击问题
http://www.cocoachina.com/ios/20150911/13260.html 作者:uxyheaven 授权本站转载. 什么是这个问题 我们的按钮是点击一次响应一次, 即使频繁的 ...
- 使用UITextView的dataDetectorTypes实现超链接需要注意的事项!
项目中需要在UITextView上识别URL,手机号码.邮箱地址等等信息.那么就用到了它的dataDetectorTypes属性.我的UITextView加在UITableViewCell上面的,当单 ...
- 《mysql必知必会》4笔记(存储过程、游标、触发器、事务、全球化本地化、权限、数据库维护、性能)
二十三:使用存储过程: 1:mysql 5添加了对存储过程的支持.很多时候,一个完整的操作需要多条语句才能完成.存储过程简单来说,就是为以后的使用而保存的一条或多条mysql语句的集合,可将其视为批文 ...
- 微信小程序入门到实战(1)-基础知识
1.微信小程序介绍 微信小程序,简称小程序,英文名Mini Program,是一种不需要下载安装即可使用的应用,它实现了应用“触手可及”的梦想,用户扫一扫或搜一下即可打开应用. 1.1. 为什么是微信 ...
- vue-quill-editor 封装成组件;图片文件流上传;同一页面多个编辑器样式异常解决办法
使用方法: 引入并注册组件,然后直接使用: @getcode是同步获取编辑器内容的::contentDefault是编辑器的默认内容: 注意:如果同一个页面多个编辑器,参数id不能相同,否则只有第一个 ...
- Microsoft.SQL.Server2012.Performance.Tuning.Cookbook学习笔记(一)
一.Creating a trace or workload 注意点: In the Trace Properties dialog box, there is a checkbox option i ...