今天写了个小demo,总体不难,但一些细节需要注意:

1)如下图所示,蓝色区域为白色box的padding,橙色区域为每条数据项的margin-bottom,那么如何解决最后一条记录margin-bottom占位的问题?

2)如下图所示,设置外层box border为1px,设置每一行的border-bottom为1px,那么如何解决最后一行border-bottom与box border-bottom紧贴,显示2px border的问题?

为解决上面的问题,需要理解margin自身的一些特性,下面对margin进行总结,以便以后回顾与查找。

块级元素外边距

(1)两个【上下相邻】且【不浮动】的块级元素间,两元素间的垂直外边距(margin)为相邻外边距中的较大者(合并)。
margin:20px
margin:30px
如:橙色元素margin-bottom为20px,灰色元素margin-top为30px,则两元素之间的垂直外间距为较大者30px
(2)两个【相邻】且【浮动】的块级元素间,两元素间的外边距(margin)为相邻外边距之和(不合并)。
margin:20px
margin:20px
如:橙色元素margin-right为20px,灰色元素margin-left为20px,则两元素之间的外间距相邻边距之和40px

行内元素外边距

(1)行内元素不占上下外边距。
margin:0px margin:30px

如:橙色元素margin为0px,灰色元素margin为30px,但两元素水平显示,上下左右边距并未发挥作用
(2)行内元素左右外边距不会合并。
margin:20px margin:30px

如:橙色元素margin为20px,灰色元素margin为30px,两元素间的外边距约为相邻外边距之和50px(不合并),事实上即使两行内元素间没有水平边距也不会完全紧贴

负margin

  • margin参考线:即margin移动的基准线,此基准线相对于box是静止的,而margin的数值,就是box相对于参考线的位移量
  • 1、top、left参考线:
    设置了margin的元素:
    (1)以父级元素content的上(左)边为参考线,自身向下(右)移动
    (2)以相邻元素margin的下(右)边为参考线,自身向下(右)移动
  • 2、bottom、right参考线:
    设置了margin的元素:
    (1)以元素本身border的下(右)边为参考线,与其相邻的元素向下(右)移动
  • 以上的位移方向为margin数值为正值时的情况,如果margin是负值,则位移方向相反
  • 更多负margin使用案例,推荐阅读:负值之美:负margin在页面布局中的应用
Container1
margin:-10px 20px -20px 40px
margin:0
如:Container1中,两个元素为【不浮动】的块级元素。
※修改橙色元素的margin-top,会影响橙色元素相对于Container1向上或向下移动;
※修改橙色元素的margin-bottom,会影响黄色元素相对于橙色元素向上或向下移动
同时注意:DOM结构中后面的元素会叠加在前面元素的上面
Container2
margin:-10px -20px -20px 40px
margin:0

如:Container2中,两个元素为【浮动】的块级元素。
※修改橙色元素的margin-left,会影响橙色元素相对于Container2向左或向右移动;
※修改橙色元素的margin-right,会影响黄色元素相对于橙色元素向左或向右移动

百分比margin

  • 元素margin为百分比时,会根据其父元素的【宽或高】来计算margin的四个具体值
  • 1、横向显示(默认):基于父元素的【宽度】的百分比计算外边距
  • 2、纵向显示:基于父元素的【高度】的百分比计算外边距(测试writing-mode这玩意只有IE能使,IE5就有,并且到IE11还坚挺的支持着)

Demo1:父元素横向显示
margin: 10% 5%
如:Demo1中:
margin-left、margin-right=$Demo1.width()*5% = 25px;
margin-top、margin-bottom= $Demo1.width()*10% = 50px

Demo2:父元素纵向显示(切换为IE测试)
margin: 10% 5%
如:Demo2中:
margin-left、margin-right=$Demo1.height()*5% = 10px;
margin-top、margin-bottom= $Demo1.height()*10% = 20px
 
最后附上demo源码,一些细节有待改进:http://runjs.cn/code/dn7ibwnt

