Animation from orange to teal is not taking effect - css

I'd like to animate an .svg image with css, changing between two colors. I attempted a tutorial here and css-tricks with no success. I believe my issue (or one of them) might be that I'm not targeting the right element in the .svg. But I've tried many different elements, ids, tags, tried using different images, and even tried making my own image. I'll share the relevant code below using my first choice .svg file:
#keyframes color-change {
from {
fill: #f4f00;
}
to {
fill: #a4f4f4;
}
}
#Layer_1, #adobe_illustrator_pgf {
animation: color-change 4s infinite alternate linear;}
<svg version="1.1"
id="Layer_1"
xmlns:x="&ns_extend;"
xmlns:i="&ns_ai;"
xmlns:graph="&ns_graphs;"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
x="0px" y="0px"
viewBox="0 0 750 750"
style="enable-background:new 0 0 750 750;"
xml:space="preserve">
<switch>
<foreignObject
requiredExtensions="&ns_ai;"
x="0"
y="0"
width="1"
height="1">
<i:pgfRef
xlink:href="#adobe_illustrator_pgf">
</i:pgfRef>
</foreignObject>
Thank you!
Update: I created the svg I wanted and was definitely able to target the right id-- I was able to change the color to orange. But the animation from orange to teal is still not taking effect.
svg:
#keyframes color-change {
from {
fill: var(--secondary-color);
}
to {
fill: var(--primary-color-lighter);
}
}
#about__main--img__fleur {
animation: color-change 4s infinite alternate linear;
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 750 750" >
<path style="fill:#ff4f00" d="m 158.31488,-2.2022728 c 91.01571,130.5628628 43.85069,121.0522128 12.21,230.0500028 h 8.42 c 82.76816,-249.50584 171.87632,-54.87233 123.86,-12.24 -51.62689,-90.80719 -96.81,12.24 -96.81,12.24 14.30301,2.24628 34.92456,17.33855 -5.51,23.74 -5.67801,35.22547 14.97807,58.61711 40.68,19.78 21.9137,62.34493 -56.60711,108.84523 -64.69,-19.78 h -9.64 c -5.46371,42.41119 45.01408,82.24554 -8.45,115.11 -45.63648,-28.05726 -15.31394,-61.97543 -8.59,-115.11 h -10.45 c -11.44247,151.90592 -92.587302,60.58808 -64.690002,19.78 32.374092,54.98005 40.680002,-19.78 40.680002,-19.78 -34.128832,-6.82614 -22.687672,-19.12856 -5.51,-23.74 -43.888082,-101.86884 -96.816002,-12.24 -96.816002,-12.24 -48.014316,-52.93652 50.97435,-223.7694488 123.866002,12.24 h 9.23 c -11.49629,-82.82875 -92.252982,-101.39727 12.21,-230.0500028" id="about__main--img__fleur" sodipodi:nodetypes="ccccccccccccccccccc" />
</svg>

I removed from svg style =" fill: # ff4f00 " since this style has more weight than styles of the same element in CSS
Assigned an identifier for path - id =" Layer_1 "
The rest is done more or less correctly. Pretty good for your first try.
Color change animation occurs when hovering over a shape
#Layer_1 {
fill:#ff4f00;
}
#Layer_1:hover {
animation: color-change 2s infinite alternate linear;
}
#keyframes color-change {
from {
fill: #ff4f00;
}
to {
fill: #a4f4f4;
}
}
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 750 750" >
<path id="Layer_1" d="m 158.31488,-2.2022728 c 91.01571,130.5628628 43.85069,121.0522128 12.21,230.0500028 h 8.42 c 82.76816,-249.50584 171.87632,-54.87233 123.86,-12.24 -51.62689,-90.80719 -96.81,12.24 -96.81,12.24 14.30301,2.24628 34.92456,17.33855 -5.51,23.74 -5.67801,35.22547 14.97807,58.61711 40.68,19.78 21.9137,62.34493 -56.60711,108.84523 -64.69,-19.78 h -9.64 c -5.46371,42.41119 45.01408,82.24554 -8.45,115.11 -45.63648,-28.05726 -15.31394,-61.97543 -8.59,-115.11 h -10.45 c -11.44247,151.90592 -92.587302,60.58808 -64.690002,19.78 32.374092,54.98005 40.680002,-19.78 40.680002,-19.78 -34.128832,-6.82614 -22.687672,-19.12856 -5.51,-23.74 -43.888082,-101.86884 -96.816002,-12.24 -96.816002,-12.24 -48.014316,-52.93652 50.97435,-223.7694488 123.866002,12.24 h 9.23 c -11.49629,-82.82875 -92.252982,-101.39727 12.21,-230.0500028" />
</svg>
UPDATE
I have optimized your SVG code using the SVGOMG utility. The file size has decreased several times.
This is to make the SVG take up less space on the HTML page.
The app is responsive. You can change its initial dimensions using the vw vh relative units in the parent container
.container {
width:50vw;
height:50vh;
}
#Layer_1 {
fill:#ff4f00;
}
#Layer_1:hover {
animation: color-change 2s infinite alternate linear;
}
#keyframes color-change {
from {
fill: #ff4f00;
}
to {
fill: #a4f4f4;
}
}
<div class="container">
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
viewBox="0 0 750 750" >
<path id="Layer_1" d="M158-2c91 130 44 121 13 230h8c83-250 172-55 124-12-52-91-97 12-97 12 14 2 35 17-6 24-5 35 15 58 41 19 22 63-56 109-65-19h-9c-6 42 45 82-9 115-45-28-15-62-8-115h-11c-11 151-92 60-64 19 32 55 40-19 40-19-34-7-22-20-5-24-44-102-97-12-97-12-48-53 51-224 124 12h9c-11-83-92-102 12-230" />
</svg>
</div>

