Имитация градиентных заголовков на чистом CSS

25 ноября 2008 г.

Если вы периодически монитерите РУнет на предмет наличия статей о различных CSS-ных штучках, то вам наверняка попадалась техника создания заголовка с помощью обычного текста и одного полупрозрачного изображения-градиента в формате PNG.

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

1
<h1>Заголовок<b></b></h1>

Контейнер <b></b> позиционируется поверх текста и в его фон помещается полупрозрачный градиент, который закрывает текст наполовину.

Альтернатива

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
h1 {
  font: 32px Georgia, "Times New Roman";
  position: relative; /* обязательно */
  color: #0094D6;
  margin: 10px 0;
  padding: 0;
}
h1 b {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 23px;
  background: #FFF;
  overflow: hidden /* для проклятого IE6 */;
  opacity: 0.63;
  filter: alpha(opacity=63);
  -moz-opacity: 0.63;
}

Что мы сделали. Мы залили контейнер <b></b> белым цветом и придали ему прозрачности (последние 3 правила, для кроссбраузерности), при этом разместив его поверх заголовка так, чтобы закрыть текст примерно наполовину.

Как и обычно, IE6 “вставил нам палки в колеса”. Во-первых, из-за него пришлось дописывать дополнительное правило overflow: hidden, иначе полупрозрачный слой закрывает текст полностью, во-вторых, проклятый не понимает процентной высоты для слоя <b></b>, также закрывая текст полностью, поэтому пришлось задавать его высоту в пикселях.

Примеры

Смотрим живые примеры (если в своей RSS-читалке вы наблюдаете просто заголовки, то перейдите на блог):

Это псевдо-градиентный заголовок

Еще один красивый заголовочек

Ну и последний за компанию

Согласитесь, красиво? Я считаю, ради красивости семантикой в данном случае можно и пожертвовать.

В общем, пробуем и при подходящем случае используем на своих сайтах =)

Источник описанной техники - Optimized Css Text Gradient.

P.S. Интересно отметить, что автор статьи-источника совсем не обратил внимания на то, что в IE6 его техника не работает. Это весьма удивительно (то, что не обратил внимания), учитывая тот факт, что англоязычных пользователей IE6 более 50%.

Теги: , , автор: Dimox | рубрика CSS-верстка

