使用 javascript "onload" 启动 SVG 动画
Starting SVG animation using javascript "onload"
我有一些 SVG 动画代码,但是当我打开我的网站时,动画通常在加载时开始播放,而不是完整形式。
let refreshRate = Math.random() *1000 + 50; // 10 times per second
function rand(max){
return Math.floor(Math.random() * (max+1));
}
setInterval(function(){document.getElementById("RectElement").setAttribute("fill","rgb("+rand(255)+", "+rand(255)+", "+rand(255)+")");},refreshRate);
<!--start animation-->
<?xml version="1.0" standalone="no"?>
<svg width="8cm" height="3cm" viewBox="0 0 800 300" xmlns="http://www.w3.org/2000/svg">
<desc>Example anim01 - demonstrate animation elements</desc>
<rect x="1" y="1" width="900" height="400"
fill="none" stroke="none" stroke-width="2" />
<!-- The following illustrates the use of the 'animate' element
to animate a rectangles x, y, and width attributes so that
the rectangle grows to ultimately fill the viewport. -->
<rect id="RectElement" x="300" y="100" width="300" height="100"
fill="rgb(0,255,0)" >
<animate attributeName="fill" begin="0" dur="1.3"
repeatCount="indefinite"/>
<animate attributeName="x" begin="0s" dur="1.3s"
fill="freeze" from="300" to="0" repeatCount="indefinite"/>
<animate attributeName="y" begin="0s" dur="1.3s"
fill="freeze" from="100" to="0" repeatCount="indefinite"/>
<animate attributeName="width" begin="0s" dur="1.3s"
fill="freeze" from="300" to="800" repeatCount="indefinite"/>
<animate attributeName="height" begin="0s" dur="1.3s"
fill="freeze" from="100" to="300" repeatCount="indefinite"/>
</rect>
<!-- Set up a new user coordinate system so that
the text string's origin is at (0,0), allowing
rotation and scale relative to the new origin -->
<g transform="translate(100,100)" >
<!-- The following illustrates the use of the 'set', 'animateMotion',
'animate' and 'animateTransform' elements. The 'text' element
below starts off hidden (i.e., invisible). At 3 seconds, it:
* becomes visible
* continuously moves diagonally across the viewport
* changes color from blue to dark red
* rotates from -30 to zero degrees
* scales by a factor of three. -->
<text id="TextElement" x="0" y="0"
font-family="Verdana" font-size="35.27" visibility="hidden" >
Buy our crap!
<set attributeName="visibility" to="visible"
begin="0s" dur="1.3s" fill="freeze" repeatCount="indefinite"/>
<animateMotion path="M 0 0 L 100 100"
begin="0s" dur="1.3s" fill="freeze" repeatCount="indefinite"/>
<animateTransform attributeName="transform"
type="rotate" from="-30" to="0"
begin="0s" dur="1.3s" fill="freeze" repeatCount="indefinite"/>
<animateTransform attributeName="transform"
type="scale" from="0.5" to="2" additive="sum"
begin="0s" dur="1.3s" fill="freeze" repeatCount="indefinite"/>
</text>
</g>
</svg>
当我打开页面时经常发生的情况是,该框保持最小尺寸并且非常快速地变换颜色,直到页面完全加载,这时它才最终正常启动。然而,这会导致网站加载速度极慢。有没有办法(使用 JS)让动画只在页面完全加载后开始?
您可以将代码包装在一个函数中,并在使用以下语法加载文档时调用它:
function rand(max){
return Math.floor(Math.random() * (max+1));
}
function init() {
let refreshRate = Math.random() *1000 + 50; // 10 times per second
setInterval(function(){document.getElementById("RectElement").setAttribute("fill","rgb("+rand(255)+", "+rand(255)+", "+rand(255)+")");},refreshRate);
}
window.document.onload = init;
我有一些 SVG 动画代码,但是当我打开我的网站时,动画通常在加载时开始播放,而不是完整形式。
let refreshRate = Math.random() *1000 + 50; // 10 times per second
function rand(max){
return Math.floor(Math.random() * (max+1));
}
setInterval(function(){document.getElementById("RectElement").setAttribute("fill","rgb("+rand(255)+", "+rand(255)+", "+rand(255)+")");},refreshRate);
<!--start animation-->
<?xml version="1.0" standalone="no"?>
<svg width="8cm" height="3cm" viewBox="0 0 800 300" xmlns="http://www.w3.org/2000/svg">
<desc>Example anim01 - demonstrate animation elements</desc>
<rect x="1" y="1" width="900" height="400"
fill="none" stroke="none" stroke-width="2" />
<!-- The following illustrates the use of the 'animate' element
to animate a rectangles x, y, and width attributes so that
the rectangle grows to ultimately fill the viewport. -->
<rect id="RectElement" x="300" y="100" width="300" height="100"
fill="rgb(0,255,0)" >
<animate attributeName="fill" begin="0" dur="1.3"
repeatCount="indefinite"/>
<animate attributeName="x" begin="0s" dur="1.3s"
fill="freeze" from="300" to="0" repeatCount="indefinite"/>
<animate attributeName="y" begin="0s" dur="1.3s"
fill="freeze" from="100" to="0" repeatCount="indefinite"/>
<animate attributeName="width" begin="0s" dur="1.3s"
fill="freeze" from="300" to="800" repeatCount="indefinite"/>
<animate attributeName="height" begin="0s" dur="1.3s"
fill="freeze" from="100" to="300" repeatCount="indefinite"/>
</rect>
<!-- Set up a new user coordinate system so that
the text string's origin is at (0,0), allowing
rotation and scale relative to the new origin -->
<g transform="translate(100,100)" >
<!-- The following illustrates the use of the 'set', 'animateMotion',
'animate' and 'animateTransform' elements. The 'text' element
below starts off hidden (i.e., invisible). At 3 seconds, it:
* becomes visible
* continuously moves diagonally across the viewport
* changes color from blue to dark red
* rotates from -30 to zero degrees
* scales by a factor of three. -->
<text id="TextElement" x="0" y="0"
font-family="Verdana" font-size="35.27" visibility="hidden" >
Buy our crap!
<set attributeName="visibility" to="visible"
begin="0s" dur="1.3s" fill="freeze" repeatCount="indefinite"/>
<animateMotion path="M 0 0 L 100 100"
begin="0s" dur="1.3s" fill="freeze" repeatCount="indefinite"/>
<animateTransform attributeName="transform"
type="rotate" from="-30" to="0"
begin="0s" dur="1.3s" fill="freeze" repeatCount="indefinite"/>
<animateTransform attributeName="transform"
type="scale" from="0.5" to="2" additive="sum"
begin="0s" dur="1.3s" fill="freeze" repeatCount="indefinite"/>
</text>
</g>
</svg>
当我打开页面时经常发生的情况是,该框保持最小尺寸并且非常快速地变换颜色,直到页面完全加载,这时它才最终正常启动。然而,这会导致网站加载速度极慢。有没有办法(使用 JS)让动画只在页面完全加载后开始?
您可以将代码包装在一个函数中,并在使用以下语法加载文档时调用它:
function rand(max){
return Math.floor(Math.random() * (max+1));
}
function init() {
let refreshRate = Math.random() *1000 + 50; // 10 times per second
setInterval(function(){document.getElementById("RectElement").setAttribute("fill","rgb("+rand(255)+", "+rand(255)+", "+rand(255)+")");},refreshRate);
}
window.document.onload = init;