Flexbox布局技术研究

写在前面

Flexbox即弹性盒子模型,它在css中的定义和标记非常简单,通过媒体查询的方式就可适配和响应变化,不需要清除浮动,不需要使用额外的框架,也不需要使用大量冗余的代码来实现栅格布局。

Flexbox究竟是什么

简单地说,我们可以在一个flex容器中标记一些flex子元素,通过css来定义布局。flexbox有很多属性来定义布局。

  • flex-direction: 通过这个属性,我们能指定flex容器的子元素是按行显示还是按列显示。

    可以通过这个属性定义元素按升序显示还是按降序显示。

  • justify-content: 通过这个属性,可以声明浏览器如何分配元素以外的可用空间。比如有3个节点,它们组合起来一共占据了容器50%的空间,我们能够指定元素集中在左边、右边还是中间。或者是均匀地从左往右分布,或许其他的一些方式。
  • flex-wrap: 通过这个属性,我们能够指定当flex子元素的总宽度超出了容器的空间时,是否换行。

栅格系统

目前,栅格系统在页面的布局管理中占据了很重要的地位。默认盒模型的行为导致在布局中通常会使用 float和inline-block等hacks方式来实现。而Flexbox能让我们仅仅是用很少的几行css代码就能轻松实现一套功能强大、可拓展的栅格系统。

简单的栅格布局

在传统的栅格系统中,我们必须用某种方式说明在一行中包含多少个内容节点,然后给每个内容节点设置相应的宽度。通过Flexbox,我们可以在一行中放置任意数目的项目,而且这些项目的宽度可以根据容器的宽度自动分配。换句话说,在css中,我们可以通过一些标记来达到目的,而不用关心一行中放置多少个内容节点。代码如下:

    <div class="grid">
        <div class="grid-row">
            <div class="grid-item">1</div>
            <div class="grid-item">2</div>
        </div>
        <div class="grid-row">
            <div class="grid-item">1</div>
            <div class="grid-item">2</div>
            <div class="grid-item">3</div>
        </div>
        <div class="grid-row">
            <div class="grid-item">1</div>
            <div class="grid-item">2</div>
            <div class="grid-item">3</div>
            <div class="grid-item">4</div>
        </div>
    </div>

对应的css代码如下(为了美观,添加了简单的样式):

    .grid {
        boder: solid 1px #e7e7e7;
    }
    .grid-row {
        display: flex;
    }
    .grid-item {
        flex: 1;
        padding: 12px;
        border: 1px solid #f7f7f7;
    }

    .grid--row {
        display: flex;
        flex-direction: column;
    }

接着,我们就可以看到神奇的自适应栅格效果。

响应式栅格布局

在上面的基础上,如果要实现类似bootstrap的响应式布局要怎么处理呢?使用Flexbox,我们同样不需要设置宽度节点,直接添加媒体查询即可。对上面的代码稍作修改:

<div class="grid">
    <h2>列布局</h2>
    <div class="grid--row grid--row-sm">
        <div class="grid-item">1</div>
        <div class="grid-item">2</div>
        <div class="grid-item">3</div>
        <div class="grid-item">4</div>
    </div>
    <div class="grid--row grid--row-md">
        <div class="grid-item">1</div>
        <div class="grid-item">2</div>
        <div class="grid-item">3</div>
        <div class="grid-item">4</div>
        <div class="grid-item">5</div>
        <div class="grid-item">6</div>
        <div class="grid-item">7</div>
    </div>
    <div class="grid--row grid--row-lg">
        <div class="grid-item">1</div>
        <div class="grid-item">2</div>
        <div class="grid-item">3</div>
    </div>
</div>

