根据屏幕大小调整文本大小

7
我在HTML中有不同大小的文本元素。我想要使它们具有动态性,以便在不同屏幕尺寸下显示不同的字体大小。
最好的方法是什么? 现在我这样做,但这会使代码看起来很丑:
<script>
$(window).resize(function(){
$('#first').css('font-size',($(window).width()*0.2)+'px');
$('h2').css('font-size',($(window).width()*0.02)+'px');
$('h1').css('font-size',($(window).width()*0.03)+'px');

如果只有两个元素,那么这样做可能还可以,但是我有更多的元素。我对html/css/javascript没有太多经验,所以这就是我想到的。

由于我正在学习,我想知道最好的方法是什么。

也许您有一些建议如何改进它?


你可以使用 $("*") 来选择所有元素,但我强烈建议使用屏幕尺寸相关的单位,如 em,这样它就完全基于 CSS。 - Reinstate Monica Cellio
9个回答

23

您可以使用新的CSS单位vw,vh(视口宽度/高度)来实现此目的。

这是一篇有趣的css-tricks文章,向您展示如何在排版中使用它们。

示例:(来自上述文章)

h1 {
  font-size: 5.9vw;
}
h2 {
  font-size: 3.0vh;
}
p {
  font-size: 2vmin;
}

因此,h1将具有视口宽度的5.9%的字体大小,以此类推。


话虽如此,在上述方式中使用视口单位作为font-size是有问题的,因为当视口宽度非常窄时,呈现的字体大小会变得太小,反之亦然。

为了解决这个问题,我建议使用一种称为流体类型CSS锁定的技术。

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

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

(参见关于CSS锁定的这篇文章,其中还详细说明了所涉及的数学知识。)

假设我们想应用上述技术,使最小字号为16px,当视口宽度小于或等于600px时,将线性增加到最大32px,在1200px的视口宽度下达到最大值。

我们可以使用此SASS mixin,它会为我们执行所有数学计算,以便CSS看起来像这样:

div {
  /* linearly increase the font-size from 16->32px 
     between a viewport width of 600px-> 1200px  */
  @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;
  }
}

// ----
// 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演示


进一步阅读

精确控制响应式排版

使用CSS Poly Fluid Sizing实现流体响应式排版

CSS中的非线性插值


5

在CSS文件中,可以使用媒体查询来设置字体大小。

@media(max-width:767px) {
    body {
        font-size: 10px;
    };
}

@media(min-width:768px) {
    body {
        font-size: 11px;
    };
}

@media(min-width:992px) {
    body {
        font-size: 12px;
    };
}

@media(min-width:1200px) {
    body {
        font-size: 13px;
    };
}

所以,这个答案的酷炫之处在于,所有那些@media让你感觉聪明极了 lol,但是,在2016年,vw才是正确的答案..仍然+1 =) - Maduro

1
放弃使用JavaScript来改变字体大小...在CSS文件中使用em指定字体大小,如下所示。
div{
   font-size:2em;
}

我认为这并不提供原始问题所寻求的内容。它只会在容器(或其父级之一)更改字体大小时调整文本大小。 - brennanyoung

0

不要使用JavaScript来指定字体大小。CSS已经内置了相关方法。

您可以使用“em”或“%”来更改与页面和设备尺寸相关的字体大小。

代码示例:

font-size: 3em;
font-size: 10%;

两者都可以。


当您调整浏览器大小时,这并不能帮助您。 - Arun Aravind
@ArunAravind 屏幕大小从来不意味着浏览器窗口大小。 - Vikram Tiwari

0
你可以使用CSS媒体查询来实现这个功能。
在媒体查询中,将body的大小设置为百分比。
例如:CSS
@media screen and (max-width: 1024px) {
   body {
      font-size: 90%;
   }
}

@media screen and (max-width: 1440px) {
   body {
      font-size: 100%;
   }
}

然后在每个你想要在调整浏览器大小或根据分辨率调整字体大小的元素上设置百分比字体大小。

例如:如果你想要调整h1标签的字体大小

h1 {
   font-size: 150%;
}

它将按照您的期望工作。


不要使用 em 设置字体大小,因为 em 的变化是指数级的。请改用百分比。 - Arun Aravind
你会推荐使用vw吗?它可以根据浏览器的变化进行调整,但并不是所有浏览器都完全支持,并且在Chrome中有一些小问题。 - Karlis
这就是我说的,我还没有使用过它。我不是一个网站开发者。你可以试着用一下,然后让我去看看你刚才给的链接文档。谢谢 :) - Arun Aravind
那里写着它正在准备与chrome 20一起发布..所以我想浏览器支持还不够。如果有浏览器支持,您应该绝对使用它。但他们报告说可能还有一些尚未修复的错误。 - Arun Aravind
我认为我会坚持使用vw,因为它可以在浏览器更改时进行调整大小。 - Karlis
显示剩余2条评论

0

使用JavaScript调整字体大小不是一个好的做法。最好使用传统的CSS来进行调整。您可以使用不同的单位(如px、em和%以及rem(根em))在CSS中调整字体大小。

为了根据屏幕大小调整字体大小,请使用rem设置字体大小。或者利用媒体查询为不同的屏幕分辨率设置字体大小。以下是一些示例媒体查询:

@media screen and (max-width: 1024px) {
    #first { font-size: 204px; }
    h2 { font-size: 20px; }
    h1 { font-size: 30px; }
}

0

使用 em 替代像素,因为它可以根据比例缩放。

来自维基百科:

在线上,使用 em 单位已变得更加普遍;随着层叠样式表 (CSS) 的发展,W3C 优秀实践建议在 HTML 和在线标记中现在要求网页基于可伸缩设计,使用相对单位(例如 em 单位),而不是固定单位如像素 ("px") 或点("pt")。


使用vw怎么样?这个建议吗,因为它在大多数浏览器中都不受支持。 - Karlis

0

0

如果你使用%或者em作为基础设置字体大小,浏览器会相应地进行调整。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接