上下margin重叠传递问题
我发现强迫症真的是我一个大病。。。每次都非得把所有情况都实验出来不可。。。BUT!!!!!!!!!悲催的是,这么多情况我根本记不住。。。还是要在写代码的时候不断出错再排错~受不了自己了!不过还是把这部分总结到这里啦~
下面的几个部分应该是margin重叠问题的所有情况了:
1、两个普通元素上下的margin会合并为一个margin,哪个大选哪个!
两个浮动元素不会出现margin传递的问题,依然是上面元素的margin-bottom和下面元素的margin-top相加作为两者之间的margin值。
2、两个元素如果是包含关系,父元素和子元素上下margin值也会合并
|
当父元素不加边框, 不设置宽高,即父级没有触发haslayout时 |
IE6、7和标准浏览器下,均会发生margin传递问题 子元素和父元素的高度相同(子元素的top将和父元素的top在一条直线上,bottom将和父元素的bottom在一条直线上) 而父元素则选择两者之间大的数值作为父元素的margin-top值和margin-bottom值!!! 子元素的margin-left和margin-right值依然存在 |
|
当父元素不加边框, 但是,设置宽或高或zoom:1;即父级加可以触发haslayout的属性时 |
标准浏览器下,会发生margin传递 但是在IE6、7下则不会发生margin传递(即子元素的margin就是相对于父元素的,不会传递给父级) |
|
当父级加边框,并且父级没有触发haslayout时 |
标准浏览器下,不会发生margin传递 IE6、7下,子元素的margin彻底消失! |
|
当父级加边框,并且父级触发haslayout(即加width或height或zoom:1)时, |
IE6、7和标准浏览器下,都不会发生margin传递!!! |
对于IE6、7来说:
即只要触发haslayout,不管给不给父元素加边框,不管标准浏览器会不会发生margin传递,IE6、7下都不会发生margin传递!!!
而对于标准浏览器来说:
只有加边框才能避免margin传递!!!
给父元素添加边框,则子元素和父元素之间的margin就有分割线了,此时将不会发生合并现象了!如果给子元素添加边框两者的margin值还是没有被分开,所以依然还会发生重叠现象!
如果这里父元素里包含了多个块子元素,则每个子元素之间满足上下margin重叠,选择两者较大的margin作为两者之间的margin,第一个子元素的top和父元素重叠(左图上面白色距浏览器顶的白色区域即是),最后一个子元素的bottom和父元素重叠。IE6、7和标准浏览器显示效果均如左图。
此时,如果两个块元素是浮动元素,那么,那么就不存在子元素和父元素的margin传递情况,此时,上下的margin值则是两者之间的各自margin值相加!标准浏览器显示如下图中,IE6显示如下图右。但为什么显示有差异呢?因为,额滴神啊!一波未平一波又起!块状元素和横向margin和浮动三者引发了IE6的新的兼容性问题——双边距bug(注意IE7没有双边距bug!!!!)

