Filling a rotating circular SVG with a pattern image - html
So i've got this text that rotates around this circle using SVG. I'd like to fill it with an image to make it less bland. This is the code I have in my HTML.
<div id="container">
<div id="circle">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="300px"
height="300px" viewBox="0 0 300 300" enable-background="new 0 0 300 300" xml:space="preserve">
<defs>
<pattern id='my_portrait'>
<image xlink:href="http://gastv.mx/wp-content/uploads/2014/05/jumex.jpg" x="-30" y="-30"
width="380" height="267" />
</pattern>
<path id="circlePath" d=" M 150, 150 m -60, 0 a 60,60 0 0,1 120,0 a 60,60 0 0,1 -120,0 " />
</defs>
<circle cx="150" cy="100" r="75" fill="none"/>
<g id="rotating_text">
<use xlink:href="#circlePath" fill="rgb(81,84,77)" stroke="black" stroke-width="2px"/>
<text fill="#000">
<textPath xlink:href="#circlePath" fill="white">Curse this circular mass of misery!!!</textPath>
</text>
</g>
</svg>
</div>
</div>
And this is the CSS defining speed and browser support.
#circle svg {
width: 100%;
-webkit-animation-name: rotate;
-moz-animation-name: rotate;
-ms-animation-name: rotate;
-o-animation-name: rotate;
animation-name: rotate;
-webkit-animation-duration: 20s;
-moz-animation-duration: 20s;
-ms-animation-duration: 20s;
-o-animation-duration: 20s;
animation-duration: 20s;
-webkit-animation-iteration-count: infinite;
-moz-animation-iteration-count: infinite;
-ms-animation-iteration-count: infinite;
-o-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-webkit-animation-timing-function: linear;
-moz-animation-timing-function: linear;
-ms-animation-timing-function: linear;
-o-animation-timing-function: linear;
animation-timing-function: linear;
}
#-webkit-keyframes rotate {
from {
-webkit-transform: rotate(360deg);
}
to {
-webkit-transform: rotate(0);
}
}
#-moz-keyframes rotate {
from {
-moz-transform: rotate(360deg);
}
to {
-moz-transform: rotate(0);
}
}
#-ms-keyframes rotate {
from {
-ms-transform: rotate(360deg);
}
to {
-ms-transform: rotate(0);
}
}
#-o-keyframes rotate {
from {
-o-transform: rotate(360deg);
}
to {
-o-transform: rotate(0);
}
}
#keyframes rotate {
from {
transform: rotate(360deg);
}
to {
transform: rotate(0);
}
}
I've tried a couple of different methods of trying to fill the inside circle but nothing ever seems to make a difference. Any help would be sorely appreciated!
add patternUnits="userSpaceOnUse" height="380" width="267" in my_portrait
and also add fill="url(#my_portrait)" in circlePath
#circle svg {
width: 100%;
-webkit-animation-name: rotate;
-moz-animation-name: rotate;
-ms-animation-name: rotate;
-o-animation-name: rotate;
animation-name: rotate;
-webkit-animation-duration: 20s;
-moz-animation-duration: 20s;
-ms-animation-duration: 20s;
-o-animation-duration: 20s;
animation-duration: 20s;
-webkit-animation-iteration-count: infinite;
-moz-animation-iteration-count: infinite;
-ms-animation-iteration-count: infinite;
-o-animation-iteration-count: infinite;
animation-iteration-count: infinite;
-webkit-animation-timing-function: linear;
-moz-animation-timing-function: linear;
-ms-animation-timing-function: linear;
-o-animation-timing-function: linear;
animation-timing-function: linear;
}
#-webkit-keyframes rotate {
from {
-webkit-transform: rotate(360deg);
}
to {
-webkit-transform: rotate(0);
}
}
#-moz-keyframes rotate {
from {
-moz-transform: rotate(360deg);
}
to {
-moz-transform: rotate(0);
}
}
#-ms-keyframes rotate {
from {
-ms-transform: rotate(360deg);
}
to {
-ms-transform: rotate(0);
}
}
#-o-keyframes rotate {
from {
-o-transform: rotate(360deg);
}
to {
-o-transform: rotate(0);
}
}
#keyframes rotate {
from {
transform: rotate(360deg);
}
to {
transform: rotate(0);
}
}
<div id="container">
<div id="circle">
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="300px"
height="300px" viewBox="0 0 300 300" enable-background="new 0 0 300 300" xml:space="preserve">
<defs>
<pattern id='my_portrait' patternUnits="userSpaceOnUse" height="380" width="267">
<image xlink:href="http://gastv.mx/wp-content/uploads/2014/05/jumex.jpg" x="-30" y="-30"
width="380" height="267" />
</pattern>
<path id="circlePath" d=" M 150, 150 m -60, 0 a 60,60 0 0,1 120,0 a 60,60 0 0,1 -120,0 " fill="url(#my_portrait)" />
</defs>
<circle cx="150" cy="100" r="75" fill="none"/>
<g id="rotating_text">
<use xlink:href="#circlePath" fill="rgb(81,84,77)" stroke="black" stroke-width="2px"/>
<text fill="#000">
<textPath xlink:href="#circlePath" fill="white">Curse this circular mass of misery!!!</textPath>
</text>
</g>
</svg>
</div>
</div>
Related
Circles "waves" animations with CSS keyframes
I'm trying to animate circles to achieve an infinite effect of colliding waves. I laid the base but I can't make the order of the animations smooth and linear. Codepen available here. <div class="circles-container" <!-- 1er circle --> <svg width="1280" height="1280" xmlns="http://www.w3.org/2000/svg" style="z-index: 1;"> <path class="circle-1" d="M0 0h640c0 353.466-286.534 640-640 640V0Z" fill="currentColor" fill-rule="evenodd" /> </svg> <!-- 2eme circle --> <svg width="1280" height="1280" xmlns="http://www.w3.org/2000/svg" style="z-index: 2;"> <path class="circle-2" d="M0 0h640c0 353.466-286.534 640-640 640V0Z" fill="currentColor" fill-rule="evenodd" /> </svg> <!-- 3eme circle --> <svg width="1280" height="1280" xmlns="http://www.w3.org/2000/svg" style="z-index: 3;"> <path class="circle-3" d="M0 0h640c0 353.466-286.534 640-640 640V0Z" fill="currentColor" fill-rule="evenodd" /> </svg> </div> .circles-container { position: relative; } .circles-container svg { position: absolute; top: 0; left: 0; } .circle-1 { animation: scaleCircle 7.5s ease-in-out infinite; transform: scale(0); transition: all 2s ease-in-out; color: #1D1D28; } .circle-2 { animation: scaleCircle 5s ease-in-out infinite 2.5s; transform: scale(0); transition: all 2s ease-in-out; color: #420DC4; } .circle-3 { animation: scaleCircle 5s ease-in-out infinite; transform: scale(0); transition: all 2s ease-in-out; color: #1D1D28; } #keyframes scaleCircle { 0% { transform: scale(0); } 100% { transform: scale(2); } } Here is the scenario: When loading, a first blue circle is displayed. A first black circle grows until it crushes the blue circle at 50% of step's 1 animation, a new blue circle is displayed and enlarged until it overwrites the black circle created during step 1 back to step 1 In my render, you can see that the circles are showing but some are hiding too soon, etc. The circles should display one after the other in a linear fashion. Is it possible to do this in full CSS with keyframes ?
Not sure if this is exactly what you are going for but maybe you can tinker with it. So with 4 circles you can animate the scale basically the way you have it. And then for their svg container, you animate the z-index so whenever a wave starts it gets its highest z-index and then it deceases before the next wave starts. <div class="circles-container"> <!-- 1er cercle --> <svg class="circle-parent-1" width="1280" height="1280" xmlns="http://www.w3.org/2000/svg"> <path class="circle-1" d="M0 0h640c0 353.466-286.534 640-640 640V0Z" fill="currentColor" fill-rule="evenodd" /> </svg> <!-- 2eme cercle --> <svg class="circle-parent-2" width="1280" height="1280" xmlns="http://www.w3.org/2000/svg" > <path class="circle-2" d="M0 0h640c0 353.466-286.534 640-640 640V0Z" fill="currentColor" fill-rule="evenodd" /> </svg> <svg class="circle-parent-3" width="1280" height="1280" xmlns="http://www.w3.org/2000/svg" > <path class="circle-3" d="M0 0h640c0 353.466-286.534 640-640 640V0Z" fill="currentColor" fill-rule="evenodd" /> </svg> <svg class="circle-parent-4" width="1280" height="1280" xmlns="http://www.w3.org/2000/svg" > <path class="circle-4" d="M0 0h640c0 353.466-286.534 640-640 640V0Z" fill="currentColor" fill-rule="evenodd" /> </svg> body { margin: 0; padding: 0; } .circles-container { position: relative; } .circles-container svg { position: absolute; top: 0; left: 0; } .circle-parent-1 { animation: zIndexCircle 8s ease-in-out infinite; animation-delay: 0s; } .circle-parent-2 { animation: zIndexCircle 8s ease-in-out infinite; animation-delay: 2s; } .circle-parent-3 { animation: zIndexCircle 8s ease-in-out infinite; animation-delay: 4s; } .circle-parent-3 { animation: zIndexCircle 8s ease-in-out infinite; animation-delay: 4s; } .circle-parent-4 { animation: zIndexCircle 8s ease-in-out infinite; animation-delay: 6s; } .circle-1 { animation: scaleCircle 8s ease-in-out infinite; animation-delay:0s; transform: scale(0); color: #1D1D28; } .circle-2 { animation: scaleCircle 8s ease-in-out infinite; animation-delay:2s; transform: scale(0); color: #420DC4; } .circle-3 { animation: scaleCircle 8s ease-in-out infinite; animation-delay:4s; transform: scale(0); color: #1D1D28; } .circle-4 { animation: scaleCircle 8s ease-in-out infinite; animation-delay:6s; transform: scale(0); color: #420DC4; } #keyframes zIndexCircle { 0% { z-index:5; } 25% { z-index: 4; } 50% { z-index:3; } 75% { z-index:2; } 100% { z-index:1; } } #keyframes scaleCircle { 0% { transform: scale(0); } 75% { transform: scale(2); } 100% { transform: scale(2); } } https://codepen.io/todilo-the-vuer/pen/XWEmdXL
Text on a Circle Path around an SVG Image
I'm attempting to have animated text moving on a circular path around an image. I have the circular text, but I can't get the image on the inside. Here is the code I'm using: <div id="container"> <div id="circle"> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="200px" height="200px" viewBox="0 0 400 400" enable-background="new 0 0 100 100" xml:space="preserve" > <defs> <path id="circlePath" d=" M 200, 200 m -60, 0 a 60,60 0 0,1 120,0 a 60,60 0 0,1 -120,0 "/> </defs> <circle cx="150" cy="100" r="75" fill="none"/> <g> <use xlink:href="#circlePath" fill="none"/> <text fill="#ffb605"> <textPath xlink:href="#circlePath">Flip the Bird • Flip the Bird • </textPath> </text> </g> </svg> </div> </div> Here is the full code on JSFiddle I created. The svg I'm trying to place in the middle is this: https://svgshare.com/i/Z4d.svg Any help would be appreciated.
You could achieve this with the image tag: <image x="165" y="150" width="88" height="100" xlink:href="PATH_TO_YOUR_IMAGE.EXTENSION" /> or (like in your linked svg) <image ... xlink:href="data:img/png;base64,YOUR_LOOOOONG_IMAGE_DATA" /> To move only the text and not the whole image (inkl. the inner bird image) you should define the rotation only for the text: #circle svg text { transform-origin: 50% 50%; animation-name: rotate; ... } Working example: (i removed the circle because it wasn't used) Unfortunately your linked svg doesn't work here because it's on another domain (but worked locally in my test file). And the inline image data from that svg doesn't fit in the stack snippet (also worked locally in my test file). Therefor i used a simple rect for demonstration. #container { margin: 0%; margin-top: 0px; margin-bottom: 0px; } #circle { position: relative; width: 500px; padding-bottom: 0%; overflow: visible; z-index: 2; } #circle text { margin: 0 calc(.14em * -1) 0 0; font-family: Cambria, "Hoefler Text", "Liberation Serif", Times, "Times New Roman", "serif"; font-size: .83em; font-style: normal; font-weight: 400; line-height: 1.4; letter-spacing: .14em; text-transform: uppercase; color: black; background: linear-gradient(-67deg, #000000 0%, #988d87 28%, #797371 52%, #5e5855 82%, #000000 100%); background-size: 100% auto; -webkit-text-fill-color: transparent; -webkit-background-clip: text; letter-spacing: .32em; } #circle svg { position: absolute; left: 140px; top: -110px; width: 100%; height: 430px; } #circle svg text { transform-origin: 50% 50%; -webkit-animation-name: rotate; -moz-animation-name: rotate; -ms-animation-name: rotate; -o-animation-name: rotate; animation-name: rotate; -webkit-animation-duration: 10s; -moz-animation-duration: 10s; -ms-animation-duration: 10s; -o-animation-duration: 10s; animation-duration: 10s; -webkit-animation-iteration-count: infinite; -moz-animation-iteration-count: infinite; -ms-animation-iteration-count: infinite; -o-animation-iteration-count: infinite; animation-iteration-count: infinite; -webkit-animation-timing-function: linear; -moz-animation-timing-function: linear; -ms-animation-timing-function: linear; -o-animation-timing-function: linear; animation-timing-function: linear; } #-webkit-keyframes rotate { from { -webkit-transform: rotate(0); } to { -webkit-transform: rotate(360deg); } } #-moz-keyframes rotate { from { -moz-transform: rotate(0); } to { -moz-transform: rotate(360deg); } } #-ms-keyframes rotate { from { -ms-transform: rotate(0); } to { -ms-transform: rotate(360deg); } } #-o-keyframes rotate { from { -o-transform: rotate(0); } to { -o-transform: rotate(360deg); } } #keyframes rotate { from { transform: rotate(0); } to { transform: rotate(360deg); } } #media screen and ( max-width: 979px) { #circle svg { left: 0px !important; top: -70px !important; height: 360px; } } #media screen and ( max-width: 480px) { #circle svg { left: -140px !important; top: 140px !important; } } <div id="container"> <div id="circle"> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="200px" height="200px" viewBox="0 0 400 400" enable-background="new 0 0 100 100" xml:space="preserve"> <defs> <path id="circlePath" d=" M 200, 200 m -60, 0 a 60,60 0 0,1 120,0 a 60,60 0 0,1 -120,0 "/> </defs> <g> <use xlink:href="#circlePath" fill="none"/> <rect x="160" y="160" width="80" height="80" fill="#FCDB8D" /> <text fill="#ffb605"> <textPath xlink:href="#circlePath">Flip the Bird • Flip the Bird • </textPath> </text> </g> </svg> </div> </div>
SVG loader not spinning correctly in Firefox
I'm trying to update an svg loader from a smil animation to a css animation. This is the original svg and the CSS animations: svg path { -webkit-animation: spin 0.6s linear infinite; -moz-animation: spin 3s linear infinite; animation: spin 0.6s linear infinite; } #-moz-keyframes spin { 0% { -moz-transform: rotate(0deg); -moz-transform-origin: 100% 100%; } 100% { -moz-transform: rotate(360deg); -moz-transform-origin: 100% 100%; } } #-webkit-keyframes spin { 0% { -webkit-transform: rotate(0deg); -webkit-transform-origin: 100% 100%; } 100% { -webkit-transform: rotate(360deg); -webkit-transform-origin: 100% 100%; } } #keyframes spin { 0% { transform:rotate(0deg); transform-origin: 100% 100%; } 100% { transform:rotate(360deg); transform-origin: 100% 100%; } } <svg version="1.1" id="loader-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="130px" height="130px" viewBox="0 0 80 80" style="enable-background:new 0 0 80 80;" xml:space="preserve"> <path fill="#000" d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z"> <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="0.6s" repeatCount="indefinite" /> </path> </svg> It looks correct in Chrome but all wrong in Firefox and I can't understand why (try the Codepen here to see what I mean). Any ideas why?
It doesn't work for me in Chrome either. At least not with recent Chromes anyway - which have a correct implementation of transform-origin. #loader-2 path { -webkit-animation: spin 0.6s linear infinite; -moz-animation: spin 3s linear infinite; animation: spin 0.6s linear infinite; } #-moz-keyframes spin { 0% { -moz-transform: rotate(0deg); -moz-transform-origin: 100% 100%; } 100% { -moz-transform: rotate(360deg); -moz-transform-origin: 100% 100%; } } #-webkit-keyframes spin { 0% { -webkit-transform: rotate(0deg); -webkit-transform-origin: 100% 100%; } 100% { -webkit-transform: rotate(360deg); -webkit-transform-origin: 100% 100%; } } #keyframes spin { 0% { transform:rotate(0deg); transform-origin: 100% 100%; } 100% { transform:rotate(360deg); transform-origin: 100% 100%; } } <svg version="1.1" id="loader-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="130px" height="130px" viewBox="0 0 80 80" style="enable-background:new 0 0 80 80;" xml:space="preserve"> <path fill="#000" d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z"> <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="0.6s" repeatCount="indefinite" /> </path> </svg> <svg version="1.1" id="loader-2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="130px" height="130px" viewBox="0 0 80 80" style="enable-background:new 0 0 80 80;" xml:space="preserve"> <path fill="#000" d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z"/> </svg> The problem is that, in SVGs, the percentage transform-origin coordinates are calculated relative to the whole SVG. Not the element they are used on. So transform-origin: 100% 100%; here means the bottom right of the SVG. Not the bottom right of <path>. The fix is to tell the browser that you want the origin to be calculated ralative to the path. You do that with the following property: transform-box: fill-box; Demo: #loader-2 path { -webkit-animation: spin 0.6s linear infinite; -moz-animation: spin 3s linear infinite; animation: spin 0.6s linear infinite; transform-box: fill-box; } #-moz-keyframes spin { 0% { -moz-transform: rotate(0deg); -moz-transform-origin: 100% 100%; } 100% { -moz-transform: rotate(360deg); -moz-transform-origin: 100% 100%; } } #-webkit-keyframes spin { 0% { -webkit-transform: rotate(0deg); -webkit-transform-origin: 100% 100%; } 100% { -webkit-transform: rotate(360deg); -webkit-transform-origin: 100% 100%; } } #keyframes spin { 0% { transform:rotate(0deg); transform-origin: 100% 100%; } 100% { transform:rotate(360deg); transform-origin: 100% 100%; } } <svg version="1.1" id="loader-1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="130px" height="130px" viewBox="0 0 80 80" style="enable-background:new 0 0 80 80;" xml:space="preserve"> <path fill="#000" d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z"> <animateTransform attributeType="xml" attributeName="transform" type="rotate" from="0 25 25" to="360 25 25" dur="0.6s" repeatCount="indefinite" /> </path> </svg> <svg version="1.1" id="loader-2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="130px" height="130px" viewBox="0 0 80 80" style="enable-background:new 0 0 80 80;" xml:space="preserve"> <path fill="#000" d="M25.251,6.461c-10.318,0-18.683,8.365-18.683,18.683h4.068c0-8.071,6.543-14.615,14.615-14.615V6.461z"/> </svg>
Trow away your svg =)) .loader { width:50px; height:50px; border:solid 7px transparent; border-top-color:rgba(0, 0, 0, .87); border-radius:55%; animation: spin 1s linear infinite; } #keyframes spin { 100% {transform:rotateZ(360deg)} } <hr class="loader">
SVG rotate animation lagging
If you take a look at the pic below, I have two animations running: the outer ring is slowly rotating clockwise and the inner ring is rotating counter-clockwise. It works great in Chrome, but in Safari, the animation lags and is not as smooth as it is in Chrome. Any ideas to why it's lagging in Safari? body.home { background-image: url('http://uploadpie.com/5Fy2h'); background-size: cover; background-position: center; background-attachment: fixed; background-repeat: no-repeat; min-height: 800px; } //////////////////// //LOGO ANIMATIONS// /////////////////// svg { width: 100%; height: 100%; overflow: hidden; position: absolute; z-index: -1; } svg mask rect { fill: rgba(255, 255, 255, 0.8); } svg > rect { fill: white; } #mask { position: relative; right: 250px; } .last-overlay { fill: rgba(255, 255, 255, 0.5); } .first-ring-path { transform-origin: 50% 50%; -webkit-animation-name: rotate; -moz-animation-name: rotate; -ms-animation-name: rotate; -o-animation-name: rotate; animation-name: rotate; -webkit-animation-duration: 90s; -moz-animation-duration: 90s; -ms-animation-duration: 90s; -o-animation-duration: 90s; animation-duration: 90s; -webkit-animation-iteration-count: infinite; -moz-animation-iteration-count: infinite; -ms-animation-iteration-count: infinite; -o-animation-iteration-count: infinite; animation-iteration-count: infinite; -webkit-animation-timing-function: linear; -moz-animation-timing-function: linear; -ms-animation-timing-function: linear; -o-animation-timing-function: linear; animation-timing-function: linear; } #-webkit-keyframes rotate { 100% { -webkit-transform: rotate(360deg); -webkit-transform: translateZ(0); } } #-moz-keyframes rotate { 100% { -moz-transform: rotate(360deg); } } #-o-keyframes rotate { 100% { -o-transform: rotate(360deg); } } #-ms-keyframes rotate { 100% { -ms-transform: rotate(360deg); } } #keyframes rotate { 100% { transform: rotate(360deg); } } .second-ring-path { transform-origin: 50% 50%; -webkit-animation-name: rotate-counter; -moz-animation-name: rotate-counter; -ms-animation-name: rotate-counter; -o-animation-name: rotate-counter; animation-name: rotate-counter; -webkit-animation-duration: 90s; -moz-animation-duration: 90s; -ms-animation-duration: 90s; -o-animation-duration: 90s; animation-duration: 90s; -webkit-animation-iteration-count: infinite; -moz-animation-iteration-count: infinite; -ms-animation-iteration-count: infinite; -o-animation-iteration-count: infinite; animation-iteration-count: infinite; -webkit-animation-timing-function: linear; -moz-animation-timing-function: linear; -ms-animation-timing-function: linear; -o-animation-timing-function: linear; animation-timing-function: linear; } #-webkit-keyframes rotate-counter { 100% { -webkit-transform: rotate(-360deg); } } #-moz-keyframes rotate-counter { 100% { -moz-transform: rotate(-360deg); } } #-o-keyframes rotate-counter { 100% { -o-transform: rotate(-360deg); } } #-ms-keyframes rotate-counter { 100% { -ms-transform: rotate(-360deg); } } #keyframes rotate-counter { 100% { transform: rotate(-360deg); } } <body class="home"> <!-- LOGO ANIMATION --> <svg id="logo-svg" preserveAspectRatio="xMidYMid slice"> <svg version="1.1" id="logo-animation" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100%" height="100%" xml:space="preserve"> <rect class="last-overlay" x="0" y="0" width="100%" height="100%" /> <mask id="mask" maskUnits="userSpaceOnUse"> <rect x="0" y="0" width="100%" height="100%" /> <svg x="-45%" y="5%" class="logo-animation-container"> <svg class="svg-path" version="1.1" baseProfile="tiny" class="first-ring" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 300 270" xml:space="preserve"> <g id="pathRotate" class="first-ring-path"> <g> <g> <path d="M118.4,237.5c-8.5,0-16.9-0.9-25.1-2.7c-2.8-0.6-4.6-3.4-3.9-6.2c0.6-2.8,3.4-4.5,6.2-3.9 c7.5,1.6,15.2,2.5,22.9,2.5c20.7,0,40.7-6,58-17.3c2.4-1.6,5.6-0.9,7.2,1.5c1.6,2.4,0.9,5.6-1.5,7.2 C163.1,230.9,141.1,237.5,118.4,237.5z" /> </g> <g> <path d="M192.5,209.2c-1.4,0-2.8-0.6-3.9-1.7c-1.9-2.1-1.7-5.4,0.4-7.3c3.9-3.5,7.5-7.3,10.9-11.3 c1.8-2.2,5.1-2.5,7.3-0.7s2.5,5.1,0.7,7.3c-3.6,4.4-7.7,8.6-11.9,12.4C195,208.7,193.7,209.2,192.5,209.2z" /> </g> <g> <path d="M214.6,181.9c-0.9,0-1.8-0.2-2.6-0.7c-2.5-1.4-3.3-4.6-1.9-7.1c9.3-16,14.1-34.3,14.1-52.9 c0-4.9-0.3-9.8-1-14.5c-0.4-2.8,1.6-5.4,4.4-5.8c2.8-0.4,5.4,1.6,5.8,4.4c0.7,5.2,1.1,10.6,1.1,15.9c0,20.4-5.4,40.5-15.5,58.1 C218.1,181,216.4,181.9,214.6,181.9z" /> </g> <g> <path d="M224.7,94.1c-2.2,0-4.3-1.4-4.9-3.7c-2.3-7.7-5.6-15.1-9.6-22.1c-1.4-2.5-0.6-5.6,1.9-7.1 c2.5-1.4,5.6-0.6,7.1,1.9c4.4,7.7,8,15.8,10.5,24.2c0.8,2.7-0.7,5.6-3.4,6.4C225.7,94,225.2,94.1,224.7,94.1z" /> </g> <g> <path d="M206.4,58.7c-1.5,0-3.1-0.7-4.1-2c-10.9-14.2-25.3-25.4-41.7-32.5c-2.6-1.1-3.8-4.2-2.7-6.8 s4.2-3.8,6.8-2.7c17.9,7.8,33.7,20.2,45.7,35.7c1.7,2.3,1.3,5.5-0.9,7.2C208.6,58.3,207.5,58.7,206.4,58.7z" /> </g> <g> <path d="M41,46.7c-1.3,0-2.7-0.5-3.7-1.6c-2-2-1.9-5.3,0.1-7.3C59.2,16.6,88,5,118.4,5c1.6,0,3.2,0,4.7,0.1 c2.9,0.1,5.1,2.5,5,5.4c-0.1,2.9-2.5,5.1-5.4,5c-1.4-0.1-2.9-0.1-4.3-0.1c-27.7,0-53.9,10.6-73.7,29.9 C43.6,46.2,42.3,46.7,41,46.7z" /> </g> <g> <path d="M7.5,119c-0.1,0-0.2,0-0.4,0c-2.8-0.2-5-2.7-4.8-5.5c0.3-4,0.8-8.1,1.5-12.1C6,88.3,10.5,75.7,17,64.2 c1.4-2.5,4.6-3.4,7-2c2.5,1.4,3.4,4.6,2,7c-5.9,10.5-10,21.9-12.1,33.9c-0.6,3.6-1.1,7.4-1.3,11C12.4,116.9,10.2,119,7.5,119z" /> </g> <g> <path d="M58.6,220c-1,0-1.9-0.3-2.8-0.8c-26.2-16.7-44.8-43.7-51.2-74c-0.6-2.8,1.2-5.5,4-6.1s5.5,1.2,6.1,4 c5.8,27.6,22.8,52.1,46.6,67.4c2.4,1.5,3.1,4.7,1.6,7.1C61.9,219.2,60.3,220,58.6,220z" /> </g> </g> </g> </svg> <svg class="svg-path" version="1.1" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 270 270" xml:space="preserve"> <g class="second-ring-path"> <g> <g> <path d="M31.9,147.9c-2.5,0-4.8-1.7-5.4-4.3c-1.8-7.3-2.7-14.8-2.7-22.3c0-7.8,1-15.5,2.8-23c0.8-3,3.8-4.8,6.8-4 c3,0.8,4.8,3.8,4,6.8c-1.7,6.6-2.5,13.4-2.5,20.3c0,6.6,0.8,13.3,2.3,19.7c0.7,3-1.1,6-4.1,6.7C32.8,147.8,32.4,147.9,31.9,147.9 z" /> </g> <g> <path d="M117.7,215.2c-29.9,0-57.4-13.8-75.3-37.8c-1.8-2.5-1.3-6,1.1-7.8c2.5-1.8,6-1.3,7.8,1.1 c15.8,21.2,40,33.3,66.4,33.3c6,0,12-0.6,17.8-1.9c3-0.7,6,1.2,6.7,4.3c0.7,3-1.2,6-4.3,6.7C131.4,214.5,124.6,215.2,117.7,215.2 z" /> </g> <g> <path d="M154.4,207.3c-2.1,0-4.1-1.2-5.1-3.3c-1.3-2.8,0-6.1,2.8-7.4c23.5-10.7,40.9-32.2,46.5-57.4 c0.7-3,3.6-4.9,6.7-4.2c3,0.7,4.9,3.6,4.2,6.7c-6.3,28.6-26,53-52.8,65.2C156,207.1,155.2,207.3,154.4,207.3z" /> </g> <g> <path d="M206.1,126.9c-3.1,0-5.6-2.5-5.6-5.6c0-14.2-3.7-28.3-10.6-40.6c-1.5-2.7-0.6-6.1,2.1-7.6 c2.7-1.5,6.1-0.6,7.6,2.1c7.9,14,12.1,29.9,12.1,46.1C211.7,124.4,209.2,126.9,206.1,126.9z" /> </g> <g> <path d="M185.2,69.8c-1.6,0-3.2-0.7-4.3-2c-9.7-11.5-22.4-20.1-36.5-24.9c-2.9-1-4.5-4.2-3.5-7.1 c1-2.9,4.2-4.5,7.1-3.5c16.1,5.5,30.4,15.2,41.4,28.3c2,2.4,1.7,5.9-0.7,7.9C187.7,69.4,186.4,69.8,185.2,69.8z" /> </g> <g> <path d="M45.9,75.3c-1.1,0-2.3-0.3-3.2-1c-2.5-1.8-3.1-5.3-1.3-7.8c11.4-15.9,27.2-27.7,45.8-34.1 c4.4-1.5,8.9-2.7,13.4-3.5c3-0.6,6,1.4,6.5,4.5c0.6,3-1.4,6-4.5,6.5c-4,0.7-7.9,1.8-11.8,3.1c-16.4,5.6-30.3,16-40.3,30 C49.4,74.5,47.7,75.3,45.9,75.3z" /> </g> </g> </g> </svg> <svg class="svg-path" version="1.1" baseProfile="tiny" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 270 270" xml:space="preserve"> <g> <g> <path d="M116.8,50.7c-39.3,0-71.3,32-71.3,71.3c0,39.3,32,71.3,71.3,71.3c39.3,0,71.3-32,71.3-71.3 C188,82.7,156.1,50.7,116.8,50.7z M138.5,122c0,34.5-11.5,60.3-21.8,60.3c-10.3,0-21.8-25.8-21.8-60.3c0-34.5,11.5-60.3,21.8-60.3 C127,61.7,138.5,87.5,138.5,122z M56.5,122c0-26.1,16.7-48.4,40-56.8C88.8,78,84,98.3,84,122c0,23.7,4.8,44,12.5,56.8 C73.2,170.4,56.5,148.1,56.5,122z M137,178.8c7.7-12.8,12.5-33,12.5-56.8c0-23.7-4.8-44-12.5-56.8c23.3,8.3,40,30.6,40,56.8 C177,148.1,160.3,170.4,137,178.8z" /> </g> </g> </svg> </svg> <!-- /logo-animation-container --> </mask> < </svg> <rect id="rect" mask="url(#mask)" x="0" y="0" width="100%" height="100%" /> </svg> </body>
Here is animating smoothly. No lag. But running the snippet in Safari (OSX 10.8.5 Safari 6.2.8) the animations is different, broken. One ring stay static while the other is going up. But all in a smooth fashion. Anyway check here: https://www.theparticlelab.com/safari-svg-animation-bug/
SVG animation transform origin propety is not working different browsers [duplicate]
This question already has answers here: transform-origin for CSS animation on SVG working in Chrome, not FF (2 answers) Closed 7 years ago. I am facing an issue with the transform origin property in firefox and safari. Here is the link what i have done so far : http://jsfiddle.net/Hassanpervaiz/aLfhfstt/ Hers is HTML SVG and CSS code : .st0{fill:#55B948;} .st1{fill:none;stroke:#55B948;stroke-miterlimit:10;} path#small-nid { -webkit-animation: spin 4s infinite; animation: spin 4s infinite; -webkit-transform-origin: 89px 88px 0; -ms-transform-origin: 89px 88px 0; transform-origin: 89px 88px 0; -webkit-animation-timing-function: steps(8); animation-timing-function: steps(8); } path#big-nid { -webkit-animation: spin 1.5s infinite; animation: spin 1.5s infinite; -webkit-transform-origin: 89px 88px 0; -ms-transform-origin: 89px 88px 0; transform-origin: 89px 88px 0; -webkit-animation-timing-function: steps(12); animation-timing-function: steps(12); } #-webkit-keyframes spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } #keyframes spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } <svg> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 177.667 177.667" style="enable-background:new 0 0 177.667 177.667;" xml:space="preserve"> <g id="circle-border"> <path class="st0" d="M88.833,177.667C39.851,177.667,0,137.816,0,88.833S39.851,0,88.833,0c48.982,0,88.833,39.851,88.833,88.833 S137.816,177.667,88.833,177.667z M88.833,1C40.402,1,1,40.402,1,88.833s39.402,87.833,87.833,87.833s87.833-39.402,87.833-87.833 S137.265,1,88.833,1z"/> </g> <path id="small-nid" class="st1" d="M88.833,92.333c-1.933,0-3.5-1.567-3.5-3.5l0,0c0-1.933,1.567-3.5,3.5-3.5h35 c1.933,0,7.313,3.5,9.5,3.5l0,0c0,1.933-7.567,3.5-9.5,3.5H88.833z"/> <path id="big-nid" class="st1" d="M92.333,88.833c0,1.933-1.567,3.5-3.5,3.5l0,0c-1.933,0-3.5-1.567-3.5-3.5v-61.75 c0-1.933,3.5-7.531,3.5-9.5l0,0c1.933,0,3.5,7.567,3.5,9.5V88.833z"/> </svg> </svg> SVG CSS animation. Is there any solution that would be great thank you :)
Edit: My first try, using only a translate(x,y) chained to the rotate() obviously only worked for Firefox... As stated in this answer by daviestar the solution is to wrap each of your pathes into <g>element, and apply the transform on those. But, strangely enough, the problem he describes isn't the same as in my first answer, maybe because of the transform-origin. Anyway, here is your working code, with no transform-origin anymore: .st0 { fill:#55B948; } .st1 { fill:none; stroke:#55B948; stroke-miterlimit:10; } .niddle-wrapper { transform: translate(-15%); } path#small-nid { -webkit-animation: spin 4s infinite; animation: spin 4s infinite; -webkit-transform-origin: 89px 88px 0; -ms-transform-origin: 89px 88px 0; transform-origin: 89px 88px 0; -webkit-animation-timing-function: steps(8); animation-timing-function: steps(8); } path#big-nid { -webkit-animation: spin 1.5s infinite; animation: spin 1.5s infinite; -webkit-transform-origin: 89px 88px 0; -ms-transform-origin: 89px 88px 0; transform-origin: 89px 88px 0; -webkit-animation-timing-function: steps(12); animation-timing-function: steps(12); } #-webkit-keyframes spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } #keyframes spin { 0% { -webkit-transform: rotate(0deg); transform: rotate(0deg); } 100% { -webkit-transform: rotate(359deg); transform: rotate(359deg); } } <svg><svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 177.667 177.667" style="enable-background:new 0 0 177.667 177.667;" xml:space="preserve"> <g id="circle-border"> <path class="st0" d="M88.833,177.667C39.851,177.667,0,137.816,0,88.833S39.851,0,88.833,0c48.982,0,88.833,39.851,88.833,88.833 S137.816,177.667,88.833,177.667z M88.833,1C40.402,1,1,40.402,1,88.833s39.402,87.833,87.833,87.833s87.833-39.402,87.833-87.833 S137.265,1,88.833,1z" /> </g> <g class="niddle-wrapper"> <path id="small-nid" class="st1" d="M88.833,92.333c-1.933,0-3.5-1.567-3.5-3.5l0,0c0-1.933,1.567-3.5,3.5-3.5h35 c1.933,0,7.313,3.5,9.5,3.5l0,0c0,1.933-7.567,3.5-9.5,3.5H88.833z" /> </g> <g class="niddle-wrapper"> <path id="big-nid" class="st1" d="M92.333,88.833c0,1.933-1.567,3.5-3.5,3.5l0,0c-1.933,0-3.5-1.567-3.5-3.5v-61.75 c0-1.933,3.5-7.531,3.5-9.5l0,0c1.933,0,3.5,7.567,3.5,9.5V88.833z" /> </g> </svg></svg> First Answer You could add a translate(x, y) into your transform declaration. .st0{fill:#55B948;} .st1{fill:none;stroke:#55B948;stroke-miterlimit:10;} path#small-nid { -webkit-animation: spin 4s infinite; animation: spin 4s infinite; -webkit-transform-origin: 89px 88px 0; -ms-transform-origin: 89px 88px 0; transform-origin: 89px 88px 0; -webkit-animation-timing-function: steps(8); animation-timing-function: steps(8); } path#big-nid { -webkit-animation: spin 1.5s infinite; animation: spin 1.5s infinite; -webkit-transform-origin: 89px 88px 0; -ms-transform-origin: 89px 88px 0; transform-origin: 89px 88px 0; -webkit-animation-timing-function: steps(12); animation-timing-function: steps(12); } #-webkit-keyframes spin { 0% { -webkit-transform: translate(-13px,-13px) rotate(0deg); } 100% { -webkit-transform: translate(-13px,-13px) rotate(359deg); } } #keyframes spin { 0% { -webkit-transform: translate(-13px,-13px) rotate(0deg); transform: translate(-13px,-13px) rotate(0deg); } 100% { -webkit-transform: translate(-13px,-13px) rotate(359deg); transform: translate(-13px,-13px) rotate(359deg); } } <svg> <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 177.667 177.667" style="enable-background:new 0 0 177.667 177.667;" xml:space="preserve"> <g id="circle-border"> <path class="st0" d="M88.833,177.667C39.851,177.667,0,137.816,0,88.833S39.851,0,88.833,0c48.982,0,88.833,39.851,88.833,88.833 S137.816,177.667,88.833,177.667z M88.833,1C40.402,1,1,40.402,1,88.833s39.402,87.833,87.833,87.833s87.833-39.402,87.833-87.833 S137.265,1,88.833,1z"/> </g> <path id="small-nid" class="st1" d="M88.833,92.333c-1.933,0-3.5-1.567-3.5-3.5l0,0c0-1.933,1.567-3.5,3.5-3.5h35 c1.933,0,7.313,3.5,9.5,3.5l0,0c0,1.933-7.567,3.5-9.5,3.5H88.833z"/> <path id="big-nid" class="st1" d="M92.333,88.833c0,1.933-1.567,3.5-3.5,3.5l0,0c-1.933,0-3.5-1.567-3.5-3.5v-61.75 c0-1.933,3.5-7.531,3.5-9.5l0,0c1.933,0,3.5,7.567,3.5,9.5V88.833z"/> </svg> </svg>