margin相关基本知识

html { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol"; font-size: 1rem; color: #212529; width: 62.5rem; letter-spacing: 1px; margin: 0 auto; line-height: 1.5 }
body { margin: 0; padding: 10px }
pre { background: #000; padding: 20px; color: #fff; font-size: 18px }
.desc p { text-indent: 20px }
blockquote { border-left: 5px solid green; padding: 10px }
.desc { padding-left: 20px }
.desc img { width: 50%; max-width: 500px }
.box { border: 1px solid red; width: 200px; height: 120px; padding: 20px }
.box .first { height: 100px; border-top: 5px dashed red; border-left: 5px dashed red; border-right: 5px solid yellowgreen; border-bottom: 5px solid yellowgreen; margin: 20px }

什么是 margin ?

CSS 边距属性定义元素周围的空间。通过使用单独的属性,可以对上、右、下、左的外边距进行设置。也可以使用简写的外边距属性同时改变所有的外边距。——W3School

边界,元素周围生成额外的空白区。“空白区”通常是指其他元素不能出现且父元素背景可见的区域。——CSS权威指南

概述

margin属性为给定元素设置所有四个(上下左右)方向的外边距属性。这是四个外边距属性设置的简写。四个外边距属性设置分别是: margin-top, margin-right, margin-bottom 和 margin-left 。指定的外边距允许为负数。

语法

margin : [ <length> | <percentage> | auto ]{1,4}
    

取值

margin 可取1~4个值,值类型如下

length

指定一个固定的宽度。可以为负数

percentage

百分比相对于该元素的包含块的宽度(相对于该块的百分比)。该值可以为负数。

auto

浏览器会自动选择一个合适的margin来应用。它可以用于将一个块居中。

  • 只有一个 值时,这个值会被指定给全部的 四个边.
  • 两个 值时,第一个值被匹配给 上和下, 第二个值被匹配给 左和右.
  • 三个 值时,第一个值被匹配给 上, 第二个值被匹配给 左和右, 第三个值被匹配给 下.
  • 四个 值时,会依次按 上、右、下、左 的顺序匹配 (即顺时针顺序).

特性

margin始终是透明的(父元素设置背景, margin区域可见的)

参考线

在margin属性中一共有两类参考线,top和left的参考线属于一类,right和bottom的参考线属于另一类。top和left是以外元素为参考,right和bottom是以元素本身为参考。margin的位移方向是指margin数值为正值时候的情形,如果是负值则位移方向相反。

总结:

1: margin-top和 margin-left 值得偏移相对于相邻元素margin或border; 如果没有相邻元素则包含容器的content边为及基准

2: margin-bottom和 margin-right 相对于自身进行偏移

常见的问题

垂直外边距合并

外边距合并指的是,当两个垂直外边距相遇时,它们将形成一个外边距。合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者。

合并几种情况 W3Shool CSS外边距合并

  • 相邻元素间的合并
  • 包含元素间的合并(假设没有内边距或边框把外边距分隔开)
  • 元素自身的合并(空元素,它有外边距,但是没有边框或填充padding)

margin在块元素、内联元素中的区别

margin 在块级元素下, 他的特性可以完全体现, 上下左右任你设定。

margin也能用于内联元素,这是规范所允许的 margin的top和bottom属性对非替换内联元素无效, 例如<span>和<code>。

常见的浏览器下margin出现的bug

IE6中双边距Bug:

发生场合:当给父元素内第一个浮动元素设置margin-left(元素float:left)或margin-right(元素float:right)时margin加倍。

解决方法:是给浮动元素加上display:inline;CSS属性;或者用padding-left代替margin-left。

原理分析:块级对象默认的display属性值是block,当设置了浮动的同时,还设置了它的外边距就会出现这种情况。也许你会问:“为什么之后的对象和第一个对象之间就不存在双倍边距的Bug”?因为浮动都有其相对应的对象,只有相对于其父对象的浮动对象才会出现这样的问题。第一个对象是相对父对象的,而之后对象是相对第一个对象的,所以之后对象在设置后不会出现问题。为什么display:inline可以解决这个双边距bug,首先是inline元素或inline-block元素是不存在双边距问题的。然后,float:left等浮动属性可以让inline元素haslayout,会让inline元素表现得跟inline-block元素的特性一样,支持高宽,垂直margin和padding等,所以div class的所有样式可以用在这个display inline的元素上。

IE6中浮动元素3px间隔Bug:

发生场合:发生在一个元素浮动,然后一个不浮动的元素自然上浮与之靠近会出现的3px的bug。

解决方法:右边元素也一起浮动;或者为右边元素添加IE6 Hack _margin-left:-3px;从而消除3px间距。

原理分析:IE6浏览器缺陷Bug。

IE6/7负margin隐藏Bug:

发生场合:当给一个有hasLayout的父元素内的非hasLayout元素设置负margin时,超出父元素部分不可见。

解决方法:去掉父元素的hasLayout;或者赋hasLayout给子元素,并添加position:relative;

原理分析:IE6/7独有的hasLayout产生问题。

IE6/7下ul/ol标记消失bug:

发生场合:当ul/ol触发了haslayout并且是在ul/ol上写margin-left,前面默认的ul/ol标记会消失。

解决方法:给li设置margin-left,而不是给ul/ol设置margin-left。

原理分析:IE6/7浏览器Bug

IE6/7下margin与absolute元素重叠bug:

发生场合:双栏自适应布局中,左侧元素absolute绝对定位,右侧的margin撑开距离定位。在IE6/7下左侧应用了absolute属性的块级元素与右边的自适应的文字内容重叠。

解决方法:把左侧块级元素更改为内联元素,比如把div更换为span。

原理分析:这是由于IE6/IE7浏览器将inline水平标签元素和block水平的标签元素没有加以区分一视同仁渲染了。属于IE6/7浏览器渲染Bug。

IE6/7/8下auto margin居中bug:

发生场合:给block元素设置margin auto无法居中

解决方法:出现这种bug的原因通常是没有Doctype,然后触发了ie的quirks mode,加上Doctype声明就可以了。在《打败IE的葵花宝典》里给出的方法是给block元素添加一个width能够解决,但根据本人亲测,加with此种方法是无效的,如果没有Doctype即使给元素添加width也无法让block元素居中。

原理分析:缺少Doctype声明。

IE8下input[button | submit] 设置margin:auto无法居中

发生场合:ie8下,如果给像button这样的标签(如button input[type="button"] input[type="submit"])设置{ display: block; margin:0 auto; }如果不设置宽度的话无法居中。

解决方法:可以给为input加上宽度

原理分析:IE8浏览器Bug。

IE8百分比padding垂直margin bug:

发生场合:当父元素设置了百分比的padding,子元素有垂直的margin的时候,就好像父元素被设置了margin一样。

解决方法:给父元素加一个overflow:hidden/auto。

原理分析:IE8浏览器Bug。

参考

海玉
W3C

原文地址:https://www.cnblogs.com/blueNotes/p/9869220.html

时间: 2024-10-11 18:48:48

margin相关基本知识的相关文章

磁盘相关的知识

每一块硬盘都由一个或多个盘片组成,每一个盘片都有两个可以读写的盘面组成. 硬盘的逻辑组成: 磁道(Track):盘片的同心圆就称为磁道. 柱面(Cylinder):所有盘片的同一个磁道就组成了柱面.柱面是分区的最小单位. 扇区(Sector):存储数据的最小单位.每一个扇区为512字节.扇区包含用户数据.以及该扇区的一些标识信息,如所位于的磁头.磁道等编号信息. MBR:Master Boot Record MBR位于0盘片,0磁道,0扇区的512字节.MBR属于磁盘,不属于任何分区. MBR有

网络连接相关基础知识笔记

一.常说的TCP/IP的含义 TCP/IP协议簇并不仅仅指TCP协议和IP协议,实际它包括了一系列协议组成的集合,如:TCP,IP,UDP,FTP,SMTP,DNS,ARP,PPP等 TCP与UDP协议都属于传输层协议,但有很大不同,TCP是面向连接的协议,提供的是可靠的数据流服务,TCP采用"带重传的肯定确认"机制来实现传输的可靠性,实现了一种"虚电路",因为从物理上来说,并不是真正在两台主机间建立了连接,这种连接只是存在于逻辑上的.最大的开销出现在通信前建立连接

深入理解mysql之BDB系列(1)---BDB相关基础知识

    深入理解mysql之BDB系列(1) ---BDB相关基础知识 作者:杨万富 一:BDB体系结构 1.1.BDB体系结构 BDB总体的体系结构如图1.1所看到的,包括五个子系统(见图1.1中相关数).1)数据存取子系统,2)事务子系统,3)锁子系统,4)内存池管理子系统,5)日志子系统. 在一个应用程序中,并不一定须要全然具备这5大子系统. 假设程序仅仅使用了数据存取子系统,它的体系结构如图1.2.在图1.2中,我们仅仅使了两个子系统:数据存取以及内存池子系统.(备注:另外三个子系统在B

.NET同步与异步之相关背景知识(六)

在之前的五篇随笔中,已经介绍了.NET 类库中实现并行的常见方式及其基本用法,当然.这些基本用法远远不能覆盖所有,也只能作为一个引子出现在这里.以下是前五篇随笔的目录: .NET 同步与异步之封装成Task(五) .NET 实现并行的几种方式(四) .NET 实现并行的几种方式(三) .NET 实现并行的几种方式(二) .NET 实现并行的几种方式(一) 话再说回来,这五篇随笔都属于<同步与异步>系列.同步与异步.这是一个很大.很笼统的话题,以笔者所学很难将其将其介绍清楚,不过.笔者还是会尽力

图像增强相关基础知识

图像增强处理-1 图像增强是图像处理中一个重要的内容,在图像生成,传输或变换的过程中,由于多种因素的影响,造成图像质量下降,图像模糊,特征淹没,给分析和识别带来困难.因此,按特定的需要将图像中感兴趣的特征友选择地突出,衰减不需要的特征,提高图像的可懂度是图像增强的主要内容.图像增强不考虑图像降质的原因,而且改善后的图像也不一定逼近原图像,这是它与图像复原本质的区别.图像增强的主要目的有两个:一是改善图像的视觉效果,提高图像的清晰度:二是将图像转换成一种更适合人类或机器进行分析处理的形式,一边从图

盒子模型之margin相关技巧!

废话不多说,直接进入主题,margin相关技巧. 1.设置元素水平居中:margin:x auto; 2.margin负值让元素位移及边框合并. 外边距合并 指当两个垂直外边距相遇时,它们将形成一个外边距.合并后的外边距的高度等于两个发生合并的外边距的高度中的较大者. 解决外边距合并的方法: a.使用这种特性. b.设置一边的外边距,一般设置margin-top c.将元素浮动或者定位(元素浮动或定位时,不会出现margin合并) margin-top塌陷 在两个盒子嵌套时候,内部的盒子设置的m

【RAC】RAC相关基础知识

[RAC]RAC相关基础知识 1.CRS简介    从Oracle 10G开始,oracle引进一套完整的集群管理解决方案—-Cluster-Ready Services,它包括集群连通性.消息和锁.负载管理等框架.从而使得RAC可以脱离第三方集群件,当然,CRS与第三方集群件可以共同使用. (1).CRS进程 CRS主要由三部分组成,三部分都作为守护进程出现 <1>CRSD:资源可用性维护的主要引擎.它用来执行高可用性恢复及管理操作,诸如维护OCR及管理应用资源,它保存着集群的信息状态和OC

MySQL相关操作知识

1.解决客户端联不上MySQL服务器的问题: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '' WITH GRANT OPTION; FLUSH PRIVILEGES; 2.登陆MySQL: mysql -u root -p 123456 3.查看所有数据库:show databases; //注意s和分号 4.选择数据库:use 库名 5.查看当前选择的数据库:select database(); //注意分号 6.列出所选数

SQlite数据库相关语法知识

1.SQLite3是一款开源的嵌入式关系型数据库,可移植性好.易使用.内存开销比较小 SQLite3是无类型的,意味着你可以保存任何类型的数据到任意表的任意字段中 2. SQLite3常用的5种数据类型:text(文本).integer(整型).real(浮点值).blob(二进制) 3. 在iOS中使用SQLite3,首先要添加库文件libsqlite3.dylib和导入主头文件 4. 创建或打开数据库 // path为:~/Documents/person.db sqlite3 *db; i