Related

Wrong keyframes animation

Since yesterday morning I am trying to realize something that could look like this:
.signature-stroke{
stroke-dasharray: 1700;
stroke-dashoffset: 1700;
stroke-width: 6;
animation: writing 2.2s linear forwards;
}
#keyframes writing {
0% {
stroke-dashoffset: 1700;
}
45% {
stroke-width: 5;
}
90% {
stroke-dashoffset: 0;
}
100% {
stroke-dashoffset: 0;
stroke-width: 15;
}
}
<svg
xmlns="http://www.w3.org/2000/svg"
width="419px" height="259px"
viewBox="0 0 419 259"
>
<defs>
<clipPath id="clipmask">
<path
d="M397.37,76.381c-8.974-5.228-13.697-15.834-16.289-15.834
c-10.234,0-8.95,3.233-14.357,3.233c-5.408,0-6.776-3.257-10.946-3.257c-8.079,0-14.854,9.382-16.744,9.382
s9.392-19.012,9.392-22.872c0-5.354-4.993-6.743-5.765-6.743c-0.384,0-38.497,36.477-68.792,77.331
c-30.672,41.363-53.528,87.11-53.528,87.11s60.356-146.88,77.346-146.88c-0.097-4.332-3.712-8.515-4.915-8.515
c-1.204,0-12.647,13.511-16.695,13.511c-2.579,0.156-4.17,2.856-7.665,2.856c-12.016,0-36.991,12.886-39.754,12.886
s16.946-22.446,1.538-22.446c-9.923,0-35.131,22.435-35.131,22.435s6.618-17.243,14.679-33.837
c8.451-17.398,16.979-31.299,18.283-33.277c2.018-3.361-1.366-7.071-3.66-7.071c-1.898,0-10.389,13.3-22.744,29.04
c-18.53,23.604-43.023,53.441-45.148,53.441c-3.543,0,3.063-8.038-1.724-8.038s-34.692,24.231-34.692,24.231
s51.531-50.008,34.414-50.008c-14.429,0-32.956,4.339-52.128,11.714c0.025,0.348,0.045,0.705,0.068,1.056l-0.531-0.871
c0.154-0.06,0.309-0.126,0.463-0.185C98.653,13.166,76.952-0.1,44.464-0.1C8.716-0.1,3.823,8.233,3.823,8.233
s-6.237,6.919,1.958,6.919c-7.817,0,11.38-9.144,37.834-9.144c20.818,0,51.589,0.545,52.93,61.067l-1.133,0.489l0,0.001
C48.538,87.229,0.293,123.92,0.293,158.951c0,22.949,14.123,28.245,21.625,28.245c25.835,0,80.986-40.162,80.986-105.7
c0-3.941-0.084-7.699-0.246-11.289c-0.48,0.184-0.958,0.378-1.438,0.567l1.437-0.597c0,0.01,0.001,0.02,0.001,0.03
c14.294-5.477,28.942-8.771,42.988-8.771c7.556,0-38.633,47.908-38.633,47.908s-5.211,9.118,0.261,9.118
c9.379,0,35.432-30.481,41.163-30.481s0.612,5.254,0.612,5.254s-3.428,4.599,1.087,4.599c7.949,0.321,52.805-57.511,52.805-57.511
l-20.604,48.399c0,0-3.929,9.443,1.18,9.443c6.263,0,32.273-29.65,41.089-29.65c3.511,0-4.914,12.56-4.914,12.56
s-4.993,7.957,2.809,7.957c7.801,0,36.275-17.631,52.112-17.631c0.081,0-24.937,33.123-44.005,76.622
c-20.308,46.326-35.227,102.967-35.227,102.967s-2.002,7.388,2.794,7.388c6.233,0.063,8.304-5.986,8.304-7.799
c41.945-95.346,113.029-186.61,128.238-191.517c-3.647,5.992-5.472,21.363-5.472,21.363s-0.261,3.908,3.647,3.908
s10.161-12.245,12.245-12.245s-0.447,2.271,2.271,2.271c4.583-0.254,3.521-7.42,7.421-7.42c3.899,0,6.322,4.832,11.663,4.832
c5.342,0,5.172-2.628,10.259-2.628c9.75,0,2.204,16.193,41.458,16.193C412.93,83.523,408.947,83.124,397.37,76.381z
M21.013,179.856c-8.636,0-14.304-8.246-14.304-18.928c0-24.325,42.091-67.734,89.77-88.21l0.005,0.025l0.094-0.039
C95.809,141.202,41.799,179.856,21.013,179.856z"/>
<path
d="M157.326,16.264c-3.229,0-7.774,4.546-7.774,7.775c0,3.229,2.618,5.847,5.848,5.847
c3.229,0,11.372-3.483,11.372-8.932C166.771,15.476,160.556,16.264,157.326,16.264z"/>
</clipPath>
</defs>
<g
class="stroke"
clip-path="url(#clipmask)"
stroke-linejoin="miter"
stroke-miterlimit="5"
>
<path
class="signature-stroke"
fill="none"
stroke="#B247B3"
d="M1.645,12.002c0,0,16.003-8.467,42.266-8.467
S99.995,9.407,99.995,71.25s-45.844,113.042-78.79,113.042c-14.247,0-17.564-14.147-17.564-26.453
C3.641,133,63,57.333,153.667,57.333C161,57.333,106,111,111.333,111c0,0,33.091-26.667,40.333-26.667s-4.521,9.581,0,9.581
s72-84.247,72-84.247S181.109,92,186.333,92s26.334-29.333,43-29.333c6.549,0-9.334,20-4.334,20c0,0,31.667-13.89,49.667-13.89
c5.712,0,9.647-13.443,16.333-13.443c-22,21.333-103.333,197-90.667,196.333c5.883,0,107.333-201.333,143.333-204.333
c0,0-13.771,31.667-9.333,31.667s9.705-11.667,14-11.667s4.332-2.523,7.666-2.523s4.579,3.966,10.667,3.966
s4.441-3.966,11.333-3.966s13.084,20.525,40.209,20.525"/>
<path
class="signature-dot"
fill="#B247B3"
d="M157.326,16.264c-3.229,0-7.774,4.546-7.774,7.775c0,3.229,2.618,5.847,5.848,5.847 c3.229,0,11.372-3.483,11.372-8.932C166.771,15.476,160.556,16.264,157.326,16.264z">
</path>
</g>
</svg>
So I created a svg code with Illustrator, something simple that would just say "hey".
.hey {
stroke-width: 6;
stroke: black;
stroke-dasharray: 10;
/* here you can see the dashes are wrong. there is no space between them. the dashes are around and not along the path! */
}
.hey2 {
stroke-width: 6;
stroke: black;
stroke-dasharray: 3900;
stroke-dashoffset: 3900;
animation: dash 15s linear forwards;
}
/* you can see the animation is wrong and the animation goes around the path... */
#keyframes dash {
to {
stroke-dashoffset: 0;
}
}
<svg class="hey" version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1280 1024" style="enable-background:new 0 0 1280 1024;" xml:space="preserve">
<g>
<g>
<path d="M149.4,259.7c33.9-20.7,65.8-44.7,95.1-71.5c23.7-21.7,54.6-49.6,47.6-85.3c-3-15.2-13.3-27.1-28.4-31.1
c-14.8-3.9-34.2-3.4-43.9,10.2c-4.6,6.5-6.9,14.4-8.7,22c-2.3,9.8-4,19.8-5.1,29.8c-2.4,20.7-2.5,41.7-1.7,62.5
c1.8,47.4,8.3,94.8,4.5,142.3c1-0.1,2-0.3,2.9-0.4c-4.6-21.4-2.3-44.1,6.5-64.2c4.1-9.5,9.7-19.4,17.2-26.6
c9.9-9.4,22.1-6.7,29.8,3.8c6.6,9,7.6,20.7,11.2,31c2.5,7.1,6.5,15.4,14.3,17.8c8.8,2.8,16.9-3.6,23-9.2c7.3-6.7,14-14.1,20-22
c14-18.4,24.1-39.5,29.7-61.8c0.2-0.8-0.2-1.7-1-1.8c-14.4-3.2-25.2,9.2-30.4,21.2c-5,11.7-6,26.2-0.8,38.1
c15.3,35.1,58.4-2.1,72.4-19.3c11.7-14.4,20-31.3,24.2-49.4c-1-0.1-2-0.3-2.9-0.4c-0.8,7.2-0.7,14.5,0.5,21.7
c1,6.2,2.5,14.5,6.2,19.7c2.7,3.7,6.7,2.9,10,0.5c6.1-4.4,11.8-9.9,17.3-15.1c19.4-18.7,36-45.3,27.2-73.1
c-0.5-1.6-2.9-1.3-2.9,0.4c-1.2,93.5-2.4,187.5-17,280.1c-2,12.8-4.3,25.5-6.8,38.1c-2,10.2-4.3,23.7-15.2,28.1
c0.6,0.3,1.2,0.7,1.8,1c-13.3-39.6-11.6-83.3,3.3-122.2c7.5-19.5,18.3-37.8,32-53.5c15.6-17.8,34.9-31.9,54.8-44.5
c18.4-11.6,39.7-22.8,47.8-44.3c0.7-1.8-2.2-2.6-2.9-0.8c-8,21.2-29.9,32-47.9,43.5c-19.8,12.6-39,26.8-54.4,44.6
c-26.5,30.4-41.8,69.8-44.4,109.9c-1.5,23.1,1.5,46.3,8.8,68.2c0.2,0.7,1.1,1.4,1.8,1c7-2.8,11-8.7,13.6-15.6
c3.7-10.1,5.1-21.2,7-31.7c4.3-23.6,7.6-47.4,10.2-71.3c5.4-48.9,7.7-98,9-147.1c0.7-27.8,1.1-55.6,1.5-83.5c-1,0.1-2,0.3-2.9,0.4
c7.5,23.9-4.8,47.6-21,64.7c-3.9,4.1-8.1,8-12.3,11.8c-2.1,1.9-4.3,3.7-6.5,5.6c-0.9,0.7-1.7,1.5-2.6,2.2c-1.4,1.9-3,2.2-4.8,0.8
c-1.7,0.1-2.7-0.6-3-2.1c-3.2-4.6-4.2-12.8-5-18.2c-0.9-6.4-0.9-12.9-0.2-19.3c0.2-1.7-2.6-2-2.9-0.4
c-6.3,27.4-22.4,52.1-45.1,68.7c-11.1,8.1-28.8,18.9-40.9,7c-8.4-8.3-9.2-22.6-7.1-33.6c2.6-13.4,13.4-32.6,29.8-29
c-0.3-0.6-0.7-1.2-1-1.8c-5.3,21.1-14.6,40.9-27.5,58.5c-6.4,8.7-13.6,16.8-21.5,24.1c-4.9,4.5-11.5,10.2-18.7,8.8
c-5.8-1.2-9.5-6.5-11.8-11.5c-7.3-15.8-7-42.3-28.2-47.3c-18.5-4.4-31.2,20.2-37.2,33.8c-9.2,20.9-11.5,44.2-6.8,66.5
c0.4,1.7,2.8,1.2,2.9-0.4c6.1-76.6-15.3-154.2,1.3-230.2c1.7-7.9,3.6-16.2,8-23.1c5.4-8.6,13.9-11.9,23.8-12.3
c17.9-0.7,35.5,5.6,42.2,23.4c13,34.5-17.4,64.1-40.2,85.4c-30.4,28.4-63.6,53.6-99.1,75.3C146.2,258.1,147.7,260.7,149.4,259.7
L149.4,259.7z"/>
</g>
</g>
</svg>
<svg class="hey2" version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1280 1024" style="enable-background:new 0 0 1280 1024;" xml:space="preserve">
<g>
<g>
<path d="M149.4,259.7c33.9-20.7,65.8-44.7,95.1-71.5c23.7-21.7,54.6-49.6,47.6-85.3c-3-15.2-13.3-27.1-28.4-31.1
c-14.8-3.9-34.2-3.4-43.9,10.2c-4.6,6.5-6.9,14.4-8.7,22c-2.3,9.8-4,19.8-5.1,29.8c-2.4,20.7-2.5,41.7-1.7,62.5
c1.8,47.4,8.3,94.8,4.5,142.3c1-0.1,2-0.3,2.9-0.4c-4.6-21.4-2.3-44.1,6.5-64.2c4.1-9.5,9.7-19.4,17.2-26.6
c9.9-9.4,22.1-6.7,29.8,3.8c6.6,9,7.6,20.7,11.2,31c2.5,7.1,6.5,15.4,14.3,17.8c8.8,2.8,16.9-3.6,23-9.2c7.3-6.7,14-14.1,20-22
c14-18.4,24.1-39.5,29.7-61.8c0.2-0.8-0.2-1.7-1-1.8c-14.4-3.2-25.2,9.2-30.4,21.2c-5,11.7-6,26.2-0.8,38.1
c15.3,35.1,58.4-2.1,72.4-19.3c11.7-14.4,20-31.3,24.2-49.4c-1-0.1-2-0.3-2.9-0.4c-0.8,7.2-0.7,14.5,0.5,21.7
c1,6.2,2.5,14.5,6.2,19.7c2.7,3.7,6.7,2.9,10,0.5c6.1-4.4,11.8-9.9,17.3-15.1c19.4-18.7,36-45.3,27.2-73.1
c-0.5-1.6-2.9-1.3-2.9,0.4c-1.2,93.5-2.4,187.5-17,280.1c-2,12.8-4.3,25.5-6.8,38.1c-2,10.2-4.3,23.7-15.2,28.1
c0.6,0.3,1.2,0.7,1.8,1c-13.3-39.6-11.6-83.3,3.3-122.2c7.5-19.5,18.3-37.8,32-53.5c15.6-17.8,34.9-31.9,54.8-44.5
c18.4-11.6,39.7-22.8,47.8-44.3c0.7-1.8-2.2-2.6-2.9-0.8c-8,21.2-29.9,32-47.9,43.5c-19.8,12.6-39,26.8-54.4,44.6
c-26.5,30.4-41.8,69.8-44.4,109.9c-1.5,23.1,1.5,46.3,8.8,68.2c0.2,0.7,1.1,1.4,1.8,1c7-2.8,11-8.7,13.6-15.6
c3.7-10.1,5.1-21.2,7-31.7c4.3-23.6,7.6-47.4,10.2-71.3c5.4-48.9,7.7-98,9-147.1c0.7-27.8,1.1-55.6,1.5-83.5c-1,0.1-2,0.3-2.9,0.4
c7.5,23.9-4.8,47.6-21,64.7c-3.9,4.1-8.1,8-12.3,11.8c-2.1,1.9-4.3,3.7-6.5,5.6c-0.9,0.7-1.7,1.5-2.6,2.2c-1.4,1.9-3,2.2-4.8,0.8
c-1.7,0.1-2.7-0.6-3-2.1c-3.2-4.6-4.2-12.8-5-18.2c-0.9-6.4-0.9-12.9-0.2-19.3c0.2-1.7-2.6-2-2.9-0.4
c-6.3,27.4-22.4,52.1-45.1,68.7c-11.1,8.1-28.8,18.9-40.9,7c-8.4-8.3-9.2-22.6-7.1-33.6c2.6-13.4,13.4-32.6,29.8-29
c-0.3-0.6-0.7-1.2-1-1.8c-5.3,21.1-14.6,40.9-27.5,58.5c-6.4,8.7-13.6,16.8-21.5,24.1c-4.9,4.5-11.5,10.2-18.7,8.8
c-5.8-1.2-9.5-6.5-11.8-11.5c-7.3-15.8-7-42.3-28.2-47.3c-18.5-4.4-31.2,20.2-37.2,33.8c-9.2,20.9-11.5,44.2-6.8,66.5
c0.4,1.7,2.8,1.2,2.9-0.4c6.1-76.6-15.3-154.2,1.3-230.2c1.7-7.9,3.6-16.2,8-23.1c5.4-8.6,13.9-11.9,23.8-12.3
c17.9-0.7,35.5,5.6,42.2,23.4c13,34.5-17.4,64.1-40.2,85.4c-30.4,28.4-63.6,53.6-99.1,75.3C146.2,258.1,147.7,260.7,149.4,259.7
L149.4,259.7z"/>
</g>
</g>
</svg>
From what I understood thanks to this tutorial https://css-tricks.com/svg-line-animation-works/, I had to add a stroke to my svg, which would be dashed.
This step is a mess for me, because every time, the svg is not dashed correctly. As you can see, there is a line that is still visible. The dashes are around and not along the path. As a consequence, when I activate the Keyframe, the animation is a line going AROUND the svg, which is making a weird thing - definitely not what I am looking for.
It is my first post here, and I just started to learn to code, so please excuse me if anything is not appropriate.
Thank you very much!
This is what I've done:
I've edited your path by removing half of it. Now it's only a line, before it was a closed path.
I've recalculated the value for stroke-dasharray and stroke-dashoffset. For this I've used hey.getTotalLength()
I hope this is what you need.
.hey {
stroke-width: 6;
stroke: black;
}
#hey {
stroke-width: 6;
stroke: black;
stroke-dasharray: 1896.892333984375;
stroke-dashoffset: 1896.892333984375;
animation: dash 15s linear forwards;
}
/* you can see the animation is wrong and the animation goes around the path... */
#keyframes dash {
to {
stroke-dashoffset: 0;
}
}
<svg class="hey" version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 1280 1024" style="enable-background:new 0 0 1280 1024;" xml:space="preserve">
<g>
<g>
<path id="hey"
fill="none"d="M149.4,259.7c33.9-20.7,65.8-44.7,95.1-71.5c23.7-21.7,54.6-49.6,47.6-85.3c-3-15.2-13.3-27.1-28.4-31.1
c-14.8-3.9-34.2-3.4-43.9,10.2c-4.6,6.5-6.9,14.4-8.7,22c-2.3,9.8-4,19.8-5.1,29.8c-2.4,20.7-2.5,41.7-1.7,62.5
c1.8,47.4,8.3,94.8,4.5,142.3c1-0.1,2-0.3,2.9-0.4c-4.6-21.4-2.3-44.1,6.5-64.2c4.1-9.5,9.7-19.4,17.2-26.6
c9.9-9.4,22.1-6.7,29.8,3.8c6.6,9,7.6,20.7,11.2,31c2.5,7.1,6.5,15.4,14.3,17.8c8.8,2.8,16.9-3.6,23-9.2c7.3-6.7,14-14.1,20-22
c14-18.4,24.1-39.5,29.7-61.8c0.2-0.8-0.2-1.7-1-1.8c-14.4-3.2-25.2,9.2-30.4,21.2c-5,11.7-6,26.2-0.8,38.1
c15.3,35.1,58.4-2.1,72.4-19.3c11.7-14.4,20-31.3,24.2-49.4c-1-0.1-2-0.3-2.9-0.4c-0.8,7.2-0.7,14.5,0.5,21.7
c1,6.2,2.5,14.5,6.2,19.7c2.7,3.7,6.7,2.9,10,0.5c6.1-4.4,11.8-9.9,17.3-15.1c19.4-18.7,36-45.3,27.2-73.1
c-0.5-1.6-2.9-1.3-2.9,0.4c-1.2,93.5-2.4,187.5-17,280.1c-2,12.8-4.3,25.5-6.8,38.1c-2,10.2-4.3,23.7-15.2,28.1
c0.6,0.3,1.2,0.7,1.8,1c-13.3-39.6-11.6-83.3,3.3-122.2c7.5-19.5,18.3-37.8,32-53.5c15.6-17.8,34.9-31.9,54.8-44.5
"/>
</g>
</g>
</svg>

