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-flowflex-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)
flexflex-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的认识,挺有趣的。

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



作者:前端小少女
链接:https://www.jianshu.com/p/d1d78fdd5b78
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值