Добавить тень к полигону SVG

В прикрепленном фрагменте у меня есть многоугольник, и мне нужно добавить эффект, чтобы он выглядел так:

Добавить тень к полигону SVG

Я не знаю, как это сделать в svg, если бы это был html, я бы использовал box-shadow.

Единственное, что кажется решением, - это использовать фильтр, но я думаю, что могу использовать это только в элементе <svg/>, поэтому я изо всех сил пытаюсь сделать это.

polygon {
  fill: #5091b9;
  stroke: #4387b0;
  stroke-width: 2;
}
<svg width = "300" height = "300">
  <g transform = "translate(100, 100)">
    <polygon points = "25.98076211353316,-14.999999999999998 25.98076211353316,14.999999999999998 1.83697019872103e-15,30 -25.98076211353316,14.999999999999998 -25.980762113533157,-15.000000000000004 -5.510910596163089e-15,-30" class = "node-vertical__hexagon node-vertical__inactive">         </polygon>
  </g>
</svg>

да, вы можете использовать фильтр тени на SVG, и у вас будет тень вокруг многоугольника

Temani Afif 10.09.2018 21:17

У меня много таких многоугольников. Вы говорите, что я вложил элементы svg в элементы svg?

dagda1 10.09.2018 21:19

ну, если у вас много элементов внутри одного svg, все получат тень

Temani Afif 10.09.2018 21:22

Вы можете сохранить свой фильтр как отдельный SVG с defs в нем для фильтра и применить их через use xlink:href

Chris W. 10.09.2018 21:22

Во избежание путаницы: фильтры SVG предназначены для использования в элементах содержимого HTML или SVG, см. Спецификация фильтра CSS. <use> не требуется, вы ссылаетесь на них с помощью функции CSS url(). Использование их на самом элементе <svg> может даже иметь неожиданные проблемы в сочетании с viewBox.

ccprog 10.09.2018 22:05
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Введение в CSS
Введение в CSS
CSS является неотъемлемой частью трех основных составляющих front-end веб-разработки.
Как выровнять Div по центру?
Как выровнять Div по центру?
Чтобы выровнять элемент <div>по горизонтали и вертикали с помощью CSS, можно использовать комбинацию свойств и значений CSS. Вот несколько методов,...
Навигация по приложениям React: Исчерпывающее руководство по React Router
Навигация по приложениям React: Исчерпывающее руководство по React Router
React Router стала незаменимой библиотекой для создания одностраничных приложений с навигацией в React. В этой статье блога мы подробно рассмотрим...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
CSS: FlexBox
CSS: FlexBox
Ранее разработчики использовали макеты с помощью Position и Float. После появления flexbox сценарий полностью изменился.
9
5
9 184
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете применить фильтр drop-shadow к SVG ИЛИ использовать SVG в качестве фона элемента и применить к нему фильтр:

polygon {
  fill: #5091b9;
  stroke: #4387b0;
  stroke-width: 2;
}
.filter {
  filter: drop-shadow(10px 0 5px red);
}

.box {
  height: 100px;
  width: 100px;
  background: url('data:image/svg+xml;utf8,<svg xmlns = "http://www.w3.org/2000/svg" viewBox = "0 0 100 100" width = "100"><g transform = "translate(50, 50)"><polygon stroke = "%234387b0" stroke-width = "2" fill = "%235091b9" points = "25.98076211353316,-14.999999999999998 25.98076211353316,14.999999999999998 1.83697019872103e-15,30 -25.98076211353316,14.999999999999998 -25.980762113533157,-15.000000000000004 -5.510910596163089e-15,-30" ></polygon></g></svg>');
}
<p>SVG element</p>
<svg viewBox = "0 0 100 100" width = "100" class = "filter"><g transform = "translate(50, 50)" ><polygon points = "25.98076211353316,-14.999999999999998 25.98076211353316,14.999999999999998 1.83697019872103e-15,30 -25.98076211353316,14.999999999999998 -25.980762113533157,-15.000000000000004 -5.510910596163089e-15,-30" ></polygon></g></svg>
<p>SVG as background</p>
<div class = "box filter"></div>

