Chrome/MacOS и Firefox/MacOS могут отображать строку с глифами из двух шрифтов, но Chrome/iOS и Safari/Any — нет

Я хочу объявить свойство font-family, называющее два шрифта, и любые глифы, отсутствующие в первом, будут отображаться во втором. Это отлично работает в Chrome и Firefox на MacOS, но Safari/MacOS, а также Chrome и Safari на iOS будут учитывать только шрифт, указанный первым.

Минимальный случай воспроизведения:

<!DOCTYPE html>
<html lang = "en">
    <head>
        <title>Example</title>
        <meta charset = "utf-8">
        <link href = "https://fonts.googleapis.com/css2?family=Redacted+Script&family=Noto+Emoji&display=swap" rel = "stylesheet">
        <style>
            p {
                font-family: "Redacted Script", "Noto Emoji", sans-serif;
                font-weight: 400;
                font-style: normal;
            }
        </style>
    </head>
    <body>
        <p>Hello 😊</p>
    </body>
</html>

Смайлик 😊 здесь должен отображаться в Noto Emoji, а не в шрифте Emoji по умолчанию в браузере. Это то, что делают Chrome/MacOS и Firefox/MacOS.

Вот чего я ожидаю:

Но в плохих случаях вместо этого я получаю это (я думаю, смайлик взят из шрифта Apple Emoji):

Что я делаю не так? Или это смешение шрифтов в одну строку не во всех браузерах поддерживается? Есть ли обходной путь?

Не могли бы вы превратить свой код в работоспособный фрагмент (<> в редакторе), чтобы его было легче тестировать на устройствах iOS?

A Haworth 06.05.2024 00:29

Это мило! Я это сделал :)

Thomas David Baker 06.05.2024 00:52

У меня ваш фрагмент работает нормально на iPad IOS 16…. Сафари. На какой версии и устройстве вы тестируете?

A Haworth 06.05.2024 01:03

…но на iPhone SE iOS 17… Safari Я вижу желтый смайлик, как вы описываете.

A Haworth 06.05.2024 01:14

Что ж, это любопытно насчет iPad/iOS 16. На iPhone 12 под управлением iOS 17.4.1 я вижу проблему как в Safari, так и в Chrome. В MacOS 14.3.1 и Chrome, и Firefox работают правильно, а Safari — нет.

Thomas David Baker 06.05.2024 02:25
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
3
5
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Safari это работает, если изменить порядок семейств.

font-family: "Noto Emoji", "Redacted Script", cursive;

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

Фрагмент для демонстрации — запустите его в Safari.

@import url('https://fonts.googleapis.com/css2?family=Noto+Emoji:[email protected]&family=Redacted+Script&display=swap');

body {
  font-size: 2em;
}

.p1 {
  font-family: "Redacted Script", "Noto Emoji", cursive;
}

.p2 {
  font-family: "Noto Emoji", "Redacted Script", cursive;
}
<p class = "p1">hello 😀😍👹🤡🤢</p>

<p class = "p2">hello 😀😍👹🤡🤢</p>

Ого, какое простое, но гениальное открытие. «Настоящая» версия этой проблемы включает в себя базовый шрифт и восемь «специальных» шрифтов, которые содержат некоторые необходимые нам символы. Однако мы разделяем все восемь специальных шрифтов только на те символы, которые нам нужны. Кажется, что если я сначала перечислю все это, а затем базовый шрифт (который «кажется» неправильным), я получу именно то поведение, которое хочу, во всех браузерах, к которым у меня есть доступ. Спасибо!

Thomas David Baker 06.05.2024 16:51

Другие вопросы по теме