摘要:之后仔细的百度了一下,发现了这么一个叫做内外补丁负值法的东西。在这个解决方案中,又涉及到了传说中的负。深入研究之后又发现了圣杯布局双飞翼布局等很多示例,确实要好好研究负边距这个东西了。相关推荐那些年,奇妙的圣杯与双飞翼,还有负边距
2015-04-22 时候写的老文,因为希望引用所以拿了出来。
那天被一个同学问了一个问题,三列的div,要求父div的高度和三个div的高度都和三个中字数最多,也就是高度最高的那个一样高。试了试才发现确实有问题。在网上查到了解决方案,运用了一些很奇葩的代码,贴上来和大家分享。点击这里查看demo。
之后仔细的百度了一下,发现了这么一个叫做内外补丁负值法的东西。不过百度内外补丁负值法,出来的都是同一篇文章,感觉不是一个真正的术语。还是把这篇文章贴出来,有兴趣的同学可以看看。
在这个解决方案中,又涉及到了传说中的负margin。之前在阿里笔试也有一个三栏布局的题,其中一个解决方案用的也是左右的负margin。深入研究之后又发现了圣杯布局、双飞翼布局等很多示例,确实要好好研究负边距这个东西了。
之后参考了CSS布局奇淫巧计之-强大的负边距这篇文章,里面做了实际的demo,总结成一点就是,css中盒子真正的边界,是由margin决定的,而且margin可以很霸气的通过负值来压缩实际宽度(padding不允许负值)。
有了这一点认识之后,很多问题都解决了。就比如说上边那个demo,通过padding-bottom:10000px;创建了一个足够高的盒子,再通过margin-bottom:-10000px;抵消这部分盒子在文档流中的实际占位(但是实际还是存在的,所以就会按照第一个的高度等高),再给父级元素加上overflow:hidden,去掉多余的高度,效果就实现了。
同时,在上边那篇文章里还解决了一个布局的问题,就是多列间有margin,但是两边没margin的问题(听不懂我中文的直接点这里看demo吧,我知道自己说的不好)。之前一直是循环到一行最后一个的时候给加上一个class,现在可以免了,就比如我在demo里用margin-right:10px;给li之间创建一个间隔,然后用marigin-rignt:-10px;强行加宽ul,使四个li能在一行,但是ul外content的宽度设为width:830px;(4200px+310px;),这样就可以正确的居中了。
之后简单说下圣杯布局和双飞翼布局吧,他们主要是为了解决三栏问题。三栏问题的研究可以看看张鑫旭老师的博客文章我熟知的三种三栏网页自适应的布局方法。然后以双飞翼举例吧,他的DOM结构是这样的。
把main放在最前面,然后对.sub(也就是left)使用margin-left:100%;强行移动到左边;对.extra(也就是right)使用margin-left:(right的宽度);强行移动到右边。由于右边的栏会盖住main的内容,所有就直接给main里加上子div,通过给子div加上margin-right防止重叠保证正常显示。如此煞费苦心的布局目的只有一个,就是让浏览器先渲染main,实现主内容先被加载的效果。圣杯布局的话,印象中就是把.main-content的margin换成了.main的padding,目的都是一样的。
再多说一点关于三栏布局的东西,就是在利用浮动布局来实现三栏的时候,应该记住,在DOM里的顺序,是左浮动的div最前,右浮动的div中间,中间的在最后,不然就会出问题。千万不要想当然觉得中间的div在DOM的中间,然后两边div分别float。因为中间的div默认要占一行,按理说右边的会先被挤下去,再float,所以他就上不来了,实现不了我们想要的效果。如果没有把中间的div放到第一个位置的需求的话,还是建议用浮动的方法做三栏布局,简单易用成本低。
自此也算是总结了负边距的一些效果,有时候想想的话,要是pading支持负值的话又会有什么样的奇怪方案出现呢?
== 2015-11-27更新 ==
今天见到了一个奇怪的面试题,用三个div实现一条彩虹,同样使用了负边距。
相关推荐:
那些年,奇妙的圣杯与双飞翼,还有负边距
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/111324.html
摘要:奇妙的圣杯与双飞翼相信很多人和我在学习前端差不多的时候就听说过了圣杯布局与双飞翼布局。他往前移动之后,文档流也会跟着移动元素宽度负边距负边距可以增加元素的宽度,对于没有的元素,负边距可以加宽他们。 [TOC] 没错,题目就是模仿《那些年,我们一起清除过的浮动》而来的。 奇妙的圣杯与双飞翼 相信很多人和我在学习前端差不多的时候就听说过了圣杯布局与双飞翼布局。关于取名无非是觉得长得像圣杯,...
摘要:中,水平边距永远不会重合。垂直边距可能在特定的框之间重合常规流向中两个或多个块框相邻的垂直边距会重合。结果的边距宽度是相邻边距宽度中较大的值。如果出现负边距,则在最大的正边距中减去绝对值最大的负边距。绝对和相对定位的框的边距不重合。 这是一个早以前研究过的东西,今天java开发说起了这个,顺带记录一下。这里有一行代码,很简单的一段代码 #div1{ background:#0...
摘要:清单一些说明注意文档的书写顺序,先写两侧栏,再写主面板,更换后则侧栏会被挤到下一列圣杯布局和双飞翼布局都会用到。可以通过设置的属性或使用双飞翼布局避免问题。双飞翼布局不用设置相对布局,以及对应的和值。 本文首发于知乎专栏:前端指南 CSS布局 布局是CSS中一个重要部分,本文总结了CSS布局中的常用技巧,包括常用的水平居中、垂直居中方法,以及单列布局、多列布局的多种实现方式(包括传统的...
摘要:布局经典问题初步整理标签前端本文主要对布局中常见的经典问题进行简单说明,并提供相关解决方案的参考链接,涉及到三栏式布局,负,清除浮动,居中布局,响应式设计,布局,等等。 CSS 布局经典问题初步整理 标签 : 前端 [TOC] 本文主要对 CSS 布局中常见的经典问题进行简单说明,并提供相关解决方案的参考链接,涉及到三栏式布局,负 margin,清除浮动,居中布局,响应式设计,Fl...
阅读 2772·2021-11-22 15:11
阅读 3536·2021-09-28 09:43
阅读 2888·2019-08-30 13:05
阅读 3429·2019-08-30 11:18
阅读 1445·2019-08-29 16:34
阅读 1298·2019-08-29 13:53
阅读 2905·2019-08-29 11:03
阅读 1657·2019-08-29 10:57