HTML5 API(上)-Canvas

<h2>一红省、Canvas</h2>
Canvas本質(zhì)上是一個位圖畫步理朋。

canvas.png

提示:
(1)Canvas的寬和高只能用屬性方式聲明龟糕!若使用樣式來聲明則無效浅蚪。
(2)Canvas的本意是“畫布/畫板”朦促,可以盛放繪制的內(nèi)容叉信;真正執(zhí)行繪圖任務(wù)的是“畫筆/繪圖上下文對象”——Context
(3)每一個畫布,有且只有一個畫筆對象:
<pre>var ctx = canvas.getContext( '2d' );</pre>
(4)畫筆/繪圖上下文對象的成員——小難點:
<pre>

  1. fillStyle:"#000000" 填充顏色
  2. font:"10px sans-serif" 字體
  3. globalAlpha:1 全局透明度
  4. lineCap:"butt" 線的端點樣式
  5. lineJoin:"miter" 線的連接處樣式
  6. lineWidth:1 線條的寬度
  7. shadowBlur:0 陰影部分模糊距離
  8. shadowColor:"rgba(0, 0, 0, 0)" 陰影部分顏色
  9. shadowOffsetX:0 陰影水平偏移量
  10. shadowOffsetY:0 陰影豎直偏移量
  11. strokeStyle:"#000000" 輪廓/描邊顏色

  1. arc:arc() 繪制一個弧線
  2. beginPath:beginPath() 開始繪制路徑
  3. clearRect:clearRect() 清除一個矩形范圍
  4. clip:clip() 裁切
  5. closePath:closePath() 閉合一條路徑
  6. createLinearGradient:createLinearGradient() 創(chuàng)建一個線性漸變色
  7. createRadialGradient:createRadialGradient() 創(chuàng)建一個徑向漸變色
  8. drawImage:drawImage() 繪制一幅圖像
  9. ellipse:ellipse() 繪制一個橢圓
  10. fill:fill() 填充一條路徑
  11. fillRect:fillRect() 填充一個矩形區(qū)域
  12. fillText:fillText() 填充一段文本
  13. lineTo:lineTo() 繪制一條直線
  14. measureText:measureText() 測量一段文本于樟,得到寬度
  15. moveTo:moveTo() 移動畫筆到指定點
  16. rect:rect() 繪制一個矩形路徑
  17. rotate:rotate() 旋轉(zhuǎn)
  18. scale:scale() 縮放
  19. stroke:stroke() 對一條路徑描邊
  20. strokeRect:strokeRect() 對一個矩形進行描邊
  21. strokeText:strokeText() 對一段文本進行描邊
  22. translate:translate() 進行位移
    </pre>


    QQ截圖20170328092438.png

    (1)繪制矩形(長方形)——矩形以自己的左上角作定位點
    (2)繪制文本——文字以自己的坐下角作定位點

html結(jié)構(gòu):
<pre>
<canvas id="diagonal" style="1px solid" width:"200" height:"200"></canvas>
</pre>
JavaScript代碼:
<pre>
function drawDiagonal(){
//取的canvas元素及其繪圖上下文
var canvas=document.getElementById("diagonal");
var context=canvas.getContext('2d');
//用絕對坐標來創(chuàng)建一條路徑
context.beginPath();
context.moveTo(70,140);
context.lineTo(140,70);
//將這條線繪制到canvas上
context.stroke();
}
window.addEventListener('load',drawDiagonal(),true);
</pre>
練習(xí):繪制一個左右來回移動的矩形
經(jīng)典的碰撞反彈效果
<pre>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>HTML5新特性——Canvas繪圖技術(shù)</title>
<style>
canvas {
background: #efefef;
}
</style>
</head>
<body>
<canvas id="c1" width="500" height="400">
您的瀏覽器不支持Canvas標簽公条!
</canvas>

<script>
//在畫布上繪圖需要使用畫筆(繪圖上下文)
var ctx = c1.getContext('2d'); //二維繪圖對象

//練習(xí):繪制一個左右來回移動的矩形
//經(jīng)典的碰撞反彈效果

var x = 0;
var y = 0;
var xDirection = 1; //1表正向 -1表負向
setInterval(function(){
//清除已有內(nèi)容
ctx.clearRect(0,0, 500,400);
ctx.fillRect(x,y, 50,40);
x += 5*xDirection;

if(x>=500-50){
  xDirection = -1;
}else if(x<=0){
  xDirection = 1;
}

}, 42);

</script>
</body>
</html>
</pre>
對于web API可以不用記住:可以查詢Mozilla開發(fā)者網(wǎng)絡(luò)API:https://developer.mozilla.org/
<h5>①第一步:Web API & DOM</h5>

QQ截圖20170327181617.png

<h5>②第二步:Web API接口一覽表</h5>

QQ截圖20170328085704.png

<h5>③第三步:找到Canvas API</h5>

QQ截圖20170328090333.png

