Статьи

Свойства CSS для управления веб-типографикой

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

Однако сеть как средство общения имеет свои особенности. Настолько, что мы склонны думать, что плавный переход от печатной формы к веб-типографии — сложный вызов. В своей книге « Типография в Интернете» , с. 110, Джейсон Санта Мария объясняет:

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

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

… Может создать у нас впечатление, что тип слишком маленький, другие могут заставить нас пропустить что-то важное за кадром, а третьи могут сделать просмотр веб-страницы практически невозможным.

Тем не менее, верно и то, что «Интернет — лучшее место для текста», как утверждает Тим ​​Браун в своем выступлении на Universal Typography . Текст в Интернете можно «искать, копировать, переводить, связывать с другими документами, его можно распечатать, это удобно, он доступен».

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

Для управления отображением текста в Интернете наш основной инструмент выбора — CSS.

Свойства CSS, которые я собираюсь представить в этом посте, можно найти в спецификации CSS Text Module .

Этот модуль описывает элементы управления версткой CSS; это
особенности CSS, которые контролируют перевод исходного текста в
форматированный текст с переносом строк.

Другими словами, текстовый модуль CSS работает с отображением символов и слов в браузере, а также с тем, как они располагаются, выравниваются, переносятся и т. Д. С использованием CSS.

То, что составляет основную единицу текста или слова, а также где именно слово может быть разбито в данном фрагменте текста, в значительной степени зависит от правил языка, используемого на веб-сайте. По этой причине важно объявить эту информацию в документе HTML (обычно в атрибуте lang элемента <html> ).

Здесь я не буду обсуждать следующие две темы:

  • шрифты, то есть визуальные представления символов , то есть глифы, и их свойства;
  • особенности CSS, связанные с оформлением текста, такие как подчеркивание, тени текста и метки выделения.

Если вам интересно, вы можете найти последнюю документацию о шрифтах и ​​свойствах оформления текста в модуле шрифтов CSS уровня 3 и модуле оформления текста CSS уровня 3 соответственно.

Манипуляции с буквами

Могут быть случаи, когда текстовые элементы должны отображаться заглавными буквами, например, имя и фамилия. CSS дает нам контроль над регистром букв с помощью свойства text-transform .

Значением по умолчанию для свойства text-transform является none , то есть не влияет на регистр букв.

Значение с capitalize

Если вы хотите, чтобы первая буква каждого слова отображалась в верхнем регистре, при этом внешний вид всех других букв не изменялся (независимо от их регистра в HTML-документе), использование значения capitalize даст следующее:

HTML:

 <h2>alice's adventures in wonderland</h2> 

CSS:

 h2 { text-transform: capitalize; } 

пример преобразования текста в заглавные буквы

Обратите внимание, что capitalize не соответствуют соглашениям о capitalize : на самом деле все первые буквы в вышеприведенном примере выглядят заглавными, включая слово «in». Авторам, намеревающимся следовать литературному соглашению о названиях, нужно будет вручную манипулировать буквами в исходном тексте.

Значение в uppercase

Если ваша цель состоит в том, чтобы все буквы отображались заглавными буквами, независимо от их регистра в HTML-документе, uppercase являются подходящим значением для использования:

HTML:

 <h2>alice's adventures in wonderland</h2> 

CSS:

 h2 { text-transform: uppercase; } 

пример преобразования текста в верхний регистр

Значение в lowercase

Использование значения в lowercase приведет к тому, что все буквы будут отображаться в нижнем регистре. Естественно, это не повлияет на вид букв, которые уже являются строчными в исходном исходном документе.

HTML:

 <h2>Alice's Adventures in Wonderland</h2> 

CSS:

 h2 { text-transform: lowercase; } 

Пример преобразования текста в нижний регистр

Значение full-width

Спецификация добавила новое значение, во full-width . Это значение заставляет символ появляться внутри квадрата, как если бы он был идеографическим символом, например, японским, китайским и т. Д. Это облегчает выравнивание латинских символов с идеографическими символами.

Не все символы имеют соответствующую форму полной ширины, в этом случае символы не будут затронуты значением full-width .

HTML:

 <h2>Alice's Adventures in Wonderland</h2> 

CSS:

 h2 { text-transform: full-width; } 

Вот как выглядят символы в Firefox при применении full-width :

пример преобразования текста во всю ширину

Дальнейшие замечания

