CSS两栏布局

255 阅读2分钟

#html和基本样式

左边固定,右边自适应的两栏布局

<div class="wrapper">
    <div class="left">左边固定</div>
    <div class="right">右边自适应</div>
</div>
* {
    box-sizing inhert
}
.wrapper {
    padding 20px
    border 1px solid #ddd
    box-sizing border-box
}
.left,.right {
    border 1px solid #999
}

.left {
    width 200px
}

后面所有样式,都是扩展样式,也就是在原样式的基础上加上class

1. inline-block 方案

.wrapper1 {
    font-size 0 // 消除inline-block元素之间的空格bug,或者也可以用元素间注释的方式
}

.left1, right1 {
    display inline-block
    vertical-align top // 顶端对齐
    font-size 14px
}

.right1 {
    width calc(100% - 200px)
}

缺点: - 需要消除inline-block元素的间距bug - 需要设置vertical-align: top满足顶端对齐

双float 方案

.wrapper2 { overflow auto // 清除浮动 }

.left2, right2 { float left }

.right2 { width calc(100% - 200px) }

和1中的方法原理相同

优点: 不用解决inline-block的间隙bug,不用顶端对齐

缺点: 需要清除浮动

3. absolute+ margin-left 方案

.left3 {
    position absolute
}
.right3 {
    margin-left 200px
}

缺点: - 绝对定位依赖父元素定位 - 若左侧盒子超过右侧盒子高度,那么只能通过设置父容器的min-height来解决

4. float + BFC 方案

.wrapper4 {
    overflow auto
}
.left4 {
    float left
}
.right4 {
    overflow auto // 利用overflow属性实现BFC,此盒子不会和浮动元素重叠
}

缺点: 父元素需要清除浮动

5. flex方案

.wrapper5 {
    display flex
    align-items flex-start
}
.right5 {
    flex 1
}

可以说是最简便的方法了,flex容器的一个默认属性值:align-items: stretch;。这个属性导致了列等高的效果。 为了让两个盒子高度自动,需要设置: align-items: flex-start

缺点: 兼容问题你懂的