SVG CSS3 animation is not showing on Safari

The following SVG code working in Chrome, but it does not work in Safari. I can't figure out what is the problem. Can you help me out?
I have already add -wekbit-animation and -webkit-frames. Supposedly, Safari should recognise these 2 tags.
<svg xmlns="http://www.w3.org/2000/svg" version="1.1"
xmlns:xlink="http://www.w3.org/1999/xlink"
preserveAspectRatio="none"
x="0px" y="0px"
width="2048px" height="1536px"
viewBox="0 0 2048 1536" xml:space="preserve">
<defs>
<path id="Layer_green_2_0_1_STROKES" stroke="#2C9842"
stroke-width="3.5" stroke-linejoin="round"
stroke-linecap="round" fill="#FFFFFF"
d="M 397.55 799.35 L 618.95 775.525 826.45 768.95
1027.1 693.3 1254.55 684.2" class="path"></path>
</defs>
<g transform="matrix( 1, 0, 0, 1, 0,0) ">
<use xlink:href="#Layer_green_2_0_1_STROKES"></use>
</g>
<style>
.path {
stroke-dasharray: 1000;
stroke-dashoffset: 1000;
animation: dash 5s linear alternate infinite;
}
#keyframes dash {
from {
stroke-dashoffset: 1000;
}
to {
stroke-dashoffset: 0;
}
}
#-webkit-keyframes dash {
from {
stroke-dashoffset: 1000;
}
to {
stroke-dashoffset: 0;
}
}
</style>
</svg>
remove <defs> tag, it will show in safari

