margin两个经典bug:
处理bug漏洞,只能弥补,不能完全解决。
一、margin 塌陷问题:
没加 margin 时,
![ee3754c117f6cdb63210dceaf027b6b6.png](https://i-blog.csdnimg.cn/blog_migrate/87e657e581dc6583a269a4ace657a62f.png)
![6965014b534b597a58935831e5e17812.png](https://i-blog.csdnimg.cn/blog_migrate/b5dc7173c3402cb59d0c383d4f858f66.png)
![7144821012b0f443806add57b953675d.png](https://i-blog.csdnimg.cn/blog_migrate/775ed2f706ae1c937a41289ec2e8b7c1.png)
给wrapper的子元素加上margin-top之后,发现父元素也跟着子元素走,
![5422860e0c7c41b912c298ed56163b43.png](https://i-blog.csdnimg.cn/blog_migrate/679f64aa32ee186d9c00df409f1b5c7c.png)
![643208abfa6fdce8186b07c2f29c59a2.png](https://i-blog.csdnimg.cn/blog_migrate/68762d3c49003196e7fde1bc4fccd43a.png)
给wrapper加上margin-top之后,发现子元素的margin-top变成100px了,这就是margin塌陷问题,
![48223d0025d9f2d21576be424f0b912c.png](https://i-blog.csdnimg.cn/blog_migrate/a00ed4c90e133469520197f982187d2f.png)
![9b8685b4f5bd3476c991c7e9aa2d0954.png](https://i-blog.csdnimg.cn/blog_migrate/a6b5626620ca4037aac4e8110924860f.png)
注意:垂直方向的margin-top,父子元素是结合到一起的,它俩会取最大的值。
怎么弥补这个bug呢?有两个方法。
1、给它的父元素加条线,加个顶。(这种做法不专业)
![fe86dee73870861f9d6b59970da803ad.png](https://i-blog.csdnimg.cn/blog_migrate/122c3b897d0840326f749dd837f9de5a.png)
![c4578936a1ebdd64414edbecb3614122.png](https://i-blog.csdnimg.cn/blog_migrate/8b8983f3587600cf34e727d2ba6d70aa.png)
2、触发bfc。(这种方法比较专业)
那么bfc是什么呢?我们先来了解一下。
bfc:“block format context” ,简称,块级格式化上下文。
设置bfc后,特定的盒子会遵循另一套语法规则。简单的说,就是bfc能改变盒子的语法规则。
/* 如何触发一个盒子的bfc */
方法一,position:absolute; (设置为绝对定位)
![bbce7dac728cc3ed9a9f4b5b67149e07.png](https://i-blog.csdnimg.cn/blog_migrate/d959dcd02c1bece78a325e2818def960.png)
![04dda072941bd9284b70706470d98f1e.png](https://i-blog.csdnimg.cn/blog_migrate/6eec7c58864d079406482fdc01e11eae.png)
方法二,display:inline-block; (设置为行级块元素)
![21309a5f357a75b23e38900efc6489bb.png](https://i-blog.csdnimg.cn/blog_migrate/8b99e0c146e768b2accb4a6d2667c654.png)
![04dda072941bd9284b70706470d98f1e.png](https://i-blog.csdnimg.cn/blog_migrate/6eec7c58864d079406482fdc01e11eae.png)
方法三,float:left/right; (设置为浮动元素)
![99c5d7cedd03fe36763aab373cb1cadd.png](https://i-blog.csdnimg.cn/blog_migrate/d65522b8da414a73294fc3eaa9d51199.png)
![954717b620c7c429c85be8412283e7a9.png](https://i-blog.csdnimg.cn/blog_migrate/d0b85963b926df74df89b8aafb2b8caa.png)
![28d45e4e247ed7a4c89fcc02e4853b1c.png](https://i-blog.csdnimg.cn/blog_migrate/a72602d2b22349b8e6fa48e52455583d.png)
![aea1c278f277dea8b7a216126a8b3cab.png](https://i-blog.csdnimg.cn/blog_migrate/842ebb4189b44dd4563ff75de94592b4.png)
方法四,overflow:hidden; (设置为溢出部分隐藏)
![517344139c8676d4061206ee2e1e5dcc.png](https://i-blog.csdnimg.cn/blog_migrate/eae255b48a88cb066e1f6c182ba36e99.png)
![954717b620c7c429c85be8412283e7a9.png](https://i-blog.csdnimg.cn/blog_migrate/d0b85963b926df74df89b8aafb2b8caa.png)
二、margin 合并问题:
没设置margin之前,
![4fb1d024871914f5c63f19578304ef7a.png](https://i-blog.csdnimg.cn/blog_migrate/6339c85ff111022f16a36859a208b42e.png)
![4f4e3e8906fe5ad3a531900a76f0d74a.png](https://i-blog.csdnimg.cn/blog_migrate/c91f34b76543cfeb1e19f7af58d45762.png)
![2181c7017991dca0ee08eedf717111ac.png](https://i-blog.csdnimg.cn/blog_migrate/cf9e4928f407f98d46327e1b2faabb16.png)
给demo1元素加上margin-bottom,看起来好像没问题,
![397b1e71ec56f8c6fa72ee38e46424c0.png](https://i-blog.csdnimg.cn/blog_migrate/2f3ff93ce0e14685df3007d0a44075f0.png)
![53f5a6a5b1b7ead2be4763b5df989675.png](https://i-blog.csdnimg.cn/blog_migrate/76d15212fa5926471de25844785864ae.png)
给demo2元素再加上margin-top,发现两个元素之间的间隔没变化,这就是margin 合并的问题了,
![5f27262f3a64e4d3a01813bb09dd1beb.png](https://i-blog.csdnimg.cn/blog_migrate/803cf211b85b798b4cb3c8ad508b70b2.png)
![53f5a6a5b1b7ead2be4763b5df989675.png](https://i-blog.csdnimg.cn/blog_migrate/76d15212fa5926471de25844785864ae.png)
那这个问题又怎么弥补呢?是不是和margin一样也能用bfc弥补呢?
对的,弥补margin合并问题,采用bfc弥补。
bfc前面说过了,这里直接演示了,
1、在demo2父级加上bfc:
![9b69beb209cf165276d80475396faea7.png](https://i-blog.csdnimg.cn/blog_migrate/88332f07fc916b96be7ac4a9339d8956.png)
加上 position:absolute; (设置为绝对定位)
![aae49bad432d6c2cc35cf5a5da54a542.png](https://i-blog.csdnimg.cn/blog_migrate/a9bc3512d3f110174e92becca7809aa6.png)
![c72d7dde9b2f6598c0a108c2707f2743.png](https://i-blog.csdnimg.cn/blog_migrate/9096306d2992057fe6fa98e8d2b78683.png)
加上 display:inline-block; (设置为行级块元素)
![3bfab1f961bc9e174be75073516a3afe.png](https://i-blog.csdnimg.cn/blog_migrate/ae4fff754da965e3df0e692d9e17d6be.png)
![05f9a4870daf4fbbd8ad84d03e5f89bd.png](https://i-blog.csdnimg.cn/blog_migrate/725879839ab942306dfe5c5eda1515fc.png)
加上 float:left/right; (设置为浮动元素)
![a8ca7ee0476bafb9b2d638ccdb4a7b27.png](https://i-blog.csdnimg.cn/blog_migrate/8f3b122ee7c974ea17d15024bcaa5c3f.png)
![c23af57367d457b7c6050586f70c7424.png](https://i-blog.csdnimg.cn/blog_migrate/9f21486dedc0c540b9217b250e493a44.png)
![bf699ffbb87a07de3837d8b11d7de4a9.png](https://i-blog.csdnimg.cn/blog_migrate/815cf2ab5465c9bc41ff8b100918112c.png)
![4e186c5fcf6491223ffc961b939f463b.png](https://i-blog.csdnimg.cn/blog_migrate/352d8ed234994701472786b6b429a402.png)
加上 overflow:hidden; (设置为溢出部分隐藏)
![1a3bf31435335dc9e845c5fce2b89455.png](https://i-blog.csdnimg.cn/blog_migrate/009a0c9b660097ed63978e75270abe73.png)
![ca73cf7458c85b62099fbede14173a73.png](https://i-blog.csdnimg.cn/blog_migrate/9e2ee7ff4f0a31baa98092e0c206756c.png)
2、在demo1父级加上bfc:
![56de627493f7f504a5db3467317e5165.png](https://i-blog.csdnimg.cn/blog_migrate/0578635c871e42d3d7a5f6ccca34a4be.png)
加上 position:absolute; (设置为绝对定位)
![62434cbcf9822d3730d9caaa07ead3f0.png](https://i-blog.csdnimg.cn/blog_migrate/4d45613da1f53dcf66e0857cd668c25f.png)
![033776619bcdf220adcc727233388f6d.png](https://i-blog.csdnimg.cn/blog_migrate/6a79ede45915e17962c5d69fac1090d0.png)
加上 display:inline-block; (设置为行级块元素)
![54dc62a54541d4048d41689b22999007.png](https://i-blog.csdnimg.cn/blog_migrate/1925f5ea9adf1088fcb4604f3f78f6b0.png)
![bdb155680ef65b53c4ed014db0ec4963.png](https://i-blog.csdnimg.cn/blog_migrate/1e84a5536581ddc6519e66100a231639.png)
加上 float:left/right; (设置为浮动元素)
![a4144748d858f0a8c716c8c272bc0236.png](https://i-blog.csdnimg.cn/blog_migrate/5f244759c6c0e6d36976ea7d91ad6aca.png)
![a625f4e24498fa4d9cbcacc13ffb0249.png](https://i-blog.csdnimg.cn/blog_migrate/d3c3eea0ac8753be464a1752611ca057.png)
![65279de4733f9107ecf17bf736083b2f.png](https://i-blog.csdnimg.cn/blog_migrate/7d4f28f5f0ff3e23dd47204ece020358.png)
![9aa0e3d5df9b7a4bc55734ef14c7a98f.png](https://i-blog.csdnimg.cn/blog_migrate/7fbdaa554d3eac9f70b7be5ac0261096.png)
加上 overflow:hidden; (设置为溢出部分隐藏)
![564f72a4757b9968622edf333b14358a.png](https://i-blog.csdnimg.cn/blog_migrate/6c55284d3e2485a2e1768b391dc6b5d7.png)
![af51c41204c743b97fcee92f4e121ec0.png](https://i-blog.csdnimg.cn/blog_migrate/5721c6e9f82934c2a6b1effdc1c4757c.png)
演示完,发现在demo1父级加上bfc,好像并不是所有能触发bfc的都能弥补margin合并问题。
总的来说,触发bfc是可以弥补margin合并问题,但虽然弥补了margin合并问题,触发bfc之后却会引发更多问题。
因此,margin合并问题,一般不需要去弥补解决。