flex布局踩过的坑

虽然我对flex的基本用法已经比较了解,但是在使用过程中还是会经常遇到些大大小小的问题。这篇博客在对flex的基本概念做一个简单的回顾后,将重点记录我在使用flex时踩过的一些坑,这篇博客也会一直更新。

本文结构:

  • flex布局基本概念
    1. flex container
    2. flex item
  • 踩过的坑
    1. flex container的高度问题
    2. flex-direction与justify-content、align-items的对应关系

一、flex布局基本概念

首先要了解flex的两个最基本的概念,容器(flex container)和项目(flex item),flex container包含flex item。通过对flex container和flex item进行flex布局,可实现多种多样的布局效果。

1、flex container

flex container为容器,主要对各个flex item的排列方向、排列顺序、对齐方式进行设置。

属性 含义 取值
flex-direction 排列方向 row(default)/row-reverse/column/column-reverse
flex-wrap 是否换行 nowrap(default)/wrap/wrap-reverse
flex-flow flex-direction和flex-wrap的简写 row nowrap(default)
justify-content 主轴对齐方式 flex-start/flex-end/center/space-between/space-around
align-items 侧轴对齐方式 flex-start/flex-end/center/baseline/stretch(default)
align-content 多行/列内容对齐方式 flex-start/flex-end/center/stretch/space-between/space-around

2、 flex item

flex item为项目,主要对item本身的一些特性进行设置。

属性 含义 取值
order 排列顺序 数值,默认为0,可为负值。flex item按照order从小到大排列
flex-grow 空间过多时增长比例 默认为0:即使存在剩余空间也不放大;数值不同:按比例划分
flex-shrink 空间不够时缩小比例 默认为1:等比例缩小;某项为0:不缩小
flex-basis 分配多余空间之前,项目占据的主轴空间 <length> /auto(default)
flex flex-grow、 flex-shrink、 flex-basis的缩写 默认为0 1 auto
align-self 自身对齐方式 auto/flex-start/flex-end/center/stretch/baseline

二、踩过的坑

1、 flex container的高度问题

其实这是一个很简单的东西,只是我经常忘记给flex container设置高度,导致使用align-items属性的时候,总是得不到我想要的结果。
现在我举一个“用户头像”的例子,当鼠标悬浮到用户头像上时,在用户头像的正中间出现“编辑”两个字,代码如下:

// html
<body>
  <div class='user'></div>
</body>
// css
.user{
  margin-top:40px;
  height:200px;
  width:200px;
  background-image: url('http://opjc44vzf.bkt.clouddn.com/17-5-6/32601215-file_1494081396100_da5d.jpg');
  background-size:200px 200px;
  border-radius:50%;
  box-shadow:0px 0px 6px 1px rgba(0,0,0,0.3) inset;
  overflow:hidden;
}
.user:hover::after{
  content:'编辑';
  color:#ffffff;
  font-size:30px;
  font-weight:bold;
  cursor:pointer;
  display:flex;
  justify-content:center;
  align-items:center;
}

结果:


我们把鼠标悬浮在头像上:


咦?为什么蓝色的两个字“编辑”没有在头像的正中间呢?你有没有看出什么问题?
我设置了align-items:center,那不就是让它在竖直方向居中么?为什么在竖直方向没有居中?

其实它在竖直方向已经居中了,不信?我们给这个flex container设置一个灰色背景,来看看这个flex container到底在哪里:

.user:hover::after{
  background:#ddd;
}

结果:


看到flex container的背景了吗?

在上面这段代码中,由于没有给flex container设置高度,flex container自动计算高度,就会出现这种情况。

我们现在给这个flex container设置一个高度:

.user:hover::after{
   height:inherit;
}

结果:


再把flex container的背景去掉:


其实这是一个很简单的东西,写代码的时候注意一下,把flex container的高度加上就行了,不要像我一样神经大条... [ 允悲 ]

2、flex-direction与justify-content、align-items的对应关系


上图来自阮一峰老师的“Flex 布局教程:语法篇”,网上也大致都是类似的图解,所以我就理所当然地以为,横着的方向就是主轴,竖着的那条就是侧轴;从左到右是主轴的方向,从上到下是侧轴的方向。可是很快,在使用justify-content、align-items时就出现了问题。通过查阅资料才发现,主轴、侧轴的位置和方向都是与flex-direction的设置有关!

我们知道,flex-direction有以下几种取值:row/row-reverse/column/column-reverse。当flex-direction取值不同时,主轴和侧轴的位置、方向都是不同的。接下来,我们设置flex container的justify-content:flex-startalign-items:flex-end,改变flex-direction的值来看结果。

1) flex-direction:row

这是最常见并且默认的一种。在这种情况下,主轴和侧轴也是以最常见的方式排列。justify-content和align-items的各属性值对应的位置如下图所示。


举例:

<body>
  <div class='parent'>
    <div class='child'></div>
  </div>
</body>
.parent{
  width:300px;
  height:300px;
  background:#ddd;
  display:flex;
  justify-content:flex-start;
  align-items:flex-end;
  flex-direction:row;
}
.child{
  width:100px;
  height:100px;
  background:pink;
}

结果:


结果符合我们的预期。粉色div在justify-content的“flex-start”位置上,也在align-items的“flex-end”的位置上。

2) flex-direction:row-reverse

在这种情况下,主轴方向相反,侧轴方向不变。justify-content和align-items的各属性值对应的位置如下图所示。


修改1)中的代码:

.parent{
  flex-direction:row-reverse;
}

结果:


我们看到,粉色div在justify-content的“flex-start”位置上,也在align-items的“flex-end”的位置上。

3)flex-direction:column

在这种情况下,主轴与侧轴的方向交换。justify-content和align-items的各属性值对应的位置如下图所示。


修改1)中的代码:

.parent{
  flex-direction:column;
}

结果:


我们看到,粉色div在justify-content的“flex-start”位置上,也在align-items的“flex-end”的位置上。

4) flex-direction:column-reverse

在这种情况下,主轴与侧轴的方向又发生了变化。justify-content和align-items的各属性值对应的位置如下图所示。


修改1)中的代码:

.parent{
  flex-direction:column-reverse;
}

结果:


我们看到,粉色div在justify-content的“flex-start”位置上,也在align-items的“flex-end”的位置上。

总结:主轴、侧轴的位置和方向根据flex-direction的不同而不同,并由此导致了justify-content和align-items的位置变化。在使用时一定要注意!!

使用flex遇到的坑就先记录到这里了,以后的坑以后再过来填。听说flex在移动端坑比较多,哈哈,但是我到现在还没遇到,看来还是要好好研究一下咯。

最后,给大家安利一个学习flex的小游戏Flexbox Froggy,可以加深对flex的认识,挺有趣的。

由于个人水平有限,博客错误之处,烦请指正!

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

推荐阅读更多精彩内容