Animated dashed line using SVG - html

I try to find a way to draw an animated dash line like HERE.
The problem with this solution is, that a black line is drawn underneath a dashed white line. The thing is, I want to have the middle parts (the spaces between the dashes) transparent, to put this animation on the top of a map image, not filled with color's (like white in this example).
I tried with different set ups of the stroke-dasharray and stroke-dashoffset attribute, but all this results were not like the way I search for.
Currently I embed a svg object directly in my HTML document. The svg tag includes the path tag, which is recommended for the path itself. The animation I try to realize with simple css animation key frames like:
#keyframes dash
{
from
{
stroke-dashoffset: 1000;
}
to
{
stroke-dashoffset: 0;
}
}

The space between the dashes is by default transparent.
Is there something your doing to change the color?
svg {
background-image: linear-gradient(45deg, red, blue);
}
svg circle {
fill: pinK;
stroke: rgba(0, 0, 0, 0.9);
stroke-width: 10px;
stroke-dasharray: 5;
stroke-dashoffset: 0;
animation: test 10s;
-webkit-animation: test 10s;
}
#keyframes test {
from {
stroke-dashoffset: 0;
}
to {
stroke-dashoffset: 200;
}
}
#-webkit-keyframes test {
from {
stroke-dashoffset: 0;
}
to {
stroke-dashoffset: 200;
}
}
<svg width="200" height="200" viewBox="0 0 100 100">
<circle cx="50" cy="50" r="40" />
</svg>

Related

How to implement animation on stroke-dasharray and stroke-offset circle svg?

I try to make piechart using stroke line, however isn't work. The idea is piechart will be animate from 0 to 50 line.
#circle{
stroke-dasharray: 50 100;
stroke-dashoffset: 0;
fill: none;
stroke: black;
stroke-width: 5px;
transition: 0.3s;
animation: progress 5s linear forwards;
#keyframes progress {
from {
stroke-dasharray: 0 100;
stroke-dashoffset: 0;
}
to {
stroke-dasharray: 50 100;
stroke-dashoffset: 50;
}
}
}
<svg >
<circle cx='24' cy='24' r='18' id="circle"/>
</svg>
The keyframes at-rule is not part of the CSS selector for the element. As default the path of the circle starts at 3 o'clock. The total length of the circle path can be controlled using the attribute pathLength. If the animation should go clockwise I think is is easier to control the starting point by setting the transform/rotate attribute on the circle instead of using the dasharray offset.
#circle {
stroke-dasharray: 0 100;
fill: none;
stroke: black;
stroke-width: 5px;
animation: progress 5s linear forwards;
}
#keyframes progress {
from {
stroke-dasharray: 0 100;
}
to {
stroke-dasharray: 100 100;
}
}
<svg>
<circle cx='24' cy='24' r='18' id="circle"
pathLength="100" transform="rotate(-90 24 24)"/>
</svg>

How do I use an animated SVG for navbar link hover, and position it properly?

I’m building my portfolio and it has a theme as if it's been drawn on paper.
When you hover over a link on my navbar, the SVG animates from underneath, it's an arrow that points to the link and it looks like it's been drawn with a sharpie. I would also like to animation to reverse on mouse out, instead of just disappearing.
The animation works awesomely on hover (by itself), exactly as I want, however I cannot figure out how to make it appear on a navbar link hover instead. Also, I'm unsure how to position it. Currently I have the SVG placed after my <a> tags.
Here's the code:
div {
border: 1px black solid;
width: 120px;
height: 150px;
text-align: center;
}
#arrowSVG:hover path {
animation: nav_arrow 800ms linear 1 normal forwards;
}
#keyframes nav_arrow {
0%,
100% {
stroke-dashoffset: 228.816432;
}
60% {
stroke-dashoffset: 0;
}
100% {
stroke-dashoffset: 0;
}
}
<div>
<p> Hover me!
</>
<svg id="arrowSVG" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 128 128" shape-rendering="geometricPrecision" text-rendering="geometricPrecision">
<path id="eZuEQXWsHpA2" d="M81.33906,95.61239c-2.04913-2.92733-15.33188-23.55344-18.27718-23.9216-2.1176-.2647-6.39806,6.74064-9.13859,
5.64442-1.72253-.68901-.23957-19.37568,1.07513-20.42744.35406-.28324,17.10175,10.91579,16.93327,12.09519-.24773,1.73411-10.42713,
4.21185-12.09519,4.56929-2.16723.46441-8.43321,2.60391-6.45077,1.61269c3.20375-1.60188,6.85172-2.25839,9.67615-4.56929.39226-.32094,
1.55594-1.2354,1.07513-1.07513-.88133.29378-11.28885,4.35372-11.28885,4.30051c0-2.22645,10.47757-5.91321,12.36397-5.91321c1.02153,
0-1.18114-1.93573-2.15025-1.61269-2.93453.97818-11.8009,6.50634-9.94494,4.03173c2.11065-2.81419,10.07996-2.15151,11.02006-4.03173.26335-.5267-10.04599,
1.11958-10.4825.53757-2.04355-2.72474,8.60103-2.59902,8.60103-3.76295c0-1.26705-8.19827,1.07445-8.86981,0-.76572-1.22515,1.75021-2.86552,
2.15026-3.49417.30422-.47805.18968-1.16541.53756-1.61269c1.16554-1.49856,2.42055,6.98982,3.76296,8.33224c4.42514,4.42514,10.96031-4.00183,9.40736,3.76295" fill="none" stroke="#000" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" stroke-dashoffset="228.816432" stroke-dasharray="228.816432" />
</div>

