Flex布局

CSS 弹性盒子布局是 CSS 的模块之一,定义了一种针对用户界面设计而优化的 CSS 盒子模型。在弹性布局模型中,弹性容器的子元素可以在任何方向上排布,也可以“弹性伸缩”其尺寸,既可以增加尺寸以填满未使用的空间,也可以收缩尺寸以避免父元素溢出。子元素的水平对齐和垂直对齐都能很方便的进行操控。通过嵌套这些框(水平框在垂直框内,或垂直框在水平框内)可以在两个维度上构建布局。

写了一个简单的单页面程序,可以在上面进行演示以查看效果,演示地址:https://codepen.io/f_zz/pen/NmPKav

你也可以复制下面的代码在本地演示:

<!DOCTYPE html>
<html>
<head>
    <title>Flexible Box Layout show</title>
    <meta charset="utf-8">
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <style type="text/css">
        h2 {
            text-align: center;
        }
        .box {
            display: flex;
            width: 400px;
            height: 300px;
            border: 2px dotted #87a7bd;
        }
        .box > div{
            border: 2px solid #87a7bd;
            border-radius: 5%;
            background-color: rgba(96, 139, 168, .2);
        }
        #item2{
            background-color: #d4d6f3c7;
        }
        #item3{
            background-color: #e0d4dcd9;
        }
        .flexBox{
            display: flex;
            justify-content: space-around;
        }
        .left, .right{
            width: 300px;
        }
        .left > *{
            margin-left: 100px;
        }
        .item{
            display: inline;
        }
        .item input{
            width: 40px;
        }
        .boxLabel{
            color: #f32d50;
            font-style: italic;
        }
        .itemLabel{
            color: #0e67f1;
            font-style: italic;
        }
        #editor, #showing{
            display: flex;
            margin-top: 30px;
            justify-content: center;
        }
        #showing{
            margin-top: 0px;
            align-items: center;
        }
        #showing > p{
            margin-right: 10px;
            font-size: 24px;
        }
        #editor > textarea{
            width: 400px;
            height: 67px;
        }
        h2 > span{
            cursor: pointer;
        }
    </style>
</head>
<body>
<div id="app">
    <h2 title="2019@fzz">Flexible Box Layout <span @click="openUrl('')">show</span></h2>
    <div class="flexBox">
        <!--left-->
        <div class="left">
            <!--boxStyle-->
            <h3>boxStyle</h3>
            <div v-for="(style, k) in boxStyle">
                <label class="boxLabel" @click="showing(k, 'boxLabel')"> {{k}} </label>
                <br>
                <select @change="doChange($event, 'boxLabel')" :name="k">
                    <option v-for="op in _data[k]"> {{op}} </option>
                </select>
            </div>
        </div>

        <!--box-->
        <div class="box" :style="boxStyle">
            <div title="doubleClicking and editing it's html" @dblclick.prevent="changeEditor" v-for="(html, id) in itemIds" :id="id" :style="_data[itemStyle[id]]" v-html="html"></div>
        </div>

        <!--left-->
        <div class="right">
            <!--itemStyle-->
            <h3>itemStyle</h3>
            <div v-for="(style, k) in item1Style">
                <label class="itemLabel" @click="showing(k, 'itemLabel')"> {{k}} </label>
                <br>
                <div v-for="(v, i) in itemStyle" class="item">
                    <label> {{i}} </label><input :name="k" :value="_data[_data.itemStyle[i]][k]" @keyup="doChange($event, 'itemLabel', _data.itemStyle[i])">
                </div>
            </div>
            </div>
        </div>

        <!--editHtml-->
        <div id="editor">
            <textarea @keyup="editHtml" spellcheck="false" v-model="editStr" placeholder="edit item's html from here!"></textarea>
        </div>

        <!--Description-->
        <div id="showing">
            <p :class="currentShowingClass">{{showingP}}</p>
            <span>{{showingContent}}</span>
        </div>
    </div>