Вы также можете рассмотреть фильтр SVG:

.node-vertical__inactive {
  filter:url(#shadow);
}

.node-vertical__hexagon {
  fill: #5091b9;
  stroke: #4387b0;
  stroke-width: 2;
}
<svg>
<defs>
    <filter id = "shadow" x = "-20%" y = "-20%" width = "200%" height = "200%">
      <feDropShadow dx = "20" dy = "3" stdDeviation = "5" flood-color = "#5091b9" />
    </filter>
  </defs>
<g class = "vx-group" transform = "translate(0, 0)">
  <g class = "vx-group node-vertical__container" transform = "translate(100, 100)"><svg class = "node-vertical__inactive" x = "0" y = "0" style = "overflow: visible;"><polygon points = "25.98076211353316,-14.999999999999998 25.98076211353316,14.999999999999998 1.83697019872103e-15,30 -25.98076211353316,14.999999999999998 -25.980762113533157,-15.000000000000004 -5.510910596163089e-15,-30" class = "node-vertical__hexagon"></polygon></svg>
</g>
</g>
</svg>

Намного лучше, чем я думал, +1

Chris W. 10.09.2018 21:38

Вы знаете, почему фильтр не применяется в этой скрипте jsfiddle.net/dagda1/k0eocxfL/40, которая соответствует моему источнику, мне нужно было бы вложить svgs. Может ли фильтр не применяться к вложенным SVG?

dagda1 10.09.2018 23:42

@ dagda1 Я думаю, что фильтр CSS не работает с вложенным svg .. в этом случае вы можете рассмотреть фильтр SVG, см. мои обновления

Temani Afif 10.09.2018 23:53

@ dagda1 работает в Firefox. Однако в некоторых других браузерах есть ограничения на применение фильтров CSS к содержимому SVG.

Robert Longson 11.09.2018 00:11

@RobertLongson есть идеи, как изменить цвет фильтра SVG? ... на удивление, я не могу найти, как: /

Temani Afif 11.09.2018 00:12

цвет заливки = "синий"

Robert Longson 11.09.2018 00:15

Вы можете использовать SVG feOffset, feGaussianBlur, feBlend вместо feDropShadow.

<svg width = "300" height = "300">
    <defs>
    <filter id = "poly" x = "0" y = "0" width = "200%" height = "200%">
      <feOffset result = "offOut" in = "SourceGraphic" dx = "15" dy = "15" />
      <feGaussianBlur result = "blurOut" in = "offOut" stdDeviation = "5" />
      <feBlend in = "SourceGraphic" in2 = "blurOut" mode = "normal" />
    </filter>
  </defs>
  <g transform = "translate(100, 100)">
  <polygon points = "100,10 40,198 190,78 10,78 160,198"
  style = "fill:lime;stroke:purple;stroke-width:5;fill-rule:nonzero;" filter = "url(#poly)" />
  </g>
</svg>
This will help you to make shadows with the exact color of your SVG shape no matter what it is so you don't have to set a single color for its shadow. For more information about this technique, you can visit W3Школы.

Ну да, но технически это не тени. Если вы посмотрите на настоящую тень, она не отражает цвет объекта, отбрасывающего тень.

Robert Longson 11.09.2018 02:30

@RobertLongson Ну, правда, тень непрозрачного объекта темная, но как насчет прозрачной? Как красный витраж или что-то в этом роде. В любом случае, я просто предлагаю альтернативный метод создания теней.

Morteza Sadri 11.09.2018 02:48

@RobertLongson Если вам нужна черная тень, вы должны добавить примитив feColorMatrix перед feOffset: <feColorMatrix values ​​= "0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" />

Waruyama 11.09.2018 09:40

@Waruyama Конечно, а затем вы реализовали feDropShadow, хотя и без внутренней оптимизации, которую может сделать браузер.

Robert Longson 11.09.2018 10:41

@RobertLongson Это правильно, но в отличие от feDropShadow он работает в Internet Explorer и Edge.

Waruyama 11.09.2018 11:00

Другие вопросы по теме