本文总结于 张鑫旭老师的 CSS深刻理解之margin课程,感谢张老师的辛苦付出!html
做为前端狗的咱们,天天都要和网页打交道。当 UI 将设计稿发给你时,CSS 的知识便显得尤其重要。而 CSS 这一标记性的语言,却时常让我很头疼:毫无逻辑性,并充满了各类坑爹的潜规则 ,以致于每次作项目时,大部分时间精力都浪费在了调整布局与样式上,详情可点击知乎上的为何 CSS 这么难学?问题,道出了个人心声 :(前端
但谁叫咱们是吃这碗饭的呢,无论怎样,有困难必须迎面解决,学好 CSS ,向张老师看齐!chrome
margin 算是性格刚烈的属性了,下面,我将从各个方面讲解 margin 的可怕之处。浏览器
一般一个元素的尺寸可分为:可视尺寸 与 占据尺寸布局
margin 又是怎样影响这两个尺寸的呢?设计
首先,两个尺寸都需知足必定的条件。3d
margin 影响元素的可视水平尺寸 margin的可视尺寸示例code
margin 影响占据尺寸 ,这个能够说是 margin 的本命技能了,就不举例了。htm
一般而言,margin 的单位中,百分比单位最容易让人头晕。blog
<style> #parent { margin: 20px 400px; width: 100px; height: 200px; } #child { /* 等价于 margin: 5% * 父元素的宽度 10% * 父元素的宽度; */ margin: 5% 10%; /* 父元素的宽度 * 50% */ width: 50%; /* 父元素的高度 * 50% */ height: 50%; } </style> <div id="parent"> <div id="child"></div> </div>
<style> #parent { width: 100px; } #child { /* 注意子元素已增长绝对定位,则百分比按照定位属性的祖先元素的宽度计算, 本例中是浏览器视口 */ position:absolute; /* 等价于 margin: 5% * 父元素的宽度 10% * 父元素的宽度; */ margin: 5% 10%; } </style> <div id="parent"> <div id="child"></div> </div>
重叠可谓是 margin 中的最重要的潜规则了。
margin-top 重叠
margin-bottom 重叠
<style> #top{ margin-top:30px; } #bottom{ margin-bottom:20px; } </style> <div id="bottom"></div> <div id="top"></div> 两个元素垂直距离为 : #top元素的 margin-top值
<style> #top{ margin-top:-30px; } #bottom{ margin-bottom:20px; } </style> <div id="bottom"></div> <div id="top"></div> 两个元素垂直距离为: #top元素的margin-top值 加上 #bottom元素的margin-bottom值
<style> #top{ margin-top:-30px; } #bottom{ margin-bottom:-20px; } </style> <div id="bottom"></div> <div id="top"></div> 两个元素垂直距离为 : #top元素的 margin-top值
当你使用 margin auto
时,就应该联想到一个词 :填充
一个没有设置宽高的块级元素,会自动填充宽度
若是 一侧是定值,一侧是 auto,则 auto 为剩余空间的大小
若是两侧均是 auto,则平分 剩余空间
示例以下:
<style> #demo{ width: 500px; margin-right:100px; /* margin-left: 100vw - margin-right - width*/ margin-left:auto; } </style> <div id="demo"></div>
以上,咱们可得当一个块级元素设置了 margin: 0 auto
能够实现水平居中,
而为何 margin:auto 0 不会垂直居中?
答:一个块级元素会自动填充可用的水平尺寸,但不会填充垂直尺寸,是由于其根本没有任何可用的垂直空间。也就是说 margin: 0 auto , 老是有尺寸能够来填充的! 而 margin: auto 0 是没有任何尺寸的能够来填充的。
当子元素的宽度大于父元素的宽度 ,是没法经过 margin: 0 auto 实现居中的 由于,这个时候已经没有任何空间能够填充了,当宽度超出父元素时,margin 已经为负值了。
<style> .father{ writing-mode: vertical-lr;/* 更改流的方向为 垂直方向 */ } .son{ margin: auto; } </style> <div class="father"> <div class="son"></div> </div>
<style> .parent{ position: relative; } .child{ position: absolute; top: 0; bottom: 0; left: 0; right: 0; margin:auto; } </style> <div class="parent"> <div class="child"></div> </div>
margin-end 与 margin-start 相对
margin-before 默认状况等同于 margin-top
margin-after 默认状况等同于 margin-bottom
margin-collapse
(默认值) 发生重叠
取消重叠,margin 重叠部分为 0 ,没有margin
不发生重叠,margin 重叠部分为 margin-top + margin-bottom
margin 课程就到此结束了,再次感谢张鑫旭老师的辛苦付出!
深刻Web全栈各项技术,坚持原创,文章更新虽不定,但只为质量而生,若是您喜欢此篇文章,欢迎支持关注。