Как объединить CSS-тень и "background-image: -webkit-gradient"

Я пытаюсь добиться эффекта тени градиента + текста в браузере Chrome/Safari с использованием текстовой тени CSS и комбинации текстовой тени и фонового изображения: -webkit-gradient, см. пример blw. Я могу применить только один из эффектов (если я добавлю тень, исчезает градиент. Что я делаю неправильно?

h1 {
font-size: 100px;
background-image: -webkit-gradient(linear, left top, left bottom, from(white), to(black));
-webkit-background-clip: text;
-webkit-text-fill-color: transparent;
text-shadow: 0 1px 1px #fff;
}

Ответы

Ответ 1

Градиент "исчезает", потому что text-shadow находится на уровне выше фона.

  • Текст (прозрачный)
  • Тень
  • Фон.

Мы можем обойти это, скопировав текст и поместив его под исходный слой, затем применим тень там, например:

  h1 {
    position: relative;
    font-size: 100px;
    text-align: center;
  }

  h1 div {
    background-image: -webkit-gradient(linear, left top, left bottom, from(white), to(black));
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    position: absolute; 
    width: 100%;
}
  h1:after {
    text-shadow: 10px 10px 11px #fff;
    color: transparent;
  }

  #hello:after {
        content: 'Hello World';
  }
  <h1 id="hello"><div>Hello World</div></h1>

Ответ 2

Этот ответ похож на ответ @KennyTM выше, за исключением того, что его ответ имеет тень, жестко закодированную в CSS, что не подходит для динамического текста, такого как как в CMS. Кроме того, его метод требует отдельного идентификатора для каждого экземпляра, что было бы очень утомительным, если вы планируете много использовать этот эффект. В приведенном ниже примере вместо этого используется класс и разрешается динамический текст.

Попробуйте следующее:

h1 {
    position: relative;
    font-size: 100px;
    text-align: center;
}

h1 div {
    background-image: -webkit-gradient(linear, left top, left bottom, from(teal), to(black));
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    position: absolute; 
    width: 100%;
}
h1:after {
    text-shadow: 2px 2px 2px #000000;
    color: transparent;
}

.gradient-shadow:after {
    content: attr(title); /* Pulls the text from the 'title' attribute to make the shadow */
}

И затем в вашем HTML:

<h1 class="gradient-shadow" title="Hello World"><div>Hello World</div></h1>

Просто убедитесь, что текст в <div> соответствует тексту в атрибуте title.

С некоторым дополнительным форматированием (я использовал Helvetica Neue Ultralight и темный фон) вы можете получить эффект примерно так: http://cl.ly/image/2C0k0I3W271D