CSS —— flex 的应用场景

一、宽/高自适应

(1)左(右)侧固定宽度,剩余内容自适应

这里主要利用 flex 本身提供的 flex-grow/flex-shrink/flex-basis 属性,通过设置
flex: 0 0 <width> 来使得部分元素宽度固定,而另一部分元素通过设置 flex: <integer> <integer> <width> 来使得它在容器大小变化的时候,被拉伸或者压缩。

水平自适应

例如你需要制作一个输入框,左侧需要一个固定宽度的图标,右侧需要一个固定宽度的搜索按钮,中间需要一个宽度自适应固定的输入框,flex 就能助你轻松完成。

(2)上(下)固定高度,剩余内容自适应

这里主要利用 flex-direction 属性,将主轴改为沿竖直方向,容器内成员都将跟随主轴方向而沿着竖直方向排列,再结合上面的方式,使得成员达到部分成员高度固定,另一部分高度自适应。

竖直自适应

(3)圣杯布局

上面我们其实已经看到了“双飞翼”在内的几种经典布局,如果再结合前面两类布局方式,也可以构建出非常典型的“圣杯布局”。

圣杯布局

粗看上去有点复杂,但实际上,非常简单。因为其实它只是上面的 “上下固定高度、中间自适应” + “左右固定宽度,中间自适应的”的组合方式。这里需要注意的一点是,作为 flex 容器内成员的 DOM 元素,仍旧可以通过设置 display: flex; 而变成 flex 容器,这是一个异常强大的模式,利用好这点,能完成很多复杂的布局方式。

二、水平垂直居中

居中是前端布局中的一个常见问题,也是面试过程中的一个经常被提及的问题,常见的 text-align: center;vertical-align: centerline-height: xxxxmargin: xx auto、负 margin、负 translatedisplay: table-cell; 等,各种方案各有利弊,一个熟练的前端,会根据其实际情况去确定具体的居中方案,但具体用法不是我们这里关注的点,此处不再赘述。flex 为我们提供了一种新的解决办法:

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

看上去是不是很简单粗暴?


水平垂直居中

三、流式布局

在商品列表页之类的页面,以瀑布流为代表的流式布局被得到了广泛应用。一般而言,使用较多的是 display: inline-block;float: left; 两种方案。但不管是哪种方案,都有一定的瑕疵。

(1)display: inline-block 与 float: left;

利用 display: inline-block,核心代码大致如下:

<style>
.inline-block li {
    display: inline-block;
}

.left {
    overflow: hidden;
}
.left li {
    float: left;
}
</style>
......
<div class="container">
    <h1>display: inline-block</h1>
    <ul class="inline-block">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>
<div class="container">
    <h1>float: left;</h1>
    <ul class="left">
        <li></li>
        <li></li>
        <li></li>
        <li></li>
        <li></li>
    </ul>
</div>

不难发现,使用 display: inline-block 方式生成的流式布局,元素之间形成了一小块白色空隙,这是由于我们的 li 标签之间的空格、换行之类的空白符,在 li 被设置成块级行内元素的时候,以一个空格的形式展示到了页面上,略微尝试一下,你甚至可以选中、复制它。尽管你可以在父级元素上设置 font-size: 0; 清除掉它,但内部元素又会受到影响,你又不得不在内层元素上,将 font-size 属性给重置回去,这显然不是我们乐意见到的。

相比而言,float: left; 方案就没有上述问题,而且你还可以通过诸如 overflow: hidden; 以形成 bfc 之类的方式,消除浮动对于正常文档流带来的影响。看起来一切都很美好,但当你尝试为浮动元素之间添加一点间距的时候,你就会发现,问题来了。

首先是繁琐的计算,为了得到合适的宽度,你需要仔细计算元素的宽度以及元素之间的间距,切记不要太过相信设计师给你的设计稿,人艰不拆。。。其次是当你计算好合适的尺寸之后,信心满满地将 CSS 写上去的时候,你可能面对两种情况(假设这里的间距是使用的 margin-right 添加上去的):

a. 理应出现在每行最后的一个元素,换到下一行去了。

出现这种情况意味着你在计算容器宽度的时候,可能忘记了考虑每行最后一个元素的右侧边距,结果导致一行元素需要需要占据的宽度的总和,超过了容器的宽度,最后一个元素就自然被“挤”到下一行去了。

b.每一行都正确排列,但仔细看你会发现,貌似整个布局稍微往左偏了一点。

出现这种情况意味着你在计算容器宽度的时候,考虑了每一个元素自身的宽度和右侧边距,但这样其实相当于为容器添加了一定的右侧内边距,容器内的元素自然就会产生一点向左移动了的效果。

上面两种问题,都有一定的方式去解决,但是一旦你这样做了,你的方案就变复杂了,就像上面使用 font-size 去解决空格带来的空隙一样,这都不是我们愿意看到的。不过如果你有兴趣,可以去尝试一下不同的解决方案,毕竟它们的兼容性还是不错的,在 pc 站点上都还有着广泛的应用。

(2)flex 的方式

相比于上面提到的方式,flex 的实现方案则显得更加简单、优雅。

fluid-flex

相比而言,flex 方式,只需要在 flex 容器上设置 justify-content 设置成对应的 normal/space-between/space-around/space-evenly,即可实现上图中的效果(后面三个布局需要容器内放满该行元素之后,需要一定剩余位置,且这个剩余位置一定比下一行第一个元素窄,否则下一行第一个元素可能会补上来)。最令人惊喜的是,如果你设置了 flex-direction: column;,你还能得到如下图所示效果:
flex-direction: column;

此外,结合 align-contentflex 还赋予了你操作行与行之间排列关系的能力:
align-content

四、栅格(grid)布局

曾经尝试过使用 float 完成过一个简易版的栅格布局,比这在这里也使用 flex 完成了一个,相比于使用 float 确实简单得多,有兴趣可以尝试一下。

.grid {
    display: flex;
}

li {
    flex: 1;
}

.item-full {
    flex: 0 0 100%;
}

.item-1of2 {
    flex: 0 0 50%;
}

.item-1of3 {
    flex: 0 0 33.3333%;
}

.item-1of4 {
    flex: 0 0 25%;
}

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

推荐阅读更多精彩内容

  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,630评论 1 92
  • 1. 前言 前端圈有个“梗”:在面试时,问个css的position属性能刷掉一半人,其中不乏工作四五年的同学。在...
    YjWorld阅读 4,333评论 5 15
  • 第一部分 HTML&CSS整理答案 1. 什么是HTML5? 答:HTML5是最新的HTML标准。 注意:讲述HT...
    kismetajun阅读 27,111评论 1 45
  • 作者:张秋菊 指导老师:刘艳 导图解析: 初三的文言文~陈涉世家。前两段要求背诵,和一个学员边分析,边画导图。 感...
    海鸥ing阅读 1,650评论 0 0
  • 爱情是一百年的孤独,直到遇上那个矢志不渝的守护你的人,那一刻,所有苦涩的孤独,都有了归途。 一旦拥有,别无所求。 ...
    清欢南叙阅读 210评论 0 0