Текст над строкой
Простые задачи в CSS часто имеют не самые очевидные решения. С одним таким случаем мне пришлось недавно столкнуться. Задача была очень простой — добавить на сайт знак ®.
Задача
В отличие от знака торговой марки ™, знак ® не поднят над строкой. Тем не менее, общепринятая практика — располагать его таким же образом, чуть уменьшив в размере.
В HTML есть подходящий элемент — <sup>
. По умолчанию, у него есть нужные CSS-свойства: vertical-align:super
и font-size:smaller
.
<sup>®</sup>
Супер!
В идеальном мире история на этом должна закончиться. В реальности все только начинается.
По условиям задачи знак может находиться практически в любом месте сайта: в основном тексте, заголовках, в элементах интерфейса, и важный момент — внутри ссылок. Это означает, что верстка должна быть гибкой. HTML-код должен быть универсальным, а CSS-стили не должны зависеть от контекста.
Проблема
То, что тег <sup>
со стилями по умолчанию не является решением стало понятно сразу.
Наличие выравнивания vertical-align:super
приводит к увеличению высоты строки, и к скачущему интерлиньяжу. А font-size:smaller
— не самый надежный способ уменьшить размер текста относительно контекста. Реальное значение будет зависеть от контекста не напрямую, а будет вычислено с оглядкой на таблицу абсолютных значений согласно спецификации. В целом браузеры справляются, хотя и по-разному, но есть и исключения. Где-то кегль будет уменьшен недостаточно, а где-то слишком сильно. Привет, IE.
Кроме того, Webkit-браузеры разрывают стандартное подчеркивание (text-decoration: underline
), встретив vertical-align:super
внутри строки (на самом деле не поэтому, но как один из случаев). Не знаю логичное это поведение или нет, но ссылка с разорванным подчеркиванием выглядит уродливо.
Уменьшить текст, выровнять его по вертикали и оставить подчеркивание на месте — эти задачи легко решаются, по отдельности. Проблема — совместить решения друг с другом.
Нагуглить готовое решение не получилось. Неплохая попытка — https://gist.github.com/unruthless/413930, но не решена проблема с подчеркиванием. Обращу внимание на хороший комментарий со ссылкой на тест-кейсы для разных знаков.
Решение
Если подстроке задать вертикальное выравнивание не по базовой линии, изменить размер шрифта, или задать позиционирование со смещением, то подчеркивание внутри строки сломается. И это не исправить.
Имитировать text-decoration:underline
другими CSS-свойствами в общем случае невозможно. Толщина и положение линии подчеркивания зависят от шрифтовой гарнитуры, кегля, браузера, ОС и режима масштабирования.
Стандартное подчеркивание необходимо сохранить, а значит сокращается набор средств для уменьшения и позиционирования текста над строкой.
Суть решения
Стилизовать не элемент
<sup>
, а псевдо-элемент с таким же содержимым.Содержимое псевдо-элемента (свойство
content
) задать черезdata
-атрибут. Так дублирование контента будет независимым от CSS и приемлимым с точки зрения HTML-семантики.Добавить обертку и назначить псевдо-элемент на нее. Это нужно, чтобы спрятать оригинальное содержимое с помощью
color:transparent
, тем самым, оставив его в потоке и резервируя место под стилизованный псевдо-элемент.Заменить
sup
наspan
. (опционально) Объяснение ниже.- Добавить
слезы единорогапробел нулевой длины (опционально). Объяснение ниже.
DEMO
Чистое решение.
Сравнение с эталонами — показывает ход решения.
Тестирование решения на разных кеглях.
Детали
Span vs. sup
В IE нельзя задать для sup
размер шрифта. Серьезно. IE лучше знает как нужно — тест. Плохо это тем, что ширина площадки, которая резервируется оригинальным содержимым, в IE будет меньше, чем в других браузерах. Для знака ® можно заменить <sup>
на <span>
, но это недопустимо в других случаях, когда важно сохранить семантику: цифры сносок, степень числа и т.д.
Магические числа vs. font-size:smaller
Font-size:smaller по-разному вычисляется в браузерах, поэтому трудно подобрать компенсирующее смещение для резервирующей площадки.
Магические числа зависят только от ширины гарнитуры. Для распространенных системных шрифтов эти числа колеблются около 0.75em для кегля и 0.25em для смещения.
Для меня вариант с магическими числами был проще, так как их требовалось подобрать только для одной гарнитуры.
Zero-width space. WTF?
В Webkit-браузерах найден странный баг.
Если подчеркнутому тексту задать смену цвета по наведению, и тексту, используя внутреннюю обертку, поменять цвет, то по наведению цвет подчеркивания не меняется.
Проще это увидеть. Тест.
Устранить баг получается, только добавлением текста непосредственно внутрь DOM-узла с подчеркиванием. Пробел нулевой длины подходит для этого лучше остальных символов.
Хаки для старых IE
В IE8 не работает color:transparent
, вместо него можно безопасно использовать visibility:hidden
Для IE7 можно написать экспрешны для before и для color:inherit или упростить стили.
Кроссбраузерность
Решение кроссбраузерное. Тестировалось в:
- Internet Explorer 8-11
- Opera 12.16
- Mozilla Firefox 33 и 3.6.*
- Google Chrome 39
- Yandex Browser 14
- Safari 8
Использовались Windows, Linux и OS X (лень расписывать соответствие версиям браузеров).
Недостатки решения
Некрасивое выделение текста — при выделении оригинальный текст перестает быть прозрачным. Этого не видно в OS X, но заметно в Linux и Windows. Эффект можно ослабить, добавив
::selection {background:transparent}
на оригинальный контент. Он исчезнет, но при этом прервется выделение.В IE псевдо-элемент копируется вместе с остальным текстом. Во всех браузерах кроме IE контент псевдо-элементов не выделяется и не копируется. В IE иначе, псевдо-элемент выделяется и визуально все хорошо, но при вставке скопированного текста, в нем будут и оригинальный контент и контент псевдо-элемента.
Нулевой пробел копируется вместе с остальным текстом. Мне трудно оценить негативные последствия, но ясно, что если они есть, то пользователю будет сложно определить их причину.
В старых IE подчеркивание дублируется и поднимается вместе с текстом.
Для некрофилов замечу, что в IE6 пробел нулевой длины заменяется на нераспознанный символ.
Итог
Решение получилось достаточно гибким и кроссбраузерным. Трюк с псевдо-элементом не самый оригинальный, но применительно к задаче, оброс нюансами.
BTW
Во время работы над задачей родился пример использования несуществующего селектора ::last-letter.
С помощью него было бы удобно убирать нижнее подчеркивание для последнего знака над строкой. Но ребята из W3C уже давно решили, что этому не бывать.P.S.
@lerarunge:
— Если ты встаешь на путь извращений, ты должен быть готов идти до конца — говорит один фронтендер другому, глядя в код
Как через CSS убрать подчеркивание ссылок? Пособие для новичка :: SYL.ru
Как вписать в свой гардероб наряды с контрастной строчкой — хит нового сезона Лоферы больше не в моде, а им на смену пришли балетки: идеи стильных образов Носим тренд девяностых. Зачем модницы выпускают пряди из пучка Цветной френч — хит конца весны: самые модные оттенки трендового маникюра Использовать самую обычную тушь: хитрости возрастного макияжа На пользу. Как правильно принимать душ, чтобы не сушить кожу Выкапывать, делить или не трогать? Как ухаживать за нарциссами,когда они отцвелиАвтор Максим Островский
Язык оформления веб-страницы CSS кажется обманчиво легким для понимания и использования, из-за чего каждый начинающий веб-разработчик торопится вперед на амбразуру, зачастую не выучив досконально структуру и фундамент этого языка разметки.
Это и неудивительно, ведь каскадные таблицы стилей позволяют оформить веб-страницу, просто перечислив необходимые ее свойства, которые можно на раз-два скопировать с учебника.Проблемы начинаются, когда такой веб-мастер сталкивается с чужим кодом, теряется в нем и не понимает принципы взаимодействия элементов на странице. Из-за попыток манипулировать кодом, страница начинает выглядеть хаотично, топорно, будто ее сверстали на заре Интернета в 90-х годах — все ссылки синие или фиолетовые, а также имеют ужасно устаревшее в плане дизайна подчеркивание. Вот эту проблему мы с вами и научимся решать быстро и просто, используя правильные селекторы и объявления значений.
Инструкция: как в CSS убрать подчеркивание ссылок
За подчеркивание текста отвечает свойство text-decoration. Чтобы полностью убрать нижнее подчеркивание ссылки CSS на странице, мы можем использовать один из следующих способов:
- непосредственно к тегу ссылки в HTML назначить атрибут style, в котором прописать: text-decoration: none;
- назначить ссылке id и применить к нему аналогичные свойства;
- чтобы убрать подчеркивание ссылок CSS для нескольких элементов, необходимо присвоить им класс атрибутом class и прописать такое же свойство, как и для одиночной ссылки.
Помимо всего прочего, есть способ в CSS убрать подчеркивание ссылок на всей странице, для этого необходимо использовать следующий синтаксис:
- a {text-decoration: none;}.
Подводные камни при работе в CSS со ссылками
Когда дело доходит до изменения вида элементов поля какого-либо действия, для разработчика без опыта все становится еще сложнее. Но не стоит отчаиваться, решение такое же простое и элегантное, как и в предыдущем случае со стандартным видом элемента.
Ссылки очень привередливы в плане управления ими через CSS. Например, интуитивно кажется, что если установить цвет текста для абзаца красным, то и ссылка в нем должна быть красной — но не тут то было. К каждой ссылке нужен «индивидуальный» подход, а если выражаться более технически точно — сначала в CSS мы должны указать либо id, либо class, либо селектор «a» в виде его местоположения в веб-документе, для которого мы хотим задать свойства. Если свойства прописывать просто для тега «a», то это определит базовые стили ссылок на странице, которые можно переназначить для отдельных элементов на странице с помощью CSS.
Убрать подчеркивание ссылок при наведении — просто, но не очевидно
Что мы имеем в виду, говоря о наведении на ссылку? С технической точки зрения, это является псевдоклассом селектора и определяет его состояние на данный момент. Разнообразие псевдоклассов и их функционал обширные настолько, что им можно выделить отдельную статью, а сейчас нас интересует лишь один псевдокласс — hover. Именно он отвечает за поведение ссылки (или любого другого HTML-тега) при наведении. Теперь, понимая структуру процесса обработки браузером вашего кода, можете использовать данный пример:
- a: hover {text-decoration: none}.
Остальные псевдоклассы и работу с ними вы сможете изучить самостоятельно, используя справочники и учебники по CSS, а вот для того чтобы работать с подчеркиванием ссылок в полной мере, этой статьи достаточно.
Похожие статьи
- Фолликулостимулирующий гормон: нормы и отклонения
- Возврат товара надлежащего качества: когда это возможно?
- Увеличенный лимфоузел под мышкой? Причины и лечение
- Перец чили маринованный. Перец чили на зиму: рецепты
- Кал со слизью — один из первых симптомов неспецифического язвенного колита
- Возврат товара в течение 14 дней по всем правилам закона
- Как стать красивой в домашних условиях? Секреты женской красоты
Также читайте
underline-offset — CSS: Каскадные таблицы стилей
Свойство CSS text-underline-offset
задает расстояние смещения линии оформления подчеркивания текста (применяется с использованием text-decoration
) от исходного положения.
text-underline-offset
не является частью сокращения text-decoration
. В то время как элемент может иметь несколько строк text-decoration
, text-underline-offset
влияет только на подчеркивание и вместо другие возможные варианты оформления строки, такие как поверх линии
или сквозная линия
.
Синтаксис
/* Одно ключевое слово */ смещение подчеркивания текста: авто; /* длина */ смещение подчеркивания текста: 0,1 em; смещение подчеркивания текста: 3 пикселя; /* процент */ смещение подчеркивания текста: 20%; /* Глобальные значения */ смещение текста-подчеркивания: наследовать; смещение подчеркивания текста: начальное; смещение подчеркивания текста: не установлено;
Свойство text-underline-offset
указывается как одно значение из списка ниже.
Значения
-
авто
- Браузер выбирает подходящее смещение для подчеркивания.
-
<длина>
- Указывает смещение подчеркивания как
em
, чтобы смещение масштабировалось вместе с размером шрифта. -
<процент>
- Указывает смещение подчеркивания как
<процент>
из 1 em в шрифте элемента. Процент наследуется как относительное значение и, следовательно, масштабируется при изменении шрифта. Для данного применения этого свойства смещение является постоянным для всего поля, к которому применяется подчеркивание, даже если есть дочерние элементы с разными размерами шрифта или выравниванием по вертикали.
Формальное определение
Начальное значение | авто |
---|---|
Относится ко всем элементам | . Это также относится к ::first-letter и ::first-line . |
Унаследовано | да |
Проценты | относятся к размеру шрифта самого элемента |
Вычисленное значение 9007 0 | как указано |
Тип анимации | по типу вычисляемого значения |
Формальный синтаксис
авто | <длина> | <процент>
Примеры
Вот текст со смещенным волнистым красным подчеркиванием!
В этом тексте есть строки как сверху, так и снизу. Смещен только нижний.
р { оформление текста: подчеркивание волнистым красным цветом; смещение подчеркивания текста: 1em; } .twolines { цвет оформления текста: фиолетовый; text-decoration-line: подчеркивание над чертой; }
Технические характеристики
Спецификация | Статус | Комментарий |
---|---|---|
Модуль оформления текста CSS, уровень 4 Определение ‘text-underline-offset’ в этой спецификации. | Рабочий проект | Исходное определение. |
Совместимость с браузером
Таблица совместимости на этой странице создана на основе структурированных данных. Если вы хотите внести свой вклад в данные, посетите https://github.com/mdn/browser-compat-data и отправьте нам запрос на включение.
Настольный | Мобильный | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|
Chrome | Edge | Firefox | Internet Explorer | Opera | Safari | Веб-просмотр Android | Chrome для Android | Firefox для Android | Opera для Android | Safari на iOS | Samsung Internet | |
text-underline-offset | Chrome Без поддержки № | Край Без поддержки № | Firefox Полная поддержка 70
| ИЭ Без поддержки № | Опера Без поддержки № | Сафари Полная поддержка 12.1 | Веб-просмотр Android Без поддержки № | Chrome Android Без поддержки № | Firefox Android Без поддержки № | Opera Android Без поддержки № | Safari iOS Полная поддержка 12,2 | Самсунг Интернет Android Без поддержки № |
Процентное значение | Хром Без поддержки № | Край Без поддержки № | Firefox Полная поддержка 74 | ИЭ Без поддержки № | Опера Без поддержки № | Сафари Без поддержки № | WebView Android Без поддержки № | Chrome Android Без поддержки № | Firefox Android Без поддержки № | Опера Android Без поддержки № | Safari iOS Без поддержки № | Samsung Интернет Android Без поддержки № |
Легенда
- Полная поддержка
- Полная опора
- Без поддержки
- Нет поддержки
- Пользователь должен явно включить эту функцию.
- Пользователь должен явно включить эту функцию.
См. также
-
украшение текста
-
толщина оформления текста
css — Управление положением подчеркивания в оформлении текста: подчеркивание
спросил
Изменено 2 месяца назад
Просмотрено 110 тысяч раз
Есть ли способ управлять положением подчеркивания в text-decoration: underline?
Пример ссылки
В приведенном выше примере по умолчанию используется подчеркивание… есть ли способ сдвинуть это подчеркивание на несколько пикселей вниз, чтобы между текстом и подчеркиванием было больше места?
- css
- подчеркивание
2020
Используйте text-underline-offset
!
2012
Единственный способ сделать это — использовать границу вместо подчеркивания. Подчеркивания общеизвестно негибки.
а { нижняя граница: 1px сплошной currentColor; /* Или любой другой цвет */ текстовое оформление: нет; }
Вот демо. Если этого места недостаточно, вы можете легко добавить больше — если слишком много, это немного менее удобно.
6 Вы можете использовать псевдо до и после вот так. Он хорошо работает и полностью настраивается.УСБ
р { высота строки: 1,6; } .подчеркнуть { текстовое оформление: нет; положение: родственник; } .подчеркивание: после { положение: абсолютное; высота: 1 пиксель; поле: 0 авто; содержание: ''; слева: 0; справа: 0; ширина: 90%; цвет: #000; цвет фона: красный; слева: 0; внизу: -3px; /* настроить это для перемещения вверх и вниз. вам, возможно, придется отрегулировать высоту строки абзаца, если вы сильно сместите его вниз. */ }
HTML
Это пример текста. На этой странице вы можете прочитать дополнительный текст или посетить книжный магазин, чтобы прочитать пример текста позже.
Вот более продвинутая демонстрация с прикрепленным снимком экрана, который я сделал, анимирует подчеркивание на . зависание, изменение цвета и т.д…
http://codepen.io/bootstrapped/details/yJqbPa/
4 Существует предлагаемое свойство text-underline-position
в CSS 3, но, похоже, оно еще не реализовано ни в одном браузере.
Таким образом, вам нужно будет использовать обходной путь подавления подчеркивания и добавления нижней границы, как это предлагается в других ответах.
Обратите внимание, что подчеркивание не добавляется к общей высоте элемента, в отличие от нижней границы. В некоторых ситуациях вы можете использовать layout-bottom
, который не добавляется к общей высоте (хотя он не так широко поддерживается, как border-bottom
).
Существует свойство text-underline-offset
в модуле оформления текста CSS уровня 4, которое позволяет перемещать оформление на указанное расстояние от его исходного положения.
Поддерживается в Safari 12.1+, Firefox 70+ и Chrome 87+ (выпущено 17 ноября 2020 г.).
text-underline-offset
свойство принимает следующие значения:
-
auto
— по умолчанию, заставляет браузер выбрать соответствующее смещение. -
from-font
— если используемый шрифт указывает предпочтительное смещение, используйте его, в противном случае он возвращается кauto
. -
em
, чтобы обеспечить пропорциональное масштабирование с размером шрифта
Пример ниже:
p { оформление текста: подчеркивание; цвет оформления текста: красный; нижняя граница: 1. 5em; } р.тест { положение: родственник; } p.test::после { положение: абсолютное; содержание: ''; дисплей: блок; высота: 1 пиксель; ширина: 100%; фон: синий; внизу: 0; }
2Если вы видите наше красное подчеркивание под синей линией, это свойство работает в вашем браузере.
А теперь давайте попробуем это с `text-underline-offset`, установленным на `auto`.
С `text-underline-offset`, установленным в `from-font`, это, вероятно, выглядит так же, как и выше.
вы можете использовать text-underline-position: under;
<тело><а href="#" > Моя ссылка