margin特性深入分析与总结的更多相关文章

  1. margin折叠及hasLayout && Block Formatting Contexts

    margin折叠的产生有几个条件: 这些margin都处于普通流中,并在同一个BFC中: 这些margin没有被非空内容.padding.border 或 clear 分隔开: 这些margin在垂直 ...

  2. 利用负margin实现元素居中

    原理就是对当前元素的position设置为absolute并且相对于父元素定位,先设置left:50%;top:50%使当前元素的左上角处于父元素的中心位置,之后再应用负margin特性使其中心位于父 ...

  3. 我对BFC的理解

    最初这篇文章打算回答寒冬大神的第一问,谈谈CSS布局.本来呢我以为布局主要涉及float跟display相关属性,以及他们的包含框.静态位置等等.后来看了大神的一片面试文章,嗯?这里怎么还有个BFC, ...

  4. CSS3与页面布局学习总结(二)——Box Model、边距折叠、内联与块标签、CSSReset

    一.盒子模型(Box Model) 盒子模型也有人称为框模型,HTML中的多数元素都会在浏览器中生成一个矩形的区域,每个区域包含四个组成部分,从外向内依次是:外边距(Margin).边框(Border ...

  5. 【干货分享】前端面试知识点锦集02(CSS篇)——附答案

    二.CSS部分 1.解释一下CSS的盒子模型? 回答一:a.标准的css盒子模型:宽度=内容的宽度+边框的宽度+加上内边具的宽度b.网页设计中常听的属性名:内容(content).填充(padding ...

  6. Box Model,边距折叠,内联和块标签,CSSReset

    一.盒子模型(Box Model) 1.1.宽度测试 1.2.溢出测试 1.3.box-sizing属性 1.4.利用CSS画图 二.边距折叠 2.1.概要 2.2.垂直方向外边距合并计算 三.内联与 ...

  7. hasLayout && Block Formatting Contexts

    转自:http://www.smallni.com/haslayout-block-formatting-contexts/ 因为本人脑子不好使,自己打印出了一张hasLayout和Block For ...

  8. @寒冬winter 大神的css作业问题

    块级元素   ①总是在新行上开始: ②高度,行高以及外边距和内边距都可控制: ③宽度缺省是它的容器的100%,除非设定一个宽度. ④它可以容纳内联元素和其他块元素 行内级元素   ①和其他元素都在一行 ...

  9. BFC与CFC

    1.在创建了 Block Formatting Context 的元素中,其子元素按文档流一个接一个地放置.垂直方向上他们的起点是一个包含块的顶部,两个相邻的元素之间的垂直距离取决于 ‘margin’ ...

随机推荐

  1. 经典排序算法的总结及其Python实现

    经典排序算法总结: 结论: 排序算法无绝对优劣之分. 不稳定的排序算法有:选择排序.希尔排序.快速排序.堆排序(口诀:“快速.选择.希尔.堆”).其他排序算法均为稳定的排序算法. 第一趟排序后就能确定 ...

  2. 练Focus T25必看!T25课表 视频与成功案例汇总

    练Focus T25必看!T25课表 视频与成功案例汇总! [复制链接]  http://jianfei.39.net/thread-3645799-1.html     小西i减肥         ...

  3. BCH码

    http://baike.baidu.com/link?url=CfLtm9DigwWdup-9VJP99RG65NgaVOXfrnjT61ogP7au0QOrlypq72k67B0s1Ey-Q1yD ...

  4. 在Windows上以服务方式运行 Redis

    ServiceStack.Redis 使用教程里提到Redis最好还是部署到Linux下去,Windows只是用来 做开发环境,现在这个命题发生改变了,在Windows上也可以部署生产环境的Redis ...

  5. Soap 教程

    SOAP 构建模块 一条 SOAP 消息就是一个普通的 XML 文档,包含下列元素: · 必需的 Envelope 元素,可把此 XML 文档标识为一条 SOAP 消息 · 可选的 Header 元素 ...

  6. 对Servlet请求或响应进行JMockit测试

    对Servlet请求及响应进行mock方法, 通过getMockInstance方法对servlet进行打桩,对servlet提供的方法进行mock,替代真正的servlet请求或响应. 参考链接: ...

  7. Linux性能测试分析命令_sar+iostat+vmstat+top

    sar主要用于收集并统计系统资源的信息,包括CPU.IO.内存.网卡流量等. vmstat命令主要是对操作系统的虚拟内存.进程.IO读写.CPU活动等整体情况进行统计.但是它不能对某个进程进行深入分析 ...

  8. Linux下Mysql 操作命令

    Linux下Mysql 操作命令 一.连接MySQL 格式: mysql -h主机地址 -u用户名 -p用户密码 1.例1:连接到本机上的MYSQL. 首先在打开DOS窗口,然后进入目录 mysqlb ...

  9. ASP.NET MVC Select无限级分类选择下拉框

    1:读取父级下的所有子类别 *ViewBag.ParentItemList:不能与ParentId相同 private void ParentDropDownList() { List<SAS. ...

  10. MySQL数据库表分区功能详解

    1.什么是表分区? mysql数据库中的数据是以文件的形势存在磁盘上的,默认放在/mysql/data下面(可以通过my.cnf中的datadir来查看),一张表主要对应着三个文件,一个是frm存放表 ...