Браузерная поддержка свойства text-transform превосходна. Фактически, все главные браузеры поддерживают это.

Единственным исключением является значение full-width , которое в настоящее время работает только в Firefox. Возможно, понятно, учитывая вероятность того, что full-width может быть отброшена на этапе спецификации кандидата в спецификации.

Кроме того, я заметил небольшое несоответствие между Firefox (v.39) и другими основными браузерами при отображении значения capitalize в слове дефиса.

Вот как это выглядит в Firefox:

первая буква после символа дефиса не превращается в верхний регистр в Firefox при применении значения заглавных букв

Обратите внимание, что первая буква после дефиса не пишется с большой буквы. С другой стороны, ниже тот же текст отображается в Chrome:

первая буква после символа дефиса превращается в верхний регистр в Chrome и во всех других основных браузерах при применении значения заглавных букв

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

Наконец, обратите внимание на каскад! Если вы установите свойство text-transform для элемента контейнера, его значение наследуется всеми его дочерними элементами. Чтобы избежать нежелательных результатов, сбросьте значение свойства text-transform дочерних элементов на none .

Просмотрите демонстрацию для значений свойства text-transform .

Как обращаться с пробелами

Когда вы нажимаете клавишу Tab, клавишу пробела или заставляете какой-то текст переходить на следующую строку (используя клавишу ENTER или тег <br> ), вы создаете пробел в исходном документе.

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

Однако что, если это не ваша цель? Допустим, например, что вы хотите сохранить пустое пространство, которое вы создаете в документе HTML. Распространенный сценарий — когда вы пишете какой-то текст, предназначенный для отображения в виде правильно выделенного фрагмента кода. Или вы хотите, чтобы какой-то текст отображался в одну строку без разрывов.

В таких случаях, когда вы намереваетесь переопределить поведение браузера по умолчанию, свойство white-space предлагает несколько интересных опций.

Ключевое слово normal сбрасывает браузер к его поведению по умолчанию: все лишние пробелы свернуты в один символ и строки переносятся, когда они достигают края своего контейнера.

pre значение

Ключевое слово pre позволяет отображать текст, сохраняя все пробелы и заставляя новые строки присутствовать в исходном документе. Текст не будет перенесен на новую строку при переполнении контейнера.

 element { white-space: pre; } 

Пример пробела с предварительным ключевым словом

Пример исходного кода в стиле с ключевым словом pre свойства white-space

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

 element { white-space: pre; -moz-tab-size: 4; -o-tab-size: 4; tab-size: 4; } 

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

Значение pre-wrap

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

Ключевое слово pre-wrap поможет вам достичь желаемого результата.

 element { white-space: pre-wrap; } 

Обратите внимание, что каждая строка, отображаемая в браузере, отражает вынужденные разрывы в исходном коде, хотя в контейнере достаточно места для размещения большего количества текста:

Пример ключевого слова перед переносом для свойства пробела

Исходный код в стиле с ключевым словом pre-wrap свойства white-space

Однако уменьшите размер экрана браузера, и вы заметите, что строки переносятся в соответствии с их контейнером.

Небольшой экранный текст, отформатированный с помощью ключевого слова pre-wrap свойства white-space

Значение pre-line

Последнее интересное значение для свойства white-spacepre-line . В той степени, в которой он сворачивает последовательности пространства в одно пространство и допускает перенос, он ведет себя как normal . Однако, если в HTML-документе присутствует символ новой строки или тег <br> , они сохраняются на дисплее браузера.

 element { white-space: pre-line; } 

Пример текста, отформатированного с ключевым словом pre-line свойства пробела

Исходный код примера для ключевого слова pre-line свойства пробела

Попробуйте демонстрацию CodePen для ключевых слов pre , pre-wrap и pre-line .

Значение nowrap

nowrap , пожалуй, самое известное значение white-space . Требует ли ваш дизайн, чтобы часть встроенного содержимого никогда не оборачивалась? Использование white-space: nowrap; на вашей стихии делает свое дело.

Луи Лазарис указывает на следующий вариант использования этого значения.

Ссылка с символом двойной стрелки в качестве прецедента для значения nowrap свойства пробела

Выше ссылка, сопровождаемая символом ». Перенос этого символа на следующую строку, например, в жидких веб-макетах, нежелателен.

Ссылка с символом двойной стрелки неприлично сброшена на следующую строку

