Текст выходит за ширину абзаца

У меня очень странная проблема, которую я никогда не видел за более чем 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 Я могу воспроизвести проблему в Edge (126.0.2592.68) и последней версии Chrome.

SyndRain 25.06.2024 18:37

@Nexo Я даже не проверял, но теперь проверил! Это происходит в Safari, Chrome и Brave, но в FF все в порядке.

GeorgePorge 25.06.2024 18:39

Проблема возникает из-за шрифта. Я протестировал ваш код с несколькими шрифтами.

Jayden Jiang 25.06.2024 18:47

Спасибо @JaydenJiang, но я это уже знал. Я тоже это сделал. Я надеялся, что кто-нибудь знает обходной путь. Странно, что Firefox нормально отображает ТОЛЬКО шрифт, вам не кажется?

GeorgePorge 25.06.2024 18:53

Думаю, я нашел обходной путь. Добавление межбуквенного интервала: 0,01 пикселей; в CSS, похоже, это исправляет. Я делаю еще несколько тестов...

GeorgePorge 25.06.2024 19:08
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Введение в 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. Это простой сайт, ничего вычурного. Основная цель -...
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Ангулярный шаблон для бронирования путешествий
Toor - Travel Booking Angular Template один из лучших Travel & Tour booking template in the world. 30+ валидированных HTML5 страниц, которые помогут...
5
5
144
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

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

Подробности и объяснения смотрите в посте @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 26.06.2024 08:38

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

SyndRain 26.06.2024 18:20

@SyndRain: извините, мой предыдущий комментарий о сравнении контекстной альтернативной функции с лигатурами был просто чепухой! (Проект W3C, очевидно, допустил ту же ошибку – они часто делали сомнительный семантический выбор). Я обновил свой ответ, добавив дополнительную информацию. GeorgePorge: поскольку это ошибка, я не думаю, что мы сможем представить решение, которое будет идеальным обходным путем. Однако ответ SyndRain заслуживает того, чтобы его пометили как принятый ответ. В идеале мы все следим за этим вопросом и делимся своими выводами, как только будет достигнут какой-либо прогресс (... это может занять некоторое время;)

herrstrietzel 27.06.2024 02:49

Я думаю, что принятие ответа @herrstrietzel имеет больше смысла для будущего читателя. Мой ответ не дает никаких объяснений. Он просто предоставил обходной путь, хотя я понятия не имел, почему он сработал. Интересное чтение!

SyndRain 27.06.2024 15:43

@SyndRain, геррстрицель, спасибо обоим за то, что они потратили столько времени на расследование и помощь. Это очень ценится. Возьмите остаток дня, вы оба, и выпейте пива. Скажи своему боссу, что я сказал, что ты можешь :о)

GeorgePorge 27.06.2024 16:16

Эта ошибка, связанная с 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>

Контекстная альтернатива и функция лигатуры

На первый взгляд обе функции служат одной и той же цели — определенная последовательность символов заменяется другим визуальным представлением, известным как «глиф».

  • лигатуры: замените/замените последовательность символов одной заменой глифа.
    Например, «ffi» (3 символа — 3 глифа) заменяется одним составным глифом «ffi» — в переводе на графический жаргон SVG: три отдельных пути заменяются одним составным путем. Стоит отметить: в браузерах все лигатуры мгновенно разбиваются на отдельные глифы, как только мы применяем собственный интервал между буквами. Просто потому, что мы не можем автоматически корректировать внутреннюю геометрию глифа, введенную лигатурным глифом (нам понадобится дополнительная логика для интерполяции данных пути «ffi», чтобы отреагировать на это изменение и сузить основы между «f-f-i»)
  • контекстные замены: на основе последовательности ввода символов можно заменять глифы... ну контекстуально. Основное отличие: мы заменяем последовательность символов несколькими глифами. Например, мы можем заменить последующие вхождения буквы «е», как в «Королеве», в соответствии с правилом замены, которое заменяет только второе вхождение буквы «е» альтернативным глифом. Другими словами, у нас нет «фиксированной» лигатуры «ee», а есть альтернативные глифы для «e». Может быть, даже 3 или более запасных.

Забавные факты: Хорошо, это ошибка!

Хотя я могу подтвердить, что вышеупомянутые обходные пути, такие как настраиваемый интервал между буквами, работают, некоторые из них не должны работать;)
По крайней мере, если бы определения функций opentype были идеально реализованы.

  • custom letter-spacing отключает все лигатуры – что может быть неприятно для многих языков с письмом справа налево, использующих такие лигатуры, как, например, арабский или фарси (особенно в сочетании с латинским текстом) – но на самом деле это не должно иметь значения, поскольку мы заменяем отдельные вводимые символы отдельными представлениями глифов.
  • Текущий проект W3C для элементов управления функциями открытого типа более высокого уровня вызывает сомнения font-variant-ligatures: contextual – это определенно не лигатурная функция.

дальнейшее чтение

Из документации Microsoft Opentype

Резюме для дизайнеров с сайта typenetwork.com

Ах, гений, интересно, сохраняется ли эта проблема в Chromium, когда для других шрифтов установлены контекстные альтернативы?

SyndRain 25.06.2024 20:04

Спасибо @herrstrietzel, это невероятно полезно. Я никогда раньше не слышал об этом и даже создавал свои собственные шрифты!

GeorgePorge 26.06.2024 08:35

@GeorgePorge: Честно говоря, я думаю, что эта довольно продвинутая функция открытого типа скорее является областью использования надписей в комиксах / графических романах - чтобы избежать явно искусственного внешнего вида при отображении двух одинаковых букв в последовательности. При использовании веб-шрифтов вы обычно стараетесь сделать сложность шрифта и размер файла как можно меньшими. Поэтому я думаю, что конфликты с другими веб-шрифтами встречаются довольно редко — просто потому, что не так много шрифтов, использующих эту функцию. Если только вы не смешиваете несколько «рукописных» шрифтов с контекстными альтернативами…

herrstrietzel 27.06.2024 03:33

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