Внутренняя тень текста с помощью CSS


107

В настоящее время я играю с CSS3 и пытаюсь добиться такого текстового эффекта (черная размытая внутренняя тень):

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

box-shadow: inset 0px -5px 10px 0px rgba(0, 0, 0, 0.5);

Любые идеи?


3
На это нет ответа, если вы не готовы к каким-то оптическим иллюзиям ...
Аария Картер-Вейр,

Ответы:


105

Вот небольшая хитрость , которую я обнаружил , используя :beforeи :afterпсевдо-элементы:

.depth {
    color: black;
    position: relative;
}
.depth:before, .depth:after {
    content: attr(title);
    color: rgba(255,255,255,.1);
    position: absolute;
}
.depth:before { top: 1px; left: 1px }
.depth:after  { top: 2px; left: 2px }

Атрибут title должен совпадать с содержимым. Демо: http://dabblet.com/gist/1609945


1
Ницца! Креатив :) Все же не в таком стиле Photoshop, как хотелось бы. Вы можете установить верхнее / левое значения на 5 пикселей каждое, чтобы получить внутреннее смещение тени 5 пикселей, но затем буква просачивается на другом конце - что отлично выглядит для 1 пикселей и 2 пикселей, но странно для более высоких значений.
ericteubert

1
Да, это хорошо выглядит только с легким намеком на белый цвет внизу. Если больше 2 пикселей, внешний вид разрушится.
Web_Designer

1
Потрясающие! Вы также можете использовать это, чтобы сделать белый текст, увеличив непрозрачность до .9, или создать скошенные края, сохранив непрозрачность на .1 и поменяв местами цвета. (+1)
JohnB

Отличное решение. Однако не работает в сочетании с текстовыми градиентами; (очень плохо. Думаю, нам придется ждать появления CSS4 несколько лет или около того, чтобы получить отличные текстовые эффекты.
Майкл Троу

Это круто в chrome, я изо всех сил пытаюсь сделать альтернативный откат для FF, который не будет применяться к Chrome без использования JS и класса пространства имен. Есть предположения. PS Красиво работает на кожаном эффекте bg, выглядит как фирменный штамп.
Уилл Хэнкок

43

Вы должны иметь возможность сделать это с помощью text-shadow, эээ как-то так:

.inner_text_shadow
{
    text-shadow: 1px 1px white, -1px -1px #444;
}

вот пример: http://jsfiddle.net/ekDNq/


8
Хм, да, вроде того. Визуальный эффект аналогичен этим параметрам, но это все еще тень за шрифтом. Не внутри. В моем примере я даже размываю вставленную тень, и это разрушит эффект здесь. Итак ... лучшее решение, но все же это просто взлом визуальных иллюзий;)
ericteubert

2
Обратите внимание, что этим вы делаете шрифт толще. Для шрифтов малого и среднего размера это может быть нежелательно.
Jonatan Littke

20

Вот моя лучшая попытка:

    .inner_shadow {
    color:transparent;
    background-color:white;
    text-shadow: 0 0 20px rgba(198,28,39,0.8), 0 0 0 black;
    font-family:'ProclamateHeavy';  // Or whatever floats your boat
    font-size:150px;
    }
   
    <span class="inner_shadow">Inner Shadow</span>
   

Проблема в том, как обрезать тени, которые растекаются по краям !!! Я пробовал использовать webkit, используя background-clip: text, но webkit отображает тень над фоном, поэтому это не работает.

Создание текстовой маски с помощью CSS?

Без верхнего слоя маски невозможно создать настоящую внутреннюю тень на тексте.

Возможно, кому-то стоит порекомендовать W3C добавить background-clip: reverse-text , который прорезал бы маску через фон вместо того, чтобы вырезать фон, чтобы поместиться внутри текста.

Либо это, либо визуализируйте тень текста как часть фона и закрепите ее с помощью background-clip: text.

Я попытался абсолютно позиционировать идентичный текстовый элемент над ним, но проблема в background-clip: текст обрезает фон, чтобы он поместился внутри текста, но нам нужно обратное.

Я пробовал использовать text-stroke: 20px white; как для этого элемента, так и для элемента над ним, но обводка текста идет как внутрь, так и наружу.

Альтернативные методы

Поскольку в настоящее время нет возможности создать маску инвертированного текста в CSS, вы можете обратиться к SVG или Canvas и создать изображение для замены текста с тремя слоями, чтобы получить свой эффект.

Поскольку SVG является подмножеством XML, текст SVG по-прежнему будет доступен для выбора и поиска, и эффект может быть достигнут с меньшим количеством кода, чем Canvas.

Было бы труднее добиться этого с помощью Canvas, потому что у него нет dom со слоями, как у SVG.

Вы можете создать SVG либо на стороне сервера, либо как метод замены текста javascript в браузере.

Дальнейшее чтение:

SVG против Canvas:

http://dev.opera.com/articles/view/svg-or-canvas-choosing-between-the-two/

Обрезка и маскирование с текстом SVG:

http://www.w3.org/TR/SVG/text.html#TextElement


