计算 fr 单位的实际长度

Jef*_*opo 4 css specifications css-grid

我在这里问是因为我数学很烂。

\n\n

假设网格大小为 1920px,并且我没有使用显式大小调整。

\n\n

即有多少个 fr's。1200 像素?我该如何计算它?

\n\n
.grid {\n  display: grid;\n  grid-template-columns: 1fr 3.3335fr 1fr;\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

规范说:

\n\n
\n

12.7.1。求一个的大小fr

\n\n

该算法找到 fr 单元在不超过目标大小的情况下可以达到的最大大小。必须使用一组网格轨道\n和一些要填充的空间来调用它.

\n\n
    \n
  • 剩余空间 be the space to fill minus the base sizes of the\n non-flexible grid tracks.
  • \n
  • 弹性因子求和 be the sum of the flex factors of the flexible tracks. If this value is less than 1, set it to 1 instead.
  • \n
  • 假设的 fr 大小 be the leftover space divided by the flex factor sum.
  • \n
  • 如果假设的 fr 大小和灵活轨道\xe2\x80\x99s 弹性因子的乘积小于轨道\xe2\x80\x99s 基本大小,则重新启动此算法,将所有此类轨道视为不灵活。
  • \n
  • 返回假设的 fr 大小。
  • \n
\n
\n\n

他们的意思是“假设的 fr 大小”适用于单位 (1fr) ?大概吧

\n\n
1920/(1+3.3335+1) = 359.988750352 <-- The hypothetical fr size\n359.988750352 * 3.3335 = 1200.0224993\n
Run Code Online (Sandbox Code Playgroud)\n\n

所以我想这是一种获取多少像素是 n fr 值的方法。

\n\n

但是,如果我想做相反的事情,这将是计算 1200px 有多少 fr 的正确方法/正确公式?

\n\n
\n\n

更新:

\n\n

这是我正在做的事情的一个活生生的例子。这minmax(min, max) helped me a lot. I\'ve solved some overflowing errors. And figured out how I can use rem units in grid template tracks but still benefit from shrinking :D

\n\n

https://codepen.io/jeflopo/pen/OmZBEJ

\n\n

\r\n
\r\n
.grid {\n  display: grid;\n  grid-template-columns: 1fr 3.3335fr 1fr;\n}\n
Run Code Online (Sandbox Code Playgroud)\r\n
1920/(1+3.3335+1) = 359.988750352 <-- The hypothetical fr size\n359.988750352 * 3.3335 = 1200.0224993\n
Run Code Online (Sandbox Code Playgroud)\r\n
\r\n
\r\n

\n

Mic*_*l_B 7

您有一个网格容器,沿 X 或 Y 轴有 1200 像素的可用空间(无所谓)。

如果容器有一个网格轨道设置为1fr,则该列/行将消耗全部 1200 像素。

如果有grid-template-columns: 1fr 1fr,那么每列都会获得相等的可用空间分配。因此每列的宽度为 600px,类似于:

grid-template-columns: 600px 600px
Run Code Online (Sandbox Code Playgroud)

就您而言,它的工作原理如下:

从规格来看:

必须使用一组网格轨道和一定数量的要填充的空间来调用它。

您已使用以下规则调用网格轨道:

grid-template-columns: 1fr 3.3335fr 1fr
Run Code Online (Sandbox Code Playgroud)

您要填充的空间是 1200 像素。


  1. 剩余空间为要填充的空间减去非灵活网格轨道的基本尺寸。

同样,要填充的空间(“剩余空间”)为 1200 像素。

没有非柔性网格轨道。这就像设置为 200px 的列:

grid-template-columns: 1fr 3.3335fr 200px 1fr
Run Code Online (Sandbox Code Playgroud)

fr 算法会减去 200px 的轨道。剩余的空间可供兄弟姐妹使用。


  1. 弯曲因子总和为柔性轨道的弯曲因子之和。

这意味着我们将这些值相加fr

1 + 3.3335 + 1 = 5.3335
Run Code Online (Sandbox Code Playgroud)

弹性因子总和为 5.3335。


  1. 假设fr 大小为剩余空间除以弹性因子总和。

1200 像素 / 5.3335fr = 225 像素


现在我们知道每个fr单位代表225px。

  • 1fr= 225 像素
  • 2fr= 450 像素
  • 3fr= 675 像素
  • ETC...

这意味着:

 grid-template-columns: 1fr 3.3335fr 1fr
Run Code Online (Sandbox Code Playgroud)

相当于:

 grid-template-columns: (1fr x 225px) (3.3335fr x 225px) (1fr x 225px)
Run Code Online (Sandbox Code Playgroud)

结果是:

 grid-template-columns: 225px 750.0375px 225px
Run Code Online (Sandbox Code Playgroud)

然而,值得注意的是,该fr装置并不打算为网格轨道设置特定的长度。它的工作是分配容器中的可用空间(类似于 flexbox 的flex-grow)。所以你的问题似乎有点理论化和不切实际。如果容器的大小发生了轻微的调整,或者将不灵活的轨道加入到混合中,则上面的所有像素计算都会被丢弃。


更新(根据评论)

有一个小错误。我的网格大小是 1920px 而不是 1200...但它是一个可推断的示例。我希望 3.3335fr 与 1200px 相关,而不是所有轨道的总和... 3.3335fr 约为 1200px,在宽度为 1920px 的网格中具有两个相邻的 1fr 列。

如果网格容器的宽度为 1920 像素,则假设的 fr 大小为 360 像素。

这意味着:

 grid-template-columns: (1fr x 360px) (3.3335fr x 360px) (1fr x 360px)
Run Code Online (Sandbox Code Playgroud)

结果是:

 grid-template-columns: 360px 1200px 360px
Run Code Online (Sandbox Code Playgroud)