<h5>④第四步:繪制矩形迂曲、文本靶橱,線型、文本樣式路捧、填充和描邊樣式关霸、漸變和圖案、圖像等</h5>
<h2>二杰扫、Audio和Video</h2>
HTML5中的多媒體支持<video></video>队寇、<audio></audio>
<pre>
<audio id="clickSound">
<source src="a.ogg">
<source src="b.mp3">
</audio>
<button id="toggle" onclick="toggleSound()">play</button>
</pre>

<pre>function toggleSound() {
var music = document.getElementById('clickSound');
var toggle = document.getElementById('toggle');
if(music.paused){
music.play();
toggle.innerHTML = 'Pause';
}else{
music.pause();
toggle.innerHTML = 'Play';
}
}</pre>
<video>標簽可用的屬性:
(1) src:待播放的資源的URL
(2) width:播放區(qū)域的寬度
(3) height:播放區(qū)域的高度
(4) controls:是否顯示播放控件,默認不顯示 false
(5) autoplay:是否自動播放章姓,默認不自動播放 false
(6) loop:是否循環(huán)播放段只,默認不循環(huán) false
(7) preload:如何預(yù)加載視頻姥份,可以賦值為
“none”:不預(yù)加載
“metadata”:只預(yù)加載元數(shù)據(jù)浸剩,如影片寬擦盾、高、大小系忙、時長
“auto”:(默認值)自動預(yù)加載元數(shù)據(jù)以及部分影片數(shù)據(jù)
(8) poster:影片播放之前顯示的“電影海報”
<pre>
<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>演示:video對象成員的使用</title>
<style>
.container {
text-align: center;
position: relative;
border: 1px solid #aaa;
}
.mask {
position: absolute;
width: 100%;
height: 100%;
top: 0;
left: 0;
background: rgba(0,0,0, .5);
}
.mask img {
margin-top: 200px;
cursor: pointer;
border: 1px solid #aaa;
border-radius: 50%;
background: rgba(255,255,255,0.2);
}
</style>
</head>
<body>

<div class="container">
<video id="player" src="resource/birds.mp4" >
您的瀏覽器不支持VIDEO標簽
</video>

QQ截圖20170328095727.png

</div>
</pre>
<pre>
<script>
//當點擊“播放|暫退信危”按鈕時,開始播放/暫停影片
playOrPause.onclick = function(){
if(player.paused === true){ //當前處于暫停狀態(tài)
player.play(); //播放影片
playOrPause.src = 'resource/pause.png';
}else { //當前處于播放狀態(tài)
player.pause();
playOrPause.src = 'resource/play.png';
}
}

//當影片暫停時笨觅,遮罩層中顯示一個廣告
player.onpause = function(){
ad.style.display = 'inline-block';
}
//當影片播放時拦耐,去除遮罩層中的廣告
player.onplay = function(){
ad.style.display = 'none';
}
</script>
</pre>
<h2>三耕腾、Geolocation</h2>
HTML5 Geolocation API 用于獲得用戶的地理位置见剩。
鑒于該特性可能侵犯用戶的隱私,除非用戶同意扫俺,否則用戶位置信息是不可用的苍苞。
瀏覽器獲得地理定位數(shù)據(jù)的原理:
手機: GPS、基站、IP反向解析
PC: IP反向解析
①使用 getCurrentPosition() 方法來獲得用戶的位置羹呵。
簡單的地理定位實例骂际,可返回用戶位置的經(jīng)度和緯度。

<pre>
<!DOCTYPE html>
<html>
<body>
<p id="demo">點擊這個按鈕冈欢,獲得您的坐標:</p>
<button onclick="getLocation()">試一下</button>
<script>
var x=document.getElementById("demo");
function getLocation()
{
if (navigator.geolocation)
{
navigator.geolocation.getCurrentPosition(showPosition);
}
else{x.innerHTML="Geolocation is not supported by this browser.";}
}
function showPosition(position)
{
x.innerHTML="Latitude: " + position.coords.latitude +
"<br />Longitude: " + position.coords.longitude;
}
</script>
</body>
</html>
</pre>
例子解釋:

檢測是否支持地理定位
如果支持歉铝,則運行 getCurrentPosition() 方法。如果不支持凑耻,則向用戶顯示一段消息太示。
如果getCurrentPosition()運行成功,則向參數(shù)showPosition中規(guī)定的函數(shù)返回一個coordinates對象
showPosition() 函數(shù)獲得并顯示經(jīng)度和緯度

上面的例子是一個非诚愫疲基礎(chǔ)的地理定位腳本类缤,不含錯誤處理。
②處理錯誤和拒絕
getCurrentPosition() 方法的第二個參數(shù)用于處理錯誤邻吭。它規(guī)定當獲取用戶位置失敗時運行的函數(shù):
<pre>
function showError(error)
{
switch(error.code)
{
case error.PERMISSION_DENIED:
x.innerHTML="User denied the request for Geolocation."
break;
case error.POSITION_UNAVAILABLE:
x.innerHTML="Location information is unavailable."
break;
case error.TIMEOUT:
x.innerHTML="The request to get user location timed out."
break;
case error.UNKNOWN_ERROR:
x.innerHTML="An unknown error occurred."
break;
}
}
</pre>
錯誤代碼:

