Web前端之路WEB前端程序开发饥人谷技术博客

Flex布局

2017-10-15  本文已影响85人  YM雨蒙

最近这两天一直在学习关于移动端页面,而移动端页面一般很多用flex(弹性)布局,方便简洁,而且没有什么兼容性的问题,我们来看一下关于flex

说起兼容性,我们先用can I Use 看看flex兼容性如何

大部分浏览器都是支持的

那什么是flex弹性布局呢?

在学习flex弹性布局之前,我们先看几个名词flex Terms

关于flex

我们知道了flex弹性布局,如何在css中创建弹性容器

弹性元素flex itemflex弹性容器中的元素都是弹性元素

<div style="display: flex">
    <div>block</div>    // 块级元素在文档流中,弹性元素
    <div style="float: left;">float</div>    // 浮动元素在文档流,弹性元素
    <span>inline</span>        // 行内元素在文档流,弹性元素
    <div style="position: absolute;">position</div>    // 定位元素脱离文档流,不是弹性元素
    <div>
        <div>grandson</div>    // 父级不是弹性容器,不是弹性元素
    </div>
</div>

我们看一下flex布局的特点:

方向相关属性

不同属性值下面,元素在页面下的展示

/* css */
.container{display: flex;}
.container1{flex-direction: row-reverse;}
.container2{flex-direction: column}
.container3{flex-direction: column-reverse}
/* html */
<div class="container container0">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
</div>
默认值:row
flex-direction: row-reverse;
flex-direction: column
flex-direction: column-reverse
/* css */
.container{display: flex;}
.container1{flex-wrap: wrap;}
.container2{flex-wrap: wrap-reverse;}

/* html */
<div class="container container0">
  <div class="item">1</div>
  <div class="item">2</div>
  <div class="item">3</div>
  <div class="item">4</div>
  <div class="item">5</div>
</div>
flex-wrap: nowrap;默认值
flex-wrap: wrap;
flex-wrap: wrap-reverse;
/* css */
.container{display: flex;}
.item2{order: 1;}
.item1{order: 10;}
.item3{order: -1;}

/* html */
<div class="container">
  <div class="item item1">order:1</div>
  <div class="item item2">order:2</div>
  <div class="item item3">order:3</div>
</div>
order

弹性相关属性

/* Specify <'width'> */
flex-basis: 10em;
flex-basis: 3px;
flex-basis: auto;

/* Intrinsic sizing keywords */
flex-basis: fill;
flex-basis: max-content;
flex-basis: min-content;
flex-basis: fit-content;

/* Automatically size based on the flex item’s content */
flex-basis: content;

/* Global values */
flex-basis: inherit;
flex-basis: initial;
flex-basis: unset;
弹性布局元素宽度 = flex-basis + flex-grow / sum(flex-grow)*remain
                   基本宽度             占的比例          剩余空间
/* css */
.container{display: flex;}
.item{width: 100px;}
.item2{flex-basis: 300px;}
.item2{flex-grow: 1;}
.item3{flex-grow: 2;}
.item2, .item3{flex-basis: 0;}

/* html */
<div class="container">
  <div class="item item1">1</div>
  <div class="item item2">2</div>
  <div class="item item3">3</div>
</div>
flex-grow
正常布局空间超出分配超出的负值空间
flex-basis + flex-shrink / sum(flex-shrink)*remain(负值)
/* css */
.container{display: flex;}
.item{flex-shrink: 0;}  //剩余空间没有弹性
.item2{flex-shrink: 2;}  //分到1/2剩余空间

/* html */
<div class="container">
  <div class="item item1">sets the flex shrink factor</div>
  <div class="item item2">sets the flex shrink factor</div>
  <div class="item item3">sets the flex shrink factor</div>
</div>
flex-shrink:1默认值为1平分
/* Basic values */
flex: auto;  // 相当于将属性设置为 flex: 1 1 auto
flex: initial;  // 相当于将属性设置为 flex: 0 1 auto
flex: none;  // 相当于将属性设置为 flex: 0 0 auto
flex: 2;

/* One value, unitless number: flex-grow */
flex: 2;

/* One value, width/height: flex-basis */
flex: 10em;
flex: 30px;

/* Two values: flex-grow | flex-basis */
flex: 1 30px;

