SVG text with ‘stroke-dashoffset’ CSS animation not working in Firefox - html
The following animation works fine in Chrome and Opera, but it doesn't work in Mozilla Firefox. I can't figure out why.
Can someone please help me to fix the problem? What is wrong with my CSS?
#text-logo {
font-family: 'Shrikhand', cursive;
stroke-dashoffset: 100%;
stroke-dasharray: 100%;
-moz-animation: draw 8s forwards ease-in;
-webkit-animation: draw 8s forwards ease-in;
animation: draw 8s forwards ease-in;
background-clip: text;
}
#keyframes draw {
100% {
stroke-dashoffset: 0;
}
}
#-webkit-keyframes draw {
100% {
stroke-dashoffset: 0;
}
}
#-moz-keyframes draw {
100% {
stroke-dashoffset: 0;
}
}
<div class="draw_text">
<svg width="1092" height="220">
<text x="150" y="200" fill="#fff" stroke="#333" id="text-logo" stroke-width="2" font-size="95">WHO I AM ?</text>
</svg>
</div>
Units have to match in Firefox so if the base is a percentage unit then the animated value must be in percentages too.
There's no such thing as a -moz-animation or -moz-keyframes and any prefixed animations should be placed before the unprefixed version. I've fixed that too below.
#text-logo {
font-family: 'Shrikhand', cursive;
stroke-dashoffset: 100%;
stroke-dasharray: 100%;
-webkit-animation: draw 8s forwards ease-in;
animation: draw 8s forwards ease-in;
background-clip: text;
}
#-webkit-keyframes draw {
100% {
stroke-dashoffset: 0%;
}
#keyframes draw {
100% {
stroke-dashoffset: 0%;
}
}
}
<div class="draw_text">
<svg width="1092" height="220">
<text x="150" y="200" fill="#fff" stroke="#333" id="text-logo" stroke-width="2" font-size="95">WHO I AM ?</text>
</svg>
</div>
Setting stroke-dashoffset: 100% looks like a neat thing, but 100% of what? The canonical definition is:
If a percentage is used, the value represents a percentage of the current viewport …
… the percentage is calculated as the specified percentage of sqrt((actual-width)**2 + (actual-height)**2))/sqrt(2).
Firefox seems to not implement that. Setting px lengths makes it work:
#text-logo {
font-family: 'Shrikhand', cursive;
stroke-dashoffset: 1114px;
stroke-dasharray: 1114px;
-moz-animation: draw 8s forwards ease-in;
-webkit-animation: draw 8s forwards ease-in;
animation: draw 8s forwards ease-in;
background-clip: text;
}
#keyframes draw {
100% {
stroke-dashoffset: 0;
}
}
#-webkit-keyframes draw {
100% {
stroke-dashoffset: 0;
}
}
#-moz-keyframes draw {
100% {
stroke-dashoffset: 0;
}
}
<div class="draw_text">
<svg width="1092" height="220">
<text x="150" y="200" fill="#fff" stroke="#333" id="text-logo" stroke-width="2" font-size="95">WHO I AM ?</text>
</svg>
</div>
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>
HTML SVG reduce circle size
I have found animated circle made with svg but I need to reduce the circle size How can I modify the code please? #keyframes dash { from { stroke-dashoffset: 816; } to { stroke-dashoffset: 0; } } .progress-circle path { stroke-dasharray: 816; stroke-dashoffset: 0; animation: dash 2s linear; animation-delay: 0.3s; } <svg class="progress-circle" width="70" height="70"> <path d="m35,2.5c17.955803,0 32.5,14.544199 32.5,32.5c0,17.955803 -14.544197,32.5 -32.5,32.5c-17.955803,0 -32.5,-14.544197 -32.5,-32.5c0,-17.955801 14.544197,-32.5 32.5,-32.5z" stroke="#000" stroke-width="1" fill="transparent" /> </svg>
You need to change the width and height and then add the viewbox atrribute with the original size: #keyframes dash { from { stroke-dashoffset: 816; } to { stroke-dashoffset: 0; } } .progress-circle path { stroke-dasharray: 816; stroke-dashoffset: 0; animation: dash 2s linear; animation-delay: 0.3s; } <svg class="progress-circle" width="30" height="30" viewBox="0 0 70 70"> <path d="m35,2.5c17.955803,0 32.5,14.544199 32.5,32.5c0,17.955803 -14.544197,32.5 -32.5,32.5c-17.955803,0 -32.5,-14.544197 -32.5,-32.5c0,-17.955801 14.544197,-32.5 32.5,-32.5z" stroke="#000" stroke-width="1" fill="transparent" /> </svg>
add viewBox= "0 0 50 50" in svg tag and reduce svgwidth and height
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.
CSS keyframes (animation) not functioning in safari
I am currently facing some issues with CSS's #keyframes, as they do not seem to work to work on Safari browser. They are working fine on Chrome, though. I have checked with the list of WebKit CSS extensions, but I do not seem to have any luck with it. .app-loading { } .app-loading .spinner { height: 200px; width: 200px; animation: rotate 2s linear infinite; -webkit-animation: rotate 2s linear infinite; transform-origin: center center; -webkit-transform-origin: center center; position: absolute; top: 0; bottom: 10; margin: auto; } .app-loading .spinner .path { stroke-dasharray: 1, 200; stroke-dashoffset: 0; -webkit-animation: dash 1.5s ease-in-out infinite; stroke-linecap: round; stroke: #ddd; } #keyframes rotate { 100% { transform: rotate(360deg); } } #-webkit-keyframes rotate { 100% { -webkit-transform: rotate(360deg); } } #keyframes dash { 0% { stroke-dasharray: 1, 200; stroke-dashoffset: 0; } 50% { stroke-dasharray: 89, 200; stroke-dashoffset: -35px; } 100% { stroke-dasharray: 89, 200; stroke-dashoffset: -124px; } } #-webkit-keyframes dash { 0% { stroke-dasharray: 1, 200; stroke-dashoffset: 0; } 50% { stroke-dasharray: 89, 200; stroke-dashoffset: -35px; } 100% { stroke-dasharray: 89, 200; stroke-dashoffset: -124px; } } <div class="app-loading"> <svg class="spinner" viewBox="25 25 50 50"> <circle class="path" cx="50" cy="50" r="20" fill="none" stroke-width="2" stroke-miterlimit="10" /> </svg> </div> I have also created a demo on JSfiddle. I understand there are many similar questions out there, but none of them seem to be solving the issue I am facing right now: 1) CSS Keyframe animations safari 2) CSS3 animation not working in safari Would appreciate some help over here. Thanks! EDIT 1: What other things I've tried - replacing the -webkit-animation shorthand with the below -webkit-animation-name: rotate; -webkit-animation-duration: 2s; -webkit-animation-iteration-count: infinite; -webkit-animation-timing-function: linear; -webkit-animation-fill-mode: infinite;
In Safari the shorthand notation does not work. So this will not work : -webkit-animation: rotate 2s linear infinite; Instead try writing your animation in full form like this : -webkit-animation-name: rotate; -webkit-animation-duration: 2s; -webkit-animation-iteration-count: infinite; -webkit-animation-timing-function: linear; -webkit-animation-fill-mode: infinite; Do the same to your other animation as well and see if it works
I faced the same problem with Safari, using expanded properties for Keyframes, and what fixed the problem for me was using the absolute strict shorthand definition: /* #keyframes duration | timing-function | delay | iteration-count | direction | fill-mode | play-state | name */ animation: 3s ease-in 1s 2 reverse both paused slidein; Note that the keyframe name is at the end of the definition, I think that could be the problem. Source: https://developer.mozilla.org/en-US/docs/Web/CSS/animation Please also note that recent versions of Safari don't use -webkit- prefix so there's no need to add that if your platform doesn't aim for retrocompatibility.
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.