对应的css如下:

    .grid {
        boder: solid 1px #e7e7e7;
     }
     .grid-row {
         display: flex;
     }
     .grid-item {
         flex: 1;
         padding: 12px;
         border: 1px solid #f7f7f7;
     }
     .grid--row {
         display: flex;
         flex-direction: column;
     }
     @media screen and (min-width:480px) {
         .grid--row-sm {
             display: flex;
             flex-direction: row;
         }
     }
     @media screen and (min-width:720px) {
         .grid--row-md {
             display: flex;
             flex-direction: row;
         }
     }

     @media screen and (min-width:960px) {
         .grid--row-lg {
             display: flex;
             flex-direction: row;
         }
     }

这样响应式的栅格布局就完成了。下图:

在大屏显示的效果:

屏幕在960px~720px

屏幕在480px~720px

有了这样的栅格系统,我们就可以自由地进行嵌套使用了,它的适应性非常强。

垂直居中

在传统的css中,垂直对齐的实现非常糟糕。有时候我们可以给节点设置inline-box能解决这个问题,也有人使用绝对定位的hack来实现,还有人使用过时的table布局(在语意化的今天,这是不符合要求的)。而Flexbox能够轻松地处理这个问题。

第一个例子:左侧是用户头像,右侧是用户的名字和一些信息。我们将使用Flexbox来使得用户头像在区域中垂直居中。

        <div class="user">
            <div class="user-avatar"></div>
            <div class="user-desc">
                <h2 class="user-username">John Doe</h2>
                <p class="user-excerpt">
                    Hello! I‘m John Doe. Nice to meet you!
                </p>
            </div>
        </div>
        <div class="user">
            <div class="user-avatar"></div>
            <div class="user-desc">
                <h2 class="user-username">John Doe</h2>
                <p class="user-excerpt">
                    Hello! I‘m John Doe. Nice to meet you!Hello! I‘m John Doe. Nice to meet you!Hello! I‘m John Doe. Nice to meet you!Hello! I‘m John Doe. Nice to meet you!Hello! I‘m John Doe. Nice to meet you!Hello! I‘m John Doe. Nice to meet you!Hello! I‘m John Doe. Nice to meet you!Hello! I‘m John Doe. Nice to meet you!
                </p>
            </div>
        </div>

对应的css如下:

            .user {
                display: flex;
                align-items: center;
                margin-bottom: 20px;
            }

            .user:last-child {
                margin-bottom: 0;
            }

            .user-avatar {
                flex: 0 0 96px;
                width: 96px;
                height: 96px;
                background-color: #e7e7e7;
            }

            .user-desc {
                flex: 1;
                margin-left: 24px;
                padding: 12px;
                border: solid 1px #e7e7e7;
            }

注意:align-items这个属性能够让flex项目垂直于flex基准线方向队列显示。换句话说,如果flex基准线沿着水平方向,我们能够让每个项目基于这个水平线排列。因此这里我们只要设置了align-items:center 就可以了。

然后我们见证奇迹的一刻:

第二个例子:在一个宽度固定、高度可变的容器中,如何实现元素始终处于容器中心(水平和垂直都居中)

让我们想象一下,在所有的节点标记中最上面的是banner,这个banner中有一些标题文本。在小屏幕中,banner的高度是180px,它将通过设置两个端点将高度变为480px。每次变化后,我们都希望标题文本仍处在banner的中心,无论是水平方向还是垂直方向。下面是标记节点:

    <div class="banner">
         <div class="banner-content">
              <h2 class="banner-title">Sysmetrical Perfection</h2>
              <span class="banner-sub">A beautiful sight, achieved with flexbox.</span>
         </div>
    </div>

这次我们使用 justify-content 属性。这个属性的作用是定义项目周围沿着flex基准线的空间如何显示。下面是css代码:

           .banner {
                display: flex;
                align-items: center;
                justify-content: space-around;
                height: 180px;
                background-color: #e7e7e7;
            }

            .banner-content {
                text-align: center;
            }

            .banner-title, .banner-sub {
                margin: 0;
                padding: 0;
                line-height: 1.5;
            }

            @media screen and (min-width:480px) {
                .banner {
                    height: 240px;
                }
            }

            @media screen and (min-width:720px) {
                .banner {
                    height: 360px;
                }
            }

            @media screen and (min-width:960px) {
                .banner {
                    height: 480px;
                }
            }

