CSS中负边距(nagative margin)是布局中常常使用的一个技巧。仅仅要运用得当时常会产生奇异的效果。勘称CSS中的奇淫巧计,非常多CSS布局方法都依赖于负边距。掌握它对于前端童鞋来说还是非常重要的。

一、原理

文档流

百度百科中的定义:文档流是文档中可显示对象在排列时所占用的位置。将窗口自上而下分成一行行, 并在每行中按从左至右的顺序排放元素,即为文档流。

(自己的理解是从头到尾依照文档的顺序,该在什么位置就在什么位置,也能够依照上面的意思理解,自上而下,自左到右的顺序)

那些没有脱离文档流的元素(指不是浮动元素也不是绝对定位、固定定位的元素等),其在页面中的位置是尾随者文档流的变化而变化的。看以下这幅图:

负边距对这些由文档流控制的元素的作用是,会使它们在文档流中的位置发生偏移,但这样的偏移不同于相对定位。通过相对定位偏移后,其仍然会坚守着它原来占领的空间,不会让文档流的其他元素乘虚而入。而通过负边距进行偏移的元素,它会放弃偏移前占领的空间,这样它后面文档流中的其他元素就会“流”过来填充这部分空间。还是通过样例来说明吧。如今我们把上图中的块状元素、行内元素以及inline-block元素都设一个负边距 margin:-10px; 看看会发生什么:

具体发生了什么变化自己体会体会,负的边距好像能减小元素在文档流中的尺寸一样,但其实。它的尺寸大小并没变,仅仅是文档流在计算元素位置的时候。会觉得负边距把元素的尺寸减小了。因此位置也就发生变化了。

所以,一切仅仅要是由文档流决定的东西,负边距就能起作用了。

总之中的一个句话,在文档流中,元素的终于边界是由margin决定的。margin为负的时候就相当于元素的边界向里收,文档流认的仅仅是这个边界。不会管你实际的尺寸是多少。

负边距对元素宽度的影响

负边距不仅能影响元素在文档流中的位置,还能添加元素的宽度!这个作用能实现的前提是:该元素没有设定width属性(当然width:auto是能够的)。

比方下图的绿色部分是一个块状元素,它没有设定宽度。它被包裹在一个宽度为400px。且水平居中的父元素中。

如今给这个元素的设一个margin-right:-100px;

我们看到它的宽度的确变长100px;然后再给它设一个margin-left:-100px;

我们看到它变得更宽了。

怎么理解呢?子块状元素的宽度设置为width:auto;或者不设置(默认width:auto;)的时候,是会依据其margin边界来填充父元素的,若正常设置为margin:100px;那么子元素的宽度必定减小200px;反之若设置margin:-100px;那么其为了正常填充整个父元素其宽度须要添加200px。

二、应用

1、左右列固定。中间列自适应布局

此例适用于左右栏宽度固定。中间栏宽度自适应的布局。因为网页的主体部分一般在中间,非常多网页都须要中间列优先载入。而这样的布局刚好满足此需求。

CSS:

    body{
margin: 0;
padding: 0;
min-width: 600px;
}
.container{
width: 100%;
float: left;
}
.main{
margin: 0 210px;
background-color: #1B6540;
height: 200px;
}
.left,.right{
float: left;
width: 200px;
height: 200px;
background-color: #4FA46B;
}
.left{
margin-left: -100%;
}
.right{
margin-left: -200px;
}

HTML:

    <div class="container">
<div class="main">
main
</div>
</div>
<div class="left">
left
</div>
<div class="right">
right
</div>

效果:

2、去掉列表右边框

项目中常常会使用浮动列表展示信息。为了美观通常为每一个列表之间设置一定的间距(margin-right),当父元素的宽度固定式,每一行的最右端的li元素的右边距就多余了,去除的方法一般是为最右端的li加入class,设置margin-right:0; 这样的方法须要动态推断为哪些li元素加入class,麻烦!

。!利用负margin就能够实现以下这样的效果:

CSS:

    *{
padding: 0;
margin: 0;
}
ul,li{
list-style: none;
}
.test{
width: 320px;
margin: 20px auto;
background-color: #1B6540;
}
.test ul{
margin-right: -10px;
}
.test ul li{
float: left;
width: 100px;
height: 100px;
background-color: #4FA46B;
margin-right: 10px;
margin-bottom: 10px;
}
.clearfix:after{
content: "";
height: 0;
display: block;
clear: both;
}

HTML:

    <div class="test clearfix">
<ul>
<li>子元素1</li>
<li>子元素2</li>
<li>子元素3</li>
<li>子元素4</li>
<li>子元素5</li>
<li>子元素6</li>
</ul>
</div>

效果:

3、负边距配合绝对定位水平垂直居中

这个前提条件是已知子元素的宽高。

CSS:

    .container{
width: 500px;
height: 500px;
margin: 20px auto;
background-color: #1B6540;
position: relative;
}
.inner{
width: 200px;
height: 200px;
position: absolute;
left: 50%;
top: 50%;
margin-left: -100px;
margin-top: -100px;
background-color: #4FA46B;
}

HTML:

    <div class="container">
<div class="inner"> </div>
</div>

4、多列等高

此例关键是给每一个框设置大的底部内边距,然后用数值类似的负外边距消除这个高度。

这会导致每一列溢出容器元素,假设把外包容器的overflow属性设为hidden,列就在最高点被裁切。

