当前位置: 首页 > 文档资料 > CSS3 入门教程 >

flex:grow、shrink、basis、

优质
小牛编辑
115浏览
2023-12-01

flex 弹性盒子

display:flex 和接下来我们介绍的这个 flex 是有区别的,前者是修改display实现弹性和模型的,而 flex 仅仅是弹性盒模型下 flex-grow、flex-shrink 和 flex-basis三个的缩写属性,用来定义和模型内部的子元素在浏览器重的展示形式。 下面我们主要讲这三个属性。

1. 官方定义

属性用于设置或检索弹性盒模型对象的子元素如何分配空间。
flex 属性是 flex-growflex-shrinkflex-basis 属性的简写属性。

2. 慕课解释

fl父元素设置成 dispaly:flex 之后子元素的空间分配通过 flex 设置,其特点为弹性,即内部分配空间如果按照比例分配则其不会随着父元尺寸变化而变化。

3. 语法

子元素

{
    flex: flex-grow flex-shrink flex-basis|auto|initial|inherit|none;
}

属性说明

参数名称参数类型解释
flex-grownumber其它子元素的比例关系默认为 0 ,存在剩余空间不扩大
flex-shrinknumber默认为1空间不足时候缩小
flex-basis| ‘auto’设定一个长度或者自动填充

4. 兼容性

flex:

IEEdgeFirefoxChromeSafariOperaiosandroid
63-7484-85

flex-grow| flex-shrink|flex-basis:

IEEdgeFirefoxChromeSafariOperaiosandroid
10+12+28+4+6.1+12.1+7+4.4

5.实例

  1. 给一个块级元素添加 flex 属性 ,让其子元素平均分配空间。
<div class="demo">
    <div class="item">1</div>
    <div class="item">2</div>
    <div class="item">3</div>
</div>
.demo{
    display:flex;
    width:200px;
    height:60x;
    line-height:60px;
    border: 1px solid #ccc;
    border-right: none;
}
div>.item{
    width:100px;
    border-right:1px solid #ccc;
    text-align: center;
    flex:1;
}

效果图

图片描述

块级元素平均分配空间 案例演示 预览 复制 复制成功!
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
    .demo{
	    display:flex;
	    width:200px;
	    height:60x;
	    line-height:60px;
	    border: 1px solid #ccc;
	    border-right: none;
	}
	div>.item{
	    width:100px;
	    border-right:1px solid #ccc;
	    text-align: center;
	    flex:1;
	}
    </style>
    <body>
    <div class="demo">
	    <div class="item">1</div>
	    <div class="item">2</div>
	    <div class="item">3</div>
	</div>	
    </body>
</html>
运行案例 点击 "运行案例" 可查看在线运行效果

解释:容器 demo 设置了 flex 总宽度为200px,项目 item 设置宽度 100px;如果正常情况下会超出容器,我们通过设置 flex:1 让项目自适应容器,并等分了空间。

  1. 给一个块级元素添加 inline-flex 属性,让其变成行内元素,子元素平均分配
.demo{
    display:inline-flex;
    width:200px;
    height:60x;
    line-height:60px;
    border: 1px solid #ccc;
    border-right: none;
}
div>.item{
    width:100px;
    border-right:1px solid #ccc;
    text-align: center;
    flex:1;
}

效果图

图片描述

内联元素平分空间效果图 案例演示 预览 复制 复制成功!
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
	.demo{
    display:inline-flex;
    width:200px;
    height:60x;
    line-height:60px;
    border: 1px solid #ccc;
    border-right: none;
}
div>.item{
    width:100px;
    border-right:1px solid #ccc;
    text-align: center;
    flex:1;
}
	</style>
</head>
<body>
     <div class="demo">
        <div class="item">1</div>
        <div class="item">2</div>
        <div class="item">3</div>
    </div>
    慕课
</body>
</html>
运行案例 点击 "运行案例" 可查看在线运行效果

demo和文字在一行,demo变成内联元素了。

  1. 一个左侧100px,右侧自适应的,左右布局
    <div class="demo-2">
        <div class="item-left">1</div>
        <div class="item-right">2</div>
    </div>
.demo-2{
    display:flex;
}
.item-left{
    flex-basis: 100px;
}
.item-right{
    flex-grow:1;
}

效果图

图片描述

左侧100px,右侧自适应的,左右布局效果图 案例演示 预览 复制 复制成功!
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
    .demo-2{
    display:flex;
}
.item-left{
    flex-basis: 100px;
}
.item-right{
    flex-grow:1;
}
    </style>
</head>
<body>
    <div class="demo-2">
        <div class="item-left">1</div>
        <div class="item-right">2</div>
    </div>
