相信你们一看到这个题目,有些同窗就会叫到:“我也遇到过这样的问题!”,这具体是什么问题呢?css
有这样一种页面结构:html
<div class="container"> <div class="left"> left </div> <div class="right"> right </div> </div>
这样的页面结构相信你们常常会遇到,可是这样的结构会出现什么问题呢?常常会遇到,当左边的内容没有右边那么多或者反过来时,就困惑了,左边高度不会跟右边保持一致啊!具体表现以下图:浏览器
这就尴尬了~咋办呢?有的同窗就给出了如下的css,期待可以解决这个问题:flex
.container { overflow: hidden; } .container .left, .container .right { float: left; } .container .left { width: 20%; height: 100%; /* 惋惜不行哦。 */ } .container .right { width: 80%; }
结果就是,too 样 too simple~spa
能够看到,这个办法是行不通的,为何呢?为何设置了height为100%却不像预期的那样呈现呢?其实这里面没有正确理解height这个值的设置,具体能够看看MDN的height解释。code
给最外的元素设置具体的高度值:htm
.container { overflow: hidden; height: 100px; } .container .left, .container .right { float: left; } .container .left { width: 20%; height: 100%; } .container .right { width: 80%; height: 100%; }
这样就能够了,由于子元素的高度使用百分比时,是使用父元素的高度来进行计算的,若是父元素没给出具体的高度,那么会使用auto,而auto由浏览器来计算高度,浏览器计算出来的高度只会是元素的内容高度,因此为何外部元素不设置高度时,内部元素不会自适应高度.blog
完美解决左右子元素高度不一致问题继承
必须设置外部容器的具体高度,当外部容器的高度不定时,问题就头疼了图片
子元素设置浮动,若是不设置overflow:hidden,则必须清除浮动,带来没必要要的麻烦
不设置外部元素的具高度,而设置root元素的高度为100%;
html,body { height: 100%; } .container { height: 100%/inherit; clear: both; } .container:after { display: block; content: " "; clear: both; } .container .left, .container .right { float: left; } .container .left { width: 20%; height: 100%/inherit; } .container .right { width: 80%; height: 100%/inherit; }
根据规范和方案一的经验,咱们能够知道,当父容器设置了100%时,计算的高度会去找父容器,若是父容器无设置具体值,则会一直向上找,一直找到root元素,那么咱们设置root元素为100%,root元素的高度是100%了,当前容器就计算出来是100%了。固然当前元素使用inherit也是能够的,继承于父元素的计算方式。
实现简单,父容器不用设置具体高度值
依然存在须要清除浮动的举动,由于父容器没有设置overflow:hidden;
使用display来实现:
.container { display: table; width: 100%; } .container .left, .container .right { display: table-cell; } .container .left { width: 20%; } .container .right { width: 80%; }
将父容器的display设置为table,将子元素display设置为table-cell,让左右结构表现为table同样,那么就具备table的一些特性:列高度自适应、上下居中等等。
暂未发现
使用相对定位和绝对定位来实现
.container { position: relative; } .container .left { position: absolute; width: 20%; height: 100%; } .container .right { margin-left: 20%; width: 80%; height: 100%; }
代码量少,实现简单,兼容性高
position:relative带来的一些问题(不详细述说,请读者自行挖坑)
使用flex和设置height实现
html,body{ height: 100%; } .container { display: flex; height: 100%; } .container .left { width: 20%; } .container .right { width: 80%; }
实现起来很是简单,简单几行代码便可
兼容性问题,IE10+才能实现,并且在移动端也有必定得兼容性问题