CSS:

    *{
padding: 0;
margin: 0;
}
.container{
overflow: hidden;
width: 500px;
margin: 20px auto;
}
.left,.mid,.right{
margin-bottom: -200px;
padding-bottom: 200px;
}
.left {
float: left;
width: 100px;
background: #4FA46B;
}
.mid {
float: left;
width: 300px;
background: #1B6540;
}
.right {
float: right;
width: 100px;
background: #4FA46B;
}
p {color: #FFF;text-align: center}

HTML:

    <div class="container">
<div class="left">
<p style="height:50px">height:50px</p>
</div>
<div class="mid">
<p style="height:100px">height:100px</p>
</div>
<div class="right">
<p style="height:200px">height:200px</p>
</div>
</div>

效果:

5、去除列表最后一个li元素的border-bottom

列表中我们常常会加入border-bottom值,最后一个li的border-bottom往往会与外边框重合,视觉上不雅观。往往要移除。

CSS:

    *{padding: 0;margin: 0;}
ul,li{list-style: none;}
.container{
width: 500px;
margin: 20px auto;
background-color: #84D0AA;
border: 3px solid #FF6798;
z-index: 999;
overflow: hidden;
}
ul li{
height: 30px;
line-height: 30px;
border-bottom: 1px dotted #fff;
padding: 5px;
margin-bottom: -1px;
}

HTML:

    <div class="container">
<ul>
<li>Test</li>
<li>Test</li>
<li>Test</li>
<li>Test</li>
<li>Test</li>
</ul>
</div>

效果:

注意:当中具有边框的父元素假设不加overflow:hidden;会导致出现边框与子元素li标签的边框重叠的情况,例如以下:

我相信这个微小的瑕疵会逼死无数像我这样的强迫症患者..

具体资源能够參考:The Definitive Guide to Using Negative Margins

有什么好的问题或者资源欢迎补充

CSS艺术之---负margin之美的更多相关文章

  1. css布局之负margin妙用及其他实现

    相信大家在项目的开发中都遇到过这样的需求,一行放X(X>1)个块且相邻块之间的间距相同. 大概就是上面这个样子,下面介绍几种实现的方式. 1.负margin大法 设置好元素的宽度和留白占满父级的 ...

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

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

  3. CSS负margin的影响

    原文 简书原文:https://www.jianshu.com/p/87677fd2ea34 相关文章: CSS负边距margin的应用:https://www.cnblogs.com/shcrk/p ...

  4. css中的负边距

    css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果.很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的. ...

  5. 负margin在布局中的运用(*****************************************************************)

    一.左右栏宽度固定,中间栏宽度自适应 <!DOCTYPE html> <html> <head lang="en"> <meta char ...

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

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

  7. 负MARGIN之讲解

    css中的负边距(negative margin)是布局中的一个常用技巧,只要运用得合理常常会有意想不到的效果.很多特殊的css布局方法都依赖于负边距,所以掌握它的用法对于前端的同学来说,那是必须的. ...

  8. 负margin使用权威指南

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

  9. 负margin新解

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

随机推荐

  1. Win10,JDK8,tomact7.0.85配置

    今天在win10上配置了jdk以及tomact先前使用jdk7+tomact7.0.56运行失败. 后经调整后正确配置注意事项如下: 1.下载并按照jdk-8u161-windows-x64,默认安装 ...

  2. Mysql数据库系列

    详情点击 MySQL基础 Mysql表操作 Mysql插入 更新 删除 查询操作 Mysql创建用户和授权 基本的Mysql语句 Mysql库的操作 Mysql表的操作 Mysql数据类型(一) My ...

  3. POJ 2230 DFS

    题意: Bessie 最近做了农场看守,他每天晚上的工作就是巡视农场并且保证没有坏人破坏农场.从谷仓出发去巡视,并且最终回到谷仓. Bessie 视力不是很好,不能像其他农场的看守一样,对农场的每一条 ...

  4. POI合并单元边框问题解决方法

    http://blog.csdn.net/hardworking0323/article/details/51105430

  5. KindEditor文本编辑框的实现

    效果图: kindeditor 是一个插件 下载地址: https://files-cdn.cnblogs.com/files/lxnlxn/kindeditor.zip 解压后将其放在项目的js文件 ...

  6. 5.29MyBatis Generator

    二.MyBatis Generator CRUD(创建,检索,更新,删除) 与表结构匹配的Java POJO BLOB (binary large object),二进制大对象,是一个可以存储二进制文 ...

  7. java编程基础篇-------> 从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度。如果是 12 月、1 月、2 月,就属于冬季。

    从键盘输入一位整数,代表月份,编程判断指定月份属于一年中的哪个季度.如果是 12月.1 月.2 月,就属于冬季:如果是 3 月.4 月.5 月,就属于春季:如果是 6 月.7 月.8 月,就属于夏季: ...

  8. mssql server 2005自动备份数据库

    (转) (1)启动[sql server Management Studio],在[对象资源管理器]窗口里选择[管理]——[维护计划]选项. 2)右击[维护计划],在弹出的快捷菜单里选择[维护计划向导 ...

  9. tee

    功能说明:把数据重定向到给定文件和屏幕上.   参数选项: -a  向文件追加内容,而不是覆盖.   tee命令允许标准输出同时把内容写入(覆盖)到文件中的实践.   tee命令允许标准输出同时把内容 ...

  10. HTML input 控件

    <input type="file" id="file1" onChange="test()"> function test() ...