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, но не работает на настольном компьютере.






Да, похоже, в 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:
Apple почти наверняка решила сделать это из соображений доступности. Текст, который слишком мал для чтения, — это проблема, которая часто возникает, когда дизайнеры полагают, что зрение всей аудитории такое же хорошее, как и их собственное. Apple уделяет большое внимание доступности, поэтому я не удивлен, увидев это ограничение. Я не говорю, что согласен с установкой жесткого ограничения, поскольку это может быть проблемой для некоторых CSS-анимаций, предотвращая эффект уменьшения масштаба типа «затухания», как лишь один пример.
Как обойти это?
Во-первых, необходимо задать вопрос: почему вы хотите, чтобы в вашем дизайне был слишком мелкий для чтения текст?
Я могу придумать несколько допустимых вариантов использования:
Ваш дизайн содержит миниатюры других дизайнов — например, у вас есть рекламный баннер, рекламирующий книгу. Обложка книги находится на баннере. А на обложке книги есть текст, который слишком мелок для чтения, но мы все равно понимаем суть, так что это нормально. В таком случае преобразуйте обложку книги в изображение, если это еще не сделано.
Преобразование текста в SVG или другой формат изображения в некоторых случаях подходит. Для текста векторный формат обычно предпочтительнее растрового. Если ваш текст выглядит таким маленьким, возможно, он не работает как обычный текст. Вместо этого рассмотрите возможность относиться к нему как к изображению.
Свойство 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 требует минимального размера шрифта при использовании zoom, при использовании transform: scale() этого не происходит. Это подойдет для моих нужд, поскольку я просто масштабирую родительский элемент dom в соответствии с областью просмотра. Добавление transform-origin также дает мне немного больше контроля. Еще раз спасибо!
@DA2. Большой! Да, мне было интересно об этом... о возможности масштабирования всего контейнера вашего контента. Однако, не зная многого о настройке вашего киоска, я не решился строить предположения. Я рад, что это может быть решением для вас.
Я очень ценю усилия, которые вы вложили в это! Что касается варианта использования, то на самом деле это не проблема для конечных пользователей... просто проблема при разработке, контроле качества и тому подобном. Это будет киоск. Таким образом, холст имеет фиксированное соотношение сторон и размер, при котором весь текст будет легко читаться. Но тем временем, при просмотре в меньшем браузере и т.п. мы сталкиваемся с этими проблемами макета. Самое простое решение? Мы просто не будем использовать Safari. Задача решена. :) Но я считаю решение Apple здесь излишним, поскольку они уже позволяют пользователям легко устанавливать минимальный размер шрифта. Но это приятно знать!