今天写了个小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. SAP 后台job

    SAP 如何定义后台job 有两种方 1是se38执行可执行程序后,菜单栏‘程序’--->'后台执行',输入输出设备,ENTER两次后,选择开始时间(立刻执行,或定义日期时间,也可周期执行..) ...

  2. path的join和resolve的使用区别

    文章目录   1.连接路径:path.join([path1][, path2][, ...]) 2.路径解析:path.resolve([from ...], to) 3.对比 1.连接路径:pat ...

  3. java多线程总结(一)

    在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口. 对于直接继承Thread的类来说,代码大致框架是: 1 2 3 4 5 6 7 8 9 10 11 ...

  4. PL/SQL编程—视图

    create or replace view test_view as select TestA.id, TestB.idno, TestB.name, TestB.sex from TestB le ...

  5. 移动端1px的border

    移动端浏览器解决1px的底部border问题 1.使用border:1px solid #e0e0e0. 在不同设备下由于devicePixelRatio不同导致1px实际显示的长度不同.所以在移动端 ...

  6. 【Java】Swing+IO流实现一个简单的文件加密程序(较完整版)

    留着参考 beans package com.my.bean; import java.io.Serializable; public class EncryptedFile implements S ...

  7. 【Java】Swing+IO流实现一个简单的文件加密程序(demo版)

    留着参考 EncrytService package com.my.service; import java.io.File; import java.io.FileInputStream; impo ...

  8. 【Head First Servlets and JSP】笔记2:MVC迷你教程

    1.采用MVC,不仅要求业务逻辑和表示分离.实际上,业务逻辑甚至根本不知道表示的存在.MVC的关键是,业务逻辑要与表示分离,而要求在中间放上别的东西,这样业务逻辑本身就可以作为一个可以重用的Java类 ...

  9. Linux下Mysql 操作命令

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

  10. Samba 3.6.9 安装、管理

    Samba简介 Samba服务类似于windows上的共享功能,可以实现linux上共享文件,windows上访问,当然在linux上可以访问到.是一种在局域网上共享文件和打印机的一种通信协议,它为局 ...