Using linear-gradient in an animation on CSS

I'm working on a mobile first project, it's a project on with HTML and CSS only, allowing us to learn how to do animation with CSS only. I have a problem with my project that I hope you can help me with.
I am trying to fill the hearts with a linear-gradient color instead of the ##9356DC I am using in my code. Problem is, each time I am using the linear-gradient, the heart doesn't fill with any color anymore.
Thanks in advance for all the help you can provide to me!
.icon {
fill: transparent;
stroke: black;
stroke-width: 50;
cursor: pointer;
position: absolute;
right: 1.5rem;
bottom: 2rem;
}
.icon svg {
overflow: visible;
width: 1.6rem;
}
.icon .heart-main:active path {
animation: fill-animation 1.5s ease-in-out forwards;
stroke: #9356DC;
}
#keyframes fill-animation {
10% {
fill: #9356DC;
}
80% {
fill: #9356DC;
}
100% {
fill: #9356DC;
}
}
<div class="icon">
<svg class="heart-main" viewBox="0 0 512 512" width="100" title="heart">
<path d="M462.3 62.6C407.5 15.9 326 24.3 275.7 76.2L256 96.5l-19.7-20.3C186.1 24.3 104.5 15.9 49.7 62.6c-62.8 53.6-66.1 149.8-9.9 207.9l193.5 199.8c12.5 12.9 32.8 12.9 45.3 0l193.5-199.8c56.3-58.1 53-154.3-9.8-207.9z" />
</svg>
</div>
To fill linear-gradient, you will have to add linearGradient node inside the definitions section of your SVG file like below: (Read More about Linear Gradient)
<defs>
<linearGradient id="FillGradient" gradientTransform="rotate(90)">
<stop offset="2%" stop-color="#FFF" />
<stop offset="95%" stop-color="#9356DC" />
</linearGradient>
</defs>
Make sure you are adding id attribute which is going to be used in CSS to fill the gradient like below:
#keyframes fill-animation {
0%{
fill-opacity: 0.1;
}
10% {
fill: url(#FillGradient);
fill-opacity: 0.1;
}
80% {
fill: url(#FillGradient);
fill-opacity: 1;
}
100% {
fill: url(#FillGradient);
fill-opacity: 1;
}
}
You can remove the fill-opacity and of course change the color of gradient in linearGradient node as per your need.
See the working Snippet below: (I have commented few styles just to make it big and clear)
.icon {
fill: transparent;
stroke: black;
stroke-width: 50;
cursor: pointer;
/* position: absolute;
right: 1.5rem;
bottom: 2rem;*/
}
.icon svg {
overflow: visible;
width: 5.6rem; /* changed from 1.6 to 5.6 */
}
.icon .heart-main:active path {
animation: fill-animation 1.5s ease-in-out forwards;
stroke: #9356DC;
}
#keyframes fill-animation {
0%{
fill-opacity: 0.1;
}
10% {
fill: url(#FillGradient);
fill-opacity: 0.1;
}
80% {
fill: url(#FillGradient);
fill-opacity: 1;
}
100% {
fill: url(#FillGradient);
fill-opacity: 1;
}
}
<div class="icon">
<svg class="heart-main" viewBox="0 0 512 512" width="300" title="heart">
<path d="M462.3 62.6C407.5 15.9 326 24.3 275.7 76.2L256 96.5l-19.7-20.3C186.1 24.3 104.5 15.9 49.7 62.6c-62.8 53.6-66.1 149.8-9.9 207.9l193.5 199.8c12.5 12.9 32.8 12.9 45.3 0l193.5-199.8c56.3-58.1 53-154.3-9.8-207.9z" />
<defs>
<linearGradient id="FillGradient" gradientTransform="rotate(90)">
<stop offset="2%" stop-color="#FFF" />
<stop offset="98%" stop-color="#9356DC" />
</linearGradient>
</defs>
</svg>
</div>
you could use my code
#keyframes value {
0%{background-image: linear-gradient(90deg, red, purple, green);}
25%{background-image: linear-gradient(90deg, orange, yellow,blue);}
50%{background-image: linear-gradient(90deg, black, grey, white);}
100%{background-image: linear-gradient(90deg,lime,violet,magenta);}
}
then use
.icon{
animation-name: value;
animation-duration: 50s;
animation-iteration-count: infinite;
}
you could use background-image instead of fill and if that doesn't work you could use color instead.
i hope i helped but i am pretty new to css myself.

Animating SVG icon on hover

I'm attempting to animate an SVG line icon ONLY on hover. I'd like it to be static when not hovered. I've worked out how to animate the drawing effect, and I can get it kind of working on hover.. however when it's going between the 'from' and 'to' keyframes, the dashes get smaller and it doesn't create the smooth drawing effect I was hoping for. I am doing this purely HTML/CSS.
.bell_line:hover {
animation: draw 3s linear forwards;
}
#keyframes draw {
from {
stroke-dashoffset:92;
stroke-dasharray: 92;
}
to {
stroke-dashoffset:0;
stroke-dasharray: 0;
}
}
<div class="bell_line" style="margin-left: 100px;margin-top: 100px;">
<svg class="bell_line" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 60.85 38.83">
<g data-name="bell_line" fill="none" stroke="#000" stroke-linecap="round" stroke-miterlimit="10">
<path class="bell_line" d="M18.43 28.41l5.38-14.11v-3a5.62 5.62 0 0111.23 0v3l5.33 14.11zM29.38 5.67V.5M29.38 33.2v5.13"/>
</g>
</svg>
</div>
Would transition solve your issue? I usually find it a simpler solution for hover states.
Your css would end up looking like this,
.bell_line {
fill: none;
stroke: black;
stroke-dashoffset: 0;
stroke-dasharray: 0;
transition: stroke-dashoffset 2s ease;
}
.bell_line:hover {
stroke-dashoffset: 92;
}
OR if you want to animate two states (in your case draw off draw on) you will need to create an animation that draws off the dashoffet by its halfway point, then redraws it by it's completion.
Like so,
#keyframes draw {
0% {
stroke-dashoffset: 0;
}
50% {
stroke-dashoffset: 90;
}
100% {
stroke-dashoffset: 180;
}
}
.bell_line {
fill: none;
stroke: black;
stroke-dashoffset: 0;
stroke-dasharray: 90;
}
.bell_line:hover {
animation: draw 2s linear forwards;
}
Here we only animate the dashoffset to produce the animation effect then reset the
Here's a working example,
https://stackblitz.com/edit/react-bell-line
https://react-bell-line.stackblitz.io
Also just be mindful that the hover state is on the path. You could always make the hover state on the svg then point to the path.
svg:hover > .bell_line
This would just mean you can create a larger area to target with the mouse.

SVG reverse drawing css animation cross-browsers

I'm fighting with CSS SVG animations and I found the problem which I cannot overcome. My animation works properly in Chrome, Opera and Firefox but Safari has a problem with it - inside circles should draw itself anticlockwise.
Anyone know how to solve this?
Thanks!
.padding {
padding-left: 20px;
padding-right: 20px;
background-color: grey;
}
svg .cog-one,
svg .cog-two {
stroke-dasharray: 390;
stroke-dashoffset: 390;
transition: all 1s linear;
}
svg .circle-one {
stroke-dasharray: 100%;
stroke-dashoffset: -100%;
transition: all .6s linear .3s;
}
svg .cog-two {
transition-delay: .3s;
}
svg .circle-two {
stroke-dasharray: 100%;
stroke-dashoffset: -100%;
transition: all .6s linear .6s;
}
svg:hover .cog-one,
svg:hover .cog-two {
stroke-dashoffset: 0;
}
svg:hover .circle-two {
stroke-dashoffset: 0%;
}
svg:hover .circle-one {
stroke-dashoffset: 0%;
}
<svg width="250" height="250" viewbox="0 0 162.95 117.37" class="padding">
<path fill="none" stroke="#231f20" stroke-width="5.5" d="M2331.44,513.63a0.3,0.3,0,0,1-.4,0l-9.58-7.17-1.23.61a35.5,35.5,0,0,1-4.16,1.73l-1.3.44-1.7,11.91a0.31,0.31,0,0,1-.09.18,0.32,0.32,0,0,1-.23.09h-16.1a0.32,0.32,0,0,1-.33-0.26l-1.73-11.87-1.29-.44a35.49,35.49,0,0,1-4.19-1.68l-1.24-.61-9.69,7.29a1.23,1.23,0,0,1-.63.19l-11.34-11.32a0.9,0.9,0,0,1,.14-0.68l7.4-9.8-0.61-1.24a35.42,35.42,0,0,1-1.73-4.15l-0.45-1.3-11.91-1.69a0.32,0.32,0,0,1-.27-0.31V467.49a0.31,0.31,0,0,1,.09-0.23,0.31,0.31,0,0,1,.18-0.09l11.89-1.7,0.44-1.3a35.2,35.2,0,0,1,1.72-4.15l0.61-1.23-7.21-9.6a0.35,0.35,0,0,1,0-.44l11.38-11.38a0.35,0.35,0,0,1,.43,0l9.62,7.22,1.21-.59a35.09,35.09,0,0,1,4.18-1.74l1.3-.44,1.69-11.9a0.31,0.31,0,0,1,.09-0.18,0.32,0.32,0,0,1,.23-0.09h16.1a0.31,0.31,0,0,1,.31.27l1.71,11.89,1.3,0.44a35.08,35.08,0,0,1,4.18,1.7l1.23,0.6,9.65-7.25a0.45,0.45,0,0,1,.49,0L2343,448.59a0.46,0.46,0,0,1,0,.49l-7.29,9.69,0.61,1.23a35.49,35.49,0,0,1,1.72,4.16l0.44,1.3,11.9,1.7a0.31,0.31,0,0,1,.27.31v16.1a0.32,0.32,0,0,1-.09.22,0.31,0.31,0,0,1-.18.09l-11.9,1.7-0.44,1.3a35.25,35.25,0,0,1-1.73,4.15l-0.61,1.23,7.19,9.59a0.3,0.3,0,0,1,0,.4Z" transform="translate(-2256.03 -406.85)" class="cog-one"></path>
<circle fill="none" stroke="#231f20" stroke-width="2.75" cx="48.67" cy="68.69" r="20.8" class="circle-one"></circle>
<path fill="none" stroke="#231f20" stroke-width="5.5" d="M2411.82,460.56a0.22,0.22,0,0,1-.25.14l-8.39-2.1-0.65.75a25.64,25.64,0,0,1-2.29,2.31l-0.74.66,2.2,8.41a0.22,0.22,0,0,1,0,.14,0.23,0.23,0,0,1-.12.13l-10.74,4.52a0.22,0.22,0,0,1-.28-0.09l-4.47-7.42-1,.07a25.64,25.64,0,0,1-3.26,0l-1-.06-4.41,7.56a0.89,0.89,0,0,1-.37.3l-10.72-4.37a0.65,0.65,0,0,1-.1-0.49l2.19-8.6-0.75-.65a25.59,25.59,0,0,1-2.31-2.28l-0.66-.74-8.4,2.2a0.23,0.23,0,0,1-.27-0.13l-4.5-10.72a0.23,0.23,0,0,1,0-.18,0.22,0.22,0,0,1,.09-0.11l7.45-4.46-0.07-1a25.43,25.43,0,0,1,0-3.25l0.06-1-7.49-4.38a0.25,0.25,0,0,1-.12-0.29l4.4-10.76a0.25,0.25,0,0,1,.29-0.13l8.43,2.12,0.64-.73a25.35,25.35,0,0,1,2.3-2.33l0.74-.66-2.2-8.4a0.23,0.23,0,0,1,0-.15,0.23,0.23,0,0,1,.12-0.13l10.72-4.51a0.23,0.23,0,0,1,.28.09l4.46,7.44,1-.07a25.34,25.34,0,0,1,3.26,0l1,0.06,4.4-7.53a0.33,0.33,0,0,1,.31-0.17l10.76,4.4a0.33,0.33,0,0,1,.11.34l-2.15,8.49,0.75,0.65a25.64,25.64,0,0,1,2.31,2.29l0.66,0.74,8.4-2.19a0.23,0.23,0,0,1,.27.13l4.5,10.72a0.23,0.23,0,0,1,0,.18,0.23,0.23,0,0,1-.09.11l-7.45,4.46,0.07,1a25.46,25.46,0,0,1,0,3.25l-0.06,1,7.47,4.38a0.22,0.22,0,0,1,.08.28Z" transform="translate(-2256.03 -406.85)" class="cog-two"></path>
<circle fill="none" stroke="#231f20" stroke-width="2.75" cx="2383.36" cy="442.66" r="14.33" transform="translate(-2241.52 550.51) rotate(-22.78)" class="circle-two"></circle>
</svg>
If Safari is drawing the circle the wrong direction, then that will be a bug in Safari. The SVG spec is clear on which direction strokes are meant to go. You may wish to report that bug to Apple.
The way to resolve your immediate problem would be to convert your <circle> elements to <path> elements. That way you control the path direction.