这样一来,无论banner的高度是多少,内容总会保持在水平和垂直方向的中心位置,这就是Flexbox的强大之处!

在React Native中使用Flexbox

下面以栅格系统为例,简单介绍一下如何把Web中的布局 转换到 React Native上。

/**
 * @desc 将web中的布局转换到React Native上
**/

import React, {
    AppRegistry,
    StyleSheet,
    Component,
    Text,
    View
} from ‘react-native‘;

const styles = StyleSheet.create({
    grid: {
        padding: 30,
        marginTop: 65,
        borderColor: ‘#e7e7e7‘,
    },
    grid_row: {
        flex: 1,
        flexDirection: ‘row‘,
        padding: 5,
    },
    grid_item: {
        flex: 1,
        backgroundColor: ‘#e7e7e7‘,
        height: 30,
        textAlign: ‘center‘,
    }
});

class SimpleApp extends React.Component {
    render() {
        return (
            <View style={styles.grid}>
                <View style={styles.grid_row}>
                    <Text style={styles.grid_item}>1</Text>
                    <Text style={styles.grid_item}>2</Text>
                </View>
                <View style={styles.grid_row}>
                    <Text style={styles.grid_item}>1</Text>
                    <Text style={styles.grid_item}>2</Text>
                    <Text style={styles.grid_item}>3</Text>
                </View>
                <View style={styles.grid_row}>
                    <Text style={styles.grid_item}>1</Text>
                    <Text style={styles.grid_item}>2</Text>
                    <Text style={styles.grid_item}>3</Text>
                    <Text style={styles.grid_item}>4</Text>
                </View>
            </View>
        )
    }
}

AppRegistry.registerComponent(‘SimpleApp‘, () => SimpleApp);

推荐一个详细的教程 http://caibaojian.com/flexbox-guide.html

时间: 2024-10-10 12:30:47

Flexbox布局技术研究的相关文章

任务十:Flexbox 布局练习

面向人群: 有一定HTML及CSS基础的同学 难度: 中 重要说明 百度前端技术学院的课程任务是由百度前端工程师专为对前端不同掌握程度的同学设计.我们尽力保证课程内容的质量以及学习难度的合理性,但即使如此,真正决定课程效果的,还是你的每一次思考和实践. 课程多数题目的解决方案都不是唯一的,这和我们在实际工作中的情况也是一致的.因此,我们的要求不仅仅是实现设计稿的效果,更是要多去思考不同的解决方案,评估不同方案的优劣,然后使用在该场景下最优雅的方式去实现.那些最终没有被我们采纳的方案,同样也可以帮

互动教程,让你5分钟掌握 Flexbox 布局模式

Flexbox 布局模块目前是 W3C 候选标准,旨在提供一个更有效的方式进行布局,对齐和为容器里的项目分配空间,即使它们的大小是未知的或者动态的.这里分享一个基于 Knockout.js 构建的互动教程,让你5分钟就掌握 Flexbox 布局模式. 您可能感兴趣的相关文章 创意无限!一组网页边栏过渡动画[附源码下载] 真是好东西!13种非常动感的页面加载动画效果 你见过吗?9款超炫的复选框(Checkbox)效果 超赞!基于 Bootstrap 的响应式的后台管理模板 Magic CSS3 –

使用CSS3 Flexbox布局

Flexbox(中文版本可以点击这里)的布局是一个用于页面布局的全新CSS3模块功能.它可以把列表放在同一个方向(从左到右或从上到下排列),并且让这些列表能延伸到占用可用的空间.较为复杂的布局可以通过嵌套一个伸缩容器(flex container)来辅助实现. Flexbox可以简单快速的创建一个具有弹性功能的布局,当在一个小屏幕上显示的时候,Flexbox可以让元素在容器(伸缩容器)中进行自由扩展和收缩,从而容易调整整个布局.它的目的是使用常见的布局模式,比如说三列布局,可以非常简单的实现.

