В недавнем дайджесте со свежими материалами из мира фронтенда увидел подборку способов подчеркивания в CSS.

Странно, что в такой хорошей подборке не указан простой способ с использованием псевдокласса :after.



Плюсы такого способа:
+ Простота использования;
+ Широкие возможности по настройкам (позиционирование, стиль, толщина, цвет линии);
+ Работает на любом фоне;
+ Не зависит от изменения масштаба (если текст при этом остается однострочным)

Минусы:
— Не подходит для подчеркивания многострочного текста;

Возможно есть еще какие-то минусы. Буду благодарен за подсказки.

<span class='inline-block decorated-link'>Ссылка в спане с {display: inline-block;} </span>
<br>
<br>
<a href='#' class='decorated-link'>Обычная ссылка</a>


.decorated-link {
    color: #337ab7;
    position: relative;
    text-decoration: none;
    cursor: pointer;
}

.decorated-link:hover {
    text-decoration: none;
    color: red;
}

.decorated-link:after {
    content: '';
    position: absolute;
    right: 0;
    left: 0;
    bottom: 1px;
    width: 100%;
    border-bottom: thin dashed rgba(51, 122, 181, 0.4);
}

.decorated-link:hover:after {
    border-color: rgba(255, 0, 0, 0.3);;
}

a.decorated-link:after {
    bottom: 0;
}

.inline-block {
    display: inline-block;
}
Поделиться с друзьями
-->

Комментарии (20)


  1. M-A-XG
    19.10.2016 13:41

    А зачем :after?
    Можно просто использовать
    border-bottom: 1px dashed;


    1. artemt
      19.10.2016 14:28

      Можно трансформации какие-нибудь накрутить при наведении, например


  1. everythingispossible
    19.10.2016 13:51
    +2

    Бывает нужно изменить позиционирование линии (сделать выше/ниже) относительно текста.


    1. lifecom
      19.10.2016 15:54

      padding-bottom не?


      1. everythingispossible
        19.10.2016 18:26
        +1

        не


    1. Aingis
      19.10.2016 16:02

      line-height меняете и она прекрасно настраивается.


      1. everythingispossible
        19.10.2016 18:45

        У меня не получилось сделать это с помощью line-height.

        Подскажите на этом примере:
        Какое значение и где задать line-height, чтобы вторая ссылка стала выглядеть, как первая?


      1. dom1n1k
        19.10.2016 19:03

        line-height нельзя просто так произвольно менять ради подчеркивания


    1. Riateche
      20.10.2016 15:23

      Можно просто bottom менять: https://jsfiddle.net/qw5h82qp/7/


  1. muxa_ru
    19.10.2016 14:31

    Визуальной разницы в примерах не вижу.

    Это так и должно быть?


    1. everythingispossible
      19.10.2016 14:48

      Да, так и должно быть.

      Значение отступа bottom для обычной ссылки и интерфейсной ссылки-кнопки (текст в элементе span) должны немного различаться, чтобы расстояние между линией и текстом было одинаковым.

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


  1. alexkunin
    19.10.2016 17:31
    +2

    Минусы:
    — Не подходит для подчеркивания многострочного текста;
    Так это ж и есть та единственная киллер-антифича, которая все плюсы перечеркивает. Очень редко можно быть на 100% уверенным, что текст ссылки не будет разбит из-за переноса. Случайное или намеренное увеличение контента средствами браузера, или размер окна слишком маленький, или локализация («save as» vs «сохранить как» — почти в 2 раза длиннее) — и все, получаем какой-то визуальный шум. А если паранойя придавит, то еще и неподгрузившиеся стили будут вам портить жизнь.

    Но как еще один способ с оговорками — имеет право на жизнь, конечно же. Забрал в копилку, спасибо.


    1. EvilPartisan
      19.10.2016 22:45

      Прием оформления используется тысячу лет, а какого нибудь «text-decoration: dashed-underline» до сих пор не придумали.


      1. alexkunin
        19.10.2016 23:58

        Согласен. Было бы прикольно, если бы полностью всю маханику border перенесли на подчеркивание. Правда, наверняка это не делается потому, что подчеркивание рендерится как фича шрифта (шрифтозависимая фича, так сказать).


      1. Weks
        20.10.2016 09:56

        Существует свойство text-decoration-style, однако, увы, оно очень плохо поддерживается (caniuse).


        1. everythingispossible
          20.10.2016 10:52

          Самое неприятное даже не то, что text-decoration-style еще не вышел за рамки экспериментального функционала основных браузеров (и то не всех).

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

          Линия dashed на таком же расстоянии от текста, что и линия solid, смотрится уродливо:


    1. everythingispossible
      20.10.2016 11:06

      Этот способ я использую только для оформления интерфейсных кнопок-ссылок (не знаю, как это правильно называется). Текст в таких кнопках обычно короткий и тестирование на мобильных устройствах показывает, что все в порядке.

      Чтобы быть уверенным, что часть текста не перенесется на новую строку при изменении масштаба — можно использовать неразрывный пробел &nbsp:

      <span class='show-on-map-link'>Показать&nbspна&nbspкарте</span>
      


      1. alexkunin
        20.10.2016 13:51

        А лучше «white-space: nowrap» добавить прямо в класс ссылки — и нет мусора в хтмл (который еще нагенерить нужно, если текст приходит из конфига, базы или библиотеки локализации).

        Кстати, еще: ваш сайт может быть кем-то переведен каким-нибудь гуглом, и тогда никаких гарантий на длину текста в этих кнопках.


        1. everythingispossible
          20.10.2016 15:16

          С nowrap отличная идея, спасибо.


  1. netgoblin
    20.10.2016 00:19

    Используйте в качестве цвета для псевдоэлементов значение currentColor и будет вам счастье =)