一般方案上来说很多。
做这个之前需要先简单知道一下 flex 是做什么的,阮一峰的那一篇就挺好。
容器默认存在两根轴:水平的主轴(main axis)和垂直的交叉轴(cross axis)。主轴的开始位置(与边框的交叉点)叫做main start,结束位置叫做main end;交叉轴的开始位置叫做cross start,结束位置叫做cross end。
项目默认沿主轴排列。单个项目占据的主轴空间叫做main size,占据的交叉轴空间叫做cross size。
这个是基本概念,由这些点来控制 flex 布局,接下来就是基本的属性
在这个基础只上,就基本理解了, flex 运作方式
display:flex 声明容器布局方式,他按照从左到又一次排列,你可以根据属性来修改主轴,以及轴的对齐方式。
上面的都是对容器进行设置,除此之外,我们还可以设置以下属性。
在上面的基础之上,就可以知道如何写了
1 | <style> |
就完成了。
grid 的概念和 flex 区别很大,flex只关心 item, grid 是在于 row 和 column,
这里就很明确了,区别。
一个是一维,一个是二维。grid 明显更适合布局,然而flex更适合局部的布局。
如果只是垂直居中的话很简单
1 | .box { |
原理都一样。
其实就是使用 td 的 vertical-align: middle & text-align: center.
这里需要知道一个概念 重绘 和 回流, 这个概念如果要讲清楚,需要从浏览器加载过程说起。
简单说,就是
重绘(Repaint):当元素的样式发生改变,但不影响其布局时,浏览器会执行重绘操作。重绘意味着浏览器会重新绘制元素的可视部分,以反映新的样式,但并不会影响元素的大小和位置。重绘操作比回流操作更加轻量级,对性能影响较小。
回流(Reflow):当页面的布局发生改变,例如元素的尺寸、位置、显示/隐藏状态等改变时,浏览器会执行回流操作。回流会重新计算并应用所有受影响元素的几何属性,然后重新排列页面中的元素。回流操作相对较为昂贵,会引起页面重新布局,对性能有较大的影响。
也就是说,当你更改一个元素的宽高,或者背景颜色都可能触发,关键是 table 特别容易触发。
table 及其内部元素可能需要多次计算才能确定好其在渲染树中节点的属性值,比同等元素要多花两倍时间,这就是我们尽量避免使用 table 布局页面的原因之一
这是table我查到的问题,但是现代浏览器优化做的很好,并且怎么去使用table,比如包含大量的嵌套或跨行/跨列的单元格时确实很复杂,确实会计算很多。
但是如果你通过其他方式去实现,比如 grid 或者 flex,在这种复杂度下,是否性能会比table好,这个我没有做过测试,但是我觉得很难说。
另外,如果只是简单的为了居中 display:table 也是一种方案。
这个比较简单,就是说
1 | .container { |
这种方式主要点在于 transform: translate(-50%, -50%); 上。
top & left 计算的是父结点,所以是300px,如果再加上元素本身高和宽,那么就不是正确的。
但是加上了 transform: translate,这里的百分比是根据当前元素计算的,这个移动就能保证居中
这里记录了4种垂直居中的方案, 如果在没有浏览器兼容性问题的情况下还是使用 flex,因为他基本没有什么缺点。
使用绝对定位是需要确定父级高度的。而且需要设置容器的定位属性,可能会对其他布局属性产生影响。
使用 display:table,对于一些特殊布局要求可能不适用。