В этом и подобных обстоятельствах (например, nowrap значение nowrap очень удобно.

Сара Соуэйдан представила нам еще один интересный пример использования в справочнике Codrops CSS . Сара отмечает, что свойство white-space можно применять к любому встроенному контенту, включая изображения.

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

Я расширил это предложение, создав базовую карусель jQuery с использованием white-space: nowrap . Вот демо:

Взять под контроль разрывы строк внутри слов

Иногда случается, что дизайн выглядит не так, потому что длинное слово не может быть перенесено на следующую строку, что приводит к переполнению контейнера. Длинные URL-адреса или некоторые сгенерированные пользователем длинные слова в комментариях блога являются распространенными сценариями.

Следующие свойства CSS предназначены для того, чтобы дать нам некоторую степень контроля над обработкой длинных слов в Интернете.

Свойство word-wrap/overflow-wrap

Свойство overflow-wrap (ранее называвшееся word-wrap , полностью поддерживается и работает во всех основных браузерах по устаревшим причинам) вступает в силу, если свойство white-space допускает перенос текста. Может иметь одно из двух значений: normal и break-word .

Используя normal значение, слова разбиваются в допустимых точках разрыва, например, пробелы, дефисы и т. Д.

Значение break-word допускает произвольные точки разрыва внутри слова, если строка не может быть иначе разбита в какой-либо другой приемлемой точке.

На рисунке ниже показано отображение длинного слова, которое переполняет его контейнер:

Пример длинного слова, переполняющего его контейнер

Давайте установим свойство overflow-wrap , а также, для унаследованных целей, свойство word-wrap в значение break-word :

 element { word-wrap: break-word; overflow-wrap: break-word; } 

… и отображение длинного слова теперь разбито на несколько строк, чтобы соответствовать доступному пространству.

перенос слов со значением брейка

Свойство hyphens

Разбивать длинные слова — это хорошо. Однако полученный текст может сбить с толку читателей. Лучший вариант — переносить слово, когда оно переносится на следующую строку. Таким образом, читателям сразу станет понятно, что они смотрят на одно слово, заключенное в несколько строк. Чтобы достичь этого, CSS предлагает свойство hyphens , которое вы можете использовать вместе с word-wrap: break-word .

Более конкретно, auto значение свойства hyphens позволяет отображать дефис в точке, где слова переносятся на следующую строку, если языковые правила документа разрешают это, или в источнике HTML присутствуют дефисы. Чтобы это работало, убедитесь, что вы установили атрибут lang на нужный язык в HTML-документе:

 .break-word.hyphens-auto { -moz-hyphens: auto; -webkit-hyphens: auto; -ms-hyphens: auto; hyphens: auto; } 

автоматическое отображение в браузере дефисов

Вы также можете запретить отображение дефисных символов. В этом случае установите для свойства hyphens значение none :

 .break-word.hyphens-none { -moz-hyphens: none; -webkit-hyphens: none; -ms-hyphens: none; hyphens: none; } 

дефис ни один браузер

Кроме того, вы можете отображать дефисные символы на разрывах строк в словах, если слова размечены в разметке и текст переносится на следующую строку. Это сделано со значением manual :

 .break-word.hyphens-manual { -moz-hyphens: manual; -webkit-hyphens: manual; -ms-hyphens: manual; hyphens: manual; } 

дефисы, установленные вручную: отображение в браузере

Исходный код с дефисами, установленными на ручное ключевое слово

Благодаря префиксам поставщиков поддержка браузером свойства hyphens хороша во всех основных браузерах, хотя и не без незначительных несоответствий. Последние версии Chrome (v.44) и Opera (v.30) на момент написания статьи не поддерживают значение свойства auto .

Посмотрите приведенные выше примеры на CodePen

Манипулирование пространством между словами и буквами

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

CSS предлагает свойства word-spacing и letter-spacing для контроля внешнего вида между словами и буквами соответственно.

Свойство word-spacing

Ниже приведены значения свойства word-spacing:

  • normal
  • <length>
  • percentage

normal отображает пробел по умолчанию между буквами. Количество места зависит от используемого шрифта или браузера.

 .normal { word-spacing: normal; } 

<length> позволяет вам добавить интервал между словами в дополнение к интервалу по умолчанию, определенному шрифтом или браузером.

 .length { word-spacing: 0.5em; } 

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

 .percentage { word-spacing: 1%; } 

межсловные значения нормальной и длины

Свойство letter-spacing

Вы можете установить для свойства letter-spacing одно из двух значений: normal или <length> .

Использование normal оставляет интервал шрифта по умолчанию между буквами. Он также сбрасывает любую длину letter-spacing ранее указанную, по умолчанию. Например, если вы задаете значение letter-spacing 1em для родительского элемента, но хотите отобразить значение по умолчанию для дочерних элементов, normal — ваш друг.

 element { letter-spacing: normal; } 

значение межбуквенного интервала установлено на нормальное

Значение <length> представляет собой единицу измерения, например, px или ems, посредством чего вы можете увеличить интервал между буквами в дополнение к интервалу по умолчанию, уже предоставленному шрифтом.

 element { letter-spacing: 1em; } 

значение межбуквенного интервала установлено в 1em

Дальнейшие подробности

word-spacing словами применимо не только к словам. Вы можете использовать его для любого типа содержимого inline или inline-block.

Кроме того, вы можете анимировать как word-spacing и letter-spacing . Однако использование CSS-переходов на letter-spacing показывает, что normal значение не распознается текущей версией Firefox (v.39). Чтобы преодолеть это, просто замените normal на 0em .

Вот демоверсия с анимированным текстом с использованием word-spacing и letter-spacing :

Последние опции CSS для выравнивания текста

Свойство text-align существует уже некоторое время. Он управляет выравниванием встроенного содержимого, такого как текст и изображения, внутри контейнера блока. Kewords left и right выравнивают встроенный контент слева и справа соответственно. Установка text-align по center выравнивает содержимое по центру контейнера. Наконец, ключевое слово justify содержимое так, что каждая строка имеет одинаковую длину (за исключением последней строки, если она не достаточно длинна, чтобы достичь края своего контейнера).

Спецификация добавляет два новых значения, которые могут быть весьма полезны на интернационализированных веб-сайтах, использующих языковые системы справа налево (RTL): start и end .

Для читателей слева направо (LTR) они соответствуют left и right соответственно. Когда веб-сайт использует язык RTL, start соответствует right а end соответствует left .

 element { text-align: start; } 

начальное значение свойства text-align

 element { text-align: end; } 

конечное значение свойства text-align

Применение text-align: match-parent к встроенному дочернему элементу гарантирует, что дочерний объект наследует то же выравнивание, что и родительский. Унаследованное start или end значение рассчитывается в зависимости от направления языка родителя, что приводит к выводу либо left либо right .

Свойство text-align-last

Новым в CSS является также свойство text-align-last . Это свойство контролирует выравнивание последней строки выровненного текста перед концом абзаца или перед тегом <br> . Он имеет те же значения ключевых слов, что и text-align , за исключением auto , который является значением по умолчанию. Значение auto позволяет выравнивать последнюю строку текста в соответствии со значением свойства text-align элемента, если оно установлено. Если свойство text-align не применяется, текст по умолчанию имеет значение start .

На момент написания, поддержка браузером text-align-last довольно слабая. Поэтому, по моему мнению, его следует использовать с осторожностью, если вообще.

Посмотреть демонстрацию CodePen, демонстрирующую эти функции в действии

Отступ текста

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

Тем не менее, отступ первой строки абзаца иногда используется для создания классического вида, подходящего для конкретных дизайнов.

Отступ в первой строке абзаца

Если ваш дизайн улучшен с помощью этой техники, CSS предлагает свойство text-indent . Давайте рассмотрим возможные значения.

Значение length обычно задается в единицах px или em:

 element { text-indent: 2em; } 

Процент устанавливается с использованием процентного значения:

 element { text-indent: 6%; } 

Значение each-line внешний вид первой строки внутри контейнера блока, а также каждой строки после принудительного разрыва строки, то есть разрыва строки, вызванного нажатием клавиши ввода или вставкой тега <br> в HTML источник. Однако отображение первой строки после мягкого переноса, то есть текста, который переносится на следующую строку, чтобы соответствовать его контейнеру, не изменяется.

При значении hanging все строки, кроме первой, отображаются с отступом.

Значения each-line и hanging являются экспериментальными значениями, еще не реализованными ни в одном браузере на момент написания.

Просмотрите эту демонстрацию, чтобы увидеть текстовый отступ в действии

Вывод

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

В этом посте я рассмотрел ряд свойств CSS, которые управляют форматированием, переносом строк и выравниванием текста в Интернете. Не стесняйтесь экспериментировать с этими примерами.

Я с нетерпением жду ваших отзывов!