前端相关

_flex布局汇总2

2017-09-13  本文已影响5人  DeeJay_Y

flex参考

flex

除了 CSS 中已有的布局系统之外,CSS3还提供了一个额外的布局系统。在这个新的框模型中,框的子代采用水平或垂直布局,而且可将未使用的空间分配给特定的子代,或者通过“弹性”分配给应展开的子代,在各子代间进行分配。这些框的嵌套(水平嵌套在垂直中,或垂直嵌套在水平中)可用于在两个维度中构建布局。

Flexbox 为 display 属性赋予了一个新的值box,还为我们提供了8个新的属性:

这些属性有的作用于父容器,有的作用于子容器,需要配合使用
先介绍用于父容器的几个

display:flex

一个容器设置了display:flex;属性就定义了一个flex容器,它的直接子元素会接受这个flex环境

.container {
  display: flex; /* or inline-flex */
}

flex-direction

flex-direction1.png

设置或检索伸缩盒对象的子元素在父容器中的位置

.container { flex-direction: row | row-reverse | column | column-reverse;}

flex-wrap

flex-wrap.png

设置或检索弹性盒模型对象的子元素超出父容器时是否换行

默认所有的flex item会尝试放在一行中,可以通过设置flex-wrap设置新行的方向

.container{
  flex-wrap: nowrap | wrap | wrap-reverse;
}

justify-content

justify-contentjustify-content

设置或检索弹性盒子元素在主轴(横轴)方向上的对齐方式,当弹性盒里一行上的所有子元素都不能伸缩或已经达到其最大值时,这一属性可协助对多余的空间进行分配。当元素溢出某行时,这一属性同样会在对齐上进行控制

.container { justify-content: flex-start | flex-end | center | space-between | space-around;}

align-items

align-itemsalign-items

设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式

.container { align-items: flex-start | flex-end | center | baseline | stretch;}

align-content

imageimage

设置或检索弹性盒堆叠伸缩行的对齐方式

.container { align-content: flex-start | flex-end | center | space-between | space-around | stretch;}

在子元素上的属性

order

orderorder

在默认情况下flex order会按照书写顺训呈现,可以通过order
属性改变,数值小的在前面,还可以是负数

.item { order: <integer>;}

flex-grow

flex-growflex-grow

设置或检索弹性盒的扩展比率,根据弹性盒子元素所设置的扩展因子作为比率来分配剩余空间

.item { flex-grow: <number>; /* default 0 */}

flex-shrink

设置或检索弹性盒的收缩比率,根据弹性盒子元素所设置的收缩因子作为比率来收缩空间

.item {
flex-shrink: <number>; /* default 1 */
}
看个例子

<ul id="flex">
    <li>a</li>
    <li>b</li>
    <li>c</li>
</ul>

#flex{display:-webkit-flex;display:flex;width:400px;margin:0;padding:0;list-style:none;}
#flex li{width:200px;}
#flex li:nth-child(1){background:#888;}
#flex li:nth-child(2){background:#ccc;}
#flex li:nth-child(3){-webkit-flex-shrink:3;flex-shrink:3;background:#aaa;}

flex-shrink的默认值为1,如果没有显示定义该属性,将会自动按照默认值1在所有因子相加之后计算比率来进行空间收缩。

c显式的定义了flex-shrink,a,b没有显式定义,但将根据默认值1来计算,可以看到总共将剩余空间分成了5份,其中a占1份,b占1份,c占3分,即1:1:3

我们可以看到父容器定义为400px,子项被定义为200px,相加之后即为600px,超出父容器200px。那么这么超出的200px需要被a,b,c消化

按照以上定义a,b,c将按照1:1:3来分配200px,计算后即可得40px,40px,120px

换句话说,a,b,c各需要消化40px,40px,120px,那么就需要用原定义的宽度相减这个值,最后得出a为160px,b为160px,c为80px

flex-basis

设置或检索弹性盒伸缩基准值,如果所有子元素的基准值之和大于剩余空间,则会根据每项设置的基准值,按比率伸缩剩余空间

.item {
  flex-basis: <length> | auto; /* default auto */
}

flex

flex-grow
, flex-shrink
,flex-basis
的缩写

.item { flex: none | [ <'flex-grow'> <'flex-shrink'>? || <'flex-basis'> ]}

align-self

align-selfalign-self

设置或检索弹性盒子元素在侧轴(纵轴)方向上的对齐方式,可以覆盖父容器align-items
的设置

.item { align-self: auto | flex-start | flex-end | center | baseline | stretch;}

使用举例:

1:

    <style>
        .div1 .parent {
            display: flex;
            height: 200px;
            border: 1px solid red;
        }
        .div1 .child {
            width: 100px;
            height: 100px; /*子元素定高定宽*/
            border: 1px solid;
            margin: auto; /*设置margin:auto之后 就可以均匀排列*/
        }
    </style>
</head>
<body>
<div class="div1">
    <div class="parent">
        <div class="child"></div>
        <div class="child"></div>
        <div class="child"></div>
    </div>
</div>

2:

    <style>
        .div2 .parent {
            display: flex;
            border: 3px solid red;
            margin-top: 10px;
        }
        .div2 .child {
            height: 100px; /*子元素只指定高度*/
            border: 1px solid;
            flex: 1; /*设置了child flex都为1之后,3个child的宽度为1:1:1*/
        }
        .div2 .child:nth-child(2) {
            flex: 2; /*设置第二个child flex为2 宽度之比现在变为了1:2:1*/
        }
    </style>
</head>
<body>
<div class="div2">
    <div class="parent">
        <div class="child">1</div>
        <div class="child">2</div>
        <div class="child">3</div>
    </div>
</div>

3:

    <style>
        .div3 .parent {
            display: flex;
            border: 3px solid red;
            margin-top: 10px;
            align-items: center; /*设置垂直居中*/
        }
        .div3 .img {
            width: 50px;
            height: 50px; /*头像图片设置宽高*/
            border: 1px solid;
        }
        .div3 .content {
            height: 150px;
            border: 1px solid;
            flex: 1;
        }
    </style>
</head>
<body>
<div class="div3">
    <div class="parent">
        <div class="img">1</div>
        <div class="content">2  要实现左侧图片一直垂直居中,右边评论的高度不固定的情况 </div>
    </div>
</div>
上一篇下一篇

猜你喜欢

热点阅读