1、外边距叠加

外边距叠加是指两个垂直外边距相遇时,这两个外边距会合并成一个外边距,就是二变一,关键是叠加后的外边距会取值两个外边距最大的那个;

例子如下:创建A、B两个盒子,A定义一个margin-bottom:30px;B定义一个margin-top:20px

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>探讨margin叠加</title>
<style type="text/css">
.s1{
width: 100px;
height: 100px;
background-color: red;
margin-bottom: 30px;
}
.s2{
width: 100px;
height: 100px;
background-color: blue;
margin-top: 20px;
}
</style>
</head>
<body>
<div class="s1"></div>
<div class="s2"></div>
</body>
</html>

结果

发现他们之间的外边距明显小于 两个之间的和,这个就是外边距叠加造成的效果

对于外边距叠加我们分三种情况讨论:

1、同级元素

2、父子元素

3、空元素

着重说下空元素:

当一个空元素有上下边距是,如果没有border或padding,则元素上边距与下边会发生合并

注意一下几点:

1、水平外边距永远不会发生叠加,水平外边距指的是:margin-left、margin-right

2、垂直外边距只有以上三种情况会发生叠加,垂直外边距指的是:margin-top、margin-bottom

3、外边距叠加后的值是两个垂直外边距最大的那个

4、外边距叠加针对的是block以及inline-block,不包括内联元素,因为margin对内联元素无效

负margin技术

当margin为负数的时候,对普通文档流和浮动元素的而影响是不一样的。

负margin对普通文档流的影响分两种

1、当元素的margin-left和margin-top为负数的时候,“当前元素”会被拉向指定位置

(就是你设置的这个盒子按你指定方向被拉出)

2、当元素的margin-right和margin-bottom为负数的时候,“后续元素”会被拉进来

(就是你的盒子会把旁边的邻居拉进来,覆盖在当前元素)

举例margin-top和margin-bottom

这是没有设置margin的代码

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>探讨margin叠加</title>
<style type="text/css">
.s1{
width:100px;
height: 300px;
}
.m1{
width: 100px;
height: 100px;
background-color: red; }
.m2{
height: 100px;
background-color: yellow; }
.m3{
height: 100px;
background-color: green;
} </style> </head>
<body>
<div class="s1">
<div class="m1">A</div>
<div class="m2">B</div>
<div class="m3">C</div> </div>
</body>
</html>

结果:

设置margin-top为负数后

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>探讨margin叠加</title>
<style type="text/css">
.s1{
width:100px;
height: 300px;
}
.m1{
width: 100px;
height: 100px;
background-color: red; }
.m2{
height: 100px;
background-color: yellow;
margin-top: -50px;
}
.m3{
height: 100px;
background-color: green;
} </style> </head>
<body>
<div class="s1">
<div class="m1">A</div>
<div class="m2">B</div>
<div class="m3">C</div> </div>
</body>
</html>

看见B把自己拉出去了,覆盖住元素A

我们再设置B的margin-bottom为负数

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>探讨margin叠加</title>
<style type="text/css">
.s1{
width:100px;
height: 300px;
}
.m1{
width: 100px;
height: 100px;
background-color: red; }
.m2{
height: 100px;
background-color: yellow;
margin-bottom: -50px;
}
.m3{
height: 100px;
background-color: green;
} </style> </head>
<body>
<div class="s1">
<div class="m1">A</div>
<div class="m2">B</div>
<div class="m3">C</div> </div>
</body>
</html>

这时候B把它的后续元素C拉进来,覆盖住它自己

可以同样去实验margin-left和margin-right

负margin的使用技巧

1、图片与文字对齐

2、自适应两列布局

3、元素垂直居中

4、tab选项卡

图片与文字对齐

当文字与图片并排的时候,在底部水平往上往往是不对齐的,这是因为图片与文字默认是基线对齐(vertical-align:baseline).如果想实现图片与文字底部水平方向对齐除了使用vertical-align:text-bottom这个方法外还可以使用

兼容性更好的负margin来实现

例如 没有设置margin时

设置margin

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>负margin</title>
<style type="text/css">
img{
margin: 0 3px -3px 0;
}
</style>
</head>
<body>
<img src="data:images/xinlang.jpg" alt="xinlang"/>新浪微博
</body>
</html>

结果

由此可以看出,默认情况下图片与文字在底部水平方向上是不对齐的 。我们再css中添加img{margin: 0 3px -3px 0;}就如上图所示。实际上,{margin: 0 3px -3px 0;}可以将它看成一条公式

2、自适应两列布局

自适应两列布局,指的是在左右两列中,其中有一列的宽度为自适应,一列宽度为固定的。如果使用float,一般只能实现固定的左右两列布局,并不能实现其中一列为自适应的布局

举例

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>宽度自适应</title>
<style type="text/css">
.content,.sidebar{
float: left;
color: white;
}
.sidebar{
width: 500px;
background-color: purple;
}
.content{
width: 100%;
margin-right: -500px;
background-color: red;
}
/*防止浏览器可视区域不足发生文本重叠*/
.content p{
margin-right: 210px;
}
/*它是200px+10px,10px为它们间的间距*/
</style>
</head>
<body>
<div class="content"><p>宽度自适应</p></div>
<div class="sidebar"><p>固定宽度</p></div>
</body>
</html>

结果

我们改变浏览器的宽度就可以很快的看出自适应两列布局的实际效果,WordPress经典的两栏自适应布局就是使用这种方法实现

3、元素垂直居中

想要实现块元素垂直居中比较麻烦,不过有一个经典的方法就是使用position定位结合负margin

语法:

父元素{

position:relative;

}

子元素{

position:absolute;

top:50%

left:50%;

margin-top:"height值得一半";

margin-left:"width值得一半";

}