Комментарии (36): »

  1. Спасибо Дмитрий, весьма оригинальное решение :)

  2. …и в фиде тоже стили пропадают :) Я тупо смотрел на три черных надписи, пока не сообразил пойти посмотреть на первоисточник :)

  3. с css на самом деле можно такие вещи творить, что просто загляденье будет)

  4. Пасиба. В закладки, определенно.

    @
  5. Градиентные заголовки мне по нраву!

    Кстати. Обратил внимание на заголовок статьи, заметил клевую тенюшку. Решил посмотреть, как сделано, но dragonfly в опере не стартовал почему-то и я открыл страницу в мозилле. Смотрю - а тени-то нет. Внимание, вопрос:
    если уж text-shadow не кроссплатформенен, то нельзя ли как-нибудь решить проблему тенюшек раз и навсегда для всех браузеров? Есть ли какие-нибудь элегантные решения? Или только блоки с позиционированием и z-indexы?

  6. а что с семантикой при таком заголовке, типа поисковики не увидят или что просветите

    @
  7. да, мне тоже понравилось решение.
    пока только единожды использовал вариант с картинками для гладиента заголовков.
    буду использовать и этот (как раз сейчас есть подходящий проект)
    спасибо!

  8. 2Лайфхакер:

    …и в фиде тоже стили пропадают

    А где еще?

    2Fenix:

    если уж text-shadow не кроссплатформенен, то нельзя ли как-нибудь решить проблему тенюшек раз и навсегда для всех браузеров? Есть ли какие-нибудь элегантные решения? Или только блоки с позиционированием и z-indexы?

    Насколько мне известно, кроссбраузерного и при том красивого решения пока не существует. text-shadow на данный момент поддерживает только Опера да Сафари (странно, что Хром, который на том же движке, не поддерживает). Знаю, что есть решение для IE с использованием, как обычно, скриптов-фильтров, но визуально результат отличается (не в лучшую сторону). А для FireFox я вообще ничего не встречал.

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

    2данила:

    а что с семантикой при таком заголовке, типа поисковики не увидят или что просветите

    Семантика в верстке - когда каждый тег несет в себе смысловую нагрузку. К примеру, если у нас имеется абзац с текстом, то семантически правильно его поместить в специально предназначенный для этого тег <p>, нежели в тег <div> или какой-то другой.

    Поэтому, если смотреть на пример в статье с точки зрения семантики, то пустого контейнера <b></b> здесь не должно быть. Надеюсь, что понятно объяснил.

    И к поисковикам это отношения не имеет.

  9. да, кстати, еще: это не только жертва семантики, но и валидности CSS :)

  10. nicothin, да, и этим тоже приходится жертвовать =)

  11. 1
    2
    3
    opacity: 0.63;
      filter: alpha(opacity=63);
      -moz-opacity: 0.63;

    тут всё просто :) второе правило отдаём через СС, а вот поддержкой старых моззил (в пользу стандартов) можно иногда пожертвовать — не так уж и много их осталось.

    @
  12. Jman, полностью согласен. Честно говоря, я даже не знаю, для какой именно версии предназначено -moz-opacity, я думал, что для FF2, а, оказывается, он прекрасно понимает opacity.

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

    Как обычно, спасибо, Дмитрий :)

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

    @
  15. milax, верно заметили. Отличилась только Опера, в которой текст выделяется, независимо от наличия этого слоя.

  16. milax, Dimox, имхо, это не так страшно.

  17. Sonikelf, а я и не говорил, что это страшно, я писал о том, что это неудобно.

    P.S. Ссылку на свой блог оставлять не буду, Dimox все-равно сотрет ;)

    @
  18. Здорово! Очень неплохое решение

  19. А для FireFox я вообще ничего не встречал

    FireFox поддерживает text-shadow, правда, только с версии 3.1

    @
  20. Dimox, это глюк или нет? В низу прошлого комментария такая надпись: “[WORDPRESS HASHCASH] The poster sent us ‘0 which is not a hashcash value.”

    @
  21. FireFox поддерживает text-shadow, правда, только с версии 3.1

    Спасибо, будем знать.

    Dimox, это глюк или нет?

    Это плагин для отлова спама. Надпись говорит о том, что у тебя отключен JavaScript.

  22. Включен у меня JavaScript. FireFox/3.04 Linux 64-bit.

    А AdBlock банит только баннеры флэшовые, стороннюю рекламу и парочку гифов.

    @
  23. Значит глючный этот плагин. Отключил его нафиг.

  24. Прикольно. Займусь этим на днях..
    Главное чтобы во всех браузерах работало..

  25. Это круто!

    Два вопроса:

    1. Как сделать так, чтобы не 2 цвета было, а скажем 5? Просто я вообще не бумбум в этом.

    2. Что нельзя сделать через CSS? :) Просто я помню, Гомера Симпсона в CSS шрифтами нарисованного…

    @
  26. 1. Как сделать так, чтобы не 2 цвета было, а скажем 5? Просто я вообще не бумбум в этом.

    Не представляю, как это должно выглядеть. Добавлять нужно по аналогии с вложенным элементом <b></b>. Зачем в заголовке делать 5 цветов?

    2. Что нельзя сделать через CSS? :) Просто я помню, Гомера Симпсона в CSS шрифтами нарисованного…

    Не понял вопроса.

  27. Все работает! Красота!
    Спасибо большое, это украсит мой блог.

  28. Очень симпатично выгладит. Спасибо, будем юзать!

  29. Хоть и простенько, но зато красивенько :)

    А это только для IE 6? Просто пыталась сделать, в Опере как был обычный текст, так и остался. Если вдруг прочитаете данный комментарий, то прошу о помощи :) Хотела бы в блоге поменять заголовок, как в примерах 3-я строка (серые цвета).

    Заранее спасибо!

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

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

    Решаемо при помощи:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    h1 {
      font: 32px Georgia, "Times New Roman";
      position: relative; /* обязательно */
      color: #0094D6;
      margin: 10px 0;
      padding: 0;
    }

    h1 b {
      position: absolute;
      top: 0;
      left: 0;
      width: 100%;
      height: 60%; /* Высота в процентах для всех браузеров */
      background: #FFF;
      overflow: hidden /* для проклятого IE6 */;
      opacity: 0.63;
      filter: alpha(opacity=63);
      -moz-opacity: 0.63;
    }

    /* Решение для IE6 нужно вынести в файл ie6.css как обычно */
    *html h1 {height: 0;}
    *html h1 b {height: expression(this.parentNode.clientHeight * 0.6);}

    ;)

    Понятно, что это грабли, но это позволит изменять размер шрифта, задавая всего одно значение - для h1.

    @
  32. Жаль, что только однострочные заголовки поддерживаются

  33. У меня такой трабл, все сделал, переделал ничего не помогает. Заливает тупо всю строку от начала сайта до конца вместе с нужным текстом!!

    @
  34. респект! спасибо, как раз то что нужно

Присоединяйтесь к обсуждению!

Отправляя кoммeнтapий, Вы автоматически принимаете правила кoммeнтиpoвaния на этом блоге.

Правила кoммeнтиpoвaния на блоге dimox.name:

  1. Первый кoммeнтapий всегда проходит премодерацию.
  2. В поле "URL блога" можно указывать только ссылку на главную страницу вашего блога. Ссылки на прочие веб-ресурсы (в том числе блоги/сплоги, созданные не для людей) будут удалены.
  3. Запрещается использовать в качестве имени комментатора слоганы/названия сайтов, рекламные фразы, ключевые и т.п. слова. В случае несоблюдения этого условия имя изменяется по усмотрению владельца блога. Просьба указывать нормальное имя или ник.
  4. Весьма вероятно, что короткий и неинформативный кoммeнтapий вида "Спасибо!", "Интересная статья", будет удален. Исключение составляют знакомые автору блога комментаторы.

Подписаться, не комментируя

Предыдущие из рубрики