假设高度已知,请写出三栏布局,其中左栏、右栏宽度各为300px,中间自适应dom
方案:float布局,absolute布局,表格布局,grid布局,flex布局,双飞翼布局,圣杯布局(共7种)布局
作法:左右两侧部分分别左右浮动,中间容器要设置的左右margin为左右两侧分别的宽度 注意:在中间的div区域要放到最前面进行渲染 优势:比较简单,兼容性也比较好。只要清除浮动作的好,是没有什么问题的 缺点:浮动元素是脱离文档流,要作清除浮动,这个处理很差的话,会带来不少问题,好比高度塌陷等
作法:对左中右三个区域部分都设置绝对定位,左边区域设置left为0,右边区域设置right为0,中间部分设置的left和right分别是左右区域的宽度 优势:很快捷,设置很方便,并且也不容易出问题 缺点:绝对定位是脱离文档流的,意味着下面的全部子元素也会脱离文档流,这就致使了这种方法的有效性和可以使用性是比较差的
作法:对包裹的父容器设置display:table,对左中右区域分别设置display:table-cell 优势:实现简单,代码少 缺点:当其中一个单元格高度超出的时候,两侧的单元格也是会跟着一块儿变高的,而有时候这种效果不是咱们想要的
作法:对包裹的父容器设置display:grid,而且设置grid-template-columns:左边宽度 auto(中间宽度自动) 右边宽度,grid-template-rows: 各区域高度 注意:在中间的div区域要放到中间进行渲染 优势:简单快捷(能够随意组合,其一高度发生变化,另外模块也不会进行跟着变化) 缺点:不支持IE10如下
作法:对包裹的父容器设置display:flex,设置中间的区域为flex:1 注意:在中间的div区域要放到中间进行渲染 优势:简单快捷(在不设置高度状况下,min-height除外,那么其一块高度发生变化,其它块高度也会发生变化) 缺点:不支持IE10如下
作法:对包裹的父容器设置padding(给左右两区域留出位置)。对中间区域设置宽度为100% 对左中右区域设置position:relative,左区域的left:-左区域宽度,margin-left:-100%。右区域的right:-右区域宽度,margin-left:-右区域宽度(左右区域占据了父容器的padding部分) 注意:最好给body设置一个最小宽度 优势:结构简单,无多余dom层 缺点:中间部分宽度小于左侧时会发生混乱
作法:对左中右区域都设置左浮动,对于中间区域用一个容器包裹着,并设置宽度为100%。中间包裹的子区域,设置左右margin为左右区域的宽度(给左右两区域留出位置) 设置左边区域的margin-left:-100%,设置右边区域的margin-left:-右区域宽度(左右区域所占据的空间是中间区域的margin空间) 注意:对于中间的区域必定要有个容器包裹着 优势:支持各类宽高变化,通用性强 缺点:多了一层包裹中间区域的代码(增长渲染树的计算量),三栏高度不统一
若高度不固定,则可使用哪一种布局
方案:flex布局,grid布局,table布局flex