当前位置: 首页 > news >正文

CSS flex布局 flex-grow不为1 items始终均匀分配剩余空间问题

问题记录:

html如下:

<div class="flex-container">
  <div class="box B">B</div>
  <div class="box D">D</div>
  <div class="box E">E</div>
</div>

css如下:

  1. 对父容器 flex-container 设置 display:flex
  2. 使用 .flex-container > div 选择器选择 .flex-container 下的第一层div子元素,设置flex-grow:1
  3. 使用 .B 类选择器 选择 元素B,设置flex-grow:3
.flex-container{
  display:flex;
  height:200px;
  width:500px;
  justify-content:center;
  align-items:center;
  background-color:yellow;
}

.flex-container > div{
  width: 60px;
  height: 60px;
  line-height: 60px;
  text-align: center;
  font-size: 2em;
  /* 这里为每一个flex item设置 flex-grow:1 */
  flex-grow:1;
}

.B {
  background-color: #50a18e; 
  /* 这里单独为B设置 flex-grow:3 */
  flex-grow:3;
}
.D { background-color: #f2916d; }
.E { background-color: #f26e50; }

每个 flex item 均匀分配剩余空间
每个flex item 均匀分配剩余空间,.B的flex-grow:3 不生效。


原因分析:

一开始考虑是因为 CSS 的选择器之间有优先级。

优先级关系:内联样式 > ID 选择器 > 类选择器 = 属性选择器 = 伪类选择器 > 标签选择器 = 伪元素选择器

但是 .flex-container > div 不算一个标签选择器,因而在 菜鸟教程 找到了如下规则。

当一个标签同时被多个选择符选中,我们便需要确定这些选择符的优先级。我们有如下规则:

CSS 优先规则4:计算选择符中 ID 选择器的个数(a),计算选择符中类选择器、属性选择器以及伪类选择器的个数之和(b),计算选择符中标签选择器和伪元素选择器的个数之和(c)。按
a、b、c 的顺序依次比较大小,大的则优先级高,相等则比较下一个。若最后两个的选择符中 a、b、c 都相等,则按照"就近原则"来判断。

因此,.flex-container > div 选择器的 (a)id选择器个数=0,(b)类选择器、属性选择器、伪类选择器个数之和 = 1 (c)标签选择器和伪元素选择器个数之和 = 1。
.B类选择器的 (a)id选择器个数=0,(b)类选择器、属性选择器、伪类选择器个数之和 = 1 (c)标签选择器和伪元素选择器个数之和 = 0。

因而 .flex-container > div 选择器的优先级高于 .B 类选择器。
所以最后 flex items 的 flex-grow 都为1,因而出现了上图所示的平均分配父容器剩余空间。


解决方案:

  1. 不使用 .container > div 选择器,而另外使用一个类来设置flex items 的通用属性。
    <div class="box B">B</div>
  2. 使用 .container > div 选择器,而在.B的样式中,设置
    flex-grow:3 !important;
    经评论区提醒,可以使用 .container > .B {} 选择器。
  3. 同时还要注意父容器 flex-container 的宽度,如果没有剩余空间,那么将不会出现剩余空间分配给 flex items,如果剩余空间较小,效果也将不明显。
    ok

相关文章:

  • [ HTML + CSS + Javascript ] 复盘尝试制作 2048 小游戏时遇到的问题
  • [Symbol.toPrimitive](hint) hint 什么时候为 default?
  • JavaScript 对象遍历方法及其遍历顺序的总结
  • vue 实现根据窗口大小自适应图片预览
  • 《计算机网络 自顶向下方法》笔记 - 第二章 应用层
  • 使用 BrowserRouter 报错 invaild hook call 解决方案
  • python中assert关键字的作用
  • CSS3 :nth-child(n)用法
  • CSS3中的transition属性详解
  • HTML中导航栏title前面小图标的实现
  • mysql区分大小写
  • SpringMvc中/和/*的区别
  • varchar 和 varchar2的区别
  • IntelliJ IDEA 各种搜索功能
  • HashMap中的tableSizeFor(int cap)
  • [LeetCode] Wiggle Sort
  • 【402天】跃迁之路——程序员高效学习方法论探索系列(实验阶段159-2018.03.14)...
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android Volley源码解析
  • AzureCon上微软宣布了哪些容器相关的重磅消息
  • Consul Config 使用Git做版本控制的实现
  • Flannel解读
  • HTTP 简介
  • JavaScript标准库系列——Math对象和Date对象(二)
  • Java基本数据类型之Number
  • MySQL几个简单SQL的优化
  • NLPIR语义挖掘平台推动行业大数据应用服务
  • orm2 中文文档 3.1 模型属性
  • php中curl和soap方式请求服务超时问题
  • Python语法速览与机器学习开发环境搭建
  • rabbitmq延迟消息示例
  • React Transition Group -- Transition 组件
  • react-native 安卓真机环境搭建
  • SQL 难点解决:记录的引用
  • Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比...
  • Traffic-Sign Detection and Classification in the Wild 论文笔记
  • Vim Clutch | 面向脚踏板编程……
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 分布式事物理论与实践
  • 设计模式走一遍---观察者模式
  • 物联网链路协议
  • 消息队列系列二(IOT中消息队列的应用)
  • 异步
  • 源码安装memcached和php memcache扩展
  • 字符串匹配基础上
  • 白色的风信子
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • # Apache SeaTunnel 究竟是什么?
  • (6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理
  • (分布式缓存)Redis哨兵
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (企业 / 公司项目)前端使用pingyin-pro将汉字转成拼音
  • (四) Graphivz 颜色选择
  • .chm格式文件如何阅读