Permission denied - 用戶不允許地理定位
Position unavailable - 無法獲取當前位置
Timeout - 操作超時

<h6>getCurrentPosition() 方法 - 返回數(shù)據(jù)</h6>
若成功餐弱,則 getCurrentPosition() 方法返回對象。始終會返回 latitude囱晴、longitude 以及 accuracy 屬性膏蚓。如果可用,則會返回其他下面的屬性畸写。

QQ截圖20170328104949.png

Geolocation 對象 - 其他有趣的方法

watchPosition() - 返回用戶的當前位置降允,并繼續(xù)返回用戶移動時的更新位置(就像汽車上的 GPS)。

clearWatch() - 停止 watchPosition() 方法

下面的例子展示 watchPosition() 方法艺糜。您需要一臺精確的 GPS 設(shè)備來測試該例(比如 iPhone):
實例
<pre>
<script>
var x=document.getElementById("demo");
function getLocation()
{
if (navigator.geolocation)
{
navigator.geolocation.watchPosition(showPosition);
}
else{x.innerHTML="Geolocation is not supported by this browser.";}
}
function showPosition(position)
{
x.innerHTML="Latitude: " + position.coords.latitude +
"<br />Longitude: " + position.coords.longitude;
}
</script></pre>
<h6>百度地圖</h6>
官網(wǎng):http://lbsyun.baidu.com/
使用步驟:
(1)注冊新用戶剧董,或者使用QQ、微博破停、微信賬號登陸
https://passport.baidu.com/v2/?reg&regType=1&tpl=mn&u=http://lbsyun.baidu.com/

注冊百度賬號.png

(2)登錄
https://passport.baidu.com/v2/?login&fr=old&login&u=http://lbsyun.baidu.com/
(3)查看開發(fā)者手冊
http://lbsyun.baidu.com/index.php?title=jspopular

開發(fā)手冊API.png

(4)每個使用百度地圖API的應(yīng)用必須申請一個唯一的AccessKey(AK)
http://lbsyun.baidu.com/apiconsole/key

1.png
2.png

3.png

(5)調(diào)用百度地圖API
1)在地圖上以某點為中心進行顯示
2)添加地圖控件
3)在地圖上標記某點
DEMO地址: http://developer.baidu.com/map/jsdemo.htm#a1_2

demo.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末翅楼,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子真慢,更是在濱河造成了極大的恐慌毅臊,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,602評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件黑界,死亡現(xiàn)場離奇詭異管嬉,居然都是意外死亡,警方通過查閱死者的電腦和手機朗鸠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,442評論 2 382
  • 文/潘曉璐 我一進店門蚯撩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人烛占,你說我怎么就攤上這事胎挎」灯簦” “怎么了?”我有些...
    開封第一講書人閱讀 152,878評論 0 344
  • 文/不壞的土叔 我叫張陵犹菇,是天一觀的道長德迹。 經(jīng)常有香客問我,道長揭芍,這世上最難降的妖魔是什么胳搞? 我笑而不...
    開封第一講書人閱讀 55,306評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮称杨,結(jié)果婚禮上流酬,老公的妹妹穿的比我還像新娘。我一直安慰自己列另,他們只是感情好芽腾,可當我...
    茶點故事閱讀 64,330評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著页衙,像睡著了一般摊滔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上店乐,一...
    開封第一講書人閱讀 49,071評論 1 285
  • 那天艰躺,我揣著相機與錄音,去河邊找鬼眨八。 笑死腺兴,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的廉侧。 我是一名探鬼主播页响,決...
    沈念sama閱讀 38,382評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼段誊!你這毒婦竟也來了闰蚕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,006評論 0 259
  • 序言:老撾萬榮一對情侶失蹤连舍,失蹤者是張志新(化名)和其女友劉穎没陡,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體索赏,經(jīng)...
    沈念sama閱讀 43,512評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡盼玄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,965評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了潜腻。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片埃儿。...
    茶點故事閱讀 38,094評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖砾赔,靈堂內(nèi)的尸體忽然破棺而出蝌箍,到底是詐尸還是另有隱情青灼,我是刑警寧澤暴心,帶...
    沈念sama閱讀 33,732評論 4 323
  • 正文 年R本政府宣布妓盲,位于F島的核電站,受9級特大地震影響专普,放射性物質(zhì)發(fā)生泄漏悯衬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,283評論 3 307
  • 文/蒙蒙 一檀夹、第九天 我趴在偏房一處隱蔽的房頂上張望筋粗。 院中可真熱鬧,春花似錦炸渡、人聲如沸娜亿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,286評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽买决。三九已至,卻和暖如春吼畏,著一層夾襖步出監(jiān)牢的瞬間督赤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,512評論 1 262
  • 我被黑心中介騙來泰國打工泻蚊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留躲舌,地道東北人。 一個月前我還...
    沈念sama閱讀 45,536評論 2 354
  • 正文 我出身青樓性雄,卻偏偏與公主長得像没卸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子秒旋,可洞房花燭夜當晚...
    茶點故事閱讀 42,828評論 2 345

推薦閱讀更多精彩內(nèi)容