• Flex 布局教程:实例篇


    写在前面:本文转自阮一峰的博客。感觉写的非常清晰,就转了。感谢前辈。

    转载的地址为:http://www.ruanyifeng.com/blog/2015/07/flex-grammar.html

    作者:阮一峰。

    Flex 布局教程:实例篇

    你会看到,不管是什么布局,Flex往往都可以几行命令搞定。

    我的主要参考资料是Landon Schropp的文章和Solved by Flexbox

    一、骰子的布局

    骰子的一面,最多可以放置9个点。

    下面,就来看看Flex如何实现,从1个点到9个点的布局。你可以到codepen查看Demo。

    如果不加说明,本节的HTML模板一律如下。

    1. <div class="box">
    2. <span class="item"></span>
    3. </div>
     

    上面代码中,div元素(代表骰子的一个面)是Flex容器,span元素(代表一个点)是Flex项目。如果有多个项目,就要添加多个span元素,以此类推。

    1.1 单项目

    首先,只有左上角1个点的情况。Flex布局默认就是首行左对齐,所以一行代码就够了。

    .box {display: flex;}

    设置项目的对齐方式,就能实现居中对齐和右对齐。

    .box {display: flex;justify-content: center;}

    .box {display: flex;justify-content: flex-end;}

    设置交叉轴对齐方式,可以垂直移动主轴。

    .box {display: flex;align-items: center;}

    .box {display: flex;justify-content: center;align-items: center;}

    1. .box {
    2. display: flex;
    3. justify-content: center;
    4. align-items: flex-end;
    5. }
     
     

    1. .box {
    2. display: flex;
    3. justify-content: flex-end;
    4. align-items: flex-end;
    5. }
     

    1.2 双项目

    1. .box {
    2. display: flex;
    3. justify-content: space-between;
    4. }
     

    1. .box {
    2. display: flex;
    3. flex-direction: column;
    4. justify-content: space-between;
    5. }
     

    1. .box {
    2. display: flex;
    3. flex-direction: column;
    4. justify-content: space-between;
    5. align-items: center;
    6. }
     

    1. .box {
    2. display: flex;
    3. flex-direction: column;
    4. justify-content: space-between;
    5. align-items: flex-end;
    6. }
     

    1. .box {
    2. display: flex;
    3. }
    4. .item:nth-child(2){
    5. align-self: center;
    6. }
     

    1. .box {
    2. display: flex;
    3. justify-content: space-between;
    4. }
    5. .item:nth-child(2){
    6. align-self: flex-end;
    7. }
     

    1.3 三项目

    1. .box {
    2. display: flex;
    3. }
    4. .item:nth-child(2){
    5. align-self: center;
    6. }
    7. .item:nth-child(3){
    8. align-self: flex-end;
    9. }
     

    1.4 四项目

    1. .box {
    2. display: flex;
    3. flex-wrap: wrap;
    4. justify-content: flex-end;
    5. align-content: space-between;
    6. }
     

    HTML代码如下。

    1. <div class="box">
    2. <div class="column">
    3. <span class="item"></span>
    4. <span class="item"></span>
    5. </div>
    6. <div class="column">
    7. <span class="item"></span>
    8. <span class="item"></span>
    9. </div>
    10. </div>
     

    CSS代码如下。

    1. .box {
    2. display: flex;
    3. flex-wrap: wrap;
    4. align-content: space-between;
    5. }
    6. .column {
    7. flex-basis:100%;
    8. display: flex;
    9. justify-content: space-between;
    10. }
     

    1.5 六项目

    1. .box {
    2. display: flex;
    3. flex-wrap: wrap;
    4. align-content: space-between;
    5. }
     

    1. .box {
    2. display: flex;
    3. flex-direction: column;
    4. flex-wrap: wrap;
    5. align-content: space-between;
    6. }
     

    HTML代码如下。

    1. <div class="box">
    2. <div class="row">
    3. <span class="item"></span>
    4. <span class="item"></span>
    5. <span class="item"></span>
    6. </div>
    7. <div class="row">
    8. <span class="item"></span>
    9. </div>
    10. <div class="row">
    11. <span class="item"></span>
    12. <span class="item"></span>
    13. </div>
    14. </div>
     

    CSS代码如下。

    1. .box {
    2. display: flex;
    3. flex-wrap: wrap;
    4. }
    5. .row{
    6. flex-basis:100%;
    7. display:flex;
    8. }
    9. .row:nth-child(2){
    10. justify-content: center;
    11. }
    12. .row:nth-child(3){
    13. justify-content: space-between;
    14. }
     

    1.6 九项目

    1. .box {
    2. display: flex;
    3. flex-wrap: wrap;
    4. }
     

    二、网格布局

    2.1 基本网格布局

    最简单的网格布局,就是平均分布。在容器里面平均分配空间,跟上面的骰子布局很像,但是需要设置项目的自动缩放。

    HTML代码如下。

    1. <div class="Grid">
    2. <div class="Grid-cell">...</div>
    3. <div class="Grid-cell">...</div>
    4. <div class="Grid-cell">...</div>
    5. </div>
     

    CSS代码如下。

    1. .Grid{
    2. display: flex;
    3. }
    4. .Grid-cell {
    5. flex:1;
    6. }
     

    2.2 百分比布局

    某个网格的宽度为固定的百分比,其余网格平均分配剩余的空间。

    HTML代码如下。

    1. <div class="Grid">
    2. <div class="Grid-cell u-1of4">...</div>
    3. <div class="Grid-cell">...</div>
    4. <div class="Grid-cell u-1of3">...</div>
    5. </div>
    **
    1. .Grid{
    2. display: flex;
    3. }
    4. .Grid-cell {
    5. flex:1;
    6. }
    7. .Grid-cell.u-full {
    8. flex:00100%;
    9. }
    10. .Grid-cell.u-1of2{
    11. flex:0050%;
    12. }
    13. .Grid-cell.u-1of3{
    14. flex:0033.3333%;
    15. }
    16. .Grid-cell.u-1of4{
    17. flex:0025%;
    18. }
     

    三、圣杯布局

    圣杯布局(Holy Grail Layout)指的是一种最常见的网站布局。页面从上到下,分成三个部分:头部(header),躯干(body),尾部(footer)。其中躯干又水平分成三栏,从左到右为:导航、主栏、副栏。

    HTML代码如下。

    1. <body class="HolyGrail">
    2. <header>...</header>
    3. <div class="HolyGrail-body">
    4. <main class="HolyGrail-content">...</main>
    5. <nav class="HolyGrail-nav">...</nav>
    6. <aside class="HolyGrail-ads">...</aside>
    7. </div>
    8. <footer>...</footer>
    9. </body>
     

    CSS代码如下。

    1. .HolyGrail{
    2. display: flex;
    3. min-height:100vh;
    4. flex-direction: column;
    5. }
    6. header,
    7. footer {
    8. flex:1;
    9. }
    10. .HolyGrail-body {
    11. display: flex;
    12. flex:1;
    13. }
    14. .HolyGrail-content {
    15. flex:1;
    16. }
    17. .HolyGrail-nav,.HolyGrail-ads {
    18. /* 两个边栏的宽度设为12em */
    19. flex:0012em;
    20. }
    21. .HolyGrail-nav {
    22. /* 导航放到最左边 */
    23. order:-1;
    24. }
     

    如果是小屏幕,躯干的三栏自动变为垂直叠加。

    1. @media(max-width:768px){
    2. .HolyGrail-body {
    3. flex-direction: column;
    4. flex:1;
    5. }
    6. .HolyGrail-nav,
    7. .HolyGrail-ads,
    8. .HolyGrail-content {
    9. flex:auto;
    10. }
    11. }
     

    四、输入框的布局

    我们常常需要在输入框的前方添加提示,后方添加按钮。

    HTML代码如下。

    1. <div class="InputAddOn">
    2. <span class="InputAddOn-item">...</span>
    3. <input class="InputAddOn-field">
    4. <button class="InputAddOn-item">...</button>
    5. </div>
     

    CSS代码如下。

    1. .InputAddOn{
    2. display: flex;
    3. }
    4. .InputAddOn-field {
    5. flex:1;
    6. }
     

    五、悬挂式布局

    有时,主栏的左侧或右侧,需要添加一个图片栏。

    HTML代码如下。

    1. <div class="Media">
    2. <img class="Media-figure" src="" alt="">
    3. <p class="Media-body">...</p>
    4. </div>
     

    CSS代码如下。

    1. .Media{
    2. display: flex;
    3. align-items: flex-start;
    4. }
    5. .Media-figure {
    6. margin-right:1em;
    7. }
    8. .Media-body {
    9. flex:1;
    10. }
     

    六、固定的底栏

    有时,页面内容太少,无法占满一屏的高度,底栏就会抬高到页面的中间。这时可以采用Flex布局,让底栏总是出现在页面的底部。

    HTML代码如下。

    1. <body class="Site">
    2. <header>...</header>
    3. <main class="Site-content">...</main>
    4. <footer>...</footer>
    5. </body>
     

    CSS代码如下。

    1. .Site{
    2. display: flex;
    3. min-height:100vh;
    4. flex-direction: column;
    5. }
    6. .Site-content {
    7. flex:1;
    8. }
     

    七,流式布局

    每行的项目数固定,会自动分行。

    CSS的写法。

    1. .parent {
    2. width:200px;
    3. height:150px;
    4. background-color: black;
    5. display: flex;
    6. flex-flow: row wrap;
    7. align-content: flex-start;
    8. }
    9. .child {
    10. box-sizing: border-box;
    11. background-color: white;
    12. flex:0025%;
    13. height:50px;
    14. border:1px solid red;
    15. }
     



     

  • 相关阅读:
    【zZ】OpenCV HOGDescriptor 参数图解
    [C]遍历目录下所有文件
    drawing
    转:基于用户投票的排名算法系列
    编码格式
    泛型
    接口
    隐藏方法不能实现多态性
    结构
    静态
  • 原文地址:https://www.cnblogs.com/moyuling/p/562ec056372dd112ee96d3d24d410da8.html
Copyright © 2020-2023  润新知