55

I'am injecting SVG elements into a webpage thanks to D3js. I have difficulties to style these elements since syntaxes like

path { border: 3px solid green; }

doesn't work.

How to add border/outline/stroke to SVG elements in webpages with CSS ?

Hugolpz
  • 17,296
  • 26
  • 100
  • 187

4 Answers4

80

In CSS, something like:

path {
  fill: none;
  stroke: #646464;
  stroke-width: 1px;
  stroke-dasharray: 2,2;
  stroke-linejoin: round;
}
Souleste
  • 1,887
  • 1
  • 12
  • 39
Hugolpz
  • 17,296
  • 26
  • 100
  • 187
28

Try adding CSS filter() dropshadow (this can be applied on any svg: <img>, background-image, in the dom, etc.)

or

SVG <filter> <feDropShadow>

svg {
  fill: #fff;
}

#example_1 {
  filter: 
    drop-shadow(-1px -1px 0px #3e68ff) 
    drop-shadow(2px -1px 0px #3e68ff) 
    drop-shadow(2px 2px 0px #3e68ff)
    drop-shadow(-1px 2px 0px #3e68ff)
}
<svg id="example_1" width="100" height="100" viewBox="0 0 288 288">
        <path class="st0" d="M144.17,77.84c-37.65,0-68.18,30.52-68.18,68.18c0,37.65,30.52,68.18,68.18,68.18
        c37.65,0,68.18-30.52,68.18-68.18C212.35,108.37,181.83,77.84,144.17,77.84z M166.37,117.02c10.77,0.03,15.31,15.39,15.58,20.03
        c0.15,2.47-2.95,3.15-4.21,1.21c-0.89-1.37-1.44-2.48-2.56-4.65c-1.51-2.93-4.99-6.08-8.71-6.15c-3.72-0.06-7.31,2.95-8.9,5.9
        c-1.23,2.28-1.86,3.4-2.66,4.89c-0.68,1.26-4.16,1.16-4.21-1.26C150.6,132.3,155.61,116.99,166.37,117.02z M121.71,117.02
        c10.81-0.05,15.63,15.43,15.73,20.03c0.05,2.33-3.05,3.44-4.4,1.11c-0.82-1.41-1.39-2.45-2.47-4.55c-1.55-3.03-5.16-6.06-8.85-6.05
        c-3.7,0.01-7.18,3.08-8.76,5.9c-1.24,2.22-2.18,3.19-2.81,4.74c-0.92,2.27-3.92,1.24-3.97-1.26
        C106.09,132.32,111,117.06,121.71,117.02z M184.23,169.45c-1.91,8.19-18.66,26.11-40.26,26.03c-21.44-0.07-38.37-17.77-39.87-26.03
        c-0.58-3.19,2.81-5.81,5.61-4.84c11.86,4.09,18.31,4.74,34.29,4.74c15.98,0,22.02-1.48,34.32-4.84
        C181.52,163.65,184.9,166.55,184.23,169.45z"></path>
</svg>
<svg id="example_2" width="100" height="100" viewBox="0 0 288 288">
    <defs>
        <filter id="shadow">
            <feDropShadow dx="-2" dy="-2" stdDeviation="0" flood-color="#3e68ff"></feDropShadow>
            <feDropShadow dx="2" dy="-2" stdDeviation="0" flood-color="#3e68ff"></feDropShadow>
            <feDropShadow dx="2" dy="2" stdDeviation="0" flood-color="#3e68ff"></feDropShadow>
            <feDropShadow dx="-2" dy="2" stdDeviation="0" flood-color="#3e68ff"></feDropShadow>
        </filter>
    </defs>
  <g filter="url(#shadow)">
    <path d="M144.17,77.84c-37.65,0-68.18,30.52-68.18,68.18c0,37.65,30.52,68.18,68.18,68.18
      c37.65,0,68.18-30.52,68.18-68.18C212.35,108.37,181.83,77.84,144.17,77.84z M166.37,117.02c10.77,0.03,15.31,15.39,15.58,20.03
      c0.15,2.47-2.95,3.15-4.21,1.21c-0.89-1.37-1.44-2.48-2.56-4.65c-1.51-2.93-4.99-6.08-8.71-6.15c-3.72-0.06-7.31,2.95-8.9,5.9
      c-1.23,2.28-1.86,3.4-2.66,4.89c-0.68,1.26-4.16,1.16-4.21-1.26C150.6,132.3,155.61,116.99,166.37,117.02z M121.71,117.02
      c10.81-0.05,15.63,15.43,15.73,20.03c0.05,2.33-3.05,3.44-4.4,1.11c-0.82-1.41-1.39-2.45-2.47-4.55c-1.55-3.03-5.16-6.06-8.85-6.05
      c-3.7,0.01-7.18,3.08-8.76,5.9c-1.24,2.22-2.18,3.19-2.81,4.74c-0.92,2.27-3.92,1.24-3.97-1.26
      C106.09,132.32,111,117.06,121.71,117.02z M184.23,169.45c-1.91,8.19-18.66,26.11-40.26,26.03c-21.44-0.07-38.37-17.77-39.87-26.03
      c-0.58-3.19,2.81-5.81,5.61-4.84c11.86,4.09,18.31,4.74,34.29,4.74c15.98,0,22.02-1.48,34.32-4.84
      C181.52,163.65,184.9,166.55,184.23,169.45z"></path>
  </g>
</svg>

You could also create a javascript function that clones each of the elements within the svg, removing fill/stroke attributes, and wrapping them in a g tag that has fill="none" and stroke attributes set. Then prepend that to the svg.

Souleste
  • 1,887
  • 1
  • 12
  • 39
  • 2
    I was able to use the drop-shadow filter for `` tags loading svg files as well. I found that 0.5 even works as well, so you can get some really fine control. It also gets a little finer if you move the shadow just x and y, not x+y, so `drop-shadow(0px 0.5px 0px #ccc) drop-shadow(0px -0.5px 0px #ccc) drop-shadow(0.5px 0px 0px #ccc) drop-shadow(-0.5px 0px 0px #ccc)` – brandonscript Jun 10 '20 at 05:39
  • 1
    This works for any arbitrary svg and is a great answer thank you. – Phani Rithvij Jul 12 '20 at 17:04
18

For the question: How to add border/outline/stroke to SVG elements in webpages with CSS ?

You can do in CSS:

path { outline: 3px solid green; }

Please note as of 2018 it is supported by chrome and safari, but might not be available across all modern browsers. See example below:

I applied outline via CSS to a <g> group with paths inside. In static it looks good. In dynamic (dragging) I can see periodically these artifacts (to the left)

enter image description here

UPDATE:

  • if outline is "solid" - there are no artifacts
  • safari mobile doesn't support outline on <g> elements...
Mr Lister
  • 45,515
  • 15
  • 108
  • 150
Sergey Rudenko
  • 8,809
  • 2
  • 24
  • 51
3

From this answer in a similar question, which actually creates an outline effect instead of stroke:

  stroke: black;
  stroke-width: 4px;
  stroke-linejoin: round;
  paint-order: stroke;
J0ANMM
  • 7,849
  • 10
  • 56
  • 90