如何实现max-font-size?

时间:2016-11-10 13:00:35

标签: css3 viewport-units

我想使用vw指定字体大小,如

font-size: 3vw;

但是,我还想将字体大小限制为36px。如何才能实现等效的max-font-size,这是不存在的 - 是使用媒体查询的唯一选择?

4 个答案:

答案 0 :(得分:75)

font-size: 3vw;表示字体大小为视口宽度的3%。因此,当视口宽度为1200px时 - 字体大小为3%* 1200px = 36px。

因此,使用单个媒体查询可以轻松实现36px的最大字体大小,以覆盖默认的3vw字体大小值。

Codepen demo(调整浏览器大小)

div {
  font-size: 3vw;
}
@media screen and (min-width: 1200px) {
  div {
     font-size: 36px;
  }
}
<div>hello</div>

话虽如此,以上述方式使用font-size的视口单元是有问题的,因为当视口宽度小得多 - 比如320px - 那么渲染的字体大小将变为0.03 x 320 = 9.6px这非常(太小。

为了解决这个问题,我建议使用名为Fluid Type AKA CSS Locks的技术。

  

CSS锁定是一种特定的CSS值计算,其中包括:

     
      
  • 有最小值和最大值,
  •   
  • 和两个断点(通常基于视口宽度),
  •   
  • 在这些断点之间,实际值从最小值到最大值呈线性变化。
  •   

From this article on CSS locks也详细解释了数学。)

因此,假设我们要应用上述技术,使得视口宽度为600px或更小时的最小字体大小为16px,并且在视口宽度为1200px时将线性增加,直到达到最大32px。 / p>

我们可以使用this SASS mixin为我们完成所有数学运算,以便CSS看起来像这样:

/* 
     1) Set a min-font-size of 16px when viewport width < 600px
     2) Set a max-font-size of 32px when viewport width > 1200px and
     3) linearly increase the font-size from 16->32px 
     between a viewport width of 600px-> 1200px 
*/

div {
  @include fluid-type(font-size, 600px, 1200px, 16px, 32px);
}

// ----
// libsass (v3.3.6)
// ----

// =========================================================================
//
//  PRECISE CONTROL OVER RESPONSIVE TYPOGRAPHY FOR SASS
//  ---------------------------------------------------
//  Indrek Paas @indrekpaas
//
//  Inspired by Mike Riethmuller's Precise control over responsive typography
//  http://madebymike.com.au/writing/precise-control-responsive-typography/
//
//  `strip-unit()` function by Hugo Giraudel
//  
//  11.08.2016 Remove redundant `&` self-reference
//  31.03.2016 Remove redundant parenthesis from output
//  02.10.2015 Add support for multiple properties
//  24.04.2015 Initial release
//
// =========================================================================

@function strip-unit($value) {
  @return $value / ($value * 0 + 1);
}

@mixin fluid-type($properties, $min-vw, $max-vw, $min-value, $max-value) {
  @each $property in $properties {
    #{$property}: $min-value;
  }

  @media screen and (min-width: $min-vw) {
    @each $property in $properties {
      #{$property}: calc(#{$min-value} + #{strip-unit($max-value - $min-value)} * (100vw - #{$min-vw}) / #{strip-unit($max-vw - $min-vw)});
    }
  }

  @media screen and (min-width: $max-vw) {
    @each $property in $properties {
      #{$property}: $max-value;
    }
  }
}

// Usage:
// ======

// /* Single property */
// html {
//   @include fluid-type(font-size, 320px, 1366px, 14px, 18px);
// }

// /* Multiple properties with same values */
// h1 {
//   @include fluid-type(padding-bottom padding-top, 20em, 70em, 2em, 4em);
// }

////////////////////////////////////////////////////////////////////////////

div {
  @include fluid-type(font-size, 600px, 1200px, 16px, 32px);
}
@media screen and (max-width: 600px) {
  div {
     font-size: 16px;
  }
}
@media screen and (min-width: 1200px) {
  div {
     font-size: 36px;
  }
}
<div>Responsive Typography technique known as Fluid Type or CSS Locks. 
  Resize the browser window to see the effect.
</div>

Codepen Demo

<小时/>

进一步阅读

Precise control over responsive typography

Fluid Responsive Typography With CSS Poly Fluid Sizing

Non-linear interpolation in CSS

答案 1 :(得分:17)

另一种方法是慢慢增加字体大小,这不会限制最大字体大小,但即使在非常宽的屏幕上,它看起来也会更好。不是以完美的方式回答问题,而是它的1行...

font-size: calc(16px + 1vw);

答案 2 :(得分:3)

在某些时候,font-size超过了36px比例,找到了。假设,它超过了width: 2048px

@media screen and (min-width: 2048px) {
  .selector {
     font-size: 36px;
  }
}

是的,遗憾的是您需要使用@media个查询。我希望这不会对任何事情产生影响。

答案 3 :(得分:0)

这是另一个想法。 calc函数使用双精度浮点数。因此,它在1e18附近表现出阶跃函数。例如,

width: calc(6e18px + 100vw - 6e18px);

这将捕捉到值0px,1024px,2048px等。请参见笔https://codepen.io/jdhenckel/pen/bQNgyW

通过一些巧妙的数学运算,step函数可用于创建abs值和最小值/最大值。例如

max(x, y) = x - (x + y) * step(y - x)

当z <0时给定step(z)为零,否则为1。

只是一个想法,不是很实用,但是尝试起来可能很有趣。