2
Я опубликовал более подробное объяснение вашей лучшей попытки с примером. Проверьте это!
Alba Mendez

1
Пример этого доведен до крайности .
Альба Мендес

В вашем примере есть внешняя тень
AlexKh

13

Более точное объяснение CSS в ответе kendo451 .

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

<h1>Get this</h1>

и этот CSS:

h1 {
  color: black;
  background-color: #cc8100;
}

Это хороший слоган

Шаг 1

Начнем с того, что сделаем текст прозрачным:

h1 {
  color: transparent;
  background-color: #cc8100;
}

Это коробка

Шаг 2

Теперь мы обрезаем этот фон по форме текста:

h1 {
  color: transparent;
  background-color: #cc8100;
  background-clip: text;
}

Фон - это текст!

Шаг 3

Теперь волшебство: мы добавим размытие text-shadow, которое будет перед фоном , создавая впечатление внутренней тени!

h1 {
  color: transparent;
  background-color: #cc8100;
  background-clip: text;
  text-shadow: 0px 2px 5px #f9c800;
}

Мы поняли!  Ура!

Смотрите окончательный результат .

Минусы?

  • Работает только в Webkit ( background-clipне может быть text).
  • Множественные тени? Даже не думай.
  • Вы также получаете внешнее свечение.

«Множественные тени? Даже не думай». О чем text-shadow: 1px 1px 1px #000, 3px 3px 5px blue;?
Morpheus

@Morpheus Одним из недостатков этого метода является то, что вы не можете применить несколько теней к тексту.
Альба Мендес,

Размер и яркость этого примера затрудняют просмотр других. Не могли бы вы переместить их во фрагменты кода? Спасибо!
Джош Хабдас

12

Элегантный пример без необходимости позиционированной обертки или дублирующего контента в разметке:

:root {
  background: #f2f2f2;
}
h1 {
  background-color: #565656;
  font: bold 48px 'Futura';
  color: transparent;
  text-shadow: 0px 2px 3px rgba(255, 255, 255, 0.8);
  -webkit-background-clip: text;
  -moz-background-clip: text;
  background-clip: text;
}
<center>
  <h1>Text With Inner Shadow</h1>
</center>

Хорошо смотрится и на темном фоне:

:root {
  --gunmetal-gray: #2a3439;
  background: var(--gunmetal-gray);
}

h1[itemprop="headline"] {
  font-family: 'Futura';
  font-size: 48px;
  padding-bottom: 0.35rem;
  font-variant-caps: all-small-caps;
  background-color: var(--gunmetal-gray);
  color: transparent;
  text-shadow: 0px 2px 3px rgba(255, 255, 255, 0.1);
  -webkit-background-clip: text;
  -moz-background-clip: text;
  background-clip: text;
  filter: brightness(3);
}
<center>
  <h1 itemprop="headline">Text With Inner Shadow</h1>
</center>

И МЕНЯ ССЫЛКА И МЕНЯ 2 ССЫЛКА


Просто и не требует настройки разметки. Отличная работа!
Джош Хабдас

10

Вы можете это сделать. К сожалению, нет возможности использовать вставку на text-shadow, но вы можете подделать ее цветом и положением. Возьмите размытие прямо вниз и расположите тень в правом верхнем углу. Что-то вроде этого может помочь:

background-color:#D7CFBA;
color:#38373D;
font-weight:bold;
text-shadow:1px 1px 0 #FFFFFF;

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


Не совсем то, что я ищу. Эффект от вашего предложения интересен, но далек от примера, который я опубликовал.
ericteubert

Тогда в этом случае нет ответа, только не с помощью CSS3. Извините, я не смог помочь.
hollsk

Вставные тени можно использовать, background-clipкак показано в этом ответе .
Джош Хабдас

10

Нет необходимости в нескольких тенях или в чем-то подобном, вам просто нужно сместить тень по отрицательной оси Y.

Для темного текста на светлом фоне:

text-shadow: 0px -1px 0px rgba(0, 0, 0, .75);

Если у вас темный фон, вы можете просто инвертировать цвет и положение по оси Y:

text-shadow: 0px 1px 0px rgba(255, 255, 255, 0.75);

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


3
По-прежнему просто оптическая иллюзия, никакой реальной внутренней тени.
ericteubert

25
... не все ли тени - оптическая иллюзия?
Чарли Шлиссер,

ты сварливый @eteubert ... действительно злой
Джейми Хутбер

7

Попробуйте эту маленькую жемчужину вариации:

text-shadow:0 1px 1px rgba(255, 255, 255, 0.5);

Я обычно воспринимаю "нет ответа" как вызов


1
Это создает белый контур внизу шрифта, но я искал черную размытую внутреннюю тень .
ericteubert

1
У меня это сработало лучше всего, особенно при затенении меньшего текста. Я предлагаю немного настроить значения RGB, если необходимо, чтобы он соответствовал цвету вашего шрифта.
Кори Ширес, 07

6

Я видел много предложенных решений, но ни одно из них не соответствовало моим ожиданиям.

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

введите описание изображения здесь

(кстати, текст и стиль основаны на OP дублирующей нити )


6