css布局简史与决胜未来的第四代css布局技术

一转眼已经2018年,前端行业也风风雨雨的走过了10多年,网页布局也从最原始的文档变成成了当前精彩纷呈的交互.当我看到第四代css布局技术网格布局的时候,就像我看到无数女神一样的的反应,我们好像在哪见过,还记得吗? 知道过去能更好的指导我们未来的技术学习,毕竟太阳底下没有新鲜事,就像我看到最新的网格布局联想起曾经的初代table布局样,一切都变了,一切好像都是重新来过. 那是2006年的第一场雪,比2005年来的更早一些,那时候我还是一个风度翩翩玉树临风的少年,那一年每一个开发者的电脑上还都装着

HTML5移动开发之Flexbox布局讲解与使用技巧

现在来详细介绍一下Flexbox布局语法跟使用.大家可能非常关心以下几个问题: 1 .什么是Flexbox布局? 2. Flexbox布局主要用于什么场景? 3. Flexbox布局它的语法是什么? 4. 如何实际使用Flexbox布局? 5. Flexbox布局它的缺陷是什么? 下面就这五个问题给大家分析分析.希望给那些想尝试用Flexbox的行内人有所帮助. 在恰当的地方能够使用恰当的布局方法,如果有说的不到位,希望大家指正,一起进步. 1 .什么是Flexbox布局? 1.1 W3C解释

存储技术研究与学习资料思维导图

最近迪迪老师给推荐了一个不错的思维导图工具--Mind42,对于梳理知识很有帮助,于是索性将存储技术研究与学习的一些资料进行了整理,导出图如下所示,更具体的内容可以通过猛击"点我"访问. 存储技术研究与学习资料思维导图,布布扣,bubuko.com

flexbox布局

flexbox布局(RN基础) flexbox是Flexible Box的缩写, 弹性盒子布局 主流的浏览器都支持flexbox布局是伸缩容器(container)和伸缩项目 (item)组成Flexbox布局的主体思想是元素可以改变大小以适应可用空间, 当可用空间变大, Flex元素将伸展大小以填充可用空间, 当Flex元素超出可用空间时将自动缩小. 总之, Flex元素是可以让你的布局根据浏览器的大小变化进行自动伸缩.按照伸缩流的方向布局伸缩容器有主轴和交叉轴组成! 主轴既可以是水平轴, 也

&lt;脱机手写汉字识别若干关键技术研究&gt;

脱机手写汉字识别若干关键技术研究 对于大字符集识别问题,一般采用模板匹配的算法,主要是因为该算法比较简单,识别速度快.但直接的模板匹配算法往往无法满足实际应用中对识别精度的需求.为此任俊玲编著的<脱机手写汉字识别若干关键技术研究>在模板匹配算法的基础上,结合统计分析和统计信号处理的原理,对脱机手写汉字识别算法以及相关问题进行了研究,力求在基本不降低识别速度的基础上较大地提高识别的精度. 内容简介 书籍计算机书籍<脱机手写汉字识别若干关键技术研究>从脱机手写汉字识别为大类别数模式识别

应用层反外挂技术研究

标 题: 应用层反外挂技术研究作 者: choday时 间: 2013-06-19,17:02:32链 接: http://bbs.pediy.com/showthread.php?t=173897 此技术不算原创,但算是整理,详解 话说神秘人物v校,73%可能性为女性.此技术是从他那里学来的.此人说话言简意赅,需要耐心体会. 外挂,与反外挂,是矛与盾的关系,要想做好反外挂,必须了解矛的构成,以及盾的技术,才能制造出一个较好的盾. 纵观当前反外挂形势,就像是世界大战,各种驱动满天横飞.战火连天,