随着现代互联网速度的提升,图像通常能在毫秒内完成加载。为了模拟图像加载的过程,一种可能性是“部分”地在我们的canvas上绘制图像。而利用canvas,我们还能添加各种炫酷的动画效果,想象力就是唯一的限制……
以下是使用从左至右动画来模拟图像加载的一个简单示例:
<canvas id="canvas" width=500></canvas>
<script>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var x = 0;
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.drawImage(image, 0, 0, x, image.height, 0, 0, x, image.height);
x = x + 1;
if (x < image.width) {
ctx.setLineDash([5, x % 10 + 5]);
ctx.rect(x, 0, 1, canvas.height);
ctx.stroke();
setTimeout(draw, 50);
}
}
var image = new Image();
image.src = "http://i.stack.imgur.com/UFBxY.png";
image.onload = draw;
</script>
接下来是一个使用模糊效果的简单动画示例:
<canvas id="canvas" width=500></canvas>
<script>
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var x = 50;
function draw() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
ctx.beginPath();
ctx.filter = 'blur(' + x + 'px)';
ctx.drawImage(image, 0, 0, image.width, image.height);
x = x - 0.5;
if (x >= 0) {
setTimeout(draw, 50);
}
}
var image = new Image();
image.src = "http://i.stack.imgur.com/UFBxY.png";
image.onload = draw;
</script>
您可以直接使用canvas作为图像展示,而非使用HTML <img>
标签。但如果您确实想使用 <img>
标签,则在canvas上绘制完成后,可以通过以下方式设置其源:
var img = document.querySelector('img');
img.src = canvas.toDataURL('image/png');
需要注意的是,使用 toDataURL()
可能会遇到CORS问题:
当您将任何未经CORS批准从其他源加载的数据绘制到canvas时,canvas就会被污染。污染的canvas被视为不安全,试图从canvas检索图像数据会导致异常抛出。
您可进一步阅读关于此问题的详细信息:
另外,还有一种方法是使用CSS来创建动画。这种方式使得代码与图像解耦,可以轻松应用于多个图像:
<style>
.slow {
animation: slow 10s;
}
@keyframes slow {
0% { opacity: 0; }
100% { opacity: 1; }
}
</style>
<img src="http://i.stack.imgur.com/UFBxY.png" class="slow" width="250">