/* Two values: flex-grow | flex-shrink */
flex: 2 2;

/* Three values: flex-grow | flex-shrink | flex-basis */
flex: 2 2 10%;

/* Global values */
flex: inherit;
flex: initial;
flex: unset;

语法可参考:flex属性

对齐相关属性

描述
flex-start 从行首开始排列,每行第一个弹性元素与行首对齐,同时所有后续的弹性元素与前一个对齐
flex-end 从行尾开始排列,每行最后一个弹性元素与行尾对齐,其他元素将与后一个对齐
center 伸缩元素向每行中点排列,每行第一个元素到行首的距离将与每行最后一个元素到行尾的距离相同
space-between 在每行上均匀分配弹性元素,相邻元素间距离相同,即空白在子项之间每行第一个元素与行首对齐,每行最后一个元素与行尾对齐
space-around 在每行上均匀分配弹性元素,相邻元素间距离相同,即空白围绕着子项每行第一个元素到行首的距离和每行最后一个元素到行尾的距离将会是相邻元素之间距离的一半
/* css */
.container{display: flex;}
.fs{justify-content: flex-start;}
.fe{justify-content: flex-end;}
.c{justify-content: center;}
.sb{justify-content: space-between;}
.sa{justify-content: space-around;}

/* html */ 更换类名看到不同的效果
<div class="container fs">
  <div class="item item1">1</div>
  <div class="item item2">2</div>
  <div class="item item3">3</div>
</div>
justify-content
描述
flex-start 元素紧靠 cross 轴起始边界
flex-end 元素紧靠 cross 轴结束边界
center 元素在 cross 轴居中,如果元素在 cross 轴上的高度高于其容器,那么在两个方向上溢出距离相同
baseline 所有元素向基线对齐, cross 轴起点到元素基线距离最大的元素将会于 cross 轴起点对齐以确定基线
stretch 弹性元素被在 cross 轴方向被拉伸到与容器相同的高度或宽度
/* css */ 设置在父容器上
.container{display: flex;}
.item1{line-height: 100px;}
.item2{line-height: 70px;}
.fs{align-items: flex-start;}
.fe{align-items: flex-end;}
.c{align-items: center;}
.s{align-items: stretch;}  //拉伸充满父容器
.b{align-items: baseline;}

/* html */ 更换类名看到不同的效果
<div class="container fs">
  <div class="item item1">1</div>
  <div class="item item2">2</div>
  <div class="item item3">3</div>
</div>
align-items align-items
描述
auto 默认值,元素继承了它的父容器的 align-items 属性,如果没有父容器,则值为 "stretch"
flex-start 元素位于该行的 cross 轴的起始边界
flex-end 元素位于该行的 cross 轴的结束边界
center flex 元素会对齐到 cross-axis 的中间,如果该元素的 cross-size 的尺寸大于 flex 容器,将在两个方向均等溢出
baseline 如果弹性盒元素的行内轴与 cross 轴为同一条,则该值与 "flex-start" 等效,其它情况下,该值将参与基线对齐
stretch 元素被拉伸到与容器相同的高度或宽度
设置在子弹性元素上的对齐方式
/* css */ 设置在父容器上
.container{display: flex;}
.container{height: 800px;flex-flow: row wrap;align-items: flex-start;}

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

/* html */ 
<div class="container">
  <div class="item item1">1</div>
  <div class="item item2">2</div>
  <div class="item item3">3</div>
  <div class="item item4">4</div>
  <div class="item item5">5</div>
  <div class="item item6">6</div>
  <div class="item item7">7</div>
  <div class="item item8">8</div>
  <div class="item item9">9</div>
  <div class="item item10">10</div>
</div>
align-content

参考MDN flex

如何用刚学的flex布局做一个三行两列自适应布局呢?

html, body{height: 100%;}
body{display: flex;flex-flow: column;}
.head, .foot{height: 100px;}
.body{flex: 1;display: flex;}
.side{width: 200px;}
.main{flex: 1;}
.main{margin-left: 10px;}
.body{width: 960px;align-self: center;} 
<div class="head">head</div>
<div class="body">
    <div class="side">side</div>
    <div class="main">main</div>
</div>
<div class="foot">foot</div>
自适应布局

参考了MDN,如有不对,请帮忙指出

上一篇 下一篇

猜你喜欢

热点阅读