负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教程(59) tessellation学习(1)
			
原文:Directx11教程(59) tessellation学习(1) 在D3D11管线中,新增加了3个stage, Hull shader, Tessellator, Domain s ...
 - ios开发使用Basic Auth 认证方式
			
http://blog.csdn.net/joonchen111/article/details/48447813 我们app的开发通常有2种认证方式 一种是Basic Auth,一种是OAuth ...
 - Sublime text 3 如何格式化HTML/css/js代码
			
Sublime Text 3 安装Package Control 原来Subl3安装Package Control很麻烦,现在简单的方法来了 一.简单的安装方法 使用Ctrl+`快捷键或者通过Vi ...
 - 利用backtrace和ucontex定位segment错误
			
C程序运行时,经常会碰到"segmentfault"错误.这是由于程序中非法访问内存导致的.当操作系统的内存保护机制发现进程访问了非法内存的时候会向此进程发送一个SIGSEGV信号 ...
 - HZOJ trade
			
强烈谴责$skyh$的没$\Huge 脸$行为. 很经典的可反悔贪心,然而我一直以为是sbdp还一直想着怎么优化…… 正常的贪心肯定是不对的. 但是由于A-C=A-B+B-C, 所以用一个小根堆维护, ...
 - javascript —— 禁止通过 Enter 键提交表单
			
$('btn').on('keydown', function () { return false; })
 - 一维数组的初始化及遍历  Day06
			
package com.sxt.arraytest1; import java.util.Arrays; /* * 一维数组 */ public class ArrayTest2 { public s ...
 - Laravel 的HTTP请求#
			
获取请求# 要通过依赖注入的方式来获取当前HTTP请求的实例,你应该在控制器方法中类型提示Illuminate\Http\Request 传入的请求的实例通过 服务容器自动注入: <?php n ...
 - poj1741 树上距离小于等于k的对数 点分治 入门题
			
#include <iostream> #include <stdio.h> #include <string.h> #include <algorithm& ...
 - 很奇怪的问题(Chrome)
			
<p>感觉这个问题跟Chrome浏览器本身的一些策略有关.</p> 在我写完登录页面后 准备美滋滋的登录验证下的时候,确一直卡在数据获取上了,查看NetWork,发现是Chro ...