PS:测试浏览器均为chrome。

首先说下负margin的影响。

正常html页面在显示时,默认是根据文档流的形式显示的。文档流横向显示时,会有一个元素横向排列的基准线,并且以最高元素的vertical-align设置为基准线,此元素的高度也为本行的高度。当横向空间不够,或者元素为block时,文档流会换行显示。

除去绝对定位、固定定位的元素,文档中的每一个元素在文档流中是占据一定空间的,此空间包括margin、border、padding、content。根据元素的display、line-height、text-align、vertical-align、float等属性,对元素进行排列布局。

如果对一个处于文档流中的元素设置了margin属性值,会改变紧接其后的元素在文档流的位置。

元素的margin为正值,会使此元素占据的文档流位置加大,同改变padding和content大小效果相似。

<div style="display:inline-block;width:100px;height:100px;border:1px solid black;margin-bottom:10px;vertical-align:bottom;"></div>
<div style="display:inline-block;width:100px;height:50px;border:1px solid black;"></div>
 
 

会发现第二个div同第一个div的下边缘对齐时,将第一个div的margin-bottom考虑进来了,距离第一个div的bottom正好向下移动了10px。


元素margin为负值,会使此元素本身占据的文档流空间减小,同时使出现的下一个元素占据的文档流位置,向上和向左移动,同文档流的方向正好相反。文档流换行显示时,会出现下行元素同上行元素重合的现象。而改变padding和content则无法达到此效果,因为padding和content最小为0。

<div style="display:inline-block;width:100px;height:100px;border:1px solid black;margin-bottom:-10px;vertical-align:bottom;"></div>
<div style="display:inline-block;width:100px;height:50px;border:1px solid black;"></div>
 
 

此时发现,第二个div的位置向上移动了,并且距离第一个div的bottom正好向上移动了10px。如果margin-left和margin-right为负值,会发现元素出现了重叠。


width值有四种:auto、length(px、em)、%、inherit。

auto,根据元素的显示方式(block,inline-block),一级父元素内部的content大小,自适应子元素的显示大小,此时子元素的auto宽度会包括margin的大小。

%,取父元素的content宽度,设置为此子元素的content加border的总宽度。如果此时子元素有padding、margin等属性值,会发现子元素可能会超出父元素的显示区域,与父元素之外的显示元素重叠。

如果子元素拥有box-sizing:border-box属性, 会取父元素的content宽度,设置为此子元素的content加padding加border的总宽度。有margin时,还是可能会与父元素以及父元素之外的元素重叠。

总结:无box-sizing:border-box时,百分比或者数值的width设置只影响元素content,有box-sizing:border-box时影响padding+content;margin不受影响,margin只会影响元素在文档流的位置和占据的空间,不参与元素大小的计算。width的百分比,参考的是父元素的content的width。此外所有和百分比相关的位置、大小设置,都是基于父元素的content。除了line-height~

css中width的计算方式,以及width:100%的参考系的更多相关文章

  1. 问答:怎样规划CSS 中 的命名方式 怎样看待 CSS 中 BEM 的命名方式?

    好多盆友 非常纠结 css命名规则 怎么弄,还没起步就被绊住了.那么今天蝈蝈就针对这个问题来讨论一下 没什么技术 含量.但却对效率开发至关重要的 "问题". 下文是一些知乎大神的个 ...

  2. 讨论CSS中的各类居中方式

    今天主要谈一谈CSS中的各种居中的办法. 首先是水平居中,最简单的办法当然就是 margin:0 auto; 也就是将margin-left和margin-right属性设置为auto,从而达到水平居 ...

  3. css中两种居中方式text-align:center和margin:0 auto 的使用场景

    关于使用text-align:center和margin:0 auto 两种居中方式的比较 前言:最近由于要学习后端,需要提前学习一部分前端知识,补了补css知识,发现狂神在讲这一部分讲的不是特别清楚 ...

  4. css中三种隐藏方式

    1.overflow 溢出隐藏 overflow:hidden 2.display 隐藏不占据原来的文档,即会让出空间 display:black  显示 display:none  隐藏 3.vis ...

  5. CSS中的那点事儿(一)--- CSS中的单位1

    单位主要用在规定元素的数值性css属性的,这里主要讨论应用的比较多的是width height  padding margin font-size,而单位中应用最广泛就是%.px.em 百分比 百分比 ...

  6. 浅析CSS中的BFC和IFC

    1. 为什么会有BFC和IFC 首先要先了解两个概念:Box和formatting context: Box:CSS渲染的时候是以Box作为渲染的基本单位.Box的类型由元素的类型和display属性 ...

  7. CSS中定位和浮动对行内元素的宽高的影响

    行内元素的大小是由元素里面的内容撑开的宽高决定的,就算在css中对行内元素设置width,height.行内元素也会忽略宽高的设置. 但是当行内元素使用position:absolute或者posit ...

  8. css中的单位和css中的颜色表示方法

    css中颜色的表示方式: 图片来源http://www.w3school.com.cn

  9. css中的width,height,属性与盒模型的关系

    这段话很容易记住盒模型: css中盒子模型包含属性margin.border.padding.content,他们可以把它转移到我们日常生活中的盒子(箱 子)上来理解,日常生活中所见的盒子也具有这些属 ...

随机推荐

  1. http://chenzhou123520.iteye.com/blog/1811340

    http://chenzhou123520.iteye.com/blog/1811340

  2. Codeforces Round #333 (Div. 2)

    水 A - Two Bases 水题,但是pow的精度不高,应该是转换成long long精度丢失了干脆直接double就可以了.被hack掉了.用long long能存的下 #include < ...

  3. time元素

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. ACM: Ubiquitous Religions-并查集-解题报告

    Ubiquitous Religions Time Limit:5000MS Memory Limit:65536KB 64bit IO Format:%lld & %llu Descript ...

  5. POJ 1673 EXOCENTER OF A TRIANGLE(垂心)

    题目链接 折腾了半天,没想出怎么证明,以前初中老师教过,不知道怎么办,就量量...受不了,怒抄模版1Y... #include <cstdio> #include <iostream ...

  6. 【JAVA】LOG4J使用心得

    一.LOG4J基础: 1.日志定义        简单的Log4j使用只需要导入下面的包就可以了 // import log4j packages import org.apache.log4j.Lo ...

  7. BZOJ4532: [BeiJing2014 WinterCamp] 珠链

    Description Alex喜欢玩网络游戏,认为这是智力和体力的综合锻炼.在一次游戏活动中,他意外获得了一个传说中威力极其强大的法宝:珠链.  珠链,顾名思义,就是由许多小珠子串起来的一条链.珠子 ...

  8. wxPython学习

    http://www.cnblogs.com/coderzh/archive/2008/11/23/1339310.html 一个简单的实例: #!/usr/bin/python import wx ...

  9. 纪念逝去的岁月——C/C++冒泡排序

    冒泡排序 代码 #include <stdio.h> void printList(int iList[], int iLen) { ; ; i < iLen; i++) { pri ...

  10. LUA 配置 运行 异常的备忘录

    1. 抛异常“lua: LuaInterface: cannot instantiate interpreter”,如图: 目前,重新生成dll之后,会多生成一个lua51.dll到\Lua\5.1\ ...