css笔记 - 张鑫旭css课程笔记之 margin 篇

margin - 人若犯我,我必犯人!

[margin地址](https://www.imooc.com/learn/680)

一、margin与容器尺寸的关系

relative可定位,但是不改变容器尺寸和占据的空间
margin不同,margin也在盒模型中。
从border开始往里边,是可视尺寸clientWidth部分。
加上margin,是占据尺寸outerWidth
margin可以改变元素尺寸,正值宽度变小,负值宽度变大。
margin也可以定位

二、margin的百分比单位

margin: 10%;
普通元素的百分比margin都是相对于容器的宽度计算的
绝对定位元素的百分比margin是相对于第一个定位祖先元素的宽度计算的;第一个定位祖先元素即第一个position值为relative/absolute/fixed的祖先元素。

margin百分比应用 —— 宽高比例为二比一的矩形效果

 

代码:

 

  

 

三、margin重叠

为什么会有margin重叠?
如何利用margin重叠?

 

1. margin重叠的原因
对于文字排版阅读的考虑,使得连续段落之间,首尾项和其他兄弟标签的比例不变。

 

2. margin重叠的特性

1).margin重叠只会发生在block水平元素上
普通的div,p,ul,li标签会,图片、按钮使用margin的时候就不会。因为内联元素没有垂直方向的上下margin。除非文档流变过来。

但是不包括float和absolute元素,因为会形成bfc?使用了float之后,元素变成内联块状元素,外部盒子是内联盒子,不会发生margin重叠。也就是上下左右的margin均不会重叠。

2).margin重叠只发生在垂直方向,
margin上下重叠,不会左右重叠。除非writing-mode书写格式变成垂直方向的从上往下排列,就会有左右重叠,没有上下重叠。

 

3. margin重叠的计算规则

正正取大值
正负值相加:有正有负时,正负值相加得到的结果就是重叠的值
负负最负值: 重叠时,取绝对值最大的负值。如-50/-20,取-50

 

4. margin重叠的几种情况

margin重叠现象观察

 

研究代码:

  

5. 解决margin重叠的方法

父元素设置BFC(如overflow:hidden;如position:absolute等
父元素设置border/padding
父元素与相邻子元素之间用inline元素隔开来
margin-bottom重叠的另一个解决方法是父元素设置了高度,高过子元素+margin-bottom也就不会重叠

 

四、margin:auto;

** auto用来计算剩余空间:
也就是说,如果占据的空间没有盛满容器,比如内联元素就不会在margin:auto上起作用。如果改为block元素,再加上宽度的设置,auto才会计算剩余空间。
margin自动填充width剩余部分的空间。不计算height是因为高度上不会有剩余空间。就好像内联元素没有填充水平宽度就没有水平方向的剩余空间是一样的。
竟然还可以这么写: 

margin: 20px 30px 10px auto;

也就是对立 方位的margin属性值,其中一个设置固定值后,另一个可以设置auto,则会自动填充剩余空间。但感觉又没有必要这么多余一下。
左右均为auto的比较常见,平分剩余空间。
上下设置auto没有变化。根本还是因为垂直方向上没有剩余空间可供分割额。
具体见下

 

margin:auto失效的情况:

  

margin:auto实现垂直居中:


五、垂直方向的居中:

1.可以改变流的方向为垂直方向的:(css3)

writing-mode: vertical-lr;

这种方法会让垂直的margin auto起作用,但是水平方向的不会起作用了。因为宽度不会自动填充了。


2. 见下方代码:

1 position:absolute;
2 top:0;
3 right:0;
4 bottom:0;
5 left:0;
6 margin: auto;

 

六、利用margin负值实现的布局

1. 两端对齐(两端网格对齐

利用margin可以改变元素尺寸的特性
使用margin负值让列表的宽度变宽即可。

  

2. 两栏等高布局

margin-bottom负值和padding-bottom结合实现

利用margin负值可以改变元素的占据空间的特性
padding-bottom把元素底部的区域撑开来,margin-bottom再减少不可见的那一层高度,把撑出来的padding抵消回去。但实际高度还在,所以padding撑出来的区域内部的背景色还可以看到。
被margin抵消的高度就成了虚拟高度,不占父元素实体空间,再利用父元素的超出隐藏,就把多余的删掉了。
这个方法不是让多栏的高度变得一般长,而是变得足够长,以至于看不到尾部不对齐的那种样式。把值设置的小一点再把父元素的overflow去掉即可一目了然其原理。

方法二:

  

3. 两栏自适应布局,右边图片左边文案

 

总结一批:

利用margin负值等于图片宽度,可以让右边图片跑到左边文案之上。

但前提是左边的元素和图片都要左浮动,不然不能

图片不用左浮动也可以,但是margin-left负值必须为自身宽度加上父元素的border

左边文案元素不用浮动不行,图片上不去。

代码:

 

4. 慕课网课程主页效果

 

 

  

 

七、margin无效 的几种情况

1. 内联元素垂直margin无效
  需满足正常书写模式,正常文档流,且非替换元素。比如不是img,button等内联元素

2. 垂直方向margin重叠导致的

  感觉上以为margin无效,没起作用。但其实是有用的。

3. display: table-cell与margin
  margin不能应用于display为table类型有表格相关声明的元素身上。
  比如:table-cell,table-row等

4. 绝对定位元素非定位方位的margin值"无效"
  比如某元素绝对定位,设置top,left方位值,但是再设置margin-right和margin-bottom,设置多大多小都是没用的。只能设置margin-left/top
  无效指的是,对于元素的偏移、定位没有影响,但实际影响元素的占据空间。
  因为浮起来的元素就好像在空气中一样,没有边界可言。触不到边他就不会反弹。而同样浮起来的两个元素又不在一个层级里。也互相触碰不到。

5. 鞭长莫及导致的margin无效
  float元素相邻的元素,其对应方位的margin相对于父元素的空间

6. 内联特性导致的margin无效。。。
  margin负值小到一定程度,定位效果无效。

 

示例 - 被a包裹的元素设置margin无效:

是因为a内部的元素是inline,inline元素设置上下margin无效。那么a里边的元素改成block元素,a也要变成block元素,同时使用padding或者border形成bfc,阻止margin穿透。

示例 - 绝对定位元素非定位方位的margin值"无效"

代码:

  

 

八、取消重叠

margin-collapse

 

 九、margin开始方位,margin结束方位。

margin-start/margin-end

适用于任何文档流:

  • 如果文档流从左到右,则margin-start等同于margin-left
  • 如果文档流从上到下,则margin-start等同于margin-top
  • 如果文档流从右到左,则margin-start等同于margin-right

 

2018/07/24 18:48

posted @   xing.org1^  阅读(1178)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示