由此
实践时,首先一定要给父元素加触发haslyout的属性!这一条保证了在IE6、7下不出现margin传递问题和margin值消失问题;
然后,考虑在标准浏览器下,给子元素加浮动可以解决没有border时出现的margin传递问题,但是此时加浮动后会造成IE6的双边距bug,
所以我们实践时尽量将浮动的块状元素的margin换为padding,如果实在不能换就给该元素加display:inline;!
3、两个Div(A、B)上下之间没有margin值,但是A中有子元素有margin,这时该子元素的margin值会传递到两者间,会使A、B两个元素之间填充上margin,仅限垂直方向!!!
对于这个问题,大概就是这样啦,其实也很简单,只是我把所有的情况列出来了,其实综合起来就是上面总结部分的内容。
我感觉这个margin传递和重叠都是因为两者的margin值之间没有边框或者是padding将margin这一空白区域隔开!!!!
上下margin重叠传递问题的更多相关文章
- CSS中上下margin的传递和折叠
CSS中上下margin的传递和折叠 1.上下margin传递 1.1.margin-top传递 为什么会产生上边距传递? 块级元素的顶部线和父元素的顶部线重叠,那么这个块级元素的margin-top ...
- CSS 外边距(margin)重叠及防止方法
边界重叠是指两个或多个盒子(可能相邻也可能嵌套)的相邻边界(其间没有任何非空内容.补白.边框)重合在一起而形成一个单一边界. 两个或多个块级盒子的垂直相邻边界会重合.结果的边界宽度是相邻边界宽度中最大 ...
- css margin重叠
父子元素margin(垂直方向)重叠 解决办法: 给子元素添加浮动属性,相应父元素添加必要的清浮动属性: 给父元素添加边缘属性,如padding.border: 同级元素margin(垂直方向)反向重 ...
- 清浮动,防止上下margin重叠(浏览器顶部空白崩溃)
清浮动 父级添加类别! .clearfix{zoom:1;//兼容ie6,7} .clearfix:after{ content:"."; display: "block ...
- CSS盒模型和margin重叠
在 CSS 中,width 和 height 指的是内容区域的宽度和高度.增加内边距.边框和外边距不会影响内容区域的尺寸,但是会增加元素框的总尺寸.(div的实际占用尺寸变打了) 但: 一旦为页面设置 ...
- margin重叠
margin重叠也就是我们常说的CSS 外边距合并,W3C给出如下定义: 外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距. 合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者 ...
- margin重叠现象
1.上下/左右相邻的普通元素margin,不是两者相加之和,而是取最大值,这个现象叫做margin重叠. 2. 普通元素才会发生margin重叠,如果是float元素,就不会发生.margin是两者相 ...
- 解决margin重叠的问题
margin重叠有两种情况: 1.兄弟级的垂直块之间,margin这个属性上下边距,会发生重叠的情况 解决办法:float浮动或display:inline-block 2 .父子级的块之间,子级的上 ...
- 2016/2/25 1, margin auto 垂直方向测试 无效 2,margin重叠 3,哪些是块状哪些是内联 4,display:block inline 导航栏把内联转块状最常见+ 扩展
1.利用margin auto完成首页居中,并自行研究,竖直方向用margin auto,是什么效果#container{width:1002px;margin: 0px auto;} 竖直方向 ...
随机推荐
- 华东交通大学2016年ACM“双基”程序设计竞赛 1008
Problem Description halfyarn找你写个简单的题?好哒!给你n个整数,现在要求你选择两个位置的数,例如选择第pos_a个数a,和第pos_b个数b,给定ans=min(a,b) ...
- JAVA线程同步辅助类CountDownLatch
一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待. 用给定的计数 初始化 CountDownLatch.由于调用了 countDown() 方法,所以在当前计数到达 ...
- 视频 之自定义VideoView
package com.lvshandian.partylive.view;import android.content.Context;import android.util.AttributeSe ...
- 学习mongo系列(四) find().pretty() remove() 查询
一.find() 方法以非结构化的方式来显示所有文档.如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:db.collection_name.find().pretty ...
- 运行js提示库没有注册错误8002801d的解决办法
运行js提示库没有注册错误8002801d的解决办法这个错误主要是因为服务器上的windows scripts版本较低,请按下面的链接下载较高版本windows scripts 5.6并在服务器上进行 ...
- 实体类调用泛型父类中的静态方法中执行CRUD——第二版
using System; using System.Collections.Generic; using System.Data.Entity; using System.Linq; namespa ...
- 最流行的JavaScript库jQuery不再支持旧版IE
直到JQuery2.0的发布,流行的jQuery JavaScript库到了一个重要里程碑.2.0版本比前任版本在大小上缩减了12%,但是更大的新闻是,jQuery 2.0不在对IE6,7,8三个版本 ...
- WEB UI 整理
当下对于网站前段开发人员来说,很少有人不使用一些JS框架或者WEB UI库,因此这些可以有效提高网站前段开发速度,并且能够统一开发环境,对于不同浏览器的兼容性也不需要程序员操心,有了这些优点,当然大家 ...
- 一些常用的方法(1)--去除DataTable中的重复数据
private DataTable Display(DataTable dtSource) { DataTable dtTemp = dtSource.Copy() ...
- PHP的三种输出方式
(1)echo 是PHP语句,没有返回值,用于输出一个或多个字符串 (2)print() 是函数,可以有返回值,只能打印出简单类型变量的值,例如int.string (3)print_r() 是函数, ...