提问者:小点点

字体大小和设备像素比


假设我将默认字体大小设置为 16px(这应该是多余的,因为它在大多数浏览器中都是默认的):

为简洁起见,我的网站包含一些大小为 10em x 10em 的盒子。

body, html 
{
    font-size: 16px;
}
.box {
    border: 1px green solid;
    background-color:green;
    width:10em;
    height:10em;
}

我的网站已经响应了针对 em 值(36、62 和 85em)的特定断点的最小宽度媒体查询。

我的网站唯一能做的就是改变盒子的宽度和颜色。

@media (min-width:36em) {
  .box {
    width: 36em;
    border:1px red solid;
    background-color:red;
  }
}
@media (min-width:62em) {
    .box {
        width: 62em;
        border:1px blue solid;
        background-color:blue;
    }
}
@media (min-width:85em) {
    .box {
        width: 85em;
        border:1px orange solid;
        background-color:orange;
    }
}

现在假设我有一些分辨率为1440x900的设备,浏览器默认决定设备的像素密度为2dppx。结果,一切看起来都比它应该的要大得多。我不喜欢它。

但是解决方法应该很简单,对吧?只需在开始时添加一个媒体查询,查询2dppx像素密度,因为它是像素的两倍,所以我只需将字体大小减少一半...这应该行得通,对不对?

而且由于我在所有内容上使用“em”,因此通过将字体大小更改一半,我会自动将所有“em”的大小减小一半......右?

@media ( min-resolution: 2dppx) {
    body, html {
        font-size: 50%;
    }
}

相关jsFiddle

好吧,我发现它不像我想象的那样工作......我试图谷歌答案,但没有找到任何相关的东西,我怀疑我误解了字体大小、ems 和像素密度的工作原理......

>

  • 将字体大小减小 50% 会使字体大小减少一半以上。原始大小为 16px,但字体大小:50%;导致字体远小于字体大小:8px ...在Firefox和Chrome中测试过。有谁知道这是为什么?

    当我设置字体大小:8px在针对2dppx的媒体查询中,针对min-width:36em、62em和85em的媒体查询没有像我预期的那样触发,至少当我在Firefox中更改layout.css.devPixelsPerPx时没有触发。媒体查询中的最小宽度表现为字体大小仍然为16px,尽管它随dppx媒体查询而改变。在Firefox和Chrome中测试。有人知道为什么吗?

    更新

    看起来媒体查询是在 1dppx 上下文中加载的,是否使用“em”并不重要,似乎它们在加载时被缓存并且最小宽度等值固定为第一个值,即使您在不同的媒体查询中更改了基本字体大小,其他查询也不会刷新。

    我现在能想到的唯一解决方案是将所有媒体查询乘以。一个媒体查询 1 dppx 上下文中的 px 值,另一个媒体查询 2 dppx 上下文中的 px 值(第一个值的 50%)。


  • 共1个答案

    匿名用户

    感谢李斯特先生的评论,我发现这一点:

    @media ( min-resolution: 2dppx) {
        body, html {
            font-size: 50%;
        }
    }
    

    …不是我想做的。50%规则适用于

    我想做的是:

    @media ( min-resolution: 2dppx) {
        html {
            font-size: 50%;
        }
    }
    

    字体大小问题已解决。

    对于媒体查询:我发现@media查询中的大小会忽略像素密度,但CSS规则正文中的大小不会。由于我使用“em”大小和SASS,我可以简单地用这个mixin替换所有@media查询(例如2dppx):

    @mixin media-min-width($min-width) {
        @media(min-width:$min-width), (min-width: $min-width / 2) and (min-resolution: 2dppx) {
            @content;
        }
    }