Animating SVG fill linearly along length of path

I have an SVG file that represents a thin shape. I would like to craft an animation such that the entire shape appears be being drawn out.
Example of what I am talking about with the 'S' logo from the Samsung Galaxy S brand:
https://codepen.io/anon/pen/MGawzy
Animation code (because StackOverflow forces me to include it):
#keyframes test {
0% {
clip-path: inset(0px 0px 300px 0px);
}
80% {
clip-path: inset(0px 0px 0px 0px);
}
100% {
clip-path: inset(0px 0px 0px 0px);
}
}
svg {
animation: test;
animation-duration: 2s;
animation-timing-function: linear;
animation-iteration-count: infinite;
}
A simple SVG in the example above is easy to animate, I can just slowly un-crop the SVG from top-down. But if I have a very complex shape which cannot be animated in this manner (maybe the red line in NASA's logo: https://upload.wikimedia.org/wikipedia/commons/e/e5/NASA_logo.svg), I need a better solution.
Just to clarify again, I do not want to animate the stroke. I want to be able to animate the fill, like it is begin drawn out.
Is there any general solution to this? If there is no general solution, how would I go about key-framing this on my own in a reasonable amount of time?
EDIT: To give some insight, I'm trying to animate the treble clef: https://upload.wikimedia.org/wikipedia/commons/e/e8/G-clef.svg
You could do this (easier to describe than to do, there's a lot of fiddly work involved):
Draw a smooth path on top of the shape that follows what you would consider the "path" and select such a stroke-width that the path covers the shape everywhere.
I would leave the final dot completely out of this, as it is so much thicker than the rest.
Divide the path in such a way that it has no overlapping parts. Order the parts in drawing order, make sure every partial path is drawn in the right direction.
Now divide the shape in the same way, making sure each part is exactly beneath the path on top.
Associate each of the shapes with one of the paths on top, defining the path as a mask for the shape. The path must have stroke:white. Preserve order.
Now you can animate the paths that define the masks with a stroke-dashoffset animation.
I would simply hide the final dot until the pseudo-line animation finishes and then reveal it at once.
Edit: I've definitely got too much time on my hands today, here's the working result:
.clef {
fill: black;
stroke: black;
stroke-width: 0.1;
}
mask path {
fill: none;
stroke: white;
stroke-width: 6;
}
#mask1 path {
stroke-dasharray: 100.8186 100.8186;
stroke-dashoffset: 100.8186;
animation: draw1 1s linear forwards;
}
#keyframes draw1 {
from { stroke-dashoffset: 100.8186; }
to { stroke-dashoffset: 0; }
}
#mask2 path {
stroke-dasharray: 83.6713 83.6713;
stroke-dashoffset: 83.6713;
animation: draw2 1s 1s linear forwards;
}
#keyframes draw2 {
from { stroke-dashoffset: 83.6713; }
to { stroke-dashoffset: 0; }
}
.dot {
opacity: 0;
animation: reveal 0s 2.5s forwards;
}
#keyframes reveal {
from { opacity: 0; }
to { opacity: 1; }
}
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="200" viewBox="0 0 44 75">
<defs>
<mask id="mask1" maskUnits="userSpaceOnUse">
<path d="M 24.3018,49.658 C 15.0191,46.9092 18.5393,38.1126 25.6256,38.2163 35.5458,38.3614 34.8431,54.3874 22.6943,54.1023 12.0123,53.8516 7.34095,40.0402 18.4391,30.1787 29.5373,20.3173 29.9235,12.5622 27.8005,9.28112" />
</mask>
<mask id="mask2" maskUnits="userSpaceOnUse">
<path d="M 27.8005,9.28112 C 25.1382,5.16638 17.6602,8.86888 20.5194,22.1412 L 28.1788,57.6956 C 31.6264,73.699 16.4903,72.3627 15.035,62.329" />
</mask>
</defs>
<path class="clef" mask="url(#mask1)" d="M 26.8522,9.90048 C 26.912,9.95039 26.9649,10.0085 27.0101,10.075 27.4815,10.7683 28.6214,14.0098 25.3767,19.8157 22.846,24.3437 11.0718,30.2815 10.2077,40.9075 9.45969,50.1477 19.1325,56.9723 27.4811,54.2894 33.0239,52.5081 35.8812,44.0959 32.4504,39.7568 23.3964,28.3057 8.87616,45.8309 22.9422,50.6319 21.4126,49.4286 20.37,48.4968 20.1759,47.3578 18.286,36.2692 34.9591,39.1968 30.4666,49.7165 28.6194,54.0421 21.1577,54.879 16.9085,51.0198 13.3489,47.787 11.7693,41.5593 15.7305,37.0885 21.0956,31.0332 27.4302,25.5974 29.1125,17.3081 29.7841,13.9988 29.4887,10.9357 28.6445,8.70078 Z" />
<path class="clef" mask="url(#mask2)" d="M 15.7311,63.3465 C 15.3353,65.46 17.5402,69.8491 21.9764,69.9924 27.3392,70.1658 30.7655,66.0634 29.1692,59.3682 L 21.164,22.4229 C 20.2111,18.0249 20.9262,15.6394 21.4351,14.2178 22.7185,10.6326 25.8192,9.03863 26.8522,9.90048 L 28.6445,8.70078 C 26.9883,4.31578 23.2199,3.11893 20.4997,9.50576 19.1217,12.7412 18.6085,15.989 19.9279,22.2128 L 27.9268,59.9444 C 28.4995,62.6457 28.1161,66.3629 25.595,68.0714 24.3461,68.9177 19.9267,69.5001 18.8455,67.48" />
<path class="clef dot" d="M 15.6702,63.6634 A 3.77139,3.8362 1.075 0 1 19.5129,59.8986 3.77139,3.8362 1.075 0 1 23.2116,63.8049 3.77139,3.8362 1.075 0 1 19.3689,67.5697 3.77139,3.8362 1.075 0 1 15.6702,63.6634 Z" />
</svg>
SVG solution
In this example, solutions from the #ccprog response are used, but the animation is moved from the CSS rules directly to the SVG animation commands
The commands that implement the animation are the same for all patches. The difference in the numeric value of the stroke-dasharray and stroke-dashoffset attributes for each patch:
<animate attributeName="stroke-dashoffset" dur="1s" values="100.8186;0" fill="freeze" />
The animation command for the appearance of a dot on the end of a treble clef:
<animate attributeName="opacity" dur="0.05s" values="0;1" begin="an2.end-0.05s" fill="freeze" />
<svg xmlns="http://www.w3.org/2000/svg" width="100" height="200" viewBox="0 0 44 75">
<defs>
<mask id="mask1" maskUnits="userSpaceOnUse">
<path fill="none" stroke="white" stroke-width="6" stroke-dasharray="100.8186" stroke-dashoffset="100.8186" d="M 24.3018,49.658 C 15.0191,46.9092 18.5393,38.1126 25.6256,38.2163 35.5458,38.3614 34.8431,54.3874 22.6943,54.1023 12.0123,53.8516 7.34095,40.0402 18.4391,30.1787 29.5373,20.3173 29.9235,12.5622 27.8005,9.28112">
<animate attributeName="stroke-dashoffset" dur="1s" values="100.8186;0" fill="freeze"/>
</path>
</mask>
<mask id="mask2" maskUnits="userSpaceOnUse">
<path fill="none" stroke="white" stroke-width="6" stroke-dasharray="83.6713" stroke-dashoffset="83.6713" d="M 27.8005,9.28112 C 25.1382,5.16638 17.6602,8.86888 20.5194,22.1412 L 28.1788,57.6956 C 31.6264,73.699 16.4903,72.3627 15.035,62.329" >
<animate id="an2" attributeName="stroke-dashoffset" dur="1s" values="83.6713;0" begin="+1s" fill="freeze"/>
</path>
</mask>
</defs>
<path class="clef" fill="black" stroke="black" stroke-width="0.1" mask="url(#mask1)" d="M 26.8522,9.90048 C 26.912,9.95039 26.9649,10.0085 27.0101,10.075 27.4815,10.7683 28.6214,14.0098 25.3767,19.8157 22.846,24.3437 11.0718,30.2815 10.2077,40.9075 9.45969,50.1477 19.1325,56.9723 27.4811,54.2894 33.0239,52.5081 35.8812,44.0959 32.4504,39.7568 23.3964,28.3057 8.87616,45.8309 22.9422,50.6319 21.4126,49.4286 20.37,48.4968 20.1759,47.3578 18.286,36.2692 34.9591,39.1968 30.4666,49.7165 28.6194,54.0421 21.1577,54.879 16.9085,51.0198 13.3489,47.787 11.7693,41.5593 15.7305,37.0885 21.0956,31.0332 27.4302,25.5974 29.1125,17.3081 29.7841,13.9988 29.4887,10.9357 28.6445,8.70078 Z"/>
<path class="clef" fill="black" stroke="black" stroke-width="0.1" mask="url(#mask2)" d="M 15.7311,63.3465 C 15.3353,65.46 17.5402,69.8491 21.9764,69.9924 27.3392,70.1658 30.7655,66.0634 29.1692,59.3682 L 21.164,22.4229 C 20.2111,18.0249 20.9262,15.6394 21.4351,14.2178 22.7185,10.6326 25.8192,9.03863 26.8522,9.90048 L 28.6445,8.70078 C 26.9883,4.31578 23.2199,3.11893 20.4997,9.50576 19.1217,12.7412 18.6085,15.989 19.9279,22.2128 L 27.9268,59.9444 C 28.4995,62.6457 28.1161,66.3629 25.595,68.0714 24.3461,68.9177 19.9267,69.5001 18.8455,67.48"/>
<path class="clef dot" opacity="0" d="M 15.6702,63.6634 A 3.77139,3.8362 1.075 0 1 19.5129,59.8986 3.77139,3.8362 1.075 0 1 23.2116,63.8049 3.77139,3.8362 1.075 0 1 19.3689,67.5697 3.77139,3.8362 1.075 0 1 15.6702,63.6634 Z">
<animate attributeName="opacity" dur="0.05s" values="0;1" begin="an2.end-0.05s" fill="freeze"/>
</path>
</svg>
Update 2020
SMIL SVG does not work in IE - caniuse

