Тень падения SVG используя css3

можно ли установить тень для элемента svg с помощью css3, что-то вроде

box-shadow: -5px -5px 5px #888;
-webkit-box-shadow: -5px -5px 5px #888;

Я видел некоторые замечания о создание тени с помощью эффектов фильтра. Есть ли пример использования только css. Ниже приведен рабочий код, где стиль cusor применяется правильно, но без теневого эффекта. Пожалуйста, помогите мне получить эффект тени с наименьшим количеством кода.

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE HTML><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en">
<head> 
<style type="text/css" media="screen">  
    svg .shadow { cursor:crosshair; 
            -moz-box-shadow: -5px -5px 5px #888;
            -webkit-box-shadow: -5px -5px 5px #888;
            box-shadow: -5px -5px 5px #888; }   
</style>
</head>
<body>
<meta http-equiv="content-type" content="application/xhtml+xml; charset=utf-8" />
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" baseProfile="full"  viewBox="0 0 120 70">  
        <rect class="shadow" x="10" y="10" width="100" height="50" fill="#c66" />
</svg>
</body>
</html>

5 ответов


здесь пример применения dropshadow к некоторым svg с помощью свойства "filter". Если вы хотите контролировать непрозрачность dropshadow, посмотрите на . The slope атрибут управляет тем, сколько непрозрачности давать тени.

соответствующие биты из примера:

<filter id="dropshadow" height="130%">
  <feGaussianBlur in="SourceAlpha" stdDeviation="3"/> <!-- stdDeviation is how much to blur -->
  <feOffset dx="2" dy="2" result="offsetblur"/> <!-- how much to offset -->
  <feComponentTransfer>
    <feFuncA type="linear" slope="0.5"/> <!-- slope is the opacity of the shadow -->
  </feComponentTransfer>
  <feMerge> 
    <feMergeNode/> <!-- this contains the offset blurred image -->
    <feMergeNode in="SourceGraphic"/> <!-- this contains the element that the filter is applied to -->
  </feMerge>
</filter>
<circle r="10" style="filter:url(#dropshadow)"/>

Box-shadow определяется для работы с CSS-полями (read: rectangles), в то время как svg немного более выразителен, чем просто прямоугольники. Читать SVG Primer чтобы узнать немного больше о том, что вы можете сделать с фильтрами SVG.


используйте новый CSS filter собственность.

поддерживается браузерами webkit, в Firefox 34+ и Edge.

вы можете использовать этот polyfill это будет поддерживать FF

вы бы использовали его так:

.shadow {
    /* Use -webkit- only if supporting: Chrome < 54, iOS < 9.3, Android < 4.4.4 */
    -webkit-filter: drop-shadow( -5px -5px 5px #000 ); 
            filter: drop-shadow( -5px -5px 5px #000 );
}

и ваш html будет:

<img src="my-svg-graphic.svg" class="shadow">

<!-- Or -->

<svg class="shadow" ... >
    <rect x="10" y="10" width="100" height="50" fill="#c66" />
</svg>

этот подход отличается от box-shadow эффект в том, что он учитывает непрозрачность и не применяет тень влияние на поле, а уголки сам элемент SVG.

вы можете увидеть живой пример здесь.

Обратите Внимание: этот подход работает только тогда, когда класс находится на элемент. Ты можешь!--32-->не используйте это на встроенном элементе svg, таком как <rect>.

<!-- This will NOT work! -->
<svg><rect class="shadow" ... /></svg>

подробнее о CSS фильтры на html5rocks.


Итак, как упоминалось в похороненных комментариях принятого ответа Лоренцо Полидори, самый простой вариант, который работает для меня в Chrome (и я уверен, что другие браузеры Webkit):

-webkit-svg-shadow: 0 0 7px #53BE12;

Я не знаю решения только для CSS.

Как вы упомянули, фильтры являются каноническим подходом к созданию эффектов тени в SVG. Спецификация SVG включает в себя пример этого:http://www.w3.org/TR/SVG/filters.html#AnExample


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

<filter id="shadow" x="0" y="0" width="200%" height="200%">
  <feDropShadow dx="40" dy="40" stdDeviation="35" flood-color="#ff0000" flood-opacity="1" />
</filter>