Есть ли способ обойти минимальный размер шрифта Safari?

JSBIN: https://jsbin.com/subipamero/edit?html,css,output

HTML:

<div>This is 20px text</div>
<div class = "shrunk">This should appear as 4px size text (20px * .2)</div> 

CSS:

div {
  font-size: 20px;
  margin: 20px;
}

div.shrunk {
  zoom: .2;
}

Пример JSBIN отображает два элемента div. Текст установлен на 20 пикселей. Однако второй div имеет набор zoom: .2.

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

Кто-нибудь знает, почему Safari это делает? И есть ли способ это обойти?

Должен отметить, что у меня нет настройки Safari «никогда не отображать тип ниже размера x».

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

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

В Chrome это означает, что независимо от того, какой размер я установил в своем браузере, все на экране масштабируется целиком и ничего не ломается (за исключением того, что оно слишком маленькое для чтения/увидения).

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

Я предполагаю, что Safari именно такой, и я, вероятно, смогу обойти это с помощью более продуманных изменений дизайна/макета. Но мне любопытно, что здесь делает Safari, если это известная вещь.

ОБНОВЛЕНИЕ: мне указали на этот ответ относительно использования -webkit-text-size-adjust: 100%. Это может «исправить» проблему в мобильном Safari, но не работает на настольном компьютере.

Приемы 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 сценарий полностью изменился.
1
0
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Да, похоже, в Safari есть нижний предел, который предотвращает воздействие zoom на текст при значениях меньше 0.5. Мы можем видеть это по результату рендеринга текста в масштабе 1~0.1:

<p style = "zoom:1.0">text at zoom:1.0</p>
<p style = "zoom:0.9">text at zoom:0.9</p>
<p style = "zoom:0.8">text at zoom:0.8</p>
<p style = "zoom:0.7">text at zoom:0.7</p>
<p style = "zoom:0.6">text at zoom:0.6</p>
<p style = "zoom:0.5">text at zoom:0.5</p>
<p style = "zoom:0.4">text at zoom:0.4</p>
<p style = "zoom:0.3">text at zoom:0.3</p>
<p style = "zoom:0.2">text at zoom:0.2</p>
<p style = "zoom:0.1">text at zoom:0.1</p>

Вот как этот текст отображается в трех настольных браузерах Mac:

Хром Сафари Fire Fox

Apple почти наверняка решила сделать это из соображений доступности. Текст, который слишком мал для чтения, — это проблема, которая часто возникает, когда дизайнеры полагают, что зрение всей аудитории такое же хорошее, как и их собственное. Apple уделяет большое внимание доступности, поэтому я не удивлен, увидев это ограничение. Я не говорю, что согласен с установкой жесткого ограничения, поскольку это может быть проблемой для некоторых CSS-анимаций, предотвращая эффект уменьшения масштаба типа «затухания», как лишь один пример.

Как обойти это?

Во-первых, необходимо задать вопрос: почему вы хотите, чтобы в вашем дизайне был слишком мелкий для чтения текст?

Я могу придумать несколько допустимых вариантов использования:


Вариант использования 1: использование текста в виде изображения.

Ваш дизайн содержит миниатюры других дизайнов — например, у вас есть рекламный баннер, рекламирующий книгу. Обложка книги находится на баннере. А на обложке книги есть текст, который слишком мелок для чтения, но мы все равно понимаем суть, так что это нормально. В таком случае преобразуйте обложку книги в изображение, если это еще не сделано.

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


Вариант использования 2: текст с анимированными переходами.

Свойство text zoom должно быть анимировано (как я описал выше). В этом случае рассмотрите возможность анимации других свойств CSS, например transform: scale() translate();.

Просто имейте в виду, что scale() имеет неприятный побочный эффект смещения вашего элемента относительно его Transform-Origin. Ничего не поделаешь — вот что делает масштабирование. И translate() часто необходимо использовать в сочетании с scale(), чтобы компенсировать изменения позиционирования.

<p style = "transform: scale(1.5)">text at scale:1.5</p>
<p style = "transform: scale(1.4)">text at scale:1.4</p>
<p style = "transform: scale(1.3)">text at scale:1.3</p>
<p style = "transform: scale(1.2)">text at scale:1.2</p>
<p style = "transform: scale(1.1)">text at scale:1.1</p>
<p style = "transform: scale(1.0)">text at scale:1.0</p>
<p style = "transform: scale(0.9)">text at scale:0.9</p>
<p style = "transform: scale(0.8)">text at scale:0.8</p>
<p style = "transform: scale(0.7)">text at scale:0.7</p>
<p style = "transform: scale(0.6)">text at scale:0.6</p>
<p style = "transform: scale(0.5)">text at scale:0.5</p>
<p style = "transform: scale(0.4)">text at scale:0.4</p>
<p style = "transform: scale(0.3)">text at scale:0.3</p>
<p style = "transform: scale(0.2)">text at scale:0.2</p>
<p style = "transform: scale(0.1)">text at scale:0.1</p>

Отображаемый результат transform: scale() — в разных браузерах заметно не различается:

(screenshot is from Safari)

Обратите внимание, что элементы со значениями шкалы >1,0 смещаются влево, а элементы со значениями <1,0 – вправо. Это можно настроить с помощью translate(), но получение правильных значений требует хлопот, связанных с методом проб и ошибок. Даже в этом случае есть вопросы, которые следует учитывать, в том числе то, как это может повлиять на оперативность реагирования. Я не обязательно рекомендую этот «взлом». Хотя это может быть хорошо для небольших корректировок.


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

Я очень ценю усилия, которые вы вложили в это! Что касается варианта использования, то на самом деле это не проблема для конечных пользователей... просто проблема при разработке, контроле качества и тому подобном. Это будет киоск. Таким образом, холст имеет фиксированное соотношение сторон и размер, при котором весь текст будет легко читаться. Но тем временем, при просмотре в меньшем браузере и т.п. мы сталкиваемся с этими проблемами макета. Самое простое решение? Мы просто не будем использовать Safari. Задача решена. :) Но я считаю решение Apple здесь излишним, поскольку они уже позволяют пользователям легко устанавливать минимальный размер шрифта. Но это приятно знать!

DA2. 08.06.2024 08:45

Задерживать! Я только что перечитал ваш ответ и понял, что вы нашли решение! Действительно, хотя Safari требует минимального размера шрифта при использовании zoom, при использовании transform: scale() этого не происходит. Это подойдет для моих нужд, поскольку я просто масштабирую родительский элемент dom в соответствии с областью просмотра. Добавление transform-origin также дает мне немного больше контроля. Еще раз спасибо!

DA2. 08.06.2024 08:59

@DA2. Большой! Да, мне было интересно об этом... о возможности масштабирования всего контейнера вашего контента. Однако, не зная многого о настройке вашего киоска, я не решился строить предположения. Я рад, что это может быть решением для вас.

Mentalist 10.06.2024 02:23

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