因为你会发现当left:50% top:50% 后,发现子元素盒子的左上角才是在中心点上,所以我们再有负margin技术,把它拉进。

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>元素居中</title>
<style type="text/css"> .main{
width: 200px;
height: 200px;
position: relative;
margin: 0 auto;
background-color: yellow;
}
.sub{
position: absolute;
width: 50px;
height: 50px;
left: 50%;
top: 50%;
background-color: blue;
}
</style>
</head>
<body>
<div class="main">
<div class="sub"></div>
</div> </body>
</html>

结果

<html lang="en">
<head>
<meta charset="UTF-8">
<title>元素居中</title>
<style type="text/css"> .main{
width: 200px;
height: 200px;
position: relative;
margin: 0 auto;
background-color: yellow;
}
.sub{
position: absolute;
width: 50px;
height: 50px;
left: 50%;
top: 50%;
background-color: blue;
margin-top: -25px;
margin-left: -25px;
}
</style>
</head>
<body>
<div class="main">
<div class="sub"></div>
</div> </body>
</html>

结果:

深入margin的更多相关文章

  1. 金融量化分析【day112】:因子选股

    一.因子选股基础 二.因子选股策略实现代码 # 导入函数库 import jqdata import psutil #初始化函数,设定基准等等 def initialize(context): set ...

  2. 理解CSS外边距margin

    前面的话   margin是盒模型几个属性中一个非常特殊的属性.简单举几个例子:只有margin不显示当前元素背景,只有margin可以设置为负值,margin和宽高支持auto,以及margin具有 ...

  3. 深入理解CSS中的margin负值

    前面的话 margin属性在实际中非常常用,也是平时踩坑较多的地方.margin折叠部分相信不少人都因为这样那样的原因中过招.margin负值也是很常用的功能,很多特殊的布局方法都依赖于它.它看似简单 ...

  4. margin折叠-从子元素margin-top影响父元素引出的问题

    正在做一个手机端电商项目,顶部导航栈的布局是一个div包含一个子div,如果给在正常文档流中的子div一个垂直margin-top,神奇的现象出现了,两父子元素的边距没变,但父div跟着一起往下走了! ...

  5. CSS margin详解

    以下的分享是本人最近几天学习了margin知识后,大有启发,感觉以前对margin的了解简直太浅薄.所以写成以下文章,一是供自己整理思路:二是把知识分享出来,避免各位对margin属性的误解.内容可能 ...

  6. 基于Caffe的Large Margin Softmax Loss的实现(中)

    小喵的唠叨话:前一篇博客,我们做完了L-Softmax的准备工作.而这一章,我们开始进行前馈的研究. 小喵博客: http://miaoerduo.com 博客原文:  http://www.miao ...

  7. 基于Caffe的Large Margin Softmax Loss的实现(上)

    小喵的唠叨话:在写完上一次的博客之后,已经过去了2个月的时间,小喵在此期间,做了大量的实验工作,最终在使用的DeepID2的方法之后,取得了很不错的结果.这次呢,主要讲述一个比较新的论文中的方法,L- ...

  8. 由css reset想到的深入理解margin及em的含义

    由css reset想到的深入理解margin及em的含义 原文地址:http://www.ymblog.net/content_189.html 经常看到这样语句,*{ margin:0px;pad ...

  9. 探究负边距(negative margin)原理

    W3C规范在介绍margin时有这样一句话: Negative values for margin properties are allowed, but there may be implement ...

  10. overflow:hidden与margin:0 auto之间的冲突

    相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.

随机推荐

  1. jenkins之从0到1利用Git和Ant插件打war包并自动部署到tomcat(第三话):创建一个自由风格的项目(非maven),实现自动打war包

    上一节把git和ant安装在虚拟机,并在jenkins上做了相关配置,接下来就可以真正开始构建一个项目了 1.新建一个自由风格的项目,因为是用ant打包,所以不要选择构建maven项目 2.配置源码管 ...

  2. echarts画中国地图并上色

    任务是画一个中国地图,并在指定区域上颜色,学姐说用arcgis画,乖乖,4个g的安装文件,算了, 还是echarts大法好..如果想熟悉这个牛X的工具,请移步https://www.w3cschool ...

  3. vs2015多行注释与取消多行注释

    注释: 先CTRL+K,然后CTRL+C 取消注释: 先CTRL+K,然后CTRL+U

  4. python3 语法小结

    (1) 关键字 # -*- coding: utf-8 -*- #!/usr/bin/python3 """ 1.关键字(保留字) ['False', 'None', ' ...

  5. vue 基础(二)

    Vue对象提供的属性功能 一.过滤器 过滤器,就是vue允许开发者自定义的文本格式化函数,可以使用在两个地方:输出内容和操作数据中. 1. 全局过滤器 Vue.filter 写在vm 对象外.必须要有 ...

  6. apicloud 按返回键

    api.addEventListener({ name: 'keyback' }, function(ret, err) { //调取index.html暴露的方法 api.execScript({ ...

  7. js,vue.js一些方法的总结

    push() 可向数组的末尾添加一个或多个元素 pop() 删除并返回数组的最后一个元素 shift()删除并返回数组的第一个元素 unshift() 添加并返回数组的第一个元素 sort()对数组的 ...

  8. mysql常用修改创建语句

    一.连接数据库 <?php $dbhost = 'localhost:3306'; // mysql服务器主机地址 $dbuser = 'root'; // mysql用户名 $dbpass = ...

  9. Linux 文本编辑器 vim

    第五讲 文本编辑器 vim

  10. re正则表达式方法

    目录 1.python正则匹配 1.1 re.search 正则表达式 1.2 re.match() 正则表达式 1.3 re.match与re.search的区别 1.4 检索和替换 1.5 正则表 ...