重学前端
程劭非(winter)
前手机淘宝前端负责人
105348 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 57 讲
开篇词+学习路线+架构图 (3讲)
重学前端
15
15
1.0x
00:00/00:00
登录|注册

CSS Flex排版:为什么垂直居中这么难?

自适应宽
两列等高
垂直居中
计算交叉轴尺寸和位置
计算主轴尺寸和位置
分行
主轴和交叉轴
flex属性
display:flex
应用
原理
设计
CSS Flex排版

该思维导图由 AI 生成,仅供参考

你好,我是 winter。今天我们来谈谈 Flex 排版。
我们在前面多次讲过,正常流排版的设计来源于数百年来出版行业的排版经验,而 HTML 诞生之初,也确实是作为一种“超文本”存在的。
但是,自上世纪 90 年代以来,Web 标准和各种 Web 应用蓬勃发展,网页的功能逐渐从“文本信息”向着“软件功能”过渡,这个思路的变化导致了:CSS 的正常流逐渐不满足人民群众的需求了。
这是因为文字排版的思路是“改变文字和盒的相对位置,把它放进特定的版面中”,而软件界面的思路则是“改变盒的大小,使得它们的结构保持固定”。
因此,在早年的 CSS 中,“使盒按照外部尺寸变化”的能力非常弱。在我入行前端的时间(大约 2006 年),CSS 三大经典问题:垂直居中问题,两列等高问题,自适应宽问题。这是在其它 UI 系统中最为基本的问题,而到了 CSS 中,却变成了困扰工程师的三座大山。
机智的前端开发者们,曾经创造了各种黑科技来解决问题,包括著名的 table 布局、负 margin、float 与 clear 等等。在这种情况下,Flex 布局被随着 CSS3 一起提出(最初叫 box 布局),可以说是解决了大问题。
React Native 则更为大胆地使用了纯粹的 Flex 排版,不再支持正常流,最终也很好地支持了大量的应用界面布局,这一点也证明了 Flex 排版的潜力。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

CSS Flex排版:为什么垂直居中这么难? 本文介绍了CSS Flex排版的设计、原理和应用。Flex排版的核心是display:flex和flex属性,它们配合使用。文章详细解释了Flex的设计思路和实现原理,包括主轴、交叉轴、分行、计算主轴和交叉轴等步骤。此外,文章还提供了几个例子,解决了旧时代的CSS三大经典问题,包括垂直居中、两列等高和自适应宽。Flex排版的灵活性和强大功能使其成为解决排版难题的利器。文章内容深入浅出,适合前端开发者快速了解Flex排版的基本原理和应用技巧。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《重学前端》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(14)

  • 最新
  • 精选
  • 靠人品去赢
    flex是我刚开始做小程序,学到的第一个东西,真的好用,结合一些别的属性能解决很多兼容问题,而不再出现一机一况的情况,但是有的的时候,在做安卓和苹果的时候还是会遇到兼容性问题,能不能讲一下安卓和苹果的一些不同,比如在一个安卓上正常,在苹果上会出现边框被吃掉一部分的情况。

    作者回复: 兼容问题怎么可能有一下子解决的方法呢,我也是case by case去看的啊

    2019-06-19
    2
    11
  • 渴望做梦
    老师,为何最后一个宽度自适应的例子用 flex: 1 呢,flex: 1 表示什么含义呢?

    作者回复: 这就是基本的flex用法。

    2019-08-02
    3
    3
  • KingSwim
    希望可以图文并茂一些
    2019-08-14
    4
    52
  • 许童童
    flex好用,gird更好用。会讲一下吗?
    2019-04-13
    3
    14
  • 阿成
    https://gist.github.com/aimergenge/e26193440fa38ebbb9a54847540c29c7
    2019-04-15
    2
    11
  • Geek_920664
    分享一个学习flex的小游戏:http://flexboxfroggy.com/
    2021-10-12
    10
  • 北拉
    试过好多次,找了很多方法flex兼容ie9以下,每次都失败,有什么好的解决办法吗
    2019-04-14
    6
  • 彧豪
    gird布局如果后面winter老师没有讲到,推荐你找找大漠老师的文章来看看,另外阮一峰老师也写了一篇,二者可以结合起来看看
    2019-04-13
    5
  • cjd
    直接calc(100% - n)
    2019-04-15
    4
  • favorlm
    自动填充剩余宽度 <!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>自适应宽</title> <style> .box { position: absolute; width: 300px; height: 100px; background-color: cyan; } .childbox1Attr { position: absolute; background-color: bisque; width: 35px; height: 35px; } .childbox2Attr { position: absolute; background-color: beige; width: 35px; height: 35px; } </style> </head> <body> <div class="box"> <div class="childbox1Attr"></div> <div class="childbox2Attr"></div> </div> <script> const childbox1Attr = { width: '100' }; const childbox2Attr = { width: '100', flex: '1' }; const box = document.getElementsByClassName('box')[0]; const childbox1Ele = document.getElementsByClassName('childbox1Attr')[0]; const childbox2Ele = document.getElementsByClassName('childbox2Attr')[0]; const boxcomputedStyle = window.getComputedStyle(box, null); const child1ComputedStyle = window.getComputedStyle(childbox1Ele, null); childbox1Ele.style.width = childbox1Attr.width+'px'; if(childbox2Attr.flex !== null || childbox2Attr.flex!==''){ if(childbox2Attr.flex === '1'){ // 利用一下不安全特性,实在不知道怎么写 const childbox2EleWidth = boxcomputedStyle["width"].substring(0,3) - child1ComputedStyle["width"].substring(0,3); childbox2Ele.style.width = childbox2EleWidth + 'px'; childbox2Ele.style.left = child1ComputedStyle["width"] } } </script> </body> </html>
    2019-04-14
    3
收起评论
显示
设置
留言
14
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部