</body>
</html>
运行案例 点击 "运行案例" 可查看在线运行效果

4.一个左侧为100px,右侧最大为600px的左右布局

.demo-2{
    display:flex;
}
.item-left{       
    flex-basis: 100px;
    background: red;
    flex-shrink:0;
}
.item-right{        
    flex-basis: 600px;
    background: yellow;
}

图片描述

左右布局 案例演示 预览 复制 复制成功!
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
		.demo-2{
    display:flex;
}
.item-left{       
    flex-basis: 100px;
    background: red;
    flex-shrink:0;
}
.item-right{        
    flex-basis: 600px;
    background: yellow;
}
	</style>
</head>
<body>
    <div class="demo-2">
        <div class="item-left">
1
        </div>
        <div class="item-right">
2
        </div>
    </div>
</body>
</html>
运行案例 点击 "运行案例" 可查看在线运行效果

解释:右侧最大宽度为600,如果小于 600 右侧将随屏幕尺寸缩小。

6. 经验分享

现在的很多前端开发都会接到一些设计稿,要求在各种终端都可以适应,那么用好 flex 是一个关键。 flex:1 是其中最常见的设置,它等价于:

.demo{
    flex-grow:1;
    flex-shrink:1;
    flex-basis:auto
}

其意思就是剩余空间就扩大,而剩余空间不足就缩小,就像弹簧一样。那么这部分就可以自适应各种屏幕大小了。

7. Tips

  1. flex-basisflex-grow 同时使用时候 flex-basis 不起作用。

  2. flex 的属性 默认是 0 1 auto,它们的顺序是 flex-grow flex-shrink 和 flex-basis 即三不:有剩余空间不扩大、当空间不足时缩小、不限制尺寸。

  3. flex 属性有两个快捷值 即 auto( 1 1 auto)和 none(0 0 auto)。

  4. 尽量不要使用缩小,因为它的兼容性不是很好。

最后更新:

类似资料

  • Elasticsearch 从 5.0 开始,为日志场景的用户提供了一个很不错的接口,叫 rollover。其作用是:当某个别名指向的实际索引过大的时候,自动将别名指向下一个实际索引。 因为这个接口是操作的别名,所以我们依然需要首先自己创建一个开始滚动的起始索引: # curl -XPUT 'http://localhost:9200/logstash-2016.11.25-1' -d '{

  • 问题内容: 我玩过这个漂亮的CSS Flexbox演示页面,并且了解大多数概念,但是在工作中看不到。无论我在此处应用什么设置,在页面上都看不到差异。 从规格: <’灵活成长’> 该组件设置’flex- grow’的长度,并指定flex增长因子,该因子决定了当分配正的自由空间时,flex项目相对于flex容器中其余的flex项目将增长多少。省略时,它设置为“ 1”。 <’伸缩收缩’> 该组件设置’f

  • 问题描述 (Problem Description) 如何使用Java缩小PDF文档中的内容。 解决方案 (Solution) 以下是使用Java缩小PDF文档内容的程序。 import com.itextpdf.kernel.geom.AffineTransform; import com.itextpdf.kernel.geom.Rectangle; import com.itextpdf

  • 在JavaFX中,您可以绘制具有锐边或带有拱形边的矩形,如下图所示。 带有拱形边缘的那个被称为圆角矩形,它有两个额外的属性,即 - arcHeight - 弧形的垂直直径,位于圆角矩形的角上。 arcWidth - 圆角矩形的圆弧处的水平直径。 默认情况下,除非使用各自的setter方法setArcHeight()和setArcWidth()将弧的高度和宽度设置为+ ve值(0 <),否则Java

  • 问题内容: 关于此有很多问题和文章,但据我所知,尚无定论。我能找到的最好的总结是 flex-basis 允许您在计算其他任何内容之前指定元素的初始/开始大小。它可以是百分比或绝对值。 …本身并没有过多说明具有 flex-basis 设置的元素的行为。以我目前对flexbox的了解,我不明白为什么那也不能描述 宽度 。 我想知道 flex-basis 与实际 宽度 有何不同: 如果我用 flex-b

  • 问题内容: 设置或设置为弹性项目而不是设置之间有区别吗? 是属性的“转折点” 吗? 当我设置浏览器时,如何确定将项目下移到新行的哪一点?是根据他们的宽度还是“弹性基础”? 示例:最后两个框具有相同的功能,但是当窗口在300px至400px之间时, 只有 其中一个向下移动。为什么? 问题答案: 允许您在计算其他任何内容之前指定元素的初始/开始大小。它可以是百分比或绝对值。 但是,它 不是 弯曲增长/