位置: IT常识 - 正文

深入理解CSS之flex精要之 flex-basis flex-grow flex-shrink 实战讲解(css详解)

编辑:rootadmin
深入理解CSS之flex精要之 flex-basis flex-grow flex-shrink 实战讲解

推荐整理分享深入理解CSS之flex精要之 flex-basis flex-grow flex-shrink 实战讲解(css详解),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:css, the definitive guide,css perspective,深入解析csspdf,css perspective,cssperspective详解,css的理解,css的理解,深入解析css,内容如对您有帮助,希望把文章链接给更多的朋友!

这篇文章对flex不熟也可以看。这篇文章只讲这三个属性。为了简单化,不会提到主轴交叉轴,也不讲方向,默认方向就是水平方向从左往右。但并不影响对这三个概念的理解。

如果你觉得对flex比较了解,可以直接从第二小节开始看起。

1.开启flex

我们正常写三个div。默认情况下是垂直排列的。只要开启flex,一行代码就可以实现水平布局。这是flex最有用的一点。

<div id="box"> <div class="div1 fontCenter">1</div> <div class="div2 fontCenter">2</div> <div class="div3 fontCenter">3</div></div> #box { /*display: flex;*/ height: 500px; width: 1000px; background-color: plum; } .div1{ width: 150px; height: 150px; background-color: lightblue; } .div2{ width: 150px; height: 150px; background-color: lightgreen; } .div3{ width: 150px; height: 150px; background-color: lightsalmon; } .fontCenter{ text-align: center; line-height: 150px; font-size: 50px; }

1.1使用flex实现水平排列

我们给容器原始#box加上display: flex;这行。表示开启flex。这时候就已经实现了水平排列功能。非常的简单,这个功能用浮动来做就麻烦的多。

#box { display: flex; height: 500px; width: 1000px; background-color: plum; }

1.1.2 左右分区

我想实现box1和box2在左边,box3在右边。这个功能通过flex非常的好实现。只需要给box3设置margin-left:auto。box3就会把能margin-left的都margin了。自己也就到了最右边,也就实现了我们想要的功能。

.div3{ width: 150px; height: 150px; margin-left: auto; background-color: lightsalmon; }

如果你想要把box2和box3一起移动到最右边,只需要把margin-left:auto设置在box2上面就可以了。

.div2{ width: 150px; height: 150px; margin-left: auto; background-color: lightgreen; }

2.理解flex-basis

flex-basis这个属性是非常重要的一个属性,也是最容易混淆的一个属性。最开始以为和width属性差不多,也就没怎么重视。不弄清楚会造成和他相关属性的理解混乱。 其实flex-basis非常的好理解,你只需要逐字逐句的把他的定义理解一遍就行。

定义: 它的初始值是 auto,此时浏览器会检查元素是否设置了 width 属性值。如果有,则使用 width 的值作为 flex-basis 的值;如果没有,则用元素内容自身的大小。如果 flex-basis 的值不是 auto,width 属性会被忽略。 分为两种情况: 1.没有设置flex-basis,这时候flex-basis为默认值auto。 这种情况很常见,就是只设置了display:flex的时候。别的flex属性都没设置。此时浏览器会检查元素是否设置了 width 属性值。如果有,则使用 width 的值作为 flex-basis 的值;如果没有,则用元素内容自身的大小。 这句话暗含了一个很重要的信息就是在flex里面,flex-basis是优先用于处理宽度的。更切确的说,在flex里面,根本不存在width,如果用户没设置flex-basis的值,flex系统会把width的值赋值给flex-basis。flex-basis有了值后,width被忽略,变成了工具人。 2.设置了flex-basis的值,这时候width会忽略,元素的宽度用flex-basis的值表示。 这点就更加验证了在flex里面,flex-basis是优先于width来处理宽度的。在flex里面只要用户设置了flex-basis的值,我flex系统都不正眼瞧你width。 总之,在设置了display:flex之后,你最好设置flex-basis的值,并且忽略width。 虽然width也是可以用,但就显得拖泥带水。就像你一只脚已经踏入我flex这个先进的布局系统里面,另一只脚还停留在原始的CSS里面。既然你已经用了flex这个系统,用就用全套,就用我flex-basis吧。而且我还可以和我另两个兄弟flex-grow 和 flex-shrink一起配合使用。组成flex三巨头。 虽然说flex-basis是替换了width,并且他和width起到的作用是差不多的。但他们还是不同的。 当width为0的时候,我们是看不到元素的。但当flex-basis为0,或者为auto并且width没有设置值的时候(默认值为0),该元素的大小是由内容大小决定的。也就是只要有内容,flex-basis是不会看不到元素的。这在后面会从例子中体现。

