h5元素大致的分為下面幾大類:
創新互聯是一家集網站建設,龍泉企業網站建設,龍泉品牌網站建設,網站定制,龍泉網站建設報價,網絡營銷,網絡優化,龍泉網站推廣為一體的創新建站企業,幫助傳統企業提升企業形象加強企業競爭力。可充分滿足這一群體相比中小企業更為豐富、高端、多元的互聯網需求。同時我們時刻保持專業、時尚、前沿,時刻以成就客戶成長自我,堅持不斷學習、思考、沉淀、凈化自己,讓我們為更多的企業打造出實用型網站。
1.內嵌------在文檔中添加其他類型的內容,如audio,video,canvas,iframe等
2.流------在文檔和應用的body中使用的元素,如form,h1,small等
3.標題------段落標題,如h1,h2,hgroup等
4.交互------與用戶交互的內容,如音頻和視頻的空間,button,textarea等
5.元數據------通常出現在頁面的head中,設置頁面其他部分的表現和行為,如script,style,title等
6.短語------文本和文本標記元素,如mark,kbd,sub,sup等
以上所有類型的元素都可以通過css來設定樣式。
HTML5定義類一組新的語義化標記來描述元素的內容。簡化了HTML頁面設計。
這些分別是
1.header------標記頭部區域的內容(用于整個頁面或頁面中的一塊區域)
2.footer------標記腳部區域的內容(用于整個頁面或頁面中的一塊區域)
3.section------Web頁面中的一塊區域
4.article------獨立的文章內容
5.aside------相關內容或者引文
6.nav------導航類輔助內容
1.hgroup------用于對整個頁面或頁面中一個內容區塊的標題進行組合
2.figure------表示一段獨立的流內容,一般表示文檔主體流內容中的一個獨立單元,使用figcaption元素可為figure元素組添加標題
3.vedio------定義視頻,比如電影片段或其他視頻流
4.audio------定義音頻,比如音樂或其他音頻流
5.embed------用來插入各種多媒體,格式可以使MIDI,WAV,AIFF,AU,MP3等
6.mark------主要用來在視覺上向用戶呈現那些需要突出顯示和高亮顯示的文字。
7.time------表示日期或時間,也可以同時表示兩者
8.canvas------表示圖形,這個元素本身沒有行為,僅提供一塊畫布,但它把一個繪圖API展現給客戶端JavaScript,以使腳本能夠把想繪制的東西回執到這塊畫布上。
9.output------表示不同類型的輸出,比如腳本的輸出
10.source------為媒介元素
11.menu------表示菜單列表。當希望列出表單控件時使用的該標簽
12.ruby------表示ruby注釋(中文注音或字符)
13.rt------表示字符的解釋或發音
14.rp------在ruby注釋中使用,以定義不支持ruby元素的瀏覽器所顯示的內容
15.wbr------表示軟換行。與br的區別在于br表示此處必須換行,而wbr意思是瀏覽器窗口或父級元素的寬度足夠寬時,不進行換行,寬度不夠時,主動在此處進行換行。
16.command------表示命令按鈕,如單選按鈕,復選按鈕或按鈕框。
17.details------表示用戶要求得到并且可以得到的細節信息,可以與summary元素配合使用,summary元素提供標題或圖例,標題是可見的,用戶單機標題時,會顯示細節信息。summary應該是details元素的第一個子元素
18.datalist------表示可選數據的列表,與input元素配合使用,可以制作出輸入值的下拉列表。
19.datagrid------表示可選數據的列表,它以樹形列表形式來顯示
20.keygen------表示生成密鑰
21.progress------表示運行中的進程,可以使用progress元素來顯示JavaScript中耗費時間函數的進程
22.email------表示必須輸入email地址的文本輸入框
23.url------表示必須輸入url地址的文本輸入框
24.number------表示必須輸入數值地址的文本輸入框
25.range------表示必須輸入一定范圍內數字值址的文本輸入框
26.Date Pickers------HTML5擁有多個可供選取日期和時間的新型輸入文本框
這個就不說了。
html5與傳統html區別
一. HTML5語法的改變
該知識點所說變化指的是基于HTML4基礎上所定義的改變,主要有如下:
1.HTML5的文件擴展符(.html或.htm)與內容類型(text/html)保持不變。
2.HTML5中,刻意不使用版本聲明,一份文檔將會適用于所有版本的HTML。
3.從HTML5開始,對于文件的字符編碼推薦使用UTF-8。
4.HTML5確保了與之前HTML版本的最大程度的兼容性。
為了保證兼容性,需從元素說起,在HTML5.中,元素的標記可以省略。其體來說,元素的標記分為“不允許寫結束標記”、“可以省略結束標記”和‘“開始標記和結束標記全部可以省略”三種類型。
不允許寫結束標記元素有:area、base、br、col.....
可以省略結束標記:li、dt、dd、p、rt......
開始標記和結束標記全部可以省略:html、head、body.....
二.新增的結構元素
section元素表示頁面中的一個內容區塊,比如章節、頁眉、頁腳或頁面中的其他部分;
article元素表示頁面中的一塊與上下文不相關的獨立內容,譬如博客中的一篇文章或報紙中的一篇文章;
aside元素表示article元素的內容之外的、與article元素的內容相關的輔助信息;
header元素表示頁面中一個內容區塊或整個頁面的標題;
hgroup元素用于對整個頁面或頁面中一個內容區塊的標題進行組合;
footer元素表示整個頁面或頁面中一個內容區塊的腳注。一般來說,它會包含創作者的姓名、創作日期以及創作者聯系信息;
nav元素表示頁面中導航鏈接的.部分;
figure元素表示一段獨立的流內容,一般表示文檔主體流內容中的一個獨立單元,使用figcaption元素為figure元素組添加標題
2、新增的其他元素
audio元素定義音頻,比如音樂或其他音頻流;
embed元素用來插入各種多媒體,格式可以是Midi、Wav、AU、MP3等;
mark元素上要用來在視覺上向用戶呈現那些需要突出顯示或高亮顯示的文字,典型應用就是在搜索結果中向用戶高亮顯示搜素關鍵詞;
progress元素表示運行中的進程
ruby元素表示ruby注釋(中文注音或字符)
rt元素表示字符(中文注音或字符)的解釋或發音
rp元素在ruby注釋中使用,以定義不支持ruby素的瀏覽器所顯示的內容。
wbr元素表示軟換行,而當寬度不夠時,主動在此處進行換行
canvas元素表示圖形,比如圖表和其他圖像
cammand元素表示命令按鈕,比如單選按鈕、復選框或按鈕
details元素表示用戶要求得到并且可以得到的細節信息
datagrid元素表示可選數據的列表,它以樹形列表的形式來顯示
keygen元素表示生成密鑰
output元素表示不同類型的輸出,比如腳本的輸出
source元素為媒介元素(比如和)定義媒介資源
menu元素表示菜單列表
3、新增的input元素
email 類型表示必須輸入E-main地址的文本輸入框
url 類型表示必須輸入URL地址的文本輸入框
number類型表示必須輸人數值的文本輸入框
range 類型表示必須輸入一定范圍內數字值的文本輸人框
HTML5擁有多個可供選取日期和時間的新型輸入文本框:
date ——選取日、月、年
month ——選取月、年
week ——選取周和年
time ——選取時間(小時和分鐘)
datetime ——一選取時間、日、月、年(UTC 時間)
datetime.local ——選取時間、日、月、年(本地時間)
三.廢除元素
1、能使用CSS替代的元素
對干basefont、big、center、font、s、strike、tt、u這些元素,由于它們的功能都是純粹去畫面展示服務的,而HTML5中提倡把畫面展示性功能放在CSS樣式表中統一編輯,所以這些元素廢除了
2、不再使用frame框架
對于frameset元素、frame元素與noframes元素,由于frame框架對網頁可用性存在負面影響,在HTML5中已不支持frame框架,只支持iframe框架,或者用服務器方創建的由多個頁面組成的復合頁面的形式,同時將以上這三個元素廢除。
3、只有部分瀏覽器支持的元素
對于applet、bgsound、blink、marquee等元素,由于只有部分瀏覽器支持這些元素,特別是bgsound元素以及marquee元素,只被Internet Explorer所支持,所以在HTML 5中被廢除。其中applet元素可由ernedd元素或object元素替代,bgsound元素可由audio元素替代,marquee可以由JavaScript編程的方式所替代
4、其他被廢除的元素:
廢除rb元素,使用ruby元素替代
廢除acronym元素,使用abbr元素替代
廢除dir元素,使用ul元素替代
廢除isindex元素,使用form元素與input元素相結合的方式替代
廢除listing元素,使用pre元素替代
廢除xmp元素,使用code元素替代
廢除nextid元素,使用GUIDS替代
廢除plaintext元素,使用“ text/plian” MIME類型替代
四.新增屬性和廢除屬性
一、新增屬性
1、與表單相關屬性
新增autofocus屬性,它以指定屬性的方式讓元素在畫面打開時自動獲得焦點;
新增placeholder屬性,它會對用戶的輸入進行提示,提示用戶可以輸入的內容;
新增form屬性,聲明它屬于哪個表單,然后將其放置在頁面上任何位置,而不是表單之內;
新增required屬性,該屬性表示在用戶提交的時候進行檢查,檢查該元素內一定要有輸入內容;
2、與鏈接相關屬性
增加media屬性,該屬性規定目標URL是為什么類型的媒介/設備進行優化的,只能在href屬性存在時使用;
增加hreflang屬性與rel屬性,以保持與a元素、link元素的一致;
3、其他屬性
屬性reverend,它指定列表倒序顯示;
為script元素增加async屬性,它定義腳本是否異步執行;
二、廢除屬性
能被CSS樣式表替代的屬性全部廢除掉;
多余屬性,例如:target、profile、version等被廢除掉;
五.全局屬性
在HTML5中,新增了一個’‘全局屬性“的概念。所謂全局屬性,是指可以對任何元素都使用的屬性。
1、contentEditable 屬性
該屬性允許用戶編輯元素中的內容,可以獲得鼠標焦點,屬性為布爾值,可被指定為true或false。另外,該屬性還有個隱藏inherit狀態,為true時,允許編輯,為false時,不允許編輯,未指定時,由inherit決定。
2、designMode 屬性
該屬性用來決定整個頁面是否可編輯。有兩個屬性“on”與"off"。屬性為"on"時,可編輯,為“off”時,不可編輯。
3、hidden屬性
所有元素都允許使用一個hidden屬性,該屬性類似于input元素中的hidden元素,功能是通知瀏覽器不渲染該元素,使該元素處于不可見狀態。該屬性值為布爾值,為true時,不可見,為false時,可見。
4、spellcheck屬性
該屬性是HTML 5針對input元素(type=text) 與textarea這兩個文本輸入框提供的一個新屬性,主要對用戶輸入內容進行拼寫與語法檢查。屬性值為布爾值,書寫時必須明確聲明屬性值為true或false書寫方式如下:
詳解form屬性
在HTML4中,表單內的從屬元素必須書寫在表單內部,但是在HTML5中,可以把他們書寫在頁面上任何地方,然后給元素制定一個form屬性,屬性值為該表單單位的id,這樣就可以聲明該元素從屬于指定表單了。
input元素從屬于表單,它唄書寫在表單內部,用不著再對它制定form屬性。textarea元素唄書寫在表單之外,但它從屬于表單,所以表單的id制定給textareea元素的form屬性。
這樣做的好處是當需要給頁面中的元素添加樣式時可以更方便地添加,因為它們不是被分散在各表單之內的了。
;
移動端網站也需要考慮SEO,具體操作步驟是:
第一步、定位和頁面設計。
無論是PC端還是移動端,網站都要考慮清楚消費群體的定位問題。雖然智能手機用戶數量非常普及,但是要明白中國的大部分手機用戶使用的還是2G網絡,一直高
喊的3G、4G手機用戶只有大約15%左右。所以,在頁面設計時,要考慮到用戶打開網頁的時長,一些炫麗的flash、JS等建議還是不用為好。這不僅僅
是用戶體驗的問題,也是盡量減少百度索引抓取的工作,讓百度蜘蛛盡可能多的爬行和收錄頁面。
第二步、網站盡可能簡潔。
①手機網站比PC端網站的頁面下載速度要慢得多,因此盡量把頁面數和頁面大小控制到最低。
②此外,由于是手機用戶,用戶瀏覽網頁的時間是零碎的,不可能耐心點擊很多的頁面。因此,要盡可能精簡移動網站設計。
③購買流程或者導購頁面盡可能精簡精簡再精簡,從消費者進入網站到購買盡可能提供最簡單的步驟,直接摒棄那些冗余內容,為消費者呈現他們想要的。假如一個購買流程需要注冊七八項,在購買時再填上七八項,那恐怕下次就不會有回頭客了。
第三步、域名和robots設置。
①域名盡可能簡短易記,大部分手機版網站的域名是PC端網站的二級域名,當然這個也很好,與傳統網站保持一致,更讓重視用戶信賴。但是如果是專門的手機網站,最好起一個簡短而且易記的域名。
②robots 設置上最好不要任何限制,讓所有搜索引擎抓取。另外小生在這里糾正一個很多站長想當然的誤區,百度官方聲明百度spider
的爬蟲UA是Baiduspider(www 和wap
一致),個別站長經常會誤認為百度手機爬蟲的UA是baiduspider-mobile,其實沒這回事。
第四步、避免使用彈窗、flash、java等行為。
同樣道理,flash和彈窗等行為將會占用很大一部分流量,對于移動手機用戶而言,無疑會浪費時間和流量,對于搜索引擎而言,基本理解不了。在技術層面來
講,Apple產品不支持Flash功能,很大一部分智能手機用戶用不了這項功能,同樣,很多智能手機也不支持Java,所以這只是兩方面都不討好的做 法。
第五步、頁面細節優化。
①專屬的手機網站頭部標簽。對于手機網站的首頁或者頻道首頁的網
頁代碼中的keywords、description最好加上與PC端有所區別的meta標簽和關鍵詞,在每個頁面的關鍵字及描述像做傳統PC端網站一
樣,做好針對性的填寫工作。對搜索結果的展現(摘要)以及優化工作大有幫助。
②減少死鏈。如果沒有內容,最好用狀態碼指定,比如404、403 等;如果內容死鏈希望重定向到首頁,最好通過302跳轉,不要使用javascript
跳轉。
第六步、使用規范化的協議,做好瀏覽器兼容調試工作。
一般來說手機建站有xhtml、html5、wml
三種協議,最好使用規范化、標準化的協議格式,避免造成不必要的麻煩。當然也可以做多個版本的站點,站點進行不同版式的自動適配。
第七步、url鏈接規范化。
①對于多個板塊的二級域名或者目錄來說,使用規范、簡單的url,盡量去除與頁面內容無關的參數,如用來區分手機型號、區分訪問用戶,方便統計等的參數。如手機版的“百度知道”
②頁面url鏈接跳轉最好是正常格式的目標url,不要中間進行跳轉。
第八步、做好移動版與PC版網站的轉換。
①確保在手機網站或者PC端網站各個頁面上有相應的導航或者提示鏈接,讓用戶可以在手機版和PC版進行切換,也便于搜索引擎更好的收錄。
②百度官方曾聲明,對于移動站點,當baiduspider ua或者其它無法確定來源的ua訪問時,建議默認情況下直接返回html5 或xhtml
類型的移動頁面,不要重定向到PC頁面。
第九步、手機網站適配聲明。
手機頁面進行合適的 DOCTYPE 聲明有助于搜索引擎識別該頁面是否適合手機瀏覽。聲明位于文檔中的最前面的位置,處于標簽之前。
第十步、其它優化事項。
其它一些優化要點與傳統PC端網站優化一樣。如網站結構要用合理的樹形結構,最好采用樹形和扁平相結合;清晰的面包屑導航,方便搜索引擎爬行抓取和用戶體驗;title寫法要盡量包含關鍵字,首頁、頻道頁、內容頁寫法要有所側重。
用html5開發隨機生成的大樹,你應該沒想到40+行代碼就可以搞定了吧~接下來就跟大家說說這棵大樹是如何在html5開發中實現的。
同樣必須要有html容器。新建Index.html,代碼如下:
、html
1 、head
2 、meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /
3 、titlecanvas tree
4 、/head
5 、body
6 、script type="text/javascript" src="tree.js"
7 、/body
8 、/html
接下來咱們開始tree.js:
、var canvas = document.createElement("canvas");
9 var ctx = canvas.getContext("2d");
10 canvas.width = 640;
11 canvas.height = 480;
12 document.body.appendChild(canvas);
代碼很好理解,創建一個canvas畫布,然后選擇為2d畫布,設置長寬,最后將這個畫布添加到body標簽下。
這個腳本最重要的函數在下面,大樹就是遞歸調用這個函數實現的,調用一次畫一條線段:
var drawTree = function (ctx, startX, startY, length, angle, depth, branchWidth){
13 var rand = Math.random,
14 newLength, newAngle, newDepth, maxBranch = 3,
15 endX, endY, maxAngle = 2 * Math.PI / 4,
16 subBraches;
17 ctx.beginPath();
18 ctx.moveTo(startX, startY);
19 endX = startX + length * Math.cos(angle);
20 endY = startY + length * Math.sin(angle);
21 ctx.lineCap = 'round';
22 ctx.lineWidth = branchWidth;
23 ctx.lineTo(endX, endY);
24 if (depth = 2){
25 ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 128) 0) + ',0)';
26 } else {
27 ctx.strokeStyle = 'rgb(' + (((rand() * 64) + 64) 0) + ',50,25)';
28 }
29 ctx.stroke();
30 newDepth = depth - 1;
31 if (!newDepth)
32 return;
33 subBranches = (rand() * (maxBranch - 1)) + 1;
34 branchWidth *= 0.7;
35 for (var i = 0; i subBranches; i++){
36 newAngle = angle + rand() * maxAngle - maxAngle * 0.5;
37 newLength = length * (0.7 + rand() * 0.3);
38 drawTree(ctx, endX, endY, newLength, newAngle, newDepth, branchWidth);
39 }
40 }
接下來一點點解釋:
首先,解釋下各個變量的含義。ctx就是前面我們的2d畫布;startX是線段開始的橫坐標,同理startY是縱坐標;length是線段長度;angle是角度;depth是深度,葉子深度為1,樹干為12(可自己設定);branchWidth就線段的粗細。有了這些信息,其實就描述了一個線段,通過這些信息我們才能畫一個線段。
接下來又很可恥地一大段定義:
var rand = Math.random,
41 newLength, newAngle, newDepth, maxBranch = 3,
42 endX, endY, maxAngle = 2 * Math.PI / 4,
43 subBraches;
rand其實就是隨機一個0~1之間的實數,顧名思義,接下來這些new的就是下一節線段的各種參數。maxBranch就是最多有3個分叉,最大的角度 PI/2 即為,下一級調整角度在90%范圍內。subBranches就是分叉的個數。
好了,重要可以畫了:
ctx.beginPath();
44 ctx.moveTo(startX, startY);
45 endX = startX + length * Math.cos(angle);
46 endY = startY + length * Math.sin(angle);
47 ctx.lineCap = 'round';
48 ctx.lineWidth = branchWidth;
49 ctx.lineTo(endX, endY);
beginPath()表示告訴瀏覽器“我要開始畫了!”,把之前的記錄放棄了,這點有點像ps。moveTo()把光標移動到(startX, startY),再計算終點坐標,endX,endY,有點像高中學的參數方程。然后告訴瀏覽器,lineCap要round,線段的兩頭要是圓形的。有多粗呢?等于branchWidth。線段一直畫到(endX, endY)。
if (depth = 2){
50 ctx.strokeStyle = 'rgb(0,' + (((rand() * 64) + 128) 0) + ',0)';
51 } else {
52 ctx.strokeStyle = 'rgb(' + (((rand() * 64) + 64) 0) + ',50,25)';
53 }
如果是已經畫到了最后兩級,即為葉子,那么就rgb就為(0, 128~192, 0)(rgb代表顏色,分別為紅綠藍,red green blue)。還沒的話,就在(64~128, 50 ,25)中取。大家可能發現了,rgb必須為整數,但是rand()只能rand實數。大家其實也注意到了有個” 0″,js當中表示位運算,整體向右移動n位,0就是移動0位。其實它的作用和Math.floor()一樣,但是速度更快。
動手畫!
ctx.stroke();
這個線段就畫好了,是時候準備下它的分叉的時候了。
newDepth = depth - 1;
54 if (!newDepth)
55 return;
如果這個線段是最后一級,就沒有分叉了,也是一個遞歸的終止條件。
subBranches = (rand() * (maxBranch - 1)) + 1;
56 branchWidth *= 0.7;
57 for (var i = 0; i subBranches; i++){
58 newAngle = angle + rand() * maxAngle - maxAngle * 0.5;
59 newLength = length * (0.7 + rand() * 0.3);
60 drawTree(ctx, endX, endY, newLength, newAngle, newDepth, branchWidth);
61 }
分叉數是1~3中的一個數。然后有多少個分叉,就畫幾條線段,newAngle為原角度調整90度之內,新長度為原長度的0.7~1.0之間。
最后畫出主干,這棵樹就可以開始畫了。
drawTree(ctx, 320, 470, 60, -Math.PI / 2, 12, 12);
大家可能注意到角度為負,不符合傳統觀念。但你要知道,畫布的縱坐標和傳統的坐標軸正好是相反的。
好了,html5開發隨機生成的大樹代碼就這樣完成了,怎么樣,一點都難吧!
站內搜索: (僅支持單關鍵字)
用HTML5 Canvas制作擺動的樹
下載源代碼
〖 作者:cyclegtx 〗〖 發布日期:2014-07-05 〗
根據工作的需要,制作一個擺動的樹做為頁面的背景。為了增加頁面的交互性,我又為背景中的樹增加了鼠標(觸控)事件,使他能夠根據鼠標(觸控)做出相應的動作,當手指做上下或者左右滑動的時候樹會跟著擺動。先看看最終效果。
Step1.完成HTML頁面,新建一個Tree類
完成HTML頁面后新建一個Tree類用來記錄樹的各個屬性。其中x,y為樹根部的坐標值,branchLen,branchWidth分別是樹枝的長度與寬度,depth為樹枝的層數,canvas用來接頁面中的canvas元素(默認是ID為canvas的元素)。
html
meta charset="utf-8" /
head
style
body {
margin: 0;
background: #7ACFFA;
}
#canvas {
position: absolute;
top: 0; left: 0;
}
/style/headbody
canvas id="canvas" width="1" height="1"/canvas
script type='text/javascript'
window.requestAnimFrame = (function(){
return window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
function( callback ){
window.setTimeout(callback, 1000 / 60);
};
})();
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
canvas.width = window.innerWidth;
canvas.height = window.innerHeight;
function Tree(x,y,branchLen,branchWidth,depth,canvas){
this.canvas = canvas || document.getElementById('canvas');
this.ctx = this.canvas.getContext('2d');
this.x = x||0;
this.y = y||0;
this.branchLen = branchLen||0;
this.branchWidth = branchWidth||0;
var depth = depth || 5;
}
/script
/body/html
Step2.添加drawRoot方法,用來繪制樹干
首先在drawRoot中畫第一個枝干。drawRoot的參數意義同上。并且在Tree類的構造函數中運行drawRoot并把Tree接受到的參數傳入。最后new一個Tree類,使樹根位于屏幕的底部正中心,樹枝長100px,樹枝寬度為8px,樹枝層數為8層(暫時用不上)。
var atree = new Tree(canvas.width/2-4,canvas.height,100,8,8,canvas);
在drawRoot中我們需要用lineTo()畫出樹枝。樹枝的起始的坐標值(x,y)已經給出,結束的坐標值(toX,toY)需要進行計算。第一個畫的是樹干,由于樹干垂直于地面所以結束坐標toX等于初始坐標x,而結束坐標toY等于初始y減去樹干長度branchLen(注意坐標的0,0點在canvas的左上角)。
var toX = x;var toY = y-branchLen;
function Tree(x,y,branchLen,branchWidth,depth,canvas){
this.canvas = canvas || document.getElementById('canvas');
this.ctx = this.canvas.getContext('2d');
this.x = x||0;
this.y = y||0;
this.branchLen = branchLen||0;
this.branchWidth = branchWidth||0;
var depth = depth || 5;
this.drawRoot(this.x,this.y,this.branchLen,this.branchWidth);
}
Tree.prototype.drawRoot = function(x,y,branchLen,branchWidth){
var toX = x;
var toY = y-branchLen;
this.ctx.save();
this.ctx.strokeStyle="rgba(37, 141, 194, 0.93)";
this.ctx.beginPath();
this.ctx.lineCap = "butt";
this.ctx.lineJoin="round";
this.ctx.lineWidth = branchWidth;
this.ctx.moveTo(x,y);
this.ctx.lineTo(toX,toY);
this.ctx.closePath();
this.ctx.stroke();
this.ctx.restore();
}
var atree = new Tree(canvas.width/2-4,canvas.height,100,8,8,canvas);
運行代碼:
Step3.添加drawBranch方法,用來繪制樹枝
drawBranch同樣是根據初始與結束坐標畫出一條直線代表樹枝。與樹干不同的是樹枝不再是垂直與地面而是與樹干保持一定的角度,而且樹枝的初始值是樹干的結束點(toX,toY)。所以在drawBranch中我們加入新參數angle用來表示樹枝與樹干的垂直夾角α,這樣就可以根據α算出toX與toY。請看圖。
這樣我們在畫完樹干后再分別畫兩個不同角度的樹枝,一個是30°一個-30°。并將傳給樹枝的寬度branchWidth減小一個像素,使其與樹干粗細不同。
Tree.prototype.drawRoot = function(x,y,branchLen,branchWidth){
var toX = x;
var toY = y-branchLen;
this.ctx.save();
this.ctx.strokeStyle="rgba(37, 141, 194, 0.93)";
this.ctx.beginPath();
this.ctx.lineCap = "butt";
this.ctx.lineJoin="round";
this.ctx.lineWidth = branchWidth;
this.ctx.moveTo(x,y);
this.ctx.lineTo(toX,toY);
this.ctx.closePath();
this.ctx.stroke();
this.ctx.restore();
this.drawBranch(toX,toY,branchLen,branchWidth-1,30);
this.drawBranch(toX,toY,branchLen,branchWidth-1,-30);
}
Tree.prototype.drawBranch = function(x,y,branchLen,branchWidth,angle){
var angle = angle || 0;
var radian = (90-angle)*(Math.PI/180);
var toX = x+Math.cos(radian)*branchLen;
var toY = y-Math.sin(radian)*branchLen;
this.ctx.save();
this.ctx.strokeStyle="rgba(37, 141, 194, 0.93)";
this.ctx.beginPath();
this.ctx.lineCap = "butt";
this.ctx.lineJoin="round";
this.ctx.lineWidth = branchWidth;
this.ctx.moveTo(x,y);
this.ctx.lineTo(toX,toY);
this.ctx.closePath();
this.ctx.stroke();
this.ctx.restore();
}
運行代碼:
Step4.修改drawBranch函數,重復畫樹枝
在drawBranch函數的最后再次調用兩次drawBranch
this.drawBranch(toX,toY,branchLen,branchWidth-1,angle+30);
this.drawBranch(toX,toY,branchLen,branchWidth-1,angle-30);
使其調用自己完成遞歸,注意這里傳入的角度是在之前的角度的基礎上在增加或者減少30度。
為了使遞歸停下來我們需要一個停止條件,就是之前一直沒有用到的depth參數。我們在每次畫下一層之前使其減1表示已經完成了一層樹枝的繪制,直至depth減小到0表示繪制完所有的層數。
function Tree(x,y,branchLen,branchWidth,depth,canvas){
this.canvas = canvas || document.getElementById('canvas');
this.ctx = this.canvas.getContext('2d');
this.x = x||0;
this.y = y||0;
this.branchLen = branchLen||0;
this.branchWidth = branchWidth||0;
var depth = depth || 5;
this.drawRoot(this.x,this.y,this.branchLen,this.branchWidth,depth);
}
Tree.prototype.drawRoot = function(x,y,branchLen,branchWidth,depth){
var toX = x;
var toY = y-branchLen;
var depth = depth||5;
this.ctx.save();
this.ctx.strokeStyle="rgba(37, 141, 194, 0.93)";
this.ctx.beginPath();
this.ctx.lineCap = "butt";
this.ctx.lineJoin="round";
this.ctx.lineWidth = branchWidth;
this.ctx.moveTo(x,y);
this.ctx.lineTo(toX,toY);
this.ctx.closePath();
this.ctx.stroke();
this.ctx.restore();
depth--;
if(depth0){
this.drawBranch(toX,toY,branchLen,branchWidth-1,30,depth);
this.drawBranch(toX,toY,branchLen,branchWidth-1,-30,depth);
}
}
Tree.prototype.drawBranch = function(x,y,branchLen,branchWidth,angle,depth){
var angle = angle || 0;
var radian = (90-angle)*(Math.PI/180);
var toX = x+Math.cos(radian)*branchLen;
var toY = y-Math.sin(radian)*branchLen;
this.ctx.save();
this.ctx.strokeStyle="rgba(37, 141, 194, 0.93)";
this.ctx.beginPath();
this.ctx.lineCap = "butt";
this.ctx.lineJoin="round";
this.ctx.lineWidth = branchWidth;
this.ctx.moveTo(x,y);
this.ctx.lineTo(toX,toY);
this.ctx.closePath();
this.ctx.stroke();
this.ctx.restore();
depth--;
if(depth0){
this.drawBranch(toX,toY,branchLen,branchWidth-1,angle+30,depth);
this.drawBranch(toX,toY,branchLen,branchWidth-1,angle-30,depth);
}
}
運行代碼:
由于樹之間角度過大,而且所有樹枝長度都相等,看起來并不像一棵樹。所以我們需要在Tree的構造函數中加入幾個參數用來調整樹的姿態。
function Tree(x,y,branchLen,branchWidth,depth,canvas){
......
this.branchLenFactor = 0.8;
this.rootLenFactor = 1.2;
this.branchAngle = 20;
......
}
branchLenFactor:畫每一層樹枝的時候乘在branchLen上面,用來控制樹枝長度。rootLenFactor:畫樹根的時候乘在branchLen上面,用來控制樹根長度。branchAngle: 用來控制樹枝之間的角度
Tree.prototype.drawRoot = function(x,y,branchLen,branchWidth,depth){
var toX = x;
var toY = y-branchLen*this.rootLenFactor;
var depth = depth||5;
this.ctx.save();
this.ctx.strokeStyle="rgba(37, 141, 194, 0.93)";
this.ctx.beginPath();
this.ctx.lineCap = "butt";
this.ctx.lineJoin="round";
this.ctx.lineWidth = branchWidth;
this.ctx.moveTo(x,y);
this.ctx.lineTo(toX,toY);
this.ctx.closePath();
this.ctx.stroke();
this.ctx.restore();
depth--;
if(depth0){
this.drawBranch(toX,toY,branchLen*this.branchLenFactor,branchWidth-1,this.branchAngle,depth);
this.drawBranch(toX,toY,branchLen*this.branchLenFactor,branchWidth-1,-this.branchAngle,depth);
}
}
Tree.prototype.drawBranch = function(x,y,branchLen,branchWidth,angle,depth){
var angle = angle || 0;
var radian = (90-angle)*(Math.PI/180);
var toX = x+Math.cos(radian)*branchLen;
var toY = y-Math.sin(radian)*branchLen;
this.ctx.save();
this.ctx.strokeStyle="rgba(37, 141, 194, 0.93)";
this.ctx.beginPath();
this.ctx.lineCap = "butt";
this.ctx.lineJoin="round";
this.ctx.lineWidth = branchWidth;
this.ctx.moveTo(x,y);
this.ctx.lineTo(toX,toY);
this.ctx.closePath();
this.ctx.stroke();
this.ctx.restore();
depth--;
if(depth0){
this.drawBranch(toX,toY,branchLen*this.branchLenFactor,branchWidth-1,angle+this.branchAngle,depth);
this.drawBranch(toX,toY,branchLen*this.branchLenFactor,branchWidth-1,angle-this.branchAngle,depth);
}
}
運行代碼:(查看效果)
H5edu教育Html5開發為您解答:
cocos2d-js是cocos2d-x的JavaScript版本,真正跨全平臺的游戲引擎,采用原生JavaScript語言,可發布到包括Web平臺,iOS,Android,Windows Phone8,Mac,Windows等平臺。
利用cocos2d-js開發HTML5游戲/動畫,我們可以通過SDK也可以直接使用js類庫:
l SDK下載:
l js類庫:
先說說SDK的開發步驟:
1、 安裝python
2、 解壓SDK,運行setup.py
3、 運行cmd,新建cocos2d-js項目:cocos new –l js project_name
4、 使用webStorm等IDE打開項目目錄,新建的項目已經有現成HelloWorld例子
5、 了解一下main.js的說明(關于project.json),然后打開resource.js和app.js閱讀代碼
6、 在app.js中正式開始自己的代碼編寫。當然,這里可以增加新的js文件,需要修改project.json。
再說說js類庫的開發步驟:
1、 下載類庫
2、 新建HTML頁面,引入相應類庫
3、 在onload之后,編寫cocos2d-js代碼,從cc.game.run()開始。入口代碼其實跟SDK開發方式的main.js一樣。這里更推薦使用SDK方式,因為可以通過閱讀源代碼獲取API的使用說明。
開始cocos2d-js開發前,需要洗洗腦,知道cocos2d-js的平面坐標情況。這跟HTML和canvas的布局都不一樣。
wps_clip_image-10616
在cocos2d-js游戲中,畫面的左下角是(0,0),x從左往右遞增,而y是從下往上遞增的,跟數學的二維坐標系一致。
Cocos2d-js框架把游戲拆分為很多個場景,當玩家在不同界面切換的時候,框架實際上就是讓游戲畫面在不同場景中切換。跟Flash一樣,cocos2d-js也有最基本的元素——節點Node。節點可以包含子節點,形成樹形結構:
wps_clip_image-1073
然后,Layer、Sprite繼承了節點,實現了更多功能,例如Layer用于表示一個面板一個層,Sprite精靈用于加載圖片表示人物。而場景本身也是節點,所以場景中可以添加層,層中可以添加層,也可以添加精靈。
網頁題目:html5樹形,漂亮html5樹形結構
本文URL:http://vcdvsql.cn/article44/dsdgshe.html
成都網站建設公司_創新互聯,為您提供域名注冊、品牌網站制作、網站維護、商城網站、微信公眾號、網站收錄
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