在页面重构中,利用margin进行定位非常常见,然而margin-top这个属性经常会给我们带来一定的困扰,有时候不起作用,还把父层“拉”了下来,如图所示:

代码如下:

test2

.header { width:300px; height:100px; background: green; }

.outer { width:300px; height:300px; background: yellow; }

.inner { margin-top:100px; width:100px; height:100px; background: red;}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

这是在做布局时的一个经典问题。那这个问题是怎么产生的呢?主要是合并margin的问题,红色层(子层)的margin-top与黄色层(父层)相合并,产生了共同的margin-top。其实合并margin还有其他的形式,比如说:

父层的margin-top与一系列子层中第一个层的margin-top合并

上层的margin-bottom与下层的margin-top合并,此时margin值为合并margin值中的最大值。至于负margin,就从正相邻margin的最大值中减去负相邻margin的绝对值的最大值。如果没有正margin,就用0减去相邻margin的绝对值的最大值

层高为0时,自身的margin-top和margin-bottom合并

那如何解决这个问题呢,w3.org给出了思路:

一个浮动的盒与任何其它盒之间的margin不会合并(甚至一个浮动盒与它的流内子级之间也不会)

建立了新的块格式化上下文的元素(例如,浮动盒与’overflow’不为’visible’的元素)的margin不会与它们的流内子级合并

绝对定位的盒的margin不会合并(甚至与它们的流内子级也不会)

内联盒的margin不会合并(甚至与它们的流内子级也不会)

一个流内块级元素的bottom margin总会与它的下一个流内块级兄弟的top margin合并,除非兄弟有空隙

一个流内块级元素的top margin会与它的第一个流内块级子级的top margin合并,如果该元素没有top border,没有top padding并且该子级没有空隙

一个’height’为’auto’并且’min-height’为0的流内块级盒的bottom margin会与它的最后一个流内块级子级的bottom margin合并,如果该盒没有bottom padding并且没有bottom border并且子级的bottom margin不与有空隙的top margin合并

盒自身的margin也会合并,如果’min-height’属性为0,并且既没有top或者bottom border也没有top或者bottom padding,并且其’height’为0或者’auto’,并且不含行盒,并且其所有流内子级的margin(如果有的话)都合并了

简单的来讲,就是

都用float来定位(有条件要求,适用范围较广)

为父元素添加overflow不为visiable 的属性 (适用范围极广,推荐使用)

为元素添加border(一般不用)

使用绝对定位(适用范围较窄)

父元素增加padding-top属性(改变尺寸,不建议使用)

然鹅我在用margin-top的时候又发现一个问题: 在上一个层有clear属性的时候margin-top不起作用,应该还是margin合并的问题,但是具体原因我没有分析清楚,只提供几个解决方案,供大家参考:

中间加一个层

设置上一个层的margin-bottom来代替下一个层的margin-top

使用包裹层,并设置上下层都用float:left;

使用绝对定位

全部加上border

js margin作用到父元素_CSS中margin-top对父级元素产生作用的问题相关推荐

  1. html中哪个属性表示块级元素,HTML块级元素与行级元素

    转自:http://gkecenter.blog.163.com/blog/static/181380305201291745234195/ 一.两种类型 HTML中的大部分元素都可分为两种类型:块级 ...

  2. 什么是行内元素、行内块、块级元素。它们有什么区别和特点

    什么是行内元素.行内块.块级元素 块级元素 每个块级元素通常都会独占一行或者是多行,可以对其单独设置高度,宽度以及对齐等属性. 常见的块级元素有:<h1>~<h6>,<p ...

  3. html 获取下一个兄弟节点,JS/JQuery获取当前元素的上一个/下一个兄弟级元素等元素的方法...

    $(function(){ //遍历获取的input元素对象数组,绑定click事件 var len = $("input[type='file']").length; for(v ...

  4. 在html中 常见的块级元素有哪些,常见的css块级元素有哪些

    css块级元素介绍: (学习视频分享:css视频教程) 根据W3C上的解释,就是说block(块级)元素是独占一行显示的.它的兄弟元素必定不会与其在同一行中(除非脱离了文档流).其实,通俗点来说,就是 ...

  5. php for调用数组元素,php中foreach语句如何用于数组元素

    php中除了for语句和while语句以外,还有用来处理数组循环的foreach语句,foreach语句是一个循环数组元素的语句,本篇文章就来给大家介绍关于php中foreach语句的用法. 我们先来 ...

  6. java数组包含某个元素_java中判断数组是否包含某元素的方法

    有两种方法可以判断数组是否包含元素: 方法1, 将数组转换为list,然后使用list的contains方法来判断:Arrays.asList(...).contains(...) java.lang ...

  7. java中person作用_以下Java程序中Person(){};是什么意思,有什么作用?

    匿名用户 1级 2013-08-20 回答 Person()方法是用来创建实例的构造方法,例如你要创建一个Person类的实例就需要new Person(),这里的Person()就是Person类的 ...

  8. 什么是BFC机制,如何触发BFC(消除浮动带来的父元素塌陷、垂直方向margin重叠、嵌套块级元素父元素margin塌陷)

    BFC机制 BFC(Block Formatting Context):块格式化上下文 BFC是 W3C CSS 2.1 规范中的一个概念,它决定了元素如何对其内容进行定位,以及与其余元素的关系和相互 ...

  9. python 全栈开发,Day48(标准文档流,块级元素和行内元素,浮动,margin的用法,文本属性和字体属性)...

    昨日内容回顾 高级选择器: 后代选择 : div p 子代选择器 : div>p 并集选择器: div,p 交集选择器: div.active属性选择器: [属性~='属性值'] 伪类选择器 a ...

最新文章

  1. 互联网大厂技术面试内幕@霞落满天
  2. 统计某一时刻的在线人数
  3. TypeError: tuple object does not support item assignment解决方案
  4. 缓存级别与缓存更新问题
  5. Python - 列表与字符串的互相转换
  6. 基于内存数据库的分布式数据库架构
  7. Mybatis之加载mybatis-config.xml
  8. leetcode 279. 完全平方数(dp)
  9. 程序员面试金典 - 面试题 16.20. T9键盘(数组)
  10. 远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案
  11. 网易云api及 asrsea 加密参数文档
  12. (48)System Verilog 类中变量随机激励数组数据
  13. Fedora10字体安装与美化
  14. 执行jar包中的某个类
  15. CodeForces 255C. Almost Arithmetical Progression (DP)
  16. 用SQLAlchemy执行原生SQL
  17. JVM本地方法栈及native方法
  18. Android音频压缩方法
  19. 公司内部Wiki及搭建wiki系统-confluence
  20. Guass-newton

热门文章

  1. [转贴]现在在做一个WEB的站内消息系统,从工具栏位置弹出一徐徐上升的窗口...
  2. c语言函数指针的理解与使用(学习)
  3. SDN/NFV:现状,挑战和未来
  4. IBM的“认知计算时代”
  5. PLSQL DEVELOPER 使用的一些技巧【转】
  6. 推荐系列:2008年第07期 总9期
  7. word2vec模型评估_干货 | NLP中的十个预训练模型
  8. vue 带全选和多选的表格怎么写_vue实现下拉列表多选全选以及模糊查询的vue组件...
  9. java异常_聊聊Java中的异常及处理
  10. flask 检测post是否为空_用Flask和Vue制作一个单页应用(五)