设为auto和0也是有区别的。一个最明显的区别就是为0的时候,如果内容文字有空格是自动换行的。 这个可以通过设置white space:nowrap解决。auto就没有这个问题。 例一: div1同时设置了width和 flex-basis,width的值将会失效。

.box1{ width: 150px; height: 150px; flex-basis: 200px; background-color: lightsalmon; } .box2{ width: 150px; height: 150px; background-color: lightgreen; } .box3{ width: 150px; height: 150px; background-color: lightblue; }

宽度使用的是flex-basis的值而不是width的。 通常用法: 这里给父元素加了宽高和背景。

#content { display: flex; width: 1000px; height: 500px; background-color: lightpink; } .box1{ height: 150px; flex-basis: 15%; background-color: lightsalmon; } .box2{ height: 150px; flex-basis: 15%; background-color: lightgreen; } .box3{ height: 150px; flex-basis: 20%; background-color: lightblue; }

3.理解flex-grow

在设置了flex-basis后,元素就占用了一定的空间。但还留有一些空间。这些空间可以通过flex-grow来占领。 以上面的这种情况为例,box1,box2,box3分别占据了父元素的15%,15%和20%的宽度,一共占据了50%宽度。还剩下50%的空白空间。 我们可以给box设置flex-grow属性。分别给三个box设置flex-grow:1。表示权重都是1,那么三个box将会平分剩下的空间。

.box1{ height: 150px; flex-basis: 15%; flex-grow: 1; background-color: lightsalmon; } .box2{ height: 150px; flex-basis: 15%; flex-grow: 1; background-color: lightgreen; } .box3{ height: 150px; flex-basis: 20%; flex-grow: 1; background-color: lightblue; }深入理解CSS之flex精要之 flex-basis flex-grow flex-shrink 实战讲解(css详解)

父元素的宽度是1000px。 以box1为例,box1原来的宽度是1000*15%=150。grow的宽度是1000 * 50% * 1/3=500/3。所以box1最终宽度是150+500/3。大家可以在开发者工具对比一下前后宽度就明白了。 如果子元素flex-grow的总和超过1,那么就是按照上面的方式,按比例(权重)瓜分剩下的空间。 还存在一种情况是flex-grow的总和没有超过1的,比如出现小数的情况。

.box1{ height: 150px; flex-basis: 15%; flex-grow: 0.3; background-color: lightsalmon; } .box2{ height: 150px; flex-basis: 15%; flex-grow: 0.3; background-color: lightgreen; } .box3{ height: 150px; flex-basis: 20%; flex-grow: 0.1; background-color: lightblue; }

这种情况就不会完全瓜分剩下的全部空间。而是子元素将自己的flex-grow值和剩余空间相乘,计算出的值就是增加的值。以box1为例,剩余空间是100050%=500,原来的宽度是10000.2=200,500*0.3=150这是增加的值,最后宽度是200+150=350。 和总和超过一的区别就是,不是按照各个子元素直接的权重比例来分配了,而是直接用flex-grow这个值乘以剩余空间来获取增长的值。

3.1 flex-grow的实际用途

其实上面提到的两种用法在实际开发中基本是用不上的。谁会给已经设置好宽度的元素又增加点宽度呢?实际上,下面这种用法才是最常见的。 下面这个效果在网页里面是经常用到的。左边是主要内容区,右边是一些小模块。使用flex-grow可以快速实现这样的功能。 我们想实现的效果是box1:box2=3,也就是box1宽度是box2宽度的3倍。

#content{ display: flex; height: 700px; font-size: 50px; } .box1{ height: 100%; flex-grow: 3; background-color: lightgreen; } .box2{ height: 100%; flex-grow: 1; background-color: lightblue; }<div id="content"> <div class="box1">box1</div> <div class="box2">box2</div></div>

