起源

2019 年 1 月 29 日,Chrome72 正式版(72.0.3626.81)发布,本次发布带来了一个改变,且没有在更新日志中提及,该改变导致某些网站发生了布局错乱。该改变主要针对的是嵌套的flex布局,下面我们一起看下是怎么回事。

问题

首先,我们有一个嵌套的 flex 布局,代码如下:

area

item

content

希望实现这样的效果:父容器 area 有一个指定的高度,且它是一个 flex 弹性盒子,它内部有一个子元素 item,使用 flex:1 指定了占满剩余空间,且 item 也是一个 flex 弹性盒子,它内部还有一个同样占满剩余空间的嵌套子元素 nest-item,通过设置 overflow:auto 让它的内容超出后显示滚动条。效果如下:

这样布局的想法很简单,即通过设置弹性盒子子元素的扩展比率,能得到一个自动占满剩余空间高度的容器,再在这个容器中放需要显示的内容,在某些情况下,这确实是一个比较不错的主意,在 Chrome72 之前都是可以正常显示的。但是 Chrome72.0.3626.81中显示如下:

追溯

为什么会出现这样的问题呢?我们看一下规范( https://drafts.csswg.org/css-flexbox/#min-size-auto )flex 弹性盒子主轴上子元素的最小大小是内容的大小(视主轴方向为宽或高)。

那么我们再看一下上面的例子,area 的主轴是纵向的,子元素 item 的最小高度即是内容的高度,而 nest-item 被 content 撑开,content 有一个高度(600px,超出了容器的高度),那么 item 的最小高度也就超过了 600px。这样一来,一层层都是被内容撑开,也就没有出现滚动条了,这样似乎是符合规范预期的。

在 chromium 的 issue 反馈中,有人提到了这个问题( https://bugs.chromium.org/p/chromium/issues/detail?id=927066 ),根据回复,这正是官方为了让 Chrome 更加符合规范行为而做的调整。也就是说,Chrome72 之前的版本,这算是一个没有按照规范行为而出现的 bug。新的调整,其实就是让 flex 弹性盒子的子元素最小高度的默认行为应用 min-height:min-content ,就像官方回复中提到的那样,让子元素作为 flex 弹性盒子时却和普通盒子处理方式不同是会让人困惑的。

解决方法

既然知道了原因,那么如果我们还想使用这样的布局方式,该怎么做呢?

对的,我们给 item 指定一个最小高度,让它不使用默认的行为(即内容的高度),一般我们指定最小高度为0 min-height:0。给 item 加上这个样式后,我们再看一下效果:

嗯,已经符合我们的预期了。为了验证规范中提到的对主轴方向的行为,我们修改一下代码,将主轴设置为水平方向试试,代码如下:

area

item

content

效果如下:

看来主轴为水平方向时,是符合规范预期行为的(Chrome72 及以前的版本都符合),那么我们给 item 加上一句样式 min-width:0 ,效果如下:

嗯,是符合我们预期的。

结语

好了,现在你已经知道是怎么一回事了,可是等等,你说你升级到Chrome72没有发现我说的问题?

那是因为官方注意到这个修改会影响到一些网站的正常显示,因此在 2019 年 2 月 6 日(正是春节假期间)发布的 Chrome72.0.3626.96 中,将这个问题还原回以前的行为了( https://chromium.googlesource.com/chromium/src/+/032ef9666487db1d04b656a095b041de8c6d2b63 )。

官方的意思是为了避免这个修改给某些网站带来的不好的影响,因此预留时间给大家修改,等到Chrome73将会发布这一改变。所以为了未来更好的浏览体验,检查一下你的页面吧!

flex布局怎么设置子元素大小_Chrome72 嵌套 flex 布局修改,你的网站可能会发生布局错乱...相关推荐

  1. flex布局怎么设置子元素大小_48张小图带你领略Flex 布局之美

    前言 最近在项目中,遇到布局问题,有时候,需要堆叠很多的样式,去排版,一定程度上增加了代码量,那么有没有更加方便的布局方式呢?? 48张图带你从0到1掌握flex布局方式. flex布局在某种程度上, ...

  2. flex布局怎么设置子元素大小_Web前端(三):前端布局

    前端布局对前端开发而言是必不可少的环节之一.我所理解的前端布局可以分成两个大类,第一类是元素层面的布局,就是像absolute布局.flex布局等等,都是描述元素在页面上以何种形式呈现,即局部的布局: ...

  3. flex 换主轴后子元素占满_Chrome72 嵌套 flex 布局修改,你的网站可能会发生布局错乱...

    起源 2019 年 1 月 29 日,Chrome72 正式版(72.0.3626.81)发布,本次发布带来了一个改变,且没有在更新日志中提及,该改变导致某些网站发生了布局错乱.该改变主要针对的是嵌套 ...

  4. 设置子元素在主轴(横轴)方向上的对齐方式为容器的开头_今日推送 CSS Flexbox布局(上)...

    在" Flexbox布局"模块之前,有四种布局模式: 四种布局模式: 块布局block,常见的就是div 内联inline,用于文本 表table,用于二维表数据 定位positi ...

  5. CSS初入门:设置子元素水平居中的方式

    问题描述: 用几种方式实现元素位于父元素的水平居中位置,如图: 解决 方式一 通过控制子元素的左边框和右边框来达到居中的效果. 在那之前,我先举个我遇到过的错误示范 <!DOCTYPE html ...

  6. flex 换主轴后子元素占满_css flex justify-content属性,子元素在主轴上的对齐方式。...

    css flex justify-content属性,子元素在主轴上的对齐方式. justify-content属性控制子元素在主轴上的对齐方式,支持flex-start . flex-end . c ...

  7. CSS中使用flex弹性布局实现上下左右垂直居中排列并设置子元素之间的间距

    场景 Flex是Flexible Box的缩写,意为"弹性布局". 怎样使用弹性布局实现页面上下两个元素上下左右垂直居中排列. 实现如下类似布局 最外层是是一个div,div里面是 ...

  8. flutter - GridView 网格布局,以及设置子元素的间距和大小

    基础的 GridView 布局 参数 说明 gridDelegate 对子元素进行修饰,由于SliverGridDelegate 是一个抽象类, 找它的实现类有 [SliverGridDelegate ...

  9. 用 justify-content 属性设置子元素两端对齐

    外层元素的 justify-content 属性设置为space-between即可实现子元素两端对齐 <!DOCTYPE html> <html> <head> ...

最新文章

  1. python适合做后端开发吗-Python真的不适合做后端开发语言吗?
  2. CentOS安装mariadb
  3. Spark _13_二次排序问题
  4. Android开发之RecyclerView滑动到底部的监听方法
  5. 从Mysql slave system lock延迟说开去
  6. 遍历磁盘扩展分区_win7系统如何创建磁盘管理扩展分区【图文教程】
  7. VC++多线程工作笔记0007---线程间同步机制2
  8. [Java] 蓝桥杯ALGO-117 算法训练 友好数
  9. 埋石图根点lisp代码_GPS测量作业流程.doc
  10. linux下编译opendds,求教OpenDDS的交叉编译!
  11. 问题G:卡布列克常数
  12. 自定义chrome新标签页
  13. 个人总结---微信抢票应用
  14. sql python excel_数据技能篇(EXCEL,SQL,Python)
  15. 关于数据库的递归查询
  16. 【计算机网络】python——socket编程(TCP/UDP)
  17. 命名实体识别的难点与现状
  18. 如何从0开始在鸿蒙OS中制作一个APP!
  19. matlab中sparse和full函数的使用
  20. SpringBoot整合JWT实现API身份校验

热门文章

  1. 《Go语言圣经》学习笔记 第十章 包和工具
  2. 一篇详文带你入门 Redis
  3. 腾讯民汉翻译征战全国机器翻译大赛夺得双冠
  4. 腾讯大数据高级产品总监洪桃李:决胜未来的4大关键能力
  5. VMware虚拟机网络模式详解 NAT模式
  6. MySQL的FROM_UNIXTIME()和UNIX_TIMESTAMP()函数
  7. redis实现简单限流
  8. leetcode 640. Solve the Equation | 640. 求解方程(字符串处理)
  9. GDB入门:A GDB Tutorial with Examples
  10. ZooKeeper实战(一):ZooKeeper原理,详细安装步骤,基本命令,节点间通信原理