SVG Line Animation Reversed in Safari?

I've built pretty simple spinning animations for a site, and they look great in Chrome/Firefox, but for some reason, they're animating in reverse in Safari. I've played around with changing values of the offsets, but nothing seems to be working. Is there a workaround for this at all?
.sq {
width: 50vw;
height: auto;
padding: 2.2vw;
}
.path {
stroke-dasharray: 250;
stroke-dashoffset: 250;
animation: line 3s ease forwards;
}
#keyframes line {
from {
stroke-dashoffset: -250;
}
to {
stroke-dashoffset: 0;
}
}
<div class="sq">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81.32 81.32">
<defs>
<style>
.cls-1{fill:#202020;opacity:0.1;}
.path{fill:none;stroke:#ef3f44;stroke-miterlimit:10;stroke-width:5px;}
</style>
</defs>
<g id="94" data-name="94">
<g id="Objects">
<circle cx="40.66" cy="40.66" r="27.17" class="cls-1"/>
<path d="M40.66 79.15a38.49 38.49 0 1 1 38.49-38.49 38.53 38.53 0 0 1-38.49 38.49zm0-76.07a37.58 37.58 0 1 0 37.58 37.58A37.63 37.63 0 0 0 40.66 3.08z" class="cls-1"/>
<path d="M26.83 5.1a38.16 38.16 0 1 0 13.83-2.6" class="path"/>
</g>
</g>
</svg>
</div>
Also feel free to check this out on Codepen as well:
https://codepen.io/noahbrennan/pen/RLNWXj
In order not to use negative values of stroke-dashoffset, you can use double the positive value of stroke-dashoffset: 500;
Instead of negative values
#keyframes line {
from {
stroke-dashoffset: -250;
}
to {
stroke-dashoffset: 0;
}
}
Use double positive values:
#keyframes line {
from {
stroke-dashoffset: 250;
}
to {
stroke-dashoffset: 500;
}
}
.sq {
width: 50vw;
height: auto;
padding: 2.2vw;
}
.path {
stroke-dasharray: 250;
stroke-dashoffset: 250;
animation: line 3s ease forwards;
}
#keyframes line {
from {
stroke-dashoffset: 250;
}
to {
stroke-dashoffset: 500;
}
}
<div class="sq">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 81.32 81.32">
<defs>
<style>
.cls-1{fill:#202020;opacity:0.1;}
.path{fill:none;stroke:#ef3f44;stroke-miterlimit:10;stroke-width:5px;}
</style>
</defs>
<g id="94" data-name="94">
<g id="Objects">
<circle cx="40.66" cy="40.66" r="27.17" class="cls-1"/>
<path d="M40.66 79.15a38.49 38.49 0 1 1 38.49-38.49 38.53 38.53 0 0 1-38.49 38.49zm0-76.07a37.58 37.58 0 1 0 37.58 37.58A37.63 37.63 0 0 0 40.66 3.08z" class="cls-1"/>
<path d="M26.83 5.1a38.16 38.16 0 1 0 13.83-2.6" class="path"/>
</g>
</g>
</svg>
</div>
Safari doesn't support negative dashoffsets. You'll need to work around that by reversing your path and having the dashoffset animate the other way.
Had the same issue for an svg circle. I wanted the animation to progress counter clockwise. Ended up solving it by horizontally flipping the circle and using a positive dash offset.
I used a transform to flip the circle.
scale(-1 1)
See codepen for an example.
https://codepen.io/rikki404/pen/YzydPJq

Change direction of SVG animation

I saw this SVG animation and I'm wondering how to alter the direction that the line is erased in; currently the line retracts from the last point it is drawn, however I want the reverse; for the line to erase itself from the point where it first started to draw (so that it looks more like a loading animation).
I see that the animation property on .path has a value of infinite, but I'm not sure how the direction is specified.
The HTML is
<div class="bg">
<svg xmlns="http://www.w3.org/2000/svg" width="670" height="236" viewBox="0 0 670 236">
<path class="path" stroke="#4CADC1" stroke-width="4" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" stroke-dasharray="300" stroke-dashoffset="300" fill="none" d="M343.6 75.9v20.3l23.1 21.8-23.1 21.8v20.3l44.6-42.1zM326.4 139.8l-23.1-21.8 23.1-21.8v-20.3l-44.6 42.1 44.6 42.1z"/>
<path class="path" stroke="#4CADC1" stroke-width="4" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" stroke-dasharray="500" stroke-dashoffset="500" fill="none" d="M335 38.9c-43.7 0-79.1 35.4-79.1 79.1s35.4 79.1 79.1 79.1 79.1-35.4 79.1-79.1-35.4-79.1-79.1-79.1zM335 182.9c-35.8 0-64.9-29.1-64.9-64.9s29.1-64.9 64.9-64.9 64.9 29.1 64.9 64.9-29.1 64.9-64.9 64.9z"/>
</svg>
</div>
And the CSS is
body {
background-color: #fff;
}
.bg {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
}
.path {
animation: draw 3.5s infinite;
}
#keyframes draw {
50% {
stroke-dashoffset: 0;
}
}
I like your idea of making this an loading animation:
CODEPEN
Now what i did:
changed the animation start stop point
#keyframes draw {
100% {
stroke-dashoffset: -500;
}
}
Why -500?
Because this is the value of the dash-array.
This is defined in the <svg>: dasharray="500"
Changed this value in the inner most path. It was only 300
I added a linear animation
animation: draw 5s infinite linear;
The default is ease. I found the animation has better consistency with a linear animation.
NOTE
dashoffset=500 <- makes the animation start without the dash/stroke
I used the negative value for stroke-dashoffset that Persijn recommended. This worked great in Chrome and FF, but it didn't work properly in Safari.
I've found that if you open the SVG in Illustrator, you can reverse the direction of the path, by opening the Attributes panel (you might have to click the "show more" in the top right) and literally clicking the "reverse path" button.
stroke-dasharray can be a list of white space separated dashes and gaps, so you could do something like this:
var svgPath = document.getElementById('svgPath');
var pathLength = svgPath.getTotalLength();
var offset = 0;
function offsetPath() {
requestAnimationFrame(offsetPath);
offset += 0.1;
var dasharray = 0 + ' ' + offset + ' ' + (pathLength - offset);
svgPath.setAttribute('stroke-dasharray', dasharray);
}
requestAnimationFrame(offsetPath);
<svg xmlns="http://www.w3.org/2000/svg" width="670" height="236" viewBox="0 0 670 236">
<path id="svgPath" class="path" stroke="#4CADC1" stroke-width="4" stroke-linejoin="round" stroke-linecap="round" stroke-miterlimit="10" stroke-dasharray="100 100 100" fill="none" d="M343.6 75.9v20.3l23.1 21.8-23.1 21.8v20.3l44.6-42.1zM326.4 139.8l-23.1-21.8 23.1-21.8v-20.3l-44.6 42.1 44.6 42.1z"
/>
</svg>
Changing SVG Line Animation Direction
Add KeyFrames and Classes for Both Directions:
.dash {
stroke-dasharray : 10 5;
animation : dash 4s linear infinite;
}
.dash_reverse {
stroke-dasharray : 10 5;
animation : dash_reverse 4s linear infinite;
}
#keyframes dash {
to {
stroke-dashoffset: 100;
}
}
#keyframes dash_reverse {
to {
stroke-dashoffset: -100;
}
}
Use JavaScript to Toggle Animation:
function animate_line_forward(id) {
$("#" + id).removeClass("dash_reverse");
$("#" + id).addClass("dash");
}
function animate_line_reverse(id) {
$("#" + id).removeClass("dash");
$("#" + id).addClass("dash_reverse");
}
Call functions as needed (pass the SVG line id into the above functions:
Calling animate_line_forward:
Calling animate_line_reverse:

Resources