但实际上,如果你打开开发者工具,测量一下,box1和box2的宽度,你会发现两者比例根本不是3:1。这是为什么? 也许你一开始就看出我这样写是有问题的,那么恭喜你,你对flex理解的很深刻。原因出在你没有设置flex-basis=0上。注意,一定要设置为0,不写flex-basis默认值是auto。为什么设置flex-basis为0就可以了呢?

我们来分析一下上面的代码的执行逻辑: 上面的代码我们没有设置flex-basis,也没有设置width。flex-basis等于auto,width没有值。所以使用内容的宽度。 不信你把flex-grow属性都去掉,就会看到下面的效果。 这里引出flex-basis和width一个重要的区别。flex-basis默认值是auto,并且没有设置width的时候,flex-basis的值等于内容的宽度,值并不是为0的。这就是导致上面代码box1和box2不能实现3:1比例的原因。要想实现box1和box2比例是3:1,box1和box2的起始宽度必须是0。这样flex-grow就可以按比例平分父元素空间了。 只需要给两个box都加上flex-basis:0就可以实现按比例平分的效果了。

.box1{ height: 100%; flex-grow: 3; flex-basis: 0; background-color: lightgreen; } .box2{ height: 100%; flex-grow: 1; flex-basis: 0; background-color: lightblue; }4.理解flex-shrink

在《深入理解CSS》这本书里面,有下面这样一个图。给三个元素设置flex-basis都等于40%。将会溢出一部分。 我也照着做了一遍。

<div id="content"> <div class="box1">1</div> <div class="box2">2</div> <div class="box3">3</div></div> #content{ display: flex; height: 500px; width: 1000px; background-color: lightpink; font-size: 50px; } .box1{ height: 200px; flex-basis: 40%; background-color: lightgreen; } .box2{ height: 200px; flex-basis: 40%; background-color: lightblue; } .box3{ height: 200px; flex-basis: 40%; background-color: lightsalmon; }

发现和想象中的不一样。box3并没有溢出。但三个flex-basis加起来确实是超出父元素宽度了。 但我心想,大牛写的书,应该不会骗我。一定是我写错了。但我没有写错,书里面说的也没错。 问题就出在flex-shrink身上。可是我也没写flex-shrink啊。你没写flex会自动给你添加上,而且默认值还不是0,而是1。 实际上,你上面的代码等价于下面的代码。

.box1{ height: 200px; flex-basis: 40%; flex-shrink: 1; background-color: lightgreen; } .box2{ height: 200px; flex-basis: 40%; flex-shrink: 1; background-color: lightblue; } .box3{ height: 200px; flex-basis: 40%; flex-shrink: 1; background-color: lightsalmon; }

flex-shrink的作用和flex-grow相反。当合计的flex-basis的总宽度超过父元素的总宽度的时候。flex-shrink会把子元素按比例减少,把溢出的宽度抹没。 比如前面的例子总宽度是40%*3=120%,也就是溢出了20%的宽度,也就是1000 * 20%=200px的宽度。怎么把这200px给抹没掉呢?就是从前面三个子元素上面扣宽度。三个子元素的flex-shrink都是1,也就是平均扣除200/3px。 就能实现抹没的效果。打开开发者工具,量一下子元素的宽度,确实是减少了这些宽度的。

如果说,我就想有这种溢出的效果,那么就把flex-shrink都设为0就好了。就可以达到下面这样效果。也就是书上提到的效果。

5.flex属性的使用

介绍完了flex-basis,flex-grow和flex-shrink后,我们可以用他们的一种精简写法flex。

例如: 我们给三个子元素都写上flex:1,就可以实现三等分的效果。

.box1{ height: 200px; flex: 1; background-color: lightgreen; } .box2{ height: 200px; flex: 1; background-color: lightblue; } .box3{ height: 200px; flex: 1; background-color: lightsalmon; }

这个效果是真正三等分的。 这里的flex:1相当于下面的写法。三个值分别表示flex-grow,flex-shrink,flex-basis。 注意,flex:1和只写一个flex-grow:1是不一样的。 写成flex:1,flex-shrink,flex-basis的默认值是1和0%。 而写成flex-grow:1,flex-shrink,flex-basis的默认值是1和auto。也就是flex-basis是不同的。 而flex-basis值为0和auto的不同前面已经验证过了,就是auto在没有width的情况下宽度是内容的宽度。这会导致flex-grow不能整体平均分。具体见flex-grow小节。

flex:1 1 0%

或者

flex-grow:1flex-shrink:1flex-basis:0%

