HTML5学习笔记(三)

HTML5音频(续)

之前使用audio元素时,播放音乐时会出现时间轴和控制界面,如果不想被这些影响显示的效果,而只保留一个最简单的开始和暂停功能。这时就可以创建一个隐藏的audio元素,不使用controls特性,用自己做的控制界面控制音频的播放。代码如下所示:

<!DOCTYPEHTML>

<html>

 <link rel="stylesheet"href="styles.css">

 <title>

   Audio cue

 </title>

 <audio id="clickSound">

  <sourcesrc="johann_sebastian_bach_air.ogg">

  <sourcesrc="johann_sebastian_bach_air.mp3">

 </audio>

 <button id="toggle"οnclick="toggleSound()">

  Play

 </button>

 <scripttype="text/javascript">

  function toggleSound()

   {

     varmusic=document.getElementById("clickSound");

     vartoggle=document.getElementById("toggle");

     if(music.paused)

     {

       music.play();

       toggle.innerHTML="Pause";

     }

     else

     {

       music.pause();

       toggle.innerHTML="Play";

     }

   }

 </script>

</html>

<audio>到</audio>与之前应用的没有区别,只是不使用controls特性。不同的是我们创建了一个具有切换功能的按键,以脚本的方式控制音频的播放即下面这段代码。

<buttonid="toggle" οnclick="toggleSound()">

  Play

 </button>

其中说明了每当点击按钮时都会触发toggleSound()函数,在这个函数中用if作了简单的判断,实现当音乐是暂停时开始播放,音乐播放时暂停,同时相应的改变按键名称。效果如下图


HTML5 Canvas

一、什么是Canvas

在网页上使用canvas元素时,它会创建一块矩形区域。默认情况下大小为300×150。Canvas本质上是一个位图画布,其上绘制的图形是不可缩放的。Canvas绘制出来的对象不属于页面DOM结构或者任何命名空间。

二、Canvas坐标

Canvas的坐标是从左上角开始的,x轴沿着水平方向向右延伸,y轴沿垂直方向向下延伸。原点位于左上角。

关于Canvas坐标的问题,我在论坛上利用自己学的相关知识回复了一位网友的相关问题,回答的过程也是我对自己所学的总结。

问题是:

<!DOCTYPE HTML>

<html>

<head>

<scriptlanguage="javascript">

function drawTop(ctx,fillStyle){

    ctx.fillStyle = fillStyle;

    ctx.beginPath();

    ctx.arc(0, 0, 30, 0,Math.PI,true);

    ctx.closePath();

    ctx.fill();

}

function draw(){

    var ctx =document.getElementById('myCanvas').getContext("2d");

    // 注意:所有的移动都是基于这一上下文。

    ctx.translate(80,80);

    for (var i=1;i<10;i++){

        <!--ctx.save();-->

        ctx.translate(60*i, 0);

        drawTop(ctx,"rgb("+(30*i)+","+(255-30*i)+",255)");

        <!--ctx.restore();-->

    }

}

window.οnlοad=function(){

    draw();

}

</script>

</head>

<body>

<canvasid="myCanvas" width="700"height="300"></canvas>

</body>

</html>

这段代码中屏蔽了save和restore,最中的结果并不是预期的结果,由此我更加深刻的理解了Canvas坐标的计算和作用。记录如下。

因为ctx是一个全局对象,ctx.save()的时候保存了ctx当前的状态值,然后你执行了一些值的修改,比如改变阴影大小,在函数最后调用ctx.restore()方法将ctx之前的状态值还原回去。

当注释掉save和restore后,这时调用draw函数时ctx的画笔状态就不会保存与还原。程序中的只是画图的全过程啊,画笔状态还有其他很多信息,虽然每次都是完成了一个图形的绘制,但是每次画笔的其他属性也都会变化了。

对比两种情况的图就会发现图是错位了。画第一个半圆的时候两者是一样的,但是当你执行完一次ctx.arc(0, 0, 30, 0,Math.PI,true);之后ctx的位置就会根据(x + radius*cos( startAngle), y + radius*sin( startAngle))这个公式变化,具体到这个例子就是每次向右移动30,然后你在循环中因为没有把ctx的状态还原在此基础上又移动了60*i的距离,画第二个半圆时传入起点位置自然就不和第一个园相邻了,图像就错位了。

举个例子来说循环是从i=1开始的,下面分别列出有无save——restore的情况,

有save——restore

i=1

执行save保存起点(0,0)

执行ctx.translate(),起点变为(60*i,0)即(60,0)

执行drawTop():起点偏移到(x + radius*cos( startAngle), y + radius*sin( startAngle))即(90,0)

执行restroe起点回到(0,0)

i=2

执行save保存起点(0,0)

执行ctx.translate(),起点变为(60*i,0)即(120,0)

执行drawTop():起点偏移到(x + radius*cos( startAngle), y + radius*sin( startAngle))即(150,0)

执行restroe起点回到(0,0)

i=3

执行save保存起点(0,0)

执行ctx.translate(),起点变为(60*i,0)即(180,0)

执行drawTop():起点偏移到(x + radius*cos( startAngle), y + radius*sin( startAngle))即(210,0)

执行restroe起点回到(0,0)

画的半圆直径是60,所以第一个半圆的起止点在(60,0)和(120,0)第二个半圆的起止点在(120,0)和(180,0),第三个半圆的起止点(180,0)和(240,0)所以这些半圆都是相切的。如下图所示:


无save——restore

i=1

执行ctx.translate(),起点变为(60*i,0)即(60,0)

执行drawTop():起点偏移到(x + radius*cos( startAngle), y + radius*sin( startAngle))即(90,0)

i=2

执行ctx.translate(),起点变为(90+60*i,0)即(210,0)

执行drawTop():起点偏移到(x + radius*cos( startAngle), y + radius*sin( startAngle))即(240,0)

i=3

执行ctx.translate(),起点变为(240+60*i,0)即(420,0)

执行drawTop():起点偏移到(x + radius*cos( startAngle), y + radius*sin( startAngle))即(450,0)

对比坐标,第一个半圆起止点是(60,0)和(120,0),第二个半圆起止点是(210,0)和(270,0),第三个半圆的起止点是(420,0)和(480,0)。第一个半圆的止点与第二个半圆的起点差了90,第二个半圆的止点与第三个半圆的起点差了150,所以你画出的图像就错位了。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值