Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Animated SVGs don't animate until page is loaded

My site contains quite a lot of ads, and these take a while to load. This isn't a problem exactly, but I've noticed any SVG animations will draw the first frame instantly, but the animation comes only after all the loading has completed on the page. The SVG animations usually indicate a spinner/loading icon. Is there a method to start the SVG animation instantly? Or if I convert it to pure CSS would it animate instantly?

This is my svg loader code: http://jsfiddle.net/5zq5j4d9/

<div class="loading-icon-outer">
    <div class="loading-icon">
        <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" width="20px" height="20px" viewBox="0 0 20 20" style="enable-background:new 0 0 50 50;" xml:space="preserve">
            <rect x="0" y="8" width="4" height="4" fill="#333" opacity="0.2">
                <animate attributeName="opacity" attributeType="XML" values="0.2; 1; 0.2" begin="0s" dur="0.6s" repeatCount="indefinite" />
                <animate attributeName="height" attributeType="XML" values="4; 20; 4" begin="0s" dur="0.6s" repeatCount="indefinite" />
                <animate attributeName="y" attributeType="XML" values="8; 0; 8" begin="0s" dur="0.6s" repeatCount="indefinite" />
            </rect>
            <rect x="8" y="8" width="4" height="4" fill="#333"  opacity="0.2">
                <animate attributeName="opacity" attributeType="XML" values="0.2; 1; 0.2" begin="0.15s" dur="0.6s" repeatCount="indefinite" />
                <animate attributeName="height" attributeType="XML" values="4; 20; 4" begin="0.15s" dur="0.6s" repeatCount="indefinite" />
                <animate attributeName="y" attributeType="XML" values="8; 0; 8" begin="0.15s" dur="0.6s" repeatCount="indefinite" />
            </rect>
            <rect x="16" y="8" width="4" height="4" fill="#333"  opacity="0.2">
                <animate attributeName="opacity" attributeType="XML" values="0.2; 1; 0.2" begin="0.3s" dur="0.6s" repeatCount="indefinite" />
                <animate attributeName="height" attributeType="XML" values="4; 20; 4" begin="0.3s" dur="0.6s" repeatCount="indefinite" />
                <animate attributeName="y" attributeType="XML" values="8; 0; 8" begin="0.3s" dur="0.6s" repeatCount="indefinite" />
            </rect>
        </svg>
    </div>
</div>
like image 549
hedgehog90 Avatar asked Jan 13 '15 17:01

hedgehog90


1 Answers

To start animations as early as possible (before load has been triggered) the SVG2 spec has added the timelineBegin attribute. This was also part of SVG Tiny 1.2.

Browser support for timelineBegin is still lacking though.

Possible alternatives include using css animations, web animations (created by script, see fiddle) or animating the svg with script. Of these sadly it's likely only the last one that will work in all browsers.

like image 80
Erik Dahlström Avatar answered Oct 18 '22 12:10

Erik Dahlström