带有 rem 的响应式排版 - 以 % 或 px 为单位的基线字体大小?

Posted

技术标签:

【中文标题】带有 rem 的响应式排版 - 以 % 或 px 为单位的基线字体大小?【英文标题】:Responsive Typography with rem - Baseline fontsize in % or px? 【发布时间】:2015-04-20 21:42:47 【问题描述】:

我正在尝试使用 rems 通过 SCSS 实现响应式排版解决方案,以便仅对 html 中的基线字体大小而不是每个元素使用媒体查询。

我在 html 中发现了不同的字体大小方法:

html  font-size: 100%;    // uses the default browser font-size
html  font-size: 62.5%;   // 62.5% = 10px to facilitate rem calculation
html  font-size: 16px;    // uses 16px

假设我会选择62.5%-approach suggested by Jonathan Snook,然后我可以使用a mixin for px-fallbacks: 轻松分配我的标题和段落安静

@mixin font-size($sizeValue: 1.6) 
    font-size: ($sizeValue * 10) + px;
    font-size: $sizeValue + rem;


h1  @include font-size(3.2);          // 32px
h2  @include font-size(2.6);          // 26px
h3  @include font-size(2.2);          // 22px
h4  @include font-size(1.8);          // 18px
h5  @include font-size(1.6);          // 16px
h6  @include font-size(1.4);          // 14px

然后我可以将媒体查询应用到 html 字体大小以在不同的分辨率下缩放排版,如下所示:

@media (min-width: 768px)  html  font-size: 56.3%;   // 56.3% = 9px
@media (min-width: 992px)  html  font-size: 62.5%;   // 62.5% = 10px
@media (min-width: 1200px)  html  font-size: 68.8%;   // 68.8% = 11px

我的问题:

1.字体大小基线的最佳方法是什么(px vs 100% vs 62.5%)?

2。使用 SASS / SCSS 进行响应式排版的最佳整体方法是什么?

【问题讨论】:

这似乎是一个非常广泛的问题? 我在互联网上找到了很多关于如何处理响应式排版的不同建议,但我找不到一个普遍接受的标准化解决方案。每个人的做法似乎都不一样。 我认为您所拥有的是一种相当标准的方法。在我看来,它更归结为它是否适用于项目/设计。因为我们这样做的原因是为了让我们的生活更轻松。如果它这样做,那么它可能是正确的。 62.5% 是 9.375 像素(至少在我的电脑上),所以我看不出这将如何促进 rem 计算 这就是 62.5% 方法的问题:它在不同浏览器中的解释不同,这让我认为 px 中的基线更有意义。我们也不能在用户的浏览器中控制 100%(可以设置为一个完全奇怪的值)。 【参考方案1】:

我的 SCSS 流畅排版,很舒服:

html  
    @include fluid-property(font-size, 1rem, 1.5rem, 320px, 1600px);



/// Fluid property/properties
/// Examples:
///      html            @include fluid-property(font-size, 14px, 20px, 320px, 1366px);                           // single property
///      html            @include fluid-property(font-size, 1em, 2em, 320px, 1366px);                             // single property
///      h1,h2,h3,h4,h5  @include fluid-property((padding-left, padding-right), 10rem, 20rem, 48em, 64em);        // multiple properties with same values
/// All units must be of the type: px / em / rem.
@mixin fluid-property($properties, $min-value, $max-value, $min-screen, $max-screen) 
    @each $property in $properties 
        #$property: $min-value;
    
    @include media-min($min-screen) 
        @each $property in $properties 
            #$property: calc-interpolation($min-value, $max-value, $min-screen, $max-screen); 
        
    
    @include media-min($max-screen) 
        @each $property in $properties 
            #$property: $max-value;
        
    

@function calc-interpolation($min-value, $max-value, $min-screen, $max-screen) 
    $u-min-value: unit($min-value);
    $a: 0; $b: 0;
    @if ($u-min-value == em) 
        $a: em($max-value - $min-value) / em($max-screen - $min-screen);
        $b: $min-value - $a * em($min-screen); 
     @else if ($u-min-value == rem) 
        $a: rem($max-value - $min-value) / rem($max-screen - $min-screen);
        $b: $min-value - $a * rem($min-screen); 
     @else 
        $a: px($max-value - $min-value) / px($max-screen - $min-screen);
        $b: $min-value - $a * px($min-screen); 
        
    $sign: "+";
    @if ($b < 0) 
        $sign: "-";
        $b: abs($b);
    
    @return calc(#$a*100vw #$sign #$b);

它将渲染下一个 CSS:

html  font-size: 1rem; 

@media only screen and (min-width: 320px)  html  font-size: calc(0.625vw + 0.875rem);  

@media only screen and (min-width: 1600px)  html  font-size: 1.5rem;  

【讨论】:

【参考方案2】:

我不认为这是“最好的方法”,但这是我最近一直在做的事情:

    以像素为单位设置基本尺寸。它将在不同浏览器中保持一致,并且更易于推理。 基线以像素为单位,元素的所有类型大小以 rem 为单位,然后只需重置媒体查询的基线大小(以像素为单位)。

这是 Trent Walton 撰写的一篇很棒的文章,它不太关注实施,而是更多地关注最佳实践,但我觉得它真的很有帮助:http://trentwalton.com/2012/06/19/fluid-type/

不确定我是否回答了您的问题,但这是一个非常深入的话题!

【讨论】:

以上是关于带有 rem 的响应式排版 - 以 % 或 px 为单位的基线字体大小?的主要内容,如果未能解决你的问题,请参考以下文章

浅谈rem与rpx布局

响应式/rem

响应式字体设置rem,em,px

响应式布局-PC端和移动端同时适配

px转rem 响应式

响应式设计+ rem