У меня очень странная проблема, которую я никогда не видел за более чем 20 лет веб-разработки. У меня есть текст, превышающий ширину содержащего его абзаца:
Мой клиент запросил шрифт Duffy Script у Adobe, что может быть проблемой, поскольку, когда я перехожу на sans serif
, проблема исчезает. Но мне бы очень хотелось это исправить, если получится!
Я создал простой jsfiddle, который показывает проблему — вы можете просто изменить размер правой панели, чтобы увидеть проблему, которую я запечатлел на изображении: https://jsfiddle.net/GeorgeMooWoof/4x50etdy/6/
Может ли кто-нибудь помочь, пожалуйста?
спасибо
@import url("https://use.typekit.net/twt4ckp.css");
.container {
padding-right: 20px;
background: yellow;
}
p {
font-family: "duffy-script", sans-serif;
font-weight: 400;
font-style: normal;
font-size: 24px;
background: rgba(255, 0, 0, 0.2);
}
<div class = "container">
<p>
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</div>
@Nexo Я даже не проверял, но теперь проверил! Это происходит в Safari, Chrome и Brave, но в FF все в порядке.
Проблема возникает из-за шрифта. Я протестировал ваш код с несколькими шрифтами.
Спасибо @JaydenJiang, но я это уже знал. Я тоже это сделал. Я надеялся, что кто-нибудь знает обходной путь. Странно, что Firefox нормально отображает ТОЛЬКО шрифт, вам не кажется?
Думаю, я нашел обходной путь. Добавление межбуквенного интервала: 0,01 пикселей; в CSS, похоже, это исправляет. Я делаю еще несколько тестов...
Подробности и объяснения смотрите в посте @herrstrietzel . Как упоминалось внутри, вы можете использовать font-variant-ligatures:no-contextual
( в качестве предварительной спецификации, предпочтительнее, чем настройка функции шрифта), чтобы отключить отображение контекстных альтернатив.
(Настройка optimizeSpeed
, как показано ниже, работает из-за побочного эффекта отключения лигатур. То же самое с добавлением положительного letter-spacing
.)
Установка text-rendering:optimizeSpeed
решает проблему (в Chrome и Edge).
@import url("https://use.typekit.net/twt4ckp.css");
.container {
padding-right: 20px;
background: yellow;
}
.par {
font-family: "duffy-script", sans-serif;
font-weight: 400;
font-style: normal;
font-size: 24px;
background: rgba(255, 0, 0, 0.2);
text-rendering: optimizeSpeed;
}
<div class = "container">
<p class = "par">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor
in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</div>
Как прокомментировал ОП, добавление letter-spacing: 0.01px
, похоже, также решает проблему.
@import url("https://use.typekit.net/twt4ckp.css");
.container {
padding-right: 20px;
/* background: yellow; */
}
.par {
display: inline-block;
font-family: "duffy-script", sans-serif;
font-weight: 400;
font-style: normal;
font-size: 24px;
width: 233px;
background: rgba(255, 0, 0, 0.2);
letter-spacing: 0.01px;
}
<div class = "container">
<p class = "par">
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</div>
Спасибо @SyndRain, мы очень ценим время, потраченное на помощь. Можете ли вы объяснить, почему font-variant-ligatures: no-contextual предпочтительнее предложения Herrstrietzel об использовании font-feature-settings: 'calt' 0 ?
@GeorgePorge Возможно, в вашем случае это не имеет значения, но, как упоминалось в ссылке, это предпочтительнее, потому что настройки шрифта - это интерфейсы с более низким уровнем рычага, которых следует избегать, когда для каскадирования и совместимости предоставляется опция более высокого уровня.
@SyndRain: извините, мой предыдущий комментарий о сравнении контекстной альтернативной функции с лигатурами был просто чепухой! (Проект W3C, очевидно, допустил ту же ошибку – они часто делали сомнительный семантический выбор). Я обновил свой ответ, добавив дополнительную информацию. GeorgePorge: поскольку это ошибка, я не думаю, что мы сможем представить решение, которое будет идеальным обходным путем. Однако ответ SyndRain заслуживает того, чтобы его пометили как принятый ответ. В идеале мы все следим за этим вопросом и делимся своими выводами, как только будет достигнут какой-либо прогресс (... это может занять некоторое время;)
Я думаю, что принятие ответа @herrstrietzel имеет больше смысла для будущего читателя. Мой ответ не дает никаких объяснений. Он просто предоставил обходной путь, хотя я понятия не имел, почему он сработал. Интересное чтение!
@SyndRain, геррстрицель, спасибо обоим за то, что они потратили столько времени на расследование и помощь. Это очень ценится. Возьмите остаток дня, вы оба, и выпейте пива. Скажи своему боссу, что я сказал, что ты можешь :о)
Эта ошибка, связанная с Chromium/blink, вызвана контекстной альтернативной функцией Opentype calt .
По-видимому, браузеры на основе Chromium/blink (Chrome, Brave, Opera, Vivaldi... и Internet Expl... Edge), а также браузеры Webkit (safari, web/epiphany, Midori) не могут правильно рассчитать текущую длину слова для соответствующих разрывы строк при включенной этой функции.
Так что это определенно ошибка (у Firefox с ней проблем нет).
См. также ответ @SyndRain, предлагающий другие обходные пути.
font-feature-settings: 'calt' 0;
Устраняет проблему при включении других функций (например, лигатур)
@import url("https://use.typekit.net/twt4ckp.css");
.container {
padding-right: 20px;
background: yellow;
resize:both;
overflow:auto;
line-height:1.5em;
max-width:100%;
}
p {
font-family: "duffy-script", sans-serif;
font-weight: 400;
font-style: normal;
font-size: 24px;
background: rgba(255, 0, 0, 0.2);
}
.no-feat{
font-feature-settings: 'calt' 0;
}
<h3>Resize me</h3>
<div class = "container">
<p class = "feat">
firm Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
<p class = "no-feat">
firm Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
</p>
</div>
На первый взгляд обе функции служат одной и той же цели — определенная последовательность символов заменяется другим визуальным представлением, известным как «глиф».
Забавные факты: Хорошо, это ошибка!
Хотя я могу подтвердить, что вышеупомянутые обходные пути, такие как настраиваемый интервал между буквами, работают, некоторые из них не должны работать;)
По крайней мере, если бы определения функций opentype были идеально реализованы.
letter-spacing
отключает все лигатуры – что может быть неприятно для многих языков с письмом справа налево, использующих такие лигатуры, как, например, арабский или фарси (особенно в сочетании с латинским текстом) – но на самом деле это не должно иметь значения, поскольку мы заменяем отдельные вводимые символы отдельными представлениями глифов.font-variant-ligatures: contextual
– это определенно не лигатурная функция.Из документации Microsoft Opentype
Резюме для дизайнеров с сайта typenetwork.com
Ах, гений, интересно, сохраняется ли эта проблема в Chromium, когда для других шрифтов установлены контекстные альтернативы?
Спасибо @herrstrietzel, это невероятно полезно. Я никогда раньше не слышал об этом и даже создавал свои собственные шрифты!
@GeorgePorge: Честно говоря, я думаю, что эта довольно продвинутая функция открытого типа скорее является областью использования надписей в комиксах / графических романах - чтобы избежать явно искусственного внешнего вида при отображении двух одинаковых букв в последовательности. При использовании веб-шрифтов вы обычно стараетесь сделать сложность шрифта и размер файла как можно меньшими. Поэтому я думаю, что конфликты с другими веб-шрифтами встречаются довольно редко — просто потому, что не так много шрифтов, использующих эту функцию. Если только вы не смешиваете несколько «рукописных» шрифтов с контекстными альтернативами…
@Nexo Я могу воспроизвести проблему в Edge (126.0.2592.68) и последней версии Chrome.