</div>
</body>
<script type="text/javascript">
var app = new Vue({
    el: '#app',
    data: {
        info: 'Flexible Box为css提供的基于盒子模型的弹性布局',
        boxStyle: {
            flexDirection: 'row',
            flexWrap: 'nowrap',
            justifyContent: 'flex-start',
            alignItems: 'flex-strat',
            alignContent: 'flex-strat',
        },
        flexDirection: ['row', 'row-reverse', 'column', 'column-reverse'],
        flexWrap: ['nowrap', 'wrap', 'wrap-reverse'],
        justifyContent: ['flex-strat', 'flex-end', 'center', 'space-between', 'space-around'],
        alignItems: ['flex-strat', 'flex-end', 'center', 'baseline', 'stretch'],
        alignContent: ['flex-strat', 'flex-end', 'center', 'space-around', 'space-between', 'stretch'],
        flexFlow: ['row', 'nowrap'],
        itemIds: {
            item1: 'item1',
            item2: 'item2222222',
            item3: 'item<br>333'
        },
        itemStyle: {
            item1: 'item1Style',
            item2: 'item2Style',
            item3: 'item3Style' 
        },
        item1Style: {
            order: 0,
            flexGrow: 0,
            flexShrink: 0,
            flexBasis: 'auto',
            alignSelf: 'auto'
        },
        item2Style: {
            order: 0,
            flexGrow: 0,
            flexShrink: 0,
            flexBasis: 'auto',
            alignSelf: 'auto'
        },
        item3Style: {
            order: 0,
            flexGrow: 0,
            flexShrink: 0,
            flexBasis: 'auto',
            alignSelf: 'auto'
        },
        alignSelf: ['auto', 'flex-strat', 'flex-end', 'center', 'baseline', 'stretch'],
        flex: [0, 1, 'auto'],
        editStr: '',
        editorId: 'item1',
        currentShowingClass: '',
        showingP: '',
        showingContent: '',
        showings: {
            Flex: '是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。任何一个容器都可以指定为Flex布局。',
            flexDirection: '属性决定主轴的方向(即项目的排列方向)。row(默认值):主轴为水平方向,起点在左端。row-reverse:主轴为水平方向,起点在右端。column:主轴为垂直方向,起点在上沿。column-reverse:主轴为垂直方向,起点在下沿。',
            flexWrap: '属性默认情况下,项目都排在一条线(又称”轴线”)上。flex-wrap属性定义,如果一条轴线排不下,如何换行。nowrap(默认):不换行。wrap:换行,第一行在上方。wrap-reverse:换行,第一行在下方。',
            justifyContent: '属性定义了项目在主轴上的对齐方式。flex-start(默认值):左对齐;flex-end:右对齐;center: 居中;space-between:两端对齐,项目之间的间隔都相等;space-around:每个项目两侧的间隔相等。所以,项目之间的间隔比项目与边框的间隔大一倍。',
            alignItems: '属性定义项目在交叉轴上如何对齐。flex-start:交叉轴的起点对齐。flex-end:交叉轴的终点对齐。center:交叉轴的中点对齐。baseline: 项目的第一行文字的基线对齐。stretch(默认值):如果项目未设置高度或设为auto,将占满整个容器的高度。',
            alignContent: '属性定义了多根轴线的对齐方式。如果项目只有一根轴线,该属性不起作用。flex-start:与交叉轴的起点对齐。flex-end:与交叉轴的终点对齐。center:与交叉轴的中点对齐。space-between:与交叉轴两端对齐,轴线之间的间隔平均分布。space-around:每根轴线两侧的间隔都相等。所以,轴线之间的间隔比轴线与边框的间隔大一倍。stretch(默认值):轴线占满整个交叉轴。',
            order: '属性定义项目的排列顺序。数值越小,排列越靠前,默认为0',
            flexGrow: '属性定义项目的放大比例,默认为0,即如果存在剩余空间,也不放大。',
            flexShrink: '属性定义了项目的缩小比例,默认为1,即如果空间不足,该项目将缩小。负值对该属性无效。',
            flexBasis: '属性定义了在分配多余空间之前,项目占据的主轴空间(main size)。浏览器根据这个属性,计算主轴是否有多余空间。它的默认值为auto,即项目的本来大小。',
            alignSelf: '属性允许单个项目有与其他项目不一样的对齐方式,可覆盖align-items属性。默认值为auto,表示继承父元素的align-items属性,如果没有父元素,则等同于stretch。',
        },
    },
    created(){
        this.showingP = 'Flex';
        this.showingContent = this.showings.Flex;
    },
    methods: {
        doChange: function(e, showClass, item){
            var target = e.target;
            if(!target){
                return;
            }
            var name = target.name,
                value = target.value;
            if(this.boxStyle.hasOwnProperty(name)){
                this.boxStyle[name] = value;
            }else if(this[item] && this[item] && this[item].hasOwnProperty(name)){
                this[item][name] = value;
            }
            this.showing(e.target.name, showClass);
        },
        changeEditor: function(e){
            this.editorId = e.target.id;
            this.editStr = this.itemIds[this.editorId];
        },
        editHtml: function(e){
            this.itemIds[this.editorId] = this.editStr;
        },
        showing(name, showClass){
            name = name || 'Flex';
            this.showingP = name;
            this.showingContent = this.showings[name];
            this.currentShowingClass = showClass || '';
        },
        openUrl: function(url){
            url = url || 'http://www.cnblogs.com/fzz9/';
            window.open(url, '_blank')
        }
    }
});
</script>
</html>
参考

https://developer.mozilla.org/zh-CN/docs/Web/CSS/CSS_Flexible_Box_Layout
http://www.runoob.com/w3cnote/flex-grammar.html

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,524评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,869评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,813评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,210评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,085评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,117评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,533评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,219评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,487评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,582评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,362评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,218评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,589评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,899评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,176评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,503评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,707评论 2 335

推荐阅读更多精彩内容

  • flex参考 flex 除了 CSS 中已有的布局系统之外,CSS3还提供了一个额外的布局系统。在这个新的框模型中...
    DeeJay_Y阅读 361评论 0 0
  • 注意:假如你想设置行内元素为 flexible box,也可以置 display 属性的值为 inline-fle...
    Z_xp阅读 1,029评论 0 0
  • 弹性盒子是 CSS3 的一种新的布局模式。CSS3 弹性盒( Flexible Box 或 flexbox),是一...
    hunter97阅读 2,303评论 0 2
  • 蓬乱茅草穿膛风 漫焰舞空了无踪 寂看篝材炼赤魂 锻尽还余根骨多
    灵魂裸奔阅读 176评论 0 0
  • 祝一号小伙伴 放下评判,拥有平静 祝二号小伙伴 放下骄傲,真正谦卑 祝三号小伙伴 放下虚荣,荣耀世界 祝四号小伙伴...
    林何凤阅读 580评论 0 0