У меня было несколько случаев, когда мне требовались внутренние тени на тексте, и следующее мне помогло:

.inner {
    color: rgba(252, 195, 67, 0.8);
    font-size: 48px;
    text-shadow: 1px 2px 3px #fff, 0 0 0 #000;
}

Это устанавливает непрозрачность текста на 80%, а затем создает две тени:

  • Первая - это белая тень (при условии, что текст находится на белом фоне) смещение на 1 пиксель слева и 2 пикселя сверху, размытое на 3 пикселя.
  • Вторая - черная тень, которая видна сквозь текст с непрозрачностью 80%, но не через первую тень, что означает, что она видна внутри текстовых букв только там, где смещена первая тень (1 пиксель слева и 2 пикселя сверху). Чтобы изменить размытие этой видимой тени, измените параметр размытия для тени первого слоя.

Предостережения

  • Это будет работать только в том случае, если желаемый цвет текста может быть достигнут без необходимости иметь 100% непрозрачность.
  • Это будет работать только в том случае, если цвет фона сплошной (поэтому он не будет работать для конкретного примера спрашивающего, где текст находится на текстурированном фоне).



4

Кажется, у каждого есть ответ на этот вопрос. Мне нравится решение от @Web_Designer. Но это не обязательно должно быть так сложно, и вы все равно можете получить размытую внутреннюю тень, которую ищете.

http://dabblet.com/gist/3877605

.depth {
    display: block;
    padding: 50px;
    color: black;
    font: bold 7em Arial, sans-serif;
    position: relative;
 }

.depth:before {
    content: attr(title);
    color: transparent;
    position: absolute;
    text-shadow: 2px 2px 4px rgba(255,255,255,0.3);
}


3

Основываясь на :before :afterметодике web_designer, вот что вам ближе:

Во-первых, сделайте свой текст цветом внутренней тени (черным в случае OP).

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

http://dabblet.com/gist/2499892

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


3

Вот отличное решение для TRUE вставки тени текста с использованием свойства CSS3 background-clip:

.insetText {
    background-color: #666666;
    -webkit-background-clip: text;
    -moz-background-clip: text;
    background-clip: text;
    color: transparent;
    text-shadow: rgba(255,255,255,0.5) 0px 3px 3px;
}

Эта ссылка сейчас не работает.
Ник Уайт,

Выглядит неплохо в webkit, но все еще не подходит для Firefox 18.
gmeben

У этого может быть ограниченная поддержка, но мне нравится этот, поскольку он действительно вставлен.
Julian K

2

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

.inset {
    color: rgba(0,0,0, 0.6);
    text-shadow: 1px 1px 1px #fff, 0 0 1px rgba(0,0,0,0.6);
}

1

Попробуйте этот пример для вставки тени текста. Вот HTML

<h1 class="inset-text-shadow">Inset text shadow trick</h1>

и CSS

body {
    background: #f8f8f8;
}
h1 {
    font-family: Helvetica, Arial, sans-serif;
    font-weight: bold;
    font-size: 6em;
    line-height: 1em;
}
.inset-text-shadow {
    /* Shadows are visible under slightly transparent text color */
    color: rgba(0,0,0,0.6);
    text-shadow: 2px 8px 6px rgba(0,0,0,0.2), 0px -5px 35px rgba(255,255,255,0.3);

}

Demo on Jsfiddle


0
text-shadow: 4px 4px 2px rgba(150, 150, 150, 1);

для тени коробки:

-webkit-box-shadow: 7px 7px 5px rgba(50, 50, 50, 0.75);
-moz-box-shadow:    7px 7px 5px rgba(50, 50, 50, 0.75);
box-shadow:         7px 7px 5px rgba(50, 50, 50, 0.75);

вы можете видеть онлайн-текст и тень поля: онлайн-текст и тень поля

для получения дополнительных примеров вы можете перейти по этому адресу: еще пример кода freeclup


0

Есть гораздо более простой способ добиться этого

.inner{color: red; text-shadow: 0 -1px 0 #666;} // #666 is the color of the inner shadow

Вуаля


0

Для текста обычного размера на маленьких кнопках

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

Вот небольшая настройка:

text-shadow: 1px 1px transparent, -1px -1px black;

Примечание:

Я использовал этот сайт, чтобы улучшить цветовые оттенки.


-1

Использую с этого сайта, тоже неплохо выглядит. Взгляни на это Внутренняя тень


1
Человек, проголосовавший против, может сказать, как это может быть отклонено. Если этот ответ отклонился от вопроса? или вы думаете, что я спамер .. если вы можете объяснить, я могу обновить свой ответ здесь
vkGunasekaran 03

+1 Тот же ответ, что и Web_Designer, но лучше объяснен. Возможно, проигравшему не понравился тот факт, что ваш ответ был в основном таким же, как и ранее опубликованный ответ. Но вот. Я просто компенсировал это вам :)
Жюль Колл

2
Только что проголосовали против. Это не только дубликат, но и не объясняет проблему и не дает никаких фрагментов, это просто ссылка. На мой взгляд, это показывает минимальные усилия автора. ИМХО, и ФТР.
Альба Мендес,
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.