C3:使用flex弹性布局

垂直居中

相信咱们大多数人都是从static,浮动,定位这三种布局方式来开始制做网页的。在大多数的业务需求下,浮动和定位都可以很好的知足咱们的开发须要。即便是在响应式设计中,浮动和定位配合百分比,rem,媒体查询都可以解决大多数的问题。可是若是你只使用浮动和定位的话,碰到如下的场景你就会发现不是那么好用。html

clipboard.png

黄色背景的段落在背景色#ccc的宽高不定的父容器中水平和垂直居中。若是只用浮动和定位的话,貌似很困难。咱们得设置p段落相对于父容器绝对定位,left和top都为50%,在使用translate往左往上各移动-50%.android

.wrap{
    position:relative;
    background-color:#ccc;
    width:50%;
    height:60%;
}
p{
    position:absolute;
    top:50%;
    left:50%;
    transform:translate(-50%,-50%);
    width:100px;
}

其中的原理是p的left和top的百分比是相对于.wrap 父容器的宽高,而translate的百分比是相对于自身的宽高的。这样子也能作到元素在宽高不定的容器的垂直水平居中。可是,这不够优雅和实用,而且累赘web

而使用flex的话就比较简单了。布局

.wrap{
    width:50%;
    height:50%
    background-color:#ccc;
    display:flex;
    justify-content:center;
    align-items:center;
}

flex的出现,可让咱们很是轻松地解决相似居中的问题。flex是弹性的意思,顾名思义,弹性才是flex的精髓所在。网上已经有不少篇介绍flex的专业文章了。诸如:
Flex 布局教程:语法篇
Flex 布局教程:实例篇
一劳永逸的搞定 flex 布局flex

flex的12个相关属性和主轴,交叉轴的概念

对于flex最重要的就是知道其中的12个属性以及主轴交叉轴的概念。上面三篇文章已经详尽地解释了这些概念和属性的用法。总结出来就是一张图:spa

clipboard.png

flex-basis:该值决定了元素在主轴方向上的初始大小.当分配给这个元素的宽度小于这个值的时候,flex父容器内的元素开始拉伸或者缩小.默认取值auto,便是按照元素的width/height属性来决定的.可取的其余的值是px,rem,百分比.
flex-direction:定义主轴的方向.可选的取值有row,columns,row-reverse,columns-reverse.
flex-grow:flex元素拉伸的比例,
flex-shrink:flex元素压缩的比例.
justify-content:做用与父容器,定义主轴上的元素的排列方式.可选的值有:flex-start,flex-end,center,space-around,space-between.
align-items:做用于父容器,定义交叉轴上的元素的排列方式,取值和意义同justify-content同样.
align-self:做用于子容器,子元素本身定义本身在交叉轴上的排列方式.优先级比父元素指定的高.取值和意义同align-items.
flex:flex-grow,flex-shrink,flex-basis的简写.
flex-wrap:定义父容器是否换行.默认不换行.若是该元素取值为wrap.那么父容器中一行的长度不够容纳的时候,就换行显示,若是子容器的flex-basis 计算宽度/高度 大于 父容器的宽度/高度,就会压缩.不然就拉伸.
flex-flow:flex-direction,flex-wrap的简写.
order:做用于子容器,定义在主轴上的顺序.默认为0,最高.相同的order的状况下,按照在html的顺序来决定..net

兼容性

flex的兼容性:IE10如下不支持。IE11如下须要加-ms-前缀。android4.4如下须要加-webkit-前缀scala

布局实例

假设咱们的设计稿以下:设计

clipboard.png

分为两步:
1.将图片的父容器设为display:flex;设置文字区域盒子为flex:1;code

clipboard.png

2.设置文字区域盒子的display:flex;而且设置主轴向下:flex-direction:columns;
clipboard.png

完整代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name='viewport' content="width=device-width,initial-scale=1.0,user-scalable=no">
    <title>flex 用于产品列表布局</title>
    <style>
        *{
            padding:0;
            margin:0;
            border:none;
        }
        .list{
            display:flex;
            flex-direction:column;
            max-width:640px;
            min-width:320px;
            width:100%;
            margin:0 auto;
        }
        .item{
            border-bottom:1px solid #e0e0e0;
            padding:20px;
            display:flex;
            flex-wrap:wrap;
            
        }
        .item .img-con{
            width:100px;
            height:100px;
            position:relative;
            overflow:hidden;
        }
        .item .img-con img{
            width:100%;
            position:absolute;
            top:50%;
            left:50%;
            transform:translate(-50%,-50%);
        }
        .item .text-con{
            font-size:14px;
            flex:1;
            margin-left:15px;
            /*background-color:#fccf00;*/
            align-self:stretch;
            display:flex;
            flex-direction:column;
            justify-content:space-around;
        }
        .item .text-con h4{
            max-height:34px;
            overflow:hidden;
            font-size:15px;
            line-height:1.066667;
        }
        .item .text-con strong{
            font-weight:normal;
            color:red;
            font-size:16px;
            line-height:1.625;
        }
    </style>
</head>
<body>
    <ul class="list">
        <li class="item">
            <div class="img-con">
                <img src="./nature1.jpg" alt="product image" >
            </div>
            <!--产品文字信息-->
            <div class="text-con">
                <h4>上海品图包装设计/包装盒设计/精装纸盒设计上海品图包装设计</h4>
                <strong>1.5元/张</strong>
                <span>99℃</span>
            </div>
        </li>
        <li class="item">
            <div class="img-con">
                <img src="./nature1.jpg" alt="product image" >
            </div>
            <!--产品文字信息-->
            <div class="text-con">
                <h4>上海品图包装设计/包装盒设计/精装纸盒设计上海品图包装设计</h4>
                <strong>1.5元/张</strong>
                <span>99℃</span>
            </div>
        </li>
        <li class="item">
            <div class="img-con">
                <img src="./nature1.jpg" alt="product image" >
            </div>
            <!--产品文字信息-->
            <div class="text-con">
                <h4>上海品图包装设计/包装盒设计/精装纸盒设计上海品图包装设计</h4>
                <strong>1.5元/张</strong>
                <span>99℃</span>
            </div>
        </li>
        <li class="item">
            <div class="img-con">
                <img src="./nature1.jpg" alt="product image" >
            </div>
            <!--产品文字信息-->
            <div class="text-con">
                <h4>上海品图包装设计/包装盒设计/精装纸盒设计上海品图包装设计</h4>
                <strong>1.5元/张</strong>
                <span>99℃</span>
            </div>
        </li>
        
    </ul>
</body>
</html>
相关文章
相关标签/搜索