除了flex-basis会单独当类似width使用外。flex-grow,flex-shrink基本是很少使用的。 flex-grow也很少单独使用,因为使用flex-grow的时候,一般就是为了按比例分配布局。这时候要同时设置flex-basis:0。 所有一般使用下面的方式来替代单独使用flex-grow。因为这种方式可以快速达到按比例分配布局。

flex:1

至于flex-shrink基本就不会用,也就设个默认值让子元素不会超出。

使用flex实现常用效果

1.包裹内容水平排列 设置flex后,子元素也不要设置width,就会出现这种包裹内容水平排列的效果。

2.第一个子元素固定,第二个子元素撑满剩余高度。 flex-shrink的值是无所谓的,因为并没有超出父容器宽度。

3.三足鼎立型。两边固定宽度,中间填满剩余空间

4.按比例划分

本文链接地址:https://www.jiuchutong.com/zhishi/298873.html 转载请保留说明!

上一篇:Vue项目使用百度地图api(vue项目使用百度地图怎么长久使用)

下一篇:车道线检测数据集介绍(车道线检测视频素材)

  • 论坛发帖推广七大技巧(论坛发帖推广七律怎么写)

    论坛发帖推广七大技巧(论坛发帖推广七律怎么写)

  • hp台式机bios设置启动顺序(hp台式机bios设置legacy)

    hp台式机bios设置启动顺序(hp台式机bios设置legacy)

  • 中国移动黄金会员怎么退订(中国移动黄金会员权益怎么领取)

    中国移动黄金会员怎么退订(中国移动黄金会员权益怎么领取)

  • iphone13Safari浏览器怎么长截屏(iphonesafari浏览器)

    iphone13Safari浏览器怎么长截屏(iphonesafari浏览器)

  • 抖音极速版怎么没有直播呢(抖音极速版怎么赚钱 一天能赚多少)

    抖音极速版怎么没有直播呢(抖音极速版怎么赚钱 一天能赚多少)

  • 滴滴长途单有空返费嘛(滴滴长途单不付钱怎么办)

    滴滴长途单有空返费嘛(滴滴长途单不付钱怎么办)

  • 抖音账号三无什么意思(什么是三无抖音)

    抖音账号三无什么意思(什么是三无抖音)

  • 无障碍模式怎么关闭(无障碍模式怎么解除)

    无障碍模式怎么关闭(无障碍模式怎么解除)

  • 淘宝如何改会员名(淘宝如何改会员名字)

    淘宝如何改会员名(淘宝如何改会员名字)

  • 手环长期没用充不进电(手环长时间没用充不上电怎么回事)

    手环长期没用充不进电(手环长时间没用充不上电怎么回事)

  • 什么是一种系统软件(何为系统?)

    什么是一种系统软件(何为系统?)

  • 被拉黑了重新加好友有显示吗(被拉黑了重新加微信)

    被拉黑了重新加好友有显示吗(被拉黑了重新加微信)

  • 引入操作系统的主要目的是(引入操作系统的方法)

    引入操作系统的主要目的是(引入操作系统的方法)

  • 升级5g套餐后4g还能用吗(升级5g套餐后4g套餐还有吗)

    升级5g套餐后4g还能用吗(升级5g套餐后4g套餐还有吗)

  • 华为mate30pro双系统怎么设置(华为mate30pro双系统怎么关闭)

    华为mate30pro双系统怎么设置(华为mate30pro双系统怎么关闭)

  • 屏幕排线坏了会出现什么情况(屏幕排线坏了会触屏不了吗)

    屏幕排线坏了会出现什么情况(屏幕排线坏了会触屏不了吗)

  • 网络显示edge是啥意思

    网络显示edge是啥意思

  • 手机qq个性封面怎么设置(手机qq设置封面)

    手机qq个性封面怎么设置(手机qq设置封面)

  • 苹果11像素多少(苹果11像素多少万像素哪里看)

    苹果11像素多少(苹果11像素多少万像素哪里看)

  • polarr是什么软件(polarr软件下载)

    polarr是什么软件(polarr软件下载)

  • 小米手机拍照翻译在哪里(小米手机拍照翻译日文)

    小米手机拍照翻译在哪里(小米手机拍照翻译日文)

  • 微信小号怎么申请不用手机号(微信小号怎么申请同一个手机号oppo)

    微信小号怎么申请不用手机号(微信小号怎么申请同一个手机号oppo)

  • 苹果8p声音小怎么办(苹果8p声音怎么调大)

    苹果8p声音小怎么办(苹果8p声音怎么调大)

  • win7只能进入安全模式(win7只能进入安全模式,正常启动无信号)

    win7只能进入安全模式(win7只能进入安全模式,正常启动无信号)

  • vue数据更新了,但是页面不渲染的问题(vue数据更新会触发什么生命周期)

    vue数据更新了,但是页面不渲染的问题(vue数据更新会触发什么生命周期)

  • 准确率、精确率、召回率、F1-score(准确率精确率)

    准确率、精确率、召回率、F1-score(准确率精确率)

  • 为博客园开发了一套脚手架及模板——实时预览页面定制效果(为博客园开发了什么项目)

    为博客园开发了一套脚手架及模板——实时预览页面定制效果(为博客园开发了什么项目)

  • antd pro 使用心得(antd pro v5)

    antd pro 使用心得(antd pro v5)

  • 什么是税收超额征收
  • 车辆使用费属于什么税收分类
  • 按份共同保证和连带共同保证
  • 筹建期的收入要交企业所得税吗
  • 季度不超过30万是含税还是不含税
  • 企业销售软件需要结转成本吗
  • 建筑 分包
  • 技术转让费怎么定价
  • 打款金额少于开票金额
  • 企事业承包承租方缴纳的管理费税费
  • 外管证的开具与注销流程
  • 取得稳岗补贴后怎么办
  • 有收入零申报要紧吗
  • 销售方开的普票税额怎么处理
  • 报销单里报销内容可以写送客户烟吗
  • 机动车发票怎么作废
  • 专项应付款与补助的区别
  • WIN7系统的镜像文件在哪里
  • 电脑每次开机都要选择系统怎么办
  • 收据入账会计分录
  • 无形资产商标转让费计入什么科目
  • 苹果电脑录屏的视频保存在哪里
  • PHP:mb_encode_numericentity()的用法_mbstring函数
  • linux小技巧
  • scchost.exe - scchost是什么进程 有什么用
  • wordpress 中文版和国际版区别
  • linux内核与文件系统
  • PHP:imagesavealpha()的用法_GD库图像处理函数
  • 企业以非货币性资产投资
  • codelite怎么进行编译
  • 陆家嘴金融贸易区管委会主任
  • input输入框限制输入数字范围
  • 农产品小规模纳税人
  • 数据分析实战
  • vue3中使用window方法
  • python3.9.4怎么用
  • php内存缓存
  • 暂估入库以及暂估的区别
  • php和mysql的软件怎么部署
  • 营改增后发票管理办法
  • 通过点击一个按键的游戏
  • 房地产城建税计税依据
  • 影响年度损益的金额怎么算
  • 增值税发票有哪些项目
  • 土地使用权转为在建工程
  • 建筑施工企业增值税税率调整时间
  • 税控盘的进项税在哪里申报
  • 物业管理费发票备注栏要求
  • 未分配利润实际没有钱分配是什么原因
  • 应纳税的物品有哪些
  • 建筑公司项目如何上手
  • 计算企业所得税可以扣除的税金
  • 现金日记账每月都要写期初余额吗
  • 前几个月的印花税怎么算
  • 工资扣员工的罚款入什么科目
  • 房地产开发公司是做什么的
  • 报销单可以当记账凭证吗
  • 预付账款的会计处理
  • 股东股权转让印花税 公司承担
  • 贷款服务可以抵扣进项税额吗
  • 高新企业研发项目规定几个
  • 营业外支出增加说明了什么
  • 房地产企业会计核算和税务处理大全
  • freebsd 升级
  • ahqinit.exe是什么进程 ahqinit是安全的进程吗
  • centos查看inode
  • windows tcp
  • win7创建一个标准用户账户
  • 大家看的是什么
  • vue是如何实现双向绑定的
  • js中调用java
  • android 开发 教程
  • c#string stringbuilder
  • jQuery easyUI datagrid 增加求和统计行的实现代码
  • 购买的环保设备未使用检察建议
  • 江西省税务局发票查询平台官网
  • 有限责任公司自然人独资属于什么企业
  • 契税和房产税是一回事吗
  • 税务上门核查要看什么
  • 现在买新车都需要交什么费用
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设