ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Flexbox 7天完全指南:从核心概念到实战布局

Flexbox 7天完全指南:从核心概念到实战布局 1. Flexbox到底解决什么问题值得你花7天去啃前端开发这个行当CSS写久了你会发现一个扎心的事实页面好不好看三分靠审美七分靠排版。而排版这件事在Flexbox出现之前简直是无数萌新的噩梦。我记得自己刚入行那会儿做一个简单的三栏布局用float写了好几层嵌套又清浮动又调margin最后还因为父容器高度塌陷被老同事指着代码说了半天。后来Flexbox普及了再回头看那些float布局真的像在用算盘解微积分——能算但没必要。Flexbox全称Flexible Box Layout翻译过来就是“弹性盒子布局”。它的核心思想特别朴素让容器里的子元素能根据容器大小自动伸缩、自动对齐、自动排列。你不需要去精确计算每个元素的宽度、高度、间距只需要告诉容器“你要怎么排”里面的元素就会像个听话的队列一样齐刷刷地站好。那它到底解决了什么问题几个词就能概括水平垂直居中不再靠魔法数字、等高列不用再hack、元素间距不用再手动加减margin、左右两栏不用再挣扎clearfix。这些场景每一个都是前端日常开发里高频踩坑的重灾区。这篇文章适合谁如果你是一个前端萌新刚学完HTML和CSS基础正在被浮动布局折磨得头秃如果你面试之前想快速把Flexbox的系统知识过一遍或者你已经在用Flexbox但每次写justify-content还是要翻文档——那这篇东西就是给你准备的。我会把7天的学习路径、核心概念、实战代码、踩坑实录全部拆开揉碎你就当是跟一个老同事聊天把这套东西彻底聊透。这个7天计划不是让你每天学8个小时而是每天花大概1-2个小时按主题推进配合实战代码去敲。不是你“看过”了就完事而是让你能用Flexbox独立排出一个完整的页面不用再靠猜。2. 吃透两个核心概念主轴与交叉轴别急着写代码很多萌新学Flexbox学不明白问题不是记不住属性而是脑子里没有建立起“轴”的概念。Flexbox这个体系的底层逻辑就是围绕两条轴转的。你把这玩意儿搞懂了属性基本是顺水推舟的事。2.1 主轴元素按什么方向排队先想一个最简单的场景你在食堂排队打饭。队伍是横着排还是竖着排取决于食堂的隔离带怎么摆。在Flexbox里这个隔离带的摆放方向就是flex-direction属性决定的。主轴Main Axis就是元素排列的方向。默认情况下flex-direction的值是row也就是主轴从左到右子元素像排队一样一个一个横着排。如果你改成column主轴就变成了从上到下元素竖着排队。这里有个很多人容易忽略的点主轴是有方向的。row意味着元素从左往右排列而row-reverse是从右往左column是从上往下column-reverse是从下往上。一旦方向变了你后续所有的对齐属性作用方向全都会跟着变。比如justify-content: flex-end在row下是让元素靠右在column下就变成靠底了。这里给一个生活类比主轴就是一条马路flex-direction决定了这条马路是东西向还是南北向row-reverse就是改成单行道但是方向反了。你所有用于对齐的justify-content属性都是沿着这条马路来布置车位的。2.2 交叉轴与主轴的垂直方向交叉轴Cross Axis就更简单了——它是与主轴垂直的那个方向。如果主轴是水平方向的row那交叉轴就是垂直方向从上到下如果主轴是垂直方向的column交叉轴就是水平方向从左到右。交叉轴主要跟两个属性打交道align-items和align-content。这俩名字看着像但如果搞混了写出来的效果会非常诡异。align-items控制的是单行内子元素在交叉轴上的对齐方式。比如容器是flex-direction: row那align-items: center就是让这一行的元素在垂直方向上居中这个也是前端最常用的“水平垂直居中”组合拳之一。align-content则不同它控制的是多行整体在交叉轴上的分布。打个比方align-items管的是队伍里每个人站得正不正而align-content管的是好几排队伍整体靠上、靠下还是均匀铺开。如果你只有一行元素align-content是不起作用的因为根本没有多行可以排列。2.3 容器与项目之间的关系Flexbox体系里你要永远记得一个父子关系设置了display: flex的父元素叫“Flex容器”容器里面的直接子元素叫“Flex项目”。这里必须强调“直接子元素”四个字。很多新手在容器里套了多层嵌套发现子元素不听话极其容易怀疑代码哪里写错了。实际上Flexbox只会作用于直接的子元素对于孙子、重孙子那一层它是管不着的。你需要给那个嵌套层单独再设一个display: flex才能让它继续用Flexbox去排列自己的子元素。另外还要提一嘴版本兼容的老坑。老掉牙的IE那边需要写display: -ms-flexbox;这种带前缀的写法而且部分老属性的兼容性很糟糕。现在的现代浏览器基本都支持无前缀的display: flex了但如果你们的项目还要兼顾一些古董浏览器建议还是查一下can i use再动手别等到测试阶段被bug追着跑。我个人的实战经验是在主轴上排序、在交叉轴上对齐这两个“轴”概念一旦在脑子里扎根后续学justify-content、align-items都是水到渠成的事。7天内真正冲劲最大的一定是你第一次用Flexbox三分钟搞定了之前折腾一小时的水平垂直居中。3. 容器属性六连击justify-content、align-items、flex-wrap、flex-direction、flex-flow、gap容器上的属性是Flexbox的“指挥中枢”。你把容器比作一个导演子元素就是演员导演怎么调度演员就怎么站位。这六个属性就是导演手里的六张调度指令卡。3.1 justify-content主轴上的站位分配justify-content控制的是子元素在主轴方向上的排列和对齐方式。它和document里常见的几种取值你大概率见过但未必理解背后的设计逻辑。flex-start默认所有元素贴着主轴的起点排列相当于队伍从排头开始站。flex-end所有元素贴着主轴的终点排列相当于队伍从排尾开始往回站。center整体居中两端不留空队伍站在马路中间。space-between第一个元素贴起点最后一个元素贴终点其余元素等分中间间隙但是两端没有空隙。space-around每个元素两侧都有相等的空隙所以两端的空隙是中间空隙的一半。space-evenly所有元素之间的间距完全相同包括两端到边缘的距离也被均匀分配了。这几个值里最容易被问住的就是space-between和space-around的区别。用例子说最直观假设你有三个宽度相同的元素容器总宽是300px。space-between的效果是三个元素之间等距元素与容器边缘贴合中间的两个空隙各占一定宽度两边没空隙。而space-around的效果是每个元素左右两侧各有一个空隙三个元素就会有六个空隙但相邻两个元素之间的空隙是两个相邻的“单侧空隙”叠在一起所以看起来元素间间距反而是两侧空隙的两倍。这个视觉差很多人第一次写出来后都懵了。3.2 align-items交叉轴上的对齐指令align-items负责的交叉轴对齐前面已经反复提到过。它的取值相比justify-content要简单一些stretch默认这个值非常特殊如果子元素没有设置高度或者高度设为auto它会被拉伸填满容器在交叉轴方向上的整个高度。这也是Flexbox里实现等高列的基础。flex-start贴交叉轴起点对齐自己在交叉轴方向上占据的空间不拉伸。flex-end贴交叉轴终点对齐。center在交叉轴方向上居中。baseline这个相对少见一点它是让多个元素的第一行文字的基线对齐。如果元素里的文字字号不同、行高不同baseline可以让它们看起来整齐统一。实战里用得最多的就是center和stretch。align-items: center直接解决“父容器里垂直居中一个未知高度的元素”这种曾经要写死高、写负margin的难题。3.3 flex-wrap换行与不换行默认情况下Flexbox容器里的元素会尽量挤在一行里哪怕把元素压扁也不会自动换行。这个“挤在一行”的机制由flex-wrap的默认值nowrap控制。当容器宽度不够、元素总宽溢出时你希望它们能自动换到下一行去就要设置flex-wrap: wrap。这个属性在响应式布局里尤其重要比如一排卡片在手机端一行放不下自动换行成两排体验会好很多。还有一个wrap-reverse了解即可。它的含义是换行方向反过来本来从第一行往下排的元素变成从下往上排了实际项目里用得比较少。这里要特别提醒一个“坑”如果设置了nowrap且子元素宽度总和超过容器宽度子元素默认会被压缩。乍一看好像没啥但一旦你给子元素设置了min-width或者固定的宽高溢出就会发生严重时候甚至会撑破布局或者产生横向滚动条。这个我在后面“flex-shrink的机制”里面会展开讲。3.4 flex-direction与flex-flow方向的终极控制flex-direction的四个取值row、row-reverse、column、column-reverse前面讲主轴时已经介绍过了。需要再强调一遍的是column虽然让元素竖着排但它和浮动布局这样的“文档流换行”有本质区别。Flexbox永远不会和文档流搞混因为它所有的排布都只发生在容器内部。flex-flow是flex-direction和flex-wrap的简写属性两个值之间用空格隔开。比如flex-flow: column wrap;就等价于flex-direction: column; flex-wrap: wrap;。我个人写代码的偏好是如果项目里只用一两个Flexbox属性就直接写完整属性语义更清晰但如果一排配置比较长用flex-flow简写会很省地方。3.5 gap终于不用再手动加margin了gap这个属性是Flexbox后来补上的特性坑过很多老前端。在它出现之前想让多个子元素之间产生均匀间距常规做法是给子元素加margin然后让父容器用负margin抵消边缘多余的距离。这套操作麻烦不说还很容易算错。gap的出现直接终结了这种“手工补缝”时代。你只需要在容器上写一个gap: 16px;子元素之间就会自动产生16px的间距首尾元素不会额外多出间距。这个属性在Grid布局里同样适用如今浏览器支持度已经非常好。需要注意老项目如果出现gap在IE里无效、间距全没的情况那只能是老老实实用margin方案了没有更好的办法。3.6 六个属性的组合实战一行代码搞定表单居中讲了一堆概念来个小实操。假设你要写一个登录表单用户名和密码两个输入框、一个按钮希望它们垂直居中于整个容器。.login-box { display: flex; flex-direction: column; align-items: center; justify-content: center; gap: 12px; height: 100vh; }这四行配置直接就让三个元素在页面正中垂直排列好了间距12px一行多余代码都没有。如果换做浮动布局加一堆固定宽高至少得多花十几行还未必能完美适配不同屏幕。4. 项目属性进阶flex-grow、flex-shrink、flex-basis、align-self、order聊完容器再聊子元素自身的“主观能动性”。很多教程会把项目属性和容器属性混在一起讲导致初学者概念混乱。我的建议是先把容器属性练熟再上手项目属性逻辑上会清晰很多。4.1 flex-basis元素的初始尺寸flex-basis可以简单理解为元素在主轴上占用的初始尺寸。如果主轴是水平方向它控制宽度如果主轴是垂直方向它控制高度。默认值是auto意味着取元素自己的宽高设置或者回退到内容的固有尺寸。它跟width的区别是width是硬编码的不会因为容器空间不足而改变而flex-basis是参与伸缩计算里的基准值它可以在后续的flex-grow和flex-shrink机制下被放大或压缩。个人经验是在Flexbox布局里能用flex-basis就用它别死磕width。尤其是在一行多列的情况下用flex-basis配合成长收缩规则来分配空间比固定宽度要灵活得多。4.2 flex-grow空间富余时的放大规则flex-grow接受一个数字默认是0。它的含义是当容器在主轴上还有剩余空间时项目按这个数字对应的比例去瓜分剩余空间。举个例子容器宽度是900px里面有三个子元素flex-basis都设成200px三个元素加起来600px还剩300px。如果三个元素的flex-grow都是1那每个人分到100px最终宽度都是300px。如果第一个是2另外两个是1那300px会被分成4份第一个拿2份也就是150px剩下两个各拿75px最终的宽度就是350px、275px、275px。这里有一个非常关键的细节flex-grow分配的是剩余空间而不是把总宽度直接按比例切开。很多人会误以为flex-grow: 1就是“等分整个容器”其实不是。只有当所有子元素的flex-basis都是0时剩余空间才等于整体空间这时候flex-grow才会表现得像等分容器。4.3 flex-shrink空间不足时的压缩规则flex-shrink是flex-grow的镜像它负责处理空间不足的情况。默认值是1也就是所有子元素都会在空间不足时按比例被压缩。常见的问题是为什么我设置了子元素宽度200px容器宽度只有150px但元素实际显示出来还是150px左右并没有被压到很小原因可能是flex-shrink值或者min-width在起作用。如果你希望某个元素不被压缩可以给它设置flex-shrink: 0。举个实际场景一个导航栏左边logo、右边几个菜单项。左边logo你想让它固定宽度不要被压缩那就给它flex-shrink: 0并且设置好宽度。右边菜单如果没有显式设置不压缩那空间不足时会自动被压。我踩过的一个坑是在宽屏上排版正常切到窄屏时某个区块的文字被压缩成一团排查了一圈发现是父容器flex-wrap没设成wrap子元素min-width也没设置导致元素在nowrap下被疯狂压缩。最后加了flex-wrap: wrap和合适的min-width才解决。4.4 flex简写一行顶三行的秘诀flex是flex-grow、flex-shrink和flex-basis的简写属性。最常见的有三种写法flex: 1等价于flex-grow: 1; flex-shrink: 1; flex-basis: 0%;适合“等分剩余空间”的场景。flex: auto等价于flex-grow: 1; flex-shrink: 1; flex-basis: auto;会根据元素内容初始尺寸来分配空间。flex: none等价于flex-grow: 0; flex-shrink: 0; flex-basis: auto;元素尺寸完全由其自身宽高决定不伸缩。这里建议萌新先不要在乎那些花里胡哨的写法把flex: 1和flex: none这两种用熟练就已经能覆盖大部分需求了。遇到复杂的比例分配问题再拆开写全三个属性可读性和可调试性反而更好。4.5 align-self子元素自己的交叉轴对齐align-self允许你单独覆盖某个子元素的交叉轴对齐方式而不影响容器上其他子元素。它接受的取值跟align-items基本一致auto、flex-start、flex-end、center、baseline、stretch。一个典型场景是一行里面多个元素其他都靠下对齐只有一个按钮要居中。你直接在按钮上写align-self: center其他元素不用动非常省事。这个属性在数据列表、卡片组件的微调里特别实用。4.6 order改变视觉顺序的隐形式命令order属性允许你改变子元素的视觉排列顺序但动画、焦点顺序不会跟着变。默认所有元素的order都是0数值大的排后面相等的按DOM顺序排。这个属性在响应式场景里有妙用。比如PC端页面左边是图片右边是文字到了移动端你希望文字在上、图片在下。用order实现重塑HTML结构都省的思路是目前前端圈子里比较高效的做法。不过用它的时候要小心视觉顺序和DOM顺序不一致对屏幕阅读器和键盘用户会产生认知障碍。为了无障碍体验能不动order建议尽量不动。5. 典型实战案例复盘从导航栏到圣杯布局手把手带你排理论说了那么多不上点硬货等于白搭。这一章我会把日常开发中最常见的几个布局场景逐个用Flexbox实现一遍并附上关键代码和思路解析。5.1 水平垂直居中这是面试官最爱问的经典问题也是日常开发最高频的需求。实现代码如下.center-box { display: flex; justify-content: center; align-items: center; height: 400px; }一句话总结主轴和交叉轴同时居中就实现了水平垂直居中。只要父容器有明确高度这一招通杀所有嵌套层级不管里面元素尺寸是固定的还是不确定的。如果你需要居中的元素有多个只想让它们整体居中且保持间距:center-box上面再补一个gap: 16px;就行。5.2 经典的圣杯布局圣杯布局指的是顶部导航、底部页脚、中间左右两栏或三栏的经典页面骨架。用Flexbox实现非常清爽核心思路是中间的区域用flex: 1两侧固定宽度。div classlayout header classheaderHeader/header div classmain aside classsideSidebar/aside section classcontentContent/section /div footer classfooterFooter/footer /div.layout { display: flex; flex-direction: column; min-height: 100vh; } .header, .footer { flex-shrink: 0; padding: 16px; } .main { display: flex; flex: 1; } .side { width: 240px; flex-shrink: 0; } .content { flex: 1; }这段代码里的关键是main区域设置flex: 1让它占据所有剩余高度而header和footer因为flex-shrink: 0不会被压缩。内部side宽度固定content用flex: 1吃满剩余宽度。这样就实现了“内容区域自适应、两侧顶天立地”的效果。5.3 粘性页脚有些页面内容很少你希望页脚永远贴底不让它飘在半空中。上面圣杯布局的写法其实已经天然解决了这个问题因为min-height: 100vh保证容器至少充满视口高度main的flex: 1又推着footer往下走。内容超出一屏时main自动扩展页脚自然被推到内容后面。这个方案比传统的position: fixed或者手动计算高度的做法高明多了代码量少、健壮性好、不依赖JS。5.4 导航栏的左右分布导航栏是Flexbox的“主场”。最典型的结构是左边Logo右边菜单。代码看起来是这样.nav { display: flex; align-items: center; justify-content: space-between; padding: 0 16px; }space-between直接把左右两组元素推开让Logo贴左、菜单贴右。如果你菜单里还有多个子项可以给菜单再包一层display: flex; gap: 12px;让子项在菜单内部均匀排开。5.5 卡片列表自动换行一排卡片PC端一行3列到4列平板一行2列手机上1列。用Flexbox配合flex-wrap实现.card-list { display: flex; flex-wrap: wrap; gap: 16px; } .card { flex: 1 1 calc(33.333% - 16px); min-width: 240px; }这套组合拳的思路是flex: 1 1让卡片能自动伸缩calc(33.333% - 16px)设置初始宽度为三列差不多大小减去gap抵消间距min-width: 240px保证再小也不至于缩成没法看的一团。需要说明的是如果追求更严谨的响应式栅格Grid布局会更灵活。但用Flexbox做这种“等宽卡片换行”已经足够应付大多数需求而且兼容性和学习成本要友好得多。5.6 表单字段的垂直排列与等宽按钮表单里最常见的需求是标签和输入框竖直对齐按钮宽度跟输入框一致。用Flexbox实现.form-row { display: flex; flex-direction: column; margin-bottom: 16px; } .form-row input { width: 100%; box-sizing: border-box; } .form-actions { display: flex; gap: 8px; } .form-actions button { flex: 1; }flex-direction: column让标签和输入框竖排gap给按钮们间距按钮flex: 1平分整行宽度。配合box-sizing: border-box宽度的计算会变得直观许多。这里强烈推荐全局给所有元素加上box-sizing: border-box否则width: 100%加上padding经常会超出去。6. 7天拆解学习路线每天学什么、练什么、怎么检验答应好的7天计划这一章给你捋清楚。我不是要做时间管理大师而是想让你有一个可以按部就班执行的节奏每天的任务都不会太重但每过一天你对Flexbox的掌控感都会明显增强。6.1 Day 1理解盒子模型与Flexbox出现的意义第一天不写Flexbox代码。先把盒子模型复习一遍content-box和border-box的区别、margin和padding怎么影响宽高、float布局的痛点到底在哪里。这些基础不扎实直接上手Flexbox会很飘。检验方式写一个20行的静态页面用float做两栏布局感受一下float的神奇“坑”法。这个体验很重要它会让你后面理解Flexbox的价值时更有共鸣。6.2 Day 2主轴与交叉轴以及flex-direction和flex-wrap第二天重点理解两条轴。写一个容器放5个颜色不一样的子元素依次切换flex-direction的四个值观察元素排布方向的变化。再切flex-wrap的nowrap和wrap对比一下元素挤压和换行的区别。检验方式不看文档说出flex-direction: column-reverse下子元素视觉顺序是怎么样的。6.3 Day 3justify-content和align-items的对齐艺术第三天只练两个属性justify-content的全部取值配合flex-direction几种状态align-items的取值尤其是stretch。建议做一个“九宫格”练习在容器里放3个子元素尝试让它们水平居中、垂直居中、两端对齐反复切换到不同取值。检验方式写出“内容水平居中且垂直居中但第一个元素在左侧边缘”的代码。6.4 Day 4flex-grow、flex-shrink、flex-basis三大法宝第四天是理解“弹性”的核心。准备一个900px宽的容器放三个子元素设置不同的flex-basis和flex-grow观察空间分配结果。这个环节一定要动手算数比如三个元素basis均为200px、grow分别是1、2、1剩余空间怎么分最终宽度都是多少算完再交给浏览器验证。检验方式解释为什么flex-grow: 1不等于“等分容器”什么时候才等价。6.5 Day 5align-self、order和gap的微操技巧第五天处理细节场景。给容器加三个子元素用align-self让其中一个单独垂直居中其余靠底用order调整视觉顺序用gap替换掉手写margin的“补缝”写法。检验方式做一个卡片组件卡片内部有标题、描述、按钮要求按钮始终固定在卡片底部标题和描述在顶部。6.6 Day 6综合实战啃下整张页面骨架第六天开始整合。把前面学的容器属性、项目属性全部用上实现一个完整的博客页面顶部导航、左右两栏内容区、底部页脚。要求尽可能复用之前学过的布局模式不要写死高度。检验方式直接把浏览器窗口缩到手机宽度检查页面是否还能清晰展示而不是乱成一团。6.7 Day 7复盘典型问题刷面试题巩固最后一天用来复盘与巩固。把所有踩过的坑过一遍再刷几道前端面试里高频的Flexbox题目比如flex: 1和flex: auto的区别。如何实现三栏等宽布局。align-items: stretch为什么能让子元素等高。如何在不改变HTML结构的情况下把移动端的图文顺序反转。检验方式打开一个自己写的旧页面用Flexbox至少重构其中三个模块对比前后代码量和维护成本。7. 踩坑实录与常见问题速查表最后分享一些我看到很多人反复踩的坑以及对应的解决方案。整理成一个速查表遇到问题直接对着查。7.1 align-items和align-content别再混了场景错用正确做法单行子元素想垂直居中用了align-content: center无效应该用align-items: center多行子元素想让整组靠底用了align-items: flex-end只让每一行内部靠底整组不贴底应该用align-content: flex-end或flex-direction: column搭配justify-content一句话记忆法align-items管“行内个体”align-content管“行与行整体”。7.2 flex: 1和flex: auto的差异flex: 1是flex-grow: 1; flex-shrink: 1; flex-basis: 0%宽度完全根据剩余空间来分配元素自身的宽高设置会被“清零”参与计算flex: auto是flex-grow: 1; flex-shrink: 1; flex-basis: auto会先考虑元素内容宽度再把剩余空间分配进来。实际使用中想让多个元素严格等分容器用flex: 1想让他们按照内容的“自然尺寸”优先其次再伸展用flex: auto。7.3 min-width和min-height的隐形约束Flexbox在空间不足时压缩元素但压缩不会低于元素的min-width/min-height。默认情况下min-width是auto意味着Flexbox会参考元素内容的最小宽度防止内容被压到完全不可读。因此你遇到“为什么我设了宽度还是缩不回去”的问题十有八九是min-width在拦路。想允许元素被压缩到更小显式设置min-width: 0能解决问题。7.4 子元素不是容器直接子级时属性失效嵌套过深时Flex属性只作用于当前容器的直接子元素。比如一个容器.wrap里有.item.item里面又有一个.sub-item你给.sub-item写flex: 1但.wrap的justify-content只会排.item永远不会直接作用到.sub-item上。如果你想让.sub-item参与.wrap的分配那得调整HTML结构或者给.item本身也设置display: flex。7.5 margin: auto在Flexbox里的奇效很多人只知道justify-content: center能居中却忽略了margin: auto在Flexbox里的“降维打击”。给子元素设置margin-left: auto它会自动吃掉主轴左侧的所有剩余空间把元素推到右边。同理margin: auto可以让单个子元素在两条轴上都居中。这个技巧在做“左标签右内容”或“底部按钮右对齐”时特别实用还不用写额外的对齐属性。7.6 百分比宽度和gap的兼容性老项目里gap不可用可以用margin替代但要注意负margin补偿父容器边缘。现代项目可以放心使用gap除了某些老旧系统浏览器现在已经没有太大兼容性压力了。还有一个隐藏小坑如果子元素设置了width: 33.33%而容器里用了gap: 16px那么三列的宽度加上间距可能会超出容器宽度导致换行或溢出。解决办法是把宽度改成calc(33.33% - 16px)或者干脆用flex: 1 1 0%搭配等分不要手动算百分比更省心。最后再分享一个我当年悟了很久才明白的经验Flexbox不是万能的它擅长解决一维布局一行或一列的问题二维布局同时控制行和列更适合用Grid。很多萌新学完Flexbox后拿着锤子看什么都像钉子把整个页面所有结构全用Flexbox硬排最后维护起来极其痛苦。定位布局和Grid布局该用的时候还是要单独用。按照这条路线走完7天你大概率已经能独立排出一个中等复杂度的页面了。剩下的就是在实际项目里不断累积经验遇到新的问题再去查资料、验证、总结。页面排版这件事靠猜永远猜不出稳定可靠的结果但把底层的逻辑吃透了它就变成了一件有章可循的事。
返回列表