h1
标题)通常在每个断点处具有不同的大小。例如:这是很好的第一步,但是您只能将其限制font-size
为设计人员在提供的断点处指定的范围。如果您问:“ font-size
850像素宽的视口应该是什么?” ,设计师会怎么说呢?在大多数情况下,答案是它应该在24像素至34像素之间。但是现在,根据您的CSS,它仅为24px,这可能不是设计人员所设想的。
此时,您的选择是计算该大小应为多少并添加另一个断点。那很容易。但是其他所有决议呢?font-size
800px宽应该是什么?那900px呢?935px呢?显然,设计人员不会为每个可能的分辨率提供完整的布局。即使它们做到了,您是否应该font-sizes
为设计人员所需的所有不同点添加数十个(或数百个)断点?当然不是。
您的布局已经随着视口的宽度而流畅地缩放。如果您的版式可以根据您的布局合理地缩放,那会不会很好?我们还可以做些什么来改善这一点?
视口救援单位?
视口单位是朝正确方向迈出的又一步。它们使您的文本可以根据布局灵活地调整大小。如今,浏览器支持功能非常强大。
但这仅在您的创意画板考虑到这一点时有效。设计师是否选择了恰好是每个画板宽度2%的文字大小?当然不是。让我们计算vw
每个断点所需的值:
22px
大小@ 576px
宽= 22 / 576 ×100 = 3.82vw 24px
大小@ 768px
宽= 24 / 768×100 = 3.13vw 34px
大小@ 992px
宽= 34 / 992 ×100 = 3.43vw
它们很接近,但不尽相同。因此,您仍然需要使用媒体查询在文本大小之间进行转换,并且仍然会有跳转。考虑一下这怪异的副作用:
@ 767像素,视口宽度的3.82%为29像素。如果视口宽1像素,则font-size
突然下降到24px。调整视口大小的动画演示了这种不良的副作用:
统计线性回归?
等待。什么?是的,这是一篇有关CSS的文章,但是一些基本的数学方法可以为解决我们的问题提供很好的解决方案。
首先,让我们在图表上绘制分辨率和相应的文本大小:
在这里,您可以看到设计师在定义的视口宽度下指定的文本大小的散点图。x轴是视口宽度,y轴是font-size
。看到那条线?这就是趋势线。这是一种font-size
根据提供的数据查找任何视口宽度的插值的方法。
趋势线是所有这些的关键
如果您可以font-size
根据这一趋势线进行设置,那么您将拥有一个可以在所有分辨率上平滑缩放的h1,这些分辨率接近匹配设计师的预期。首先,让我们看一下数学。直线由以下公式定义:
如何在CSS中使用它?
好的,这在数学上变得越来越沉重。我们如何在前端Web开发中实际使用这些东西?答案是CSS calc()
!再次,很好地支持了一种相当新的CSS技术。
/// least-squares-fit
/// Calculate the least square fit linear regression of provided values
/// @param {map} $map - A Sass map of viewport width and size value combinations
/// @return Linear equation as a calc() function
/// @example
/// font-size: least-squares-fit((576px: 24px, 768px: 24px, 992px: 34px));
/// @author Jake Wilson <jake.e.wilson@gmail.com>
@function least-squares-fit($map) {
// Get the number of provided breakpoints
$length: length(map-keys($map));
// Error if the number of breakpoints is < 2
@if ($length < 2) {
@error "leastSquaresFit() $map must be at least 2 values"
}
// Calculate the Means
$resTotal: 0;
$valueTotal: 0;
@each $res, $value in $map {
$resTotal: $resTotal + $res;
$valueTotal: $valueTotal + $value;
}
$resMean: $resTotal/$length;
$valueMean: $valueTotal/$length;
// Calculate some other stuff
$multipliedDiff: 0;
$squaredDiff: 0;
@each $res, $value in $map {
// Differences from means
$resDiff: $res - $resMean;
$valueDiff: $value - $valueMean;
// Sum of multiplied differences
$multipliedDiff: $multipliedDiff + ($resDiff * $valueDiff);
// Sum of squared resolution differences
$squaredDiff: $squaredDiff + ($resDiff * $resDiff);
}
// Calculate the Slope
$m: $multipliedDiff / $squaredDiff;
// Calculate the Y-Intercept
$b: $valueMean - ($m * $resMean);
// Return the CSS calc equation
@return calc(#{$m*100}vw + #{$b});
}