Размер шрифта и соотношение устройств к пикселям

Допустим, у меня по умолчанию установлен размер шрифта 16px (это должно быть избыточно, так как это по умолчанию в большинстве браузеров):

Для краткости мой сайт содержит коробку размером 10em x 10em.

body, html {font-size: 16px; }.box {border: 1px green solid; цвет фона: зеленый; ширина:10em; высота:10em;
}

Мой сайт уже реагирует на min-width медиа-запросы для конкретных точек останова, нацеленных на значения em (36, 62 и 85em).

Единственное, что делает мой сайт - это изменяет ширину и цвет коробки.

@media (min-width: 36em) {.box {
    ширина: 36em;
    граница: 1px красная сплошная;
    фон-цвет: красный;
  }
}
@media (min-width:62em) {
    .box {
        ширина: 62 мм;
        граница: 1px синяя сплошная;
        цвет фона: синий;
    }
}
@media (min-width:85em) {
    .box {
        ширина: 85 мкм;
        граница: 1px оранжевое твердое вещество;
        фон-цвет: оранжевый;
    }
}

Теперь предположим, что у меня есть какое-то устройство с разрешением 1440x900, где браузеры решают, что плотность пикселей устройства по умолчанию составляет 2dppx. В результате все выглядит намного больше, чем должно быть. И мне это не нравится.

Но решение должно быть простым, верно? Просто добавьте медиазапрос при запуске для плотности пикселей 2dppx и, поскольку это в два раза больше пикселей, я просто уменьшу размер шрифта вдвое... это должно работать, верно?

И так как я использую "em" для всего, то, изменяя размер шрифта наполовину, я автоматически уменьшаю размер всего, что "em", - наполовину... верно?

@media (минимальное разрешение: 2dppx) {
    body, html {
        размер шрифта: 50%;
    }
}

соответствующие jsFiddle

Ну, я обнаружил, что это не работает, как я думал, что это будет... Я пытался найти ответы в Google, но не нашел ничего релевантного, я подозреваю, что неправильно понимаю, как работают размеры шрифтов, ems и плотность пикселей...

  • Уменьшение размера шрифта на 50% уменьшает размер шрифта более чем вдвое. Оригинальный размер 16px, но размер шрифта: 50%; в результате размер шрифта значительно меньше размера шрифта: 8 пикселей... Проверено в Firefox и Chrome. Кто-нибудь знает, почему это?

  • Когда я устанавливаю размер шрифта:8px; в медиа-запросе для 2dppx медиа-запросы для min-width:36em, 62em и 85em не запускаются, как я ожидал, по крайней мере, когда я меняю layout.css.devPixelsPerPx в Firefox. Минимальная ширина в медиа-запросе ведет себя так, как будто размер шрифта все еще равен 16px, хотя он изменяется с помощью медиа-запроса dppx. Протестировано в Firefox и Chrome. Кто-нибудь знает, почему это?

ОБНОВИТЬ

Похоже, медиа-запросы загружаются в контексте 1dppx, не важно, используете ли вы "em", кажется, что они кэшируются при загрузке, а значения, такие как min-width, фиксируются в первом значении и даже при изменении базового размера шрифта. в другом медиа-запросе другие запросы не обновляются.

Единственное решение, которое я могу придумать сейчас, - это умножить все медиазапросы. Один медиа-запрос для значения px в контексте 1 dppx и другой медиа-запрос для значения px в контексте 2 dppx (что составляет 50% от первого значения).

1 ответ

Решение

Благодаря господину Листеру в комментариях я узнал, что это:

@media (минимальное разрешение: 2dppx) {
    body, html {
        размер шрифта: 50%;
    }
}

... это не то, что я намеревался сделать. Правило 50% работает для <html> тег И для <body> тег. Результирующий размер шрифта составляет не 8px в теле, а 4px, потому что 50% в html - 8px, а еще 50% во вложенном теге body - 4px.

То, что я намеревался сделать, было этим:

@media (минимальное разрешение: 2dppx) {
    html {
        размер шрифта: 50%;
    }
}

Проблема размера шрифта решена.

Для медиа-запроса: я обнаружил, что размеры в запросах @media игнорируют плотность пикселей, а размеры в теле правила CSS - нет. Поскольку я использую размеры "em" и SASS, я могу просто заменить все запросы @media следующим миксином (пример с 2dppx):

@mixin media-min-width ($ min-width) {
    @media (min-width: $ min-width), (min-width: $ min-width / 2) и (минимальное разрешение: 2dppx) {
        @content;
    }
}
Другие вопросы по тегам