如何使用 max() CSS 函数获得逐渐改变字体比例的流畅排版?

How can I get fluid typography that gradually change type scale using the max() CSS Function?

我是流畅排版的忠实粉丝,我希望我正在开发的网站能够采用它。最近,我了解了 max() CSS 功能。我想用它来获得流畅的排版。特别是,我希望网页上的文本从特定的字体比例开始,然后采用不同的字体。具体来说,我希望文本在一个小的起始视口上使用小三音阶。当视口变大时,我希望文本改为使用完美五度音阶。我想得到 Utopia 让你得到的结果。在那里,您可以指定要在不同视口上使用的两种类型比例。我想尝试复制相同的效果,但只使用 max() 函数,因为我不想提供“最大视口”:我的文本必须无限缩放。到目前为止,我已尝试使用此代码:

    <!DOCTYPE html>
    <html>
    <head>
       <meta name="viewport" content="width=device-width, initial-scale=1.0">
       <style>
          h1   { font-size: max(2.488rem, 11.089vw); }
          h2   { font-size: max(2.074rem, 6.854vw); }    
          h3   { font-size: max(1.728rem, 4.236vw); }
          h4   { font-size: max(1.44rem, 2.618vw); }
          h5   { font-size: max(1.2rem, 1.618vw); }
       </style>
    </head>
    <body>
       <h1>Heading 1</h1>
       <h2>Heading 2</h2>
       <h3>Heading 3</h3>
       <h4>Heading 4</h4>
       <h5>Heading 5</h5>
    </body>
    </html>

此代码所做的是对每个标题使用 max() 函数,其第一个成员是小三度音阶定义的音阶,而第二个是完美五度音阶定义的音阶。要查看我在做什么,请尝试在 运行 上面的代码片段之后调整视口大小,您会看到标题改变比例。我不知道这段代码是否完全符合我想要实现的目标(即,从一个比例尺切换到另一个比例尺),但看起来确实如此。然而,我想避免的是,例如,h1h2 元素在调整视口大小时发生变化时出现的间隔。具体来说,h1h2 之前开始采用新比例 。这是有道理的,因为计算出的两个最大值不同,但我希望我的所有标题同时开始采用新比例,即当我调整视口大小时。

以下是您可以使用媒体查询执行此操作的方法:

h1 {
  font-size: max(2.488rem, 11.089vw);
}

h2 {
  font-size: max(2.074rem, 6.854vw);
}

h3 {
  font-size: max(1.728rem, 4.236vw);
}

h4 {
  font-size: max(1.44rem, 2.618vw);
}

h5 {
  font-size: max(1.2rem, 1.618vw);
}


/* tablet */

@media (min-width: 768px) {
  h1 {
    font-size: max(3.488rem, 16.089vw);
  }
  h2 {
    font-size: max(3.074rem, 11.854vw);
  }
  h3 {
    font-size: max(2.728rem, 9.236vw);
  }
  h4 {
    font-size: max(2.44rem, 7.618vw);
  }
  h5 {
    font-size: max(2.2rem, 5.618vw);
  }
}


/* large screens and up */

@media (min-width: 1200px) {
  h1 {
    font-size: max(4.488rem, 30.089vw);
  }
  h2 {
    font-size: max(4.074rem, 18.854vw);
  }
  h3 {
    font-size: max(3.728rem, 16.236vw);
  }
  h4 {
    font-size: max(3.44rem, 14.618vw);
  }
  h5 {
    font-size: max(3.2rem, 10.618vw);
  }
}
<html>

<head>
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>

<body>
  <h1>Heading 1</h1>
  <h2>Heading 2</h2>
  <h3>Heading 3</h3>
  <h4>Heading 4</h4>
  <h5>Heading 5</h5>
</body>

</html>

我为字体大小增加编了数字,您可以添加更多浏览器视口中断大小,甚至使用 rem 值而不是 px

最后,我发现最好的解决方案是使用类似的东西:

:root {
 --step6:calc(1.602rem + 5.063vw);
 --step5:calc(1.424rem + 3.375vw);
 --step4:calc(1.266rem + 2.25vw);
 --step3:calc(1.125rem + 1.5vw);
 --step2:calc(1rem + 1vw);
 --step1:calc(0.889rem + 0.667vw);
 --step0:calc(0.79rem + 0.444vw)
}

我使用这些 CSS 变量来指定元素的大小并让文本无限缩放,而不需要使用媒体查询来指定我的设计应该更改的精确点。我只使用这些变量就得到了我想要的效果。例如,h1 元素可以使用:

h1 { font-size:var(--step6) }

和一个 h2 元素:

h2 { font-size: var(--step5) }

这让我说:«我只提供最小的值。当视口变大时,我希望尺寸可以无限缩放,使用这个比例»。当然,我不仅将这些变量用